App的国际化和本地化(九) —— 自己管理字符串文件(一)

版本记录

版本号 时间
V1.0 2018.05.13

前言

很多APP都有国际化版本,常见于一些大公司的产品,比如Facebook、Wechat等,那么国际化需要我们APP做哪些更改呢,接下来这几篇就一起来看一下APP的国际化和本地化。感兴趣的可以看上面几篇。
1. App的国际化和本地化(一) —— 简单介绍(一)
2. App的国际化和本地化(二) —— 查看语言和区域设置(一)
3. App的国际化和本地化(三) —— 国际化用户界面(一)
4. App的国际化和本地化(四) —— 国际化代码(一)
5. App的国际化和本地化(五) —— 使用区域设置格式化数据(一)
6. App的国际化和本地化(六) —— 支持从右到左的语言(一)
7. App的国际化和本地化(七) —— 本地化你的App(一)
8. App的国际化和本地化(八) —— 测试您的国际化应用程序(一)

回顾

上一篇主要介绍测试您的国际化应用程序,本篇主要介绍自己管理字符串文件。


Managing Strings Files Yourself - 自己管理字符串文件

如果要自行生成并翻译存储在项目文件夹中的字符串文件,请按照本附录中的步骤操作。 在这种情况下,您可以添加要支持的语言,生成字符串文件,并使用AppleGlot词汇表或其他进程本地化字符串文件。 当您更改用户界面或将面向用户的文本添加到代码中时,您有责任更新字符串文件。

如果要管理自己的字符串文件,请首先将您想支持的语言添加到项目中,如Using Base Internationalization中所述。

重要的事:或者,Xcode会自动生成字符串文件,并将它们添加到项目中,如导出本地化版本,编辑XLIFF文件(其中包含字符串文件)并导入它们,如Localizing Your App中所述。


Viewing Language Folders in the Finder - 在Finder中查看语言文件夹

导入本地化或添加语言后,您可以在Finder中查看不同的语言文件夹。项目导航器中出现在组中的本地化资源位于项目文件夹中的单独语言文件夹中。当您导出和导入本地化时,Xcode会为您管理这些文件夹。要在Finder中查看语言文件夹,按住Control键并点按项目导航器中的项目,然后从快捷菜单中选择Show in Finder

项目文件夹应该包含一个名为Base.lproj的文件夹和其他具有.lproj扩展名的语言特定的文件夹。语言文件夹的前缀是language ID,如Language and Locale IDs中所述。

Base.lproj文件夹包含开发语言中的所有.storyboard.xib文件。添加到项目中的语言文件夹包含项目中每个.storyboard.xib文件的字符串文件。开发语言文件夹不包含.storyboard.xib文件的字符串文件,因为它们不需要开发语言中的翻译。所有语言文件夹都包含一个InfoPlist.strings文件,用于本地化包的属性,例如应用程序名称。任何其他本地化资源(例如您从代码生成并使用的字符串文件)都会显示在这些语言文件夹中。

例如,对于使用英语作为开发语言的通用iOS应用程序,Base.lproj文件夹包含Main_iPad.storyboardMain.iPhone.storyboard,而en.lproj文件夹包含InfoPlist.strings。如果添加德语,Xcode将创建一个包含InfoPlist.stringsMain_iPad.stringsMain_iPhone.strings文件的de.lproj文件夹。 de.lproj文件夹中的文件包含需要翻译为德语的占位符文本。

对于使用英语作为开发语言的Mac应用程序,文件结构可能类似于:


Creating Strings Files for User-Facing Text in Your Code - 为代码中的面向用户的文本创建字符串文件

按照Separating User-Facing Text from Your Code中所述,使用NSLocalizedString宏替换包含面向用户的文本的字符串后,可以创建并本地化相应的字符串文件。

To create a strings file for user-facing text - 为面向用户的文本创建一个字符串文件

  • 使用genstrings脚本来创建Localizable.strings文件的开发语言版本。

在终端中,运行这些命令:

cd [Project folder]
find . -name \*.m | xargs genstrings -o .

对于源文件中每一个NSLocalizedString宏的出现,脚本都会将注释以键值对(使用该值的占位符文本)添加到Localizable.strings文件中,如

