iOS如何本地化模块中的文件

Wil*_*ken 1 iphone translation localization internationalization ios

我有一个课程,实现了我们都知道和喜爱的"拍照/选择图书馆".正是在这里https://github.com/fulldecent/FDTake这包括在我的其他项目通过git的子模块和工作正常.

现在我需要将该课程中的文本翻译成中文,因此它是"拍照/选照片"或类似的东西.有没有一种很好的方式将翻译放在那里,所以每个人都可以使用它们?

Ola*_*laf 5

本地化通常由NSLocalizedString(<#key#>, <#comment#>)宏处理.在源代码中,用宏替换所有硬编码字符串.例如:

    [self.buttonTitles addObject:@"Hi"]; // hard coded greeting
Run Code Online (Sandbox Code Playgroud)

    [self.theLabel setText:(NSLocalizedString(@"theKey", @"Hi"))];
Run Code Online (Sandbox Code Playgroud)

然后genstrings(从终端内部)用于扫描实现文件(*.m)并将其输出写入语言项目文件夹(此处:en.lproj)

    $ genstrings -o en.lproj/ *.m
Run Code Online (Sandbox Code Playgroud)

在目录中en.lproj/调用一个文件Localizable.strings.其内容将是:

/* Hi */
"theKey" = "theKey";
Run Code Online (Sandbox Code Playgroud)

评论/* Hi */来自我们的源代码.该字符串Hi应显示给(说英语的)用户.所以我们需要编辑等号右边的字符串并使其成为问候语,= "theKey"必须成为= "Hi":

/* Hi */
"theKey" = "Hi!";
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好

如果只有几个字符串或者没有打算修改字符串,那么这一切都很好.gestrings再次运行时,它将覆盖修改,你实际上失去了完成的工作Localizable.strings.一个想法可能是将genstrings的输出写入不同的位置.但是,您必须手动合并更改.一旦Localizable.strings文件增长,它就变成了一个噩梦,试图保持源代码并保持Localizable.strings同步.所以我们试着避免这种情况.

使用有很大的帮助NSLocalizedStringWithDefaultValue(<#key#>, <#tbl#>, <#bundle#>, <#val#>, <#comment#>).该宏将允许在Localizable.strings文件中设置默认值,此外,它将使得对值字段的初始编辑的需要消失.

把它放在一起:

[self.theLabel setText:NSLocalizedStringWithDefaultValue(@"theKey2", @"Localizable", [NSBundle mainBundle], @"Hi!", @"informal greeting"))];
Run Code Online (Sandbox Code Playgroud)

运行genstrings上面使用的命令后,现在有一个小的不同Localizable.strings

/* informal greeting */
"theKey2" = "Hi!";
Run Code Online (Sandbox Code Playgroud)

除了现在告诉翻译我们想要非正式问候的评论之外,“Hi!”已经存在于价值领域.无需转到Localizable.strings文件,搜索正确的行,将字段"theKey"修改为"Hi!".genstrings我们根据NSLocalizedStringWithDefaultValue提供的默认值为我们做了这个.

将文件添加Localizable.strings到xcode项目.

做翻译

更改源代码后,对于Xcode内部的新语言,首先添加本地化Localizable.strings.Xcode将Localizable.strings根据原始文件生成子文件夹下 的副本Localizable.strings.

我个人不会说中文,而是说德语.因此,如果要添加德语本地化,我的翻译将被删除de.lproj/Localizable.strings,意大利语it.lproj/等等.

Localizable.strings根据需要编辑新内容:

(德语)

/* informal greeting */
"theKey2" = "Hallo!";
Run Code Online (Sandbox Code Playgroud)

(意大利)

/* informal greeting */
"theKey2" = "Ciao!";
Run Code Online (Sandbox Code Playgroud)

然后构建并运行.

********* begin edit

把它捆绑起来

以上考虑了"标准"xcode项目.您在询问是否批量模拟模块,因此允许您的代码成为项目的补充.我建议你创建一个包含本地化的包.当有人将您的代码包含到他们的项目中时,本地化将保持独立.有关bundle的完整文档在这里.

使用捆绑包进行本地化的项目是QuincyKit(可能还有更多,这是第一个想到的)

因此,将定位成比其它束时mainBundle[NSBundle mainBundle]在下面的线必须改变

    [self.theLabel setText:NSLocalizedStringWithDefaultValue(@"theKey2", @"Localizable", [NSBundle mainBundle], @"Hi!", @"informal greeting"))];
Run Code Online (Sandbox Code Playgroud)

而不是从mainBundle获取字符串,获取对您自己的模块的引用.文档建议:

    NSBundle* myBundle = [NSBundle bundleForClass:[self class]];
Run Code Online (Sandbox Code Playgroud)

这条线变成:

    [self.theLabel setText:NSLocalizedStringWithDefaultValue(@"theKey2", @"Localizable", myBundle, @"Hi!", @"informal greeting"))];
Run Code Online (Sandbox Code Playgroud)

********* end edit


PS :: 我原来的文字可以在这里看到