跳到正文

← 全部工具

给 iOS 和 Mac 开发者的免费工具

.strings 和 .stringsdict 转字符串目录

拖入你的 Localizable.strings(每种语言一个,来自各 xx.lproj 文件夹)和 .stringsdict,下载一个 Localizable.xcstrings。注释变成每个键的注释,.stringsdict 的复数规则变成复数变体,%@、%lld 等格式符原样保留,每条翻译都标记为已翻译。也可以反过来:打开字符串目录,按语言得到 .strings,复数部分另生成 .stringsdict。全部在本页运行,不会上传任何内容。

方向

拖入 .strings 和 .stringsdict 文件,或包含各 .lproj 文件夹的目录

每种语言一个 Localizable.strings,外加任意 .stringsdict。语言从 xx.lproj 文件夹名读取;读不到时请手动选择。文件只在本页读取,不会上传。

你的字符串目录

至少添加一个设置了语言的 .strings 或 .stringsdict 文件,就能看到目录。

它是怎么工作的

  • •每个 .strings 按 Apple 的 strings 文件格式读取:UTF-8 或 UTF-16(由字节顺序标记判断),/* */ 和 // 注释,转义的引号,\n、\t、\U 转义,以及 Apple 允许的不带引号的键。XML 或二进制 plist 格式的 .strings 也能读取。
  • •条目正上方的注释成为目录里该键的注释。占位注释“No comment provided by engineer.”会被去掉。各语言注释不同时,以源语言的为准。
  • •格式只有一个复数变量的 .stringsdict 条目,变成分支相同的复数变体(zero、one、two、few、many、other)。变量前后还有文字或有多个变量的,变成替换(substitutions),数字的格式符写成 %arg,与 Xcode 的存储方式一致。设备规则变成设备变体。
  • •我们用 Xcode 自带的命令行工具检查过结果:本页生成的目录经 xcstringstool compile 编译后,得到的 .strings 值和复数规则与原文件相同,JSON 的写法也和 Xcode 完全一致。
  • •反向转换按 Xcode 构建时的方式拆分目录:普通字符串写入 .strings,复数、替换和设备变体写入 .stringsdict。我们把输出与 xcstringstool compile 的结果做过对比,生成的每个 .strings 都能被 plutil 读取。

它做不到的事

  • •宽度变体(NSStringVariableWidthRuleType)、引用其他变量的复数分支,以及变体里套变体,都不会转换。页面会列出每一条未转换的内容。
  • •转换后的每条翻译都标记为“已翻译”。页面无法知道哪些还需要复核。
  • •它不扫描代码,所以不知道哪些键还在使用。Xcode 会在下次构建时检查,并把不再使用的键标记为过期。
  • •不转换 .xliff 或 .xcloc 导出文件。这些请用 Xcode 的 Import Localizations。
  • •反向转换时,目录里的状态(新增、需复核)不会保留:.strings 文件没有地方存放它们。

常见问题

Xcode 自己不能把 .strings 转成字符串目录吗?
可以:Xcode 15 及以后的版本能把项目里的 .strings 和 .stringsdict 迁移为字符串目录。本页适合那样做不方便的时候:文件来自别的项目或译者、不想打开项目、想先看看目录里会有什么,或者要为旧工具或旧的部署版本转回 .strings。
.stringsdict 的复数怎么对应到字符串目录?
格式只有复数变量(例如 %#@photos@)的规则,变成复数变体:每个分支(one、other 等)保留原文,例如“%d photo”。格式里还有其他内容的(例如“%#@files@ in %@”),变成一个带名为 files 的替换的字符串,替换内部的数字写成 %arg。这正是 Xcode 自己使用的形式。
每个文件是哪种语言?
页面从文件夹名读取:de.lproj 是德语,zh-Hans.lproj 是简体中文。选择或拖入整个文件夹时,文件夹名会一起传过来。如果只选了单个文件,浏览器不会提供文件夹名,请在列表里为每个文件设置语言。
支持 UTF-16 编码的 .strings 吗?
支持。旧项目和 genstrings 经常写出带字节顺序标记的 UTF-16;本页能读取两种字节顺序的 UTF-16,以及带或不带字节顺序标记的 UTF-8。目录总是按 Xcode 的方式写成 UTF-8 JSON。
为什么源语言的条目比其他语言少?
在字符串目录里,键就是源文本。源语言条目的文本和键完全相同时("Cancel" = "Cancel"),Xcode 不为它存任何内容,本页也一样。源文本和键不同时(例如键是 "delete_album"),才会存下来。
会上传什么吗?
不会。文件由本页的 JavaScript 读取,结果在你的浏览器里生成。页面加载后断开网络,它照样能用。

相关工具