LocalizedStringKit
LocalizedStringKit 是一个工具,允许您直接在源代码中编写英文字符串,并在以后生成所需的 .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 文档。
字符串包
应用程序和库需要能够访问字符串包。为此,我们需要做一些基本的设置
主要包
- 在您的应用程序项目中创建一个名为
LocalizedStringKit
的文件夹。 - 在该文件夹内部,创建一个新的文件夹命名为
LocalizedStringKit.bundle
(这将将其转换成一个包)。 - 将此包添加到您的Xcode项目中
- 确保此包被复制到您的主应用程序包中(即使您将在框架中使用它)。
磁盘结构将看起来像这样
ProjectName/
├── LocalizedStringKit/
| ├── LocalizedStringKit.bundle/
二级包(们):packageNames
为了利用多个包中字符串的bundleName分段,您还需要创建这些包。
- 导航到第一次创建的主
LocalizedStringKit
文件夹。 - 在该文件夹内部,创建一个新的文件夹命名为
<packageName>.bundle
(这将将其转换成一个包)。请确保用您在源代码中将使用的某些敏感性包名称替换packageName
。 - 将此包添加到您的Xcode项目中
- 确保此包被复制到您的主应用程序包中(即使您将在框架中使用它)。
创建一些新的字符串
在您的源代码中,添加一些代码
label.text = Localized("My new string", "A comment")
记得也要在文件中导入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
文件中,如果 preferred。
这样就完成了。您现在可以使用LocalizedStringKit了。
注意:如果你使用Carthage进行安装,需要在命令中添加--exclude Carthage
(或相应的路径)以避免将库本身标记。
常见问题
如何让这个工具更快?
我们知道这个工具有点慢。不幸的是,我们无法做太多让它加速。相反,我们已经开发了一个--check
标志可以使用。如果repo中存在source_strings.m
文件,它将比较repo状态与该文件,如果存在差异将返回非零退出代码。如果该文件不存在,检查标志将始终返回非零退出代码。
这个可以作为库使用吗?
当然可以。只需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")
在这种情况下,英语字符串和扩展(在此例中为Verb
或Noun
)将在哈希之前连接起来生成键,从而使这两个情况具有不同的键。键扩展可以是您喜欢的任意字符串。
为何执行此操作后应用程序变大?
默认情况下,.strings
文件使用旧的OpenStep plist格式。您通过Xcode使用标准功能时,它会自动在构建过程中将其转换为二进制plist。但是,使用此过程的自定义捆绑包,这不再自动发生。然而,要解决这个问题,相对简单。只需将一个新运行脚本阶段添加到主应用程序的构建阶段,并向其中添加以下行:
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的所有存储库中这样做一次。
本项目采用了微软开源行为准则。如需更多信息,请参阅行为准则FAQ,或通过[email protected]联系,有任何疑问或意见请提出。