此软件包是 NStack.io API 的封装器。
支持以下 NStack 模块
将 NStack
添加到 Package 依赖项
dependencies: [
// ...,
.package(url: "https://github.com/nodes-vapor/nstack.git", from: "3.0.0")
]
以及添加到你的目标(例如,“App”)
targets: [
.target(name: "App", dependencies: [..., "NStack", ...]),
// ...
]
在需要的地方导入 NStack
import NStack
创建 NStack.Config
以配置 NStack
、你的 Applications
以及默认的 Translate.Config
。
let nstackConfig = NStack.Config(
applicationConfigs: [
Application.Config(
name: "my app name",
applicationId: "NEVER_PUT_API_IDS_IN_SOURCE_CODE",
restKey: "NEVER_PUT_API_KEYS_IN_SOURCE_CODE"
)
],
defaultTranslateConfig: TranslateController.Config(
defaultPlatform: .backend,
defaultLanguage: "en-EN",
cacheInMinutes: 1
),
log: false
)
如果将 log
设置为 true
,你将收到有用的日志,以防万一出现任何问题。
实例化并注册 NStackProvider
,使用在上一步中创建的配置。如果你计划使用 leaf 标签(见下文),请确保使用同步缓存,例如 MemoryKeyedCache
(而不是 RedisCache
);否则可能会破坏你的 leaf 模板,请参阅 https://github.com/vapor/leaf/issues/134
在 configure.swift
中
// MARK: NStack
try services.register(
NStackProvider(
config: nstackConfig,
cacheFactory: { container in try container.make(MemoryKeyedCache.self) }
)
)
func getProductName(req: Request) throws -> Future<String> {
// ...
let nstack = try req.make(NStack.self)
let translation = nstack.application.translate.get(on: req, section: "products", key: "nstackForSale")
return translation
}
你还可以提供 searchReplacePairs
func getProductName(req: Request, owner: String) throws -> Future<String> {
let nstack = try req.make(NStack.self)
let translation = nstack.application.translate.get(
on: req,
section: "products",
key: "nstackForSale",
searchReplacePairs: [
"productOwner" : owner
]
)
return translation
}
如果你在项目中使用多个 NStack 应用程序,你可以使用 getApplication()
切换它们
let nstack = try req.make(NStack.self)
let translation = nstack.getApplication("my app name").translate.get(on: req, section: "products", key: "nstackForSale")
注意:如果你不想使用 defaultTranslateConfig
中提供的值,你可以进一步指定 get()
调用
let translation = nstack.application.translate.get(
on: req,
platform: .backend,
language: "dk-DK",
section: "products",
key: "nstackForSale",
searchReplacePairs: [
"productOwner" : "Christian"
]
)
为了渲染 NStack Leaf 标签,你需要先添加它们
public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
services.register { container -> LeafTagConfig in
var tags = LeafTagConfig.default()
try tags.useNStackLeafTags(container)
return tags
}
}
NStack 带有内置的 Leaf 标签。该标签会生成翻译后的字符串,如果翻译失败,则生成给定的键
// Get translation for camelCasedSection.camelCasedKey
#nstack:translate("camelCasedSection", "camelCasedKey")
// Get translation for camelCasedSection.camelCasedKey and replace searchString1 with replaceString1 etc
#nstack:translate("camelCasedSection", "camelCasedKey", "searchString1", "replaceString1", "searchString2", "replaceString2", ...)
重要提示: 由于 leaf 中的一个错误,你必须确保在渲染视图时,翻译已加载并同步可用。这可以通过在视图的路由上使用 NStackPreloadMiddleware
来实现
let nstackPreloadMiddleware = try container.make(NStackPreloadMiddleware.self)
let unprotectedBackend = router.grouped(nstackPreloadMiddleware)
请注意,leaf 标签始终使用你提供的当前应用程序和默认翻译配置。
NStack 能够检索特定平台的最新版本。你可以使用 getLatestVersion(for platform: Platforms) -> Future<UpdateVersion?>
方法来实现,例如
let nstack = try NStack.makeService(for: req)
nstack.application.version.getLatestVersion(for: .android)
NStack 可用于存储 JSON 响应。要使用此功能,你可以使用 ResponseController
。
let nstack = try NStack.makeService(for: req)
nstack.application.response[42].do { (response: Response) in
print(response.content)
}
这将获取未修改的 NStack Response
,其中你的 JSON 数据在以 data
为键的对象中,例如
{"data":{"myJSONData":"Starts here"}}
或者,你可以像这样解码你的 JSON 对象
nstack.application.response[42].do { (response: [String: String]) in
print(response)
}
这将产生你的 Decodable
对象,在本例中是我们的字典:["myJSONData": "Starts here"]
。
NStack 使用 Vapor 注册的 KeyedCache
。如果你没有注册任何缓存,这应该是 KeyedMemory
缓存。如果你配置 Vapor 以首选另一个缓存,NStack 将改为使用这个缓存。Redis 示例
在 configure.swift
中
config.prefer(DatabaseKeyedCache<ConfiguredDatabase<RedisDatabase>>.self, for: KeyedCache.self)
此软件包由 Nodes 的 Vapor 团队开发和维护。
此软件包是根据 MIT 许可证 开源的软件