Lingo 提供程序

Language GitHub license

一个用于 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 版本升级到 4.2.0 版本

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 模板中

当使用 Leaf 作为模板引擎时,你可以使用 LingoVaporLeaf 中的 LocalizeTagLocaleTagLocaleLinksTag 在模板内进行本地化。

添加到 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/")

了解更多