NStack 🛠

Swift Version Vapor Version CircleCI codebeat badge codecov Readme Score GitHub license

此软件包是 NStack.io API 的封装器。

支持以下 NStack 模块

📦 安装

Package.swift

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"
    ]
)
Leaf 标签

为了渲染 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 许可证 开源的软件