/* distance for a marathon */
"RunningDistance" = "RunningDistance";

如果在代码中使用NSLocalizedString宏,则该键的值将默认为该键。 如果您需要不同的行为,请使用Foundation Functions参考中介绍的采用更多参数的其他NSLocalizedString宏之一。

  • Localizable.strings文件添加到所有语言文件夹。

将该文件添加到您的Xcode项目中,如Adding Languages中所述。 出现对话框时,不要将Localizable.strings添加到基本本地化中。

注意:如果Xcode警告您Localizable.strings文件看起来是Unicode(UtF-16),则可以使用文件检查器将其转换为Unicode(UTF-8)。 要将文件转换为UTF-8,请在项目导航器中选择该文件,然后打开文件检查器。 在文本设置部分,从文本编码弹出式菜单中选择Unicode(UTF-8)。 在出现的对话框中,点击转换。

  • 本地化每个语言文件夹中的Localizable.strings文件。

例如,在en.lproj / Localizable.strings文件中,输入RunningDistance键的英文翻译:

/* distance for a marathon */
"RunningDistance" = "26.22 miles";

ja.lproj / Localizable.strings文件中,输入RunningDistance键的日语翻译:

/* distance for a marathon */
"RunningDistance" = "42.20 キロメートル";

在对代码进行这些类型的更改时逐渐测试您的应用程序。 本地化一组语言文件或使用伪定位技术,如Testing Using Pseudolanguages中所述


Localizing Strings Files - 定位字符串文件

在向项目添加语言时,Xcode将在.storyboard.xib文件中找到的所有面向用户的文本添加到相应的字符串文件中。 Xcode在标识显示文本的视图的每个键值对之前插入注释。 例如,在这个字符串文件的片段中,列标题Location和文本字段标签Address:for:require translation

/* Class = "NSTableColumn"; headerCell.title = "Location"; ObjectID = "f0Y-kT-hVz"; */
"f0Y-kT-hVz.headerCell.title" = "Location";
 
/* Class = "NSTextFieldCell"; title = "Address:"; ObjectID = "gfa-oA-9cr"; */
"gfa-oA-9cr.title" = "Address:";
 
/* Class = "NSTextFieldCell"; title = "for:"; ObjectID = "gsV-Sg-yiA"; */
"gsV-Sg-yiA.title" = "for:";

genstrings脚本还会搜索您的代码以获取面向用户的文本,并将其添加到字符串文件中,如 Separating User-Facing Text from Your Code所述。 除了您的代码为翻译员提供注释外,文件格式相同。 要本地化字符串文件,请指示译员使用本地化文本替换占位符文本 - 显示在评论下方等号的右侧。


Localizing Strings Files Using AppleGlot - 使用AppleGlot本地化字符串文件

另一种方案,使用AppleGlot执行字符串文件的一些初始翻译。例如,使用AppleGlot根据您在创建项目时选择的模板,将Xcode添加到用户界面的视图的文本本地化。然后,您可以专注于本地化仅添加到用户界面的特定于应用程序的文本。

AppleGlot是iOS和Mac应用程序开发人员的本地化工具。 AppleGlot提供iOS和Mac语言词汇表来帮助您翻译常用文本字符串。它还可以将面向用户的文本导出为标准格式,本地化人员可以轻松地将其翻译成多种语言。 AppleGlot支持增量开发,因此您只需在每个发行版中将更改转换为用户文本。

要下载AppleGlot和语言词汇表,请转到Build Apps for the WorldUnder Programming Resources > Downloads,单击AppleGlot and Localization Glossaries。如有必要,输入您的Apple ID并单击登录。下载AppleGlot的.dmg文件以及您支持的语言。要安装AppleGlot,请打开AppleGlot.dmg文件并双击AppleGlot.pkg

在本地化文件之前,您可以使用AppleGlot语言词汇表翻译所有常用文本字符串。

To translate your .storyboard and .xib strings files using AppleGlot glossaries - 使用AppleGlot术语表翻译您的.storyboard和.xib字符串文件

  • 在终端中,创建一个AppleGlot环境
