Skip to content

Commit b64ffb4

Browse files
committed
feat: add optional Translating trait for internationalization
Add optional Translating trait (Swift 6.1+) to integrate TranslatedString support without requiring pointfree-html-translating bridge package. Changes: - Add Translating trait definition in Package.swift - Add conditional dependency on swift-translating when trait enabled - Create TranslatedString+HTML.swift with #if TRANSLATING guard - Update HTML, HTMLWebsite, and HTMLEmail targets to support trait - Remove pointfree-html-translating dependency - Maintain backward compatibility via Package@swift-5.9.swift Breaking: Requires Swift 6.1 for trait support (Swift 5.9+ users use Package@swift-5.9.swift)
1 parent b218a67 commit b64ffb4

File tree

3 files changed

+237
-12
lines changed

3 files changed

+237
-12
lines changed

Package.swift

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
// swift-tools-version:5.9
2-
// The swift-tools-version declares the minimum version of Swift required to build this package.
1+
// swift-tools-version:6.1
32

43
import PackageDescription
54

@@ -32,7 +31,6 @@ extension Target.Dependency {
3231
static var markdownBuilder: Self { .product(name: "MarkdownBuilder", package: "swift-builders") }
3332
static var orderedCollections: Self { .product(name: "OrderedCollections", package: "swift-collections") }
3433
static var translating: Self { .product(name: "Translating", package: "swift-translating") }
35-
static var htmlTranslating: Self { .product(name: "PointFreeHTMLTranslating", package: "pointfree-html-translating") }
3634
static var builders: Self { .product(name: "Builders", package: "swift-builders") }
3735
}
3836

@@ -56,12 +54,17 @@ let package = Package(
5654
// Convenience product with common features
5755
.library(name: .htmlKit, targets: [.html, .htmlTheme, .htmlComponents])
5856
],
57+
traits: [
58+
.trait(
59+
name: "Translating",
60+
description: "Include TranslatedString integration for internationalization support"
61+
)
62+
],
5963
dependencies: [
6064
.package(url: "https://github.com/coenttb/swift-html-css-pointfree", from: "0.0.1"),
6165
.package(url: "https://github.com/coenttb/swift-html-types", from: "0.1.0"),
6266
.package(url: "https://github.com/coenttb/swift-svg", from: "0.1.0"),
6367
.package(url: "https://github.com/coenttb/pointfree-html", from: "2.0.0"),
64-
.package(url: "https://github.com/coenttb/pointfree-html-translating", from: "0.0.1"),
6568
.package(url: "https://github.com/coenttb/swift-builders", from: "0.0.1"),
6669
.package(url: "https://github.com/coenttb/swift-translating", from: "0.0.1"),
6770
.package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.9.2"),
@@ -77,9 +80,16 @@ let package = Package(
7780
.stringBuilder,
7881
.dependencies,
7982
.orderedCollections,
80-
.htmlTranslating,
8183
.builders,
82-
.product(name: "SVG", package: "swift-svg")
84+
.product(name: "SVG", package: "swift-svg"),
85+
.product(
86+
name: "Translating",
87+
package: "swift-translating",
88+
condition: .when(traits: ["Translating"])
89+
)
90+
],
91+
swiftSettings: [
92+
.define("TRANSLATING", .when(traits: ["Translating"]))
8393
]
8494
),
8595
.target(
@@ -97,8 +107,14 @@ let package = Package(
97107
.htmlMarkdown,
98108
.htmlTheme,
99109
.dependencies,
100-
.htmlTranslating,
101-
.translating
110+
.product(
111+
name: "Translating",
112+
package: "swift-translating",
113+
condition: .when(traits: ["Translating"])
114+
)
115+
],
116+
swiftSettings: [
117+
.define("TRANSLATING", .when(traits: ["Translating"]))
102118
]
103119
),
104120
.target(
@@ -107,8 +123,7 @@ let package = Package(
107123
.html,
108124
.htmlTheme,
109125
.dependencies,
110-
.orderedCollections,
111-
.htmlTranslating
126+
.orderedCollections
112127
]
113128
),
114129
.target(
@@ -131,7 +146,14 @@ let package = Package(
131146
.htmlMarkdown,
132147
.dependencies,
133148
.orderedCollections,
134-
.translating
149+
.product(
150+
name: "Translating",
151+
package: "swift-translating",
152+
condition: .when(traits: ["Translating"])
153+
)
154+
],
155+
swiftSettings: [
156+
.define("TRANSLATING", .when(traits: ["Translating"]))
135157
]
136158
),
137159
.testTarget(
@@ -169,7 +191,8 @@ let package = Package(
169191
.pointFreeHtmlTestSupport
170192
]
171193
)
172-
]
194+
],
195+
swiftLanguageModes: [.v6]
173196
)
174197

