LocalizedStringKit

LocalizedStringKit Logo

LocalizedStringKit 是一款工具,可让您直接在源代码中编写英语字符串,并在稍后生成所需的 .strings 文件。无需再手动管理字符串键或记住稍后将它们添加到 strings 文件中。您只需更改

label.text = NSLocalizedString("TERMS_SCREEN_MAIN_HEADER", "Comment here...")

变为

label.text = Localized("Terms and Conditions", "Comment here...")

即可开始使用。

入门指南

应用程序库

该工具的应用程序端由 LocalizedStringKit 库提供支持。

推荐的使用此库的方式是通过 Carthage。添加到您的 Cartfile 的行是:github "Microsoft/localizedstringkit"

如有任何问题,请参阅 Carthage 文档。

字符串 bundle

应用程序和库需要能够访问字符串 bundle。为此,我们将进行一些基本设置

主 Bundle

  1. 在您的应用程序项目中的某个位置创建一个名为 LocalizedStringKit 的文件夹。
  2. 在该文件夹内,创建一个名为 LocalizedStringKit.bundle 的新文件夹(这将使其成为 bundle)。
  3. 将此 bundle 添加到 Xcode 中的项目
  4. 确保此 bundle 已复制到您的主应用程序 bundle(即使您要在框架中使用它)。

磁盘结构现在看起来像

ProjectName/
├── LocalizedStringKit/
|   ├── LocalizedStringKit.bundle/

辅助 Bundle:bundleNames

要利用多个 bundle 中字符串的 bundleName 分段,您还需要创建这些 bundle。

  1. 导航到在主设置中创建的第一个 LocalizedStringKit 文件夹。
  2. 在该文件夹内,创建一个名为 <bundleName>.bundle 的新文件夹(这将使其成为 bundle)。确保将 bundleName 替换为您将在源代码中使用的区分大小写的 bundleName。
  3. 将此 bundle 添加到 Xcode 中的项目
  4. 确保此 bundle 已复制到您的主应用程序 bundle(即使您要在框架中使用它)。

创建一些新字符串

在您的源代码中,添加如下代码

label.text = Localized("My new string", "A comment")

记住在文件中 import LocalizedStringKit

生成您的字符串

现在一切就绪,可以生成 .strings 文件了。为此,您需要我们用来生成字符串文件的工具。它是一个 Python 工具,可以通过运行 pip install localizedstringkit 来安装。

安装该工具后,您只需运行 localizedstringkit -h,它将向您展示如何调用它。这是一个示例

localizedstringkit \
--path /path/to/my/project/root \
--localized-string-kit-path /path/to/my/project/root/LocalizedStringKit

这将扫描 /path/to/my/project/root/ 中的所有 Swift 和 Objective-C 文件,提取对 Localized 的任何调用,并生成 en.lproj/LocalizedStringKit.strings 文件。它还将生成一个 source_strings.m 文件作为中间步骤。此文件被保留,因为它允许快速运行 localizedstringkit --check 命令。如果需要,您可以将其添加到您的 .gitignore 中。

就是这样。您现在已经开始使用 LocalizedStringKit 了。

注意:请记住,如果您使用 Carthage 进行安装,则需要在命令中添加 --exclude Carthage(或您的路径),以避免将库本身标记出来。

常见问题解答

如何使此工具更快?

我们知道这个工具有点慢。不幸的是,我们几乎无法加快它的速度。相反,我们开发了一个可以使用的 --check 标志。如果 source_strings.m 存在于 repo 中,它会将 repo 的状态与该文件进行比较,如果存在差异,则返回非零退出代码。如果该文件不存在,则 check 标志将始终返回非零退出代码。

这可以作为库使用吗?

是的,当然可以。只需 import localizedstringkit 即可。

如何迁移现有字符串?

没有内置方法来迁移现有字符串,但这相对简单。首先按照上面的设置步骤操作。然后将所有 NSLocalizedString 调用转换为 Localized 调用,将您的手动键替换为英语字符串。然后运行上面提到的生成脚本。然后,您需要通过类似的过程移动您的翻译。

如何处理冲突?

如果您有两个相同的字符串,那么它们将被“合并”。通过这种方式,它们将共享相同的键,但注释将被附加。结果在 LocalizedStringKit.strings 文件中看起来像这样

/* Text on button which when tapped will send an email message to a user
   Text on button which when tapped will send a message to the support team */
"1432f32780bbd9cde496343b060fd75d" = "Send Message";

但是,在某些情况下,您不希望这种情况发生。例如,您可能有一个单词 Schedule 作为屏幕标题出现,该屏幕显示用户的每日日程安排,但它也是一个您可以按下的按钮以安排会议。在一种情况下,该单词是名词,另一种情况是动词。这些在其他语言中通常是不同的词,因此您要确保它们获得唯一的翻译。为此,您可以使用键扩展。例如

// Heading
title.text = LocalizedWithKeyExtension("Schedule", "Title for a screen which shows the users daily schedule", "Noun")

// Button
button.text = LocalizedWithKeyExtension("Schedule", "Text for a button which will schedule the meeting currently displayed on screen.", "Verb")

在这种情况下,英语字符串和扩展名(在本例中为 VerbNoun)将在哈希处理之前连接,以生成键,从而使这两种情况具有不同的键。键扩展可以是您喜欢的任何字符串。

为什么我的应用程序在使用后变得更大?

默认情况下,.strings 文件采用旧的 OpenStep plist 格式。当您通过 Xcode 使用标准功能时,它会在构建时自动将这些文件转换为二进制 plist。使用此过程的自定义 bundle,这种情况不再自动发生。但是,要修复它,相对简单。只需在您的主应用程序构建阶段添加一个新的运行脚本阶段,并将以下行添加到其中

find "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/LocalizedStringKit.bundle" -name "LocalizedStringKit.strings" -exec plutil -convert binary1 {} \;

在构建时,您的二进制文件中的文件现在将被压缩。

这可以通过 Swift Package Manager 获得吗?

是的,它在 Swift Package Index 上列出,此处

贡献

此项目欢迎贡献和建议。大多数贡献都要求您同意贡献者许可协议 (CLA),声明您有权并将实际授予我们使用您的贡献的权利。有关详细信息,请访问 https://cla.opensource.microsoft.com

当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA,并适当地修饰 PR(例如,状态检查、评论)。只需按照机器人提供的说明进行操作即可。您只需在使用我们 CLA 的所有仓库中执行此操作一次。

本项目已采用 Microsoft 开源行为准则。有关更多信息,请参阅 行为准则常见问题解答 或通过 opencode@microsoft.com 联系 opencode@microsoft.com 提出任何其他问题或意见。