一个用于 Lingo 的 Vapor 提供程序 - Lingo 是一个纯 Swift 本地化库,可用于服务器端 Swift 项目。
在你的 Package.swift
文件中添加 LingoProvider 作为依赖
dependencies: [
...,
.package(name: "LingoVapor", url: "https://github.com/vapor-community/Lingo-Vapor.git", from: "4.2.0")]
],
targets: [
.target(name: "App", dependencies: [
.product(name: "LingoVapor", package: "Lingo-Vapor")
4.1.0 版本使用了新版本的 Lingo,其中本地标识符的格式已更改为符合 RFC 5646。在 4.2.0 之前的版本中,_
用于分隔本地标识符中的语言代码和国家代码,而现在该库按照 RFC 使用 -
。
如果你正在使用任何包含国家代码的区域设置,则需要重命名相关的翻译文件以匹配新格式。
在 configure.swift
中,只需使用默认区域设置初始化 LingoVapor
import LingoVapor
...
public func configure(_ app: Application) throws {
...
app.lingoVapor.configuration = .init(defaultLocale: "en", localizationsDir: "Localizations")
}
localizationsDir
可以省略,因为 Localizations 也是默认路径。请注意,此文件夹应存在于 workDir 下。
配置提供程序后,你可以使用 lingoVapor
服务来创建 Lingo
let lingo = try app.lingoVapor.lingo()
...
let localizedTitle = lingo.localize("welcome.title", locale: "en")
要从请求中获取用户的区域设置,你可以使用 request.locale
。这将使用 HTTP 标头中的语言,如果该语言在你的可用区域设置中,则使用该语言。否则,它将回退到默认区域设置。现在你可以动态地使用不同的区域设置
let localizedTitle = lingo.localize("welcome.title", locale: request.locale)
当覆盖请求的区域设置时,只需将新的区域设置写入会话,例如像这样
session.data["locale"] = locale
使用以下语法在 JSON 文件中定义本地化
{
"title": "Hello Swift!",
"greeting.message": "Hi %{full-name}!",
"unread.messages": {
"one": "You have one unread message.",
"other": "You have %{count} unread messages."
}
}
如果你想在不同的子文件夹上提供不同的区域设置,你可以使用 LocaleRedirectMiddleware
。
添加到 configure.swift
中
import LingoVapor
// Inside `configure(_ app: Application)`:
app.middleware.use(LocaleRedirectMiddleware())
添加到 routes.swift
中
import LingoVapor
// Inside `routes(_ app: Application)`:
app.get("home") { /* ... */ }
app.get(":locale", "home") { /* ... */ } // For each route, add the one prefixed by the `locale` parameter
这样,访问 /home/
将把你重定向到 /<locale>/home/
(其中 <locale>
对应于你的浏览器区域设置),而访问 /fr/home/
将以法语显示主页,无论浏览器区域设置是什么。
当使用 Leaf 作为模板引擎时,你可以使用 LingoVaporLeaf
中的 LocalizeTag
、LocaleTag
和 LocaleLinksTag
在模板内进行本地化。
添加到 configure.swift
中
import LingoVaporLeaf
// Inside `configure(_ app: Application)`:
app.leaf.tags["localize"] = LocalizeTag()
app.leaf.tags["locale"] = LocaleTag()
app.leaf.tags["localeLinks"] = LocaleLinksTag()
之后,你可以在 Leaf 模板中调用它们
<!-- String localization -->
#localize("thisisthelingokey")
#localize("lingokeywithvariable", "{\"foo\":\"bar\"}")
<!-- Get current locale -->
<html lang="#locale()">
<!-- Generate link canonical and alternate tags -->
#localeLinks("http://example.com/", "/canonical/path/")