175198
extension String {

Package@swift-5.9.swift

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
// swift-tools-version:5.9
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
extension String {
7+
static let html: Self = "HTML"
8+
static let htmlTheme: Self = "HTMLTheme"
9+
static let htmlComponents: Self = "HTMLComponents"
10+
static let htmlMarkdown: Self = "HTMLMarkdown"
11+
static let htmlEmail: Self = "HTMLEmail"
12+
static let htmlWebsite: Self = "HTMLWebsite"
13+
static let htmlKit: Self = "HTMLKit"
14+
}
15+
16+
extension Target.Dependency {
17+
static var html: Self { .target(name: .html) }
18+
static var htmlTheme: Self { .target(name: .htmlTheme) }
19+
static var htmlComponents: Self { .target(name: .htmlComponents) }
20+
static var htmlMarkdown: Self { .target(name: .htmlMarkdown) }
21+
static var htmlEmail: Self { .target(name: .htmlEmail) }
22+
static var htmlWebsite: Self { .target(name: .htmlWebsite) }
23+
}
24+
25+
extension Target.Dependency {
26+
static var htmlTypesFoundation: Self { .product(name: "HTMLTypesFoundation", package: "swift-html-types") }
27+
static var pointFreeHtmlTestSupport: Self { .product(name: "PointFreeHTMLTestSupport", package: "pointfree-html") }
28+
static var htmlCssPointFreeHTML: Self { .product(name: "HTMLCSSPointFreeHTML", package: "swift-html-css-pointfree") }
29+
static var stringBuilder: Self { .product(name: "StringBuilder", package: "swift-builders") }
30+
static var dependencies: Self { .product(name: "Dependencies", package: "swift-dependencies") }
31+
static var swiftMarkdown: Self { .product(name: "Markdown", package: "swift-markdown") }
32+
static var markdownBuilder: Self { .product(name: "MarkdownBuilder", package: "swift-builders") }
33+
static var orderedCollections: Self { .product(name: "OrderedCollections", package: "swift-collections") }
34+
static var translating: Self { .product(name: "Translating", package: "swift-translating") }
35+
static var htmlTranslating: Self { .product(name: "PointFreeHTMLTranslating", package: "pointfree-html-translating") }
36+
static var builders: Self { .product(name: "Builders", package: "swift-builders") }
37+
}
38+
39+
let package = Package(
40+
name: "swift-html",
41+
platforms: [
42+
.iOS(.v17),
43+
.macOS(.v14),
44+
.tvOS(.v17),
45+
.watchOS(.v10),
46+
.macCatalyst(.v17)
47+
],
48+
products: [
49+
// Individual targets
50+
.library(name: .html, targets: [.html]),
51+
.library(name: .htmlTheme, targets: [.htmlTheme]),
52+
.library(name: .htmlComponents, targets: [.htmlComponents]),
53+
.library(name: .htmlMarkdown, targets: [.htmlMarkdown]),
54+
.library(name: .htmlEmail, targets: [.htmlEmail]),
55+
.library(name: .htmlWebsite, targets: [.htmlWebsite]),
56+
// Convenience product with common features
57+
.library(name: .htmlKit, targets: [.html, .htmlTheme, .htmlComponents])
58+
],
59+
dependencies: [
60+
.package(url: "https://github.com/coenttb/swift-html-css-pointfree", from: "0.0.1"),
61+
.package(url: "https://github.com/coenttb/swift-html-types", from: "0.1.0"),
62+
.package(url: "https://github.com/coenttb/swift-svg", from: "0.1.0"),
63+
.package(url: "https://github.com/coenttb/pointfree-html", from: "2.0.0"),
64+
.package(url: "https://github.com/coenttb/pointfree-html-translating", from: "0.0.1"),
65+
.package(url: "https://github.com/coenttb/swift-builders", from: "0.0.1"),
66+
.package(url: "https://github.com/coenttb/swift-translating", from: "0.0.1"),
67+
.package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.9.2"),
68+
.package(url: "https://github.com/swiftlang/swift-markdown", from: "0.4.0"),
69+
.package(url: "https://github.com/apple/swift-collections", from: "1.1.2"),
70+
],
71+
targets: [
72+
.target(
73+
name: .html,
74+
dependencies: [
75+
.htmlCssPointFreeHTML,
76+
.htmlTypesFoundation,
77+
.stringBuilder,
78+
.dependencies,
79+
.orderedCollections,
80+
.htmlTranslating,
81+
.builders,
82+
.product(name: "SVG", package: "swift-svg")
83+
]
84+
),
85+
.target(
86+
name: .htmlTheme,
87+
dependencies: [
88+
.html,
89+
.dependencies
90+
]
91+
),
92+
.target(
93+
name: .htmlWebsite,
94+
dependencies: [
95+
.html,
96+
.htmlComponents,
97+
.htmlMarkdown,
98+
.htmlTheme,
99+
.dependencies,
100+
.htmlTranslating,
101+
.translating
102+
]
103+
),
104+
.target(
105+
name: .htmlComponents,
106+
dependencies: [
107+
.html,
108+
.htmlTheme,
109+
.dependencies,
110+
.orderedCollections,
111+
.htmlTranslating
112+
]
113+
),
114+
.target(
115+
name: .htmlMarkdown,
116+
dependencies: [
117+
.html,
118+
.htmlTheme,
119+
.swiftMarkdown,
120+
.markdownBuilder,
121+
.dependencies,
122+
.orderedCollections
123+
]
124+
),
125+
.target(
126+
name: .htmlEmail,
127+
dependencies: [
128+
.html,
129+
.htmlTheme,
130+
.htmlComponents,
131+
.htmlMarkdown,
132+
.dependencies,
133+
.orderedCollections,
134+
.translating
135+
]
136+
),
137+
.testTarget(
138+
name: .html.tests,
139+
dependencies: [
140+
.html,
141+
.pointFreeHtmlTestSupport
142+
]
143+
),
144+
.testTarget(
145+
name: .htmlTheme.tests,
146+
dependencies: [
147+
.htmlTheme,
148+
.pointFreeHtmlTestSupport
149+
]
150+
),
151+
.testTarget(
152+
name: .htmlComponents.tests,
153+
dependencies: [
154+
.htmlComponents,
155+
.pointFreeHtmlTestSupport
156+
]
157+
),
158+
.testTarget(
159+
name: .htmlMarkdown.tests,
160+
dependencies: [
161+
.htmlMarkdown,
162+
.pointFreeHtmlTestSupport
163+
]
164+
),
165+
.testTarget(
166+
name: .htmlEmail.tests,
167+
dependencies: [
168+
.htmlEmail,
169+
.pointFreeHtmlTestSupport
170+
]
171+
)
172+
]
173+
)
174+
175+
extension String {
176+
var tests: Self { "\(self) Tests" }
177+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// TranslatedString+HTML.swift
3+
// swift-html
4+
//
5+
// TranslatedString integration for HTML (requires Translating trait)
6+
//
7+
8+
import Foundation
9+
import PointFreeHTML
10+
11+
#if TRANSLATING
12+
import Translating
13+
14+
extension TranslatedString: @retroactive HTML {
15+
public var body: some HTML {
16+
HTMLText("\(self)")
17+
}
18+
}
19+
20+
extension HTMLText {
21+
public init(_ translatedString: TranslatedString) {
22+
self = .init("\(translatedString)")
23+
}
24+
}
25+
#endif

0 commit comments

Comments
 (0)