mkdir [MyAppleGlotEnvironment]
cd [MyAppleGlotEnvironment]
appleglot -w create .
  • 设置源语言和目标语言。
appleglot -w setlangs [base_language_id] [target_langauge_id]

例如,如果开发语言是英语且目标是俄语,请将en传递给base_language_id,将ru传递给target_langauge_id

  • 在Finder中,将语言资源文件夹粘贴到AppleGlot环境_NewBase文件夹中。

如果使用base internationalization,请将特定于语言的文件夹[target_language_id] .lproj粘贴到_NewBase文件夹中,并将文件夹的名称更改为[base_language_id] .lproj。例如,将ru.lproj粘贴到_NewBase中,并将名称更改为en.lproj

否则,如果您不使用base internationalization[base_language_id] .lproj文件夹应该包含您想要翻译成目标语言的所有字符串文件。

  • 打开目标语言词汇表.dmg,并将词汇表(具有.lg扩展名的文件)复制到_LanguageGlossaries文件夹中。

  • 在终端中,填充_NewLoc文件夹。

appleglot -w populate

这将在_ApplicationDictionaries文件夹中创建一个.ad文件,其中包含以前翻译的字符串和_WorkGlossary文件夹中的.wg文件,该文件夹包含项目中的所有字符串,尽可能多地使用语言词汇表中的所有字符串。

  • 或者,使用支持这些文件格式的第三方本地化工具,使用adwg扩展名来定位文件中剩余的字符串。

  • 在终端中,将翻译整合到您的字符串文件中。

appleglot -w update
appleglot -w finalize
  • 在Finder中,将本地化资源粘贴到Xcode项目文件夹中。

_NewLoc / [base_language_id] .lproj文件夹的内容粘贴到Xcode项目文件夹中的[target_language_id] .lproj文件夹中。 例如,如果目标语言是俄语,请将_NewLoc / en.lproj文件夹的内容粘贴到ru.lproj文件夹中。

对于Mac应用程序,Xcode模板中的主菜单项会出现翻译,除了应用程序名称的出现。

有关AppleGlot的更多信息,请阅读位于AppleGlot.dmg文件中的AppleGlot 4 User’s Guide


Updating Storyboard and Xib Strings Files Using ibtool - 使用ibtool更新Storyboard和Xib字符串文件

.storyboard.xib文件中更改面向用户的文本时,请使用ibtool命令生成新的字符串文件。使用另一个工具(例如FileMerge)来识别更改并将它们合并到您支持的每种语言的现有字符串文件中。编辑.storyboard或.xib文件时,Xcode不会自动更新相应的字符串文件。

在终端中,切换到Base.lproj文件夹,然后运行此命令为xib文件生成一个字符串文件:

ibtool [MyNib] .xib --generate-strings-file [MyNib_new.strings]

或者,在将更改与每个lproj文件夹中的[MyNib] .strings文件合并之前,将输出文件中的更改本地化。要从Xcode启动FileMerge,请选择Xcode> Open Developer Tool> FileMerge

或者,您可以使用ibtool命令将翻译合并回nib文件并执行其他增量本地化更新,如ibtool手册页中所述。或者使用appleglot命令来管理对字符串文件的更改,如Importing Localizations中所述


Creating a Pseudolocalization - 创建伪定位

如果Testing Your Internationalized App中描述的伪定位选项不足以测试您的应用程序,请创建您自己的伪定位。 将语言添加到您的项目中,如Using Base Internationalization中所述。 通过用伪文本替换占位符文本来编辑语言文件夹中的字符串文件。 如Testing Specific Languages and Regions中所述设置语言启动参数,然后运行您的应用程序。

例如,通过添加世界语言的特征来编辑字符串文件中的占位符文本,但保持原文可读,如

/* distance for a marathon */
"RunningDistance" = "[ŔûüñńîńɠƊïšṱáäńçêè]";

一种技术是为每个字符串添加前缀和后缀。 然后,您可以轻松识别在测试应用程序时这些前缀和后缀不显示的位置。 使用多字节字符作为前缀来验证您的应用是否支持这些字符

后记

本篇主要讲述了自己管理字符串文件,感兴趣的给个赞或者关注~~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容