Wil*_*ken 1 iphone translation localization internationalization ios
我有一个课程,实现了我们都知道和喜爱的"拍照/选择图书馆".正是在这里https://github.com/fulldecent/FDTake这包括在我的其他项目通过git的子模块和工作正常.
现在我需要将该课程中的文本翻译成中文,因此它是"拍照/选照片"或类似的东西.有没有一种很好的方式将翻译放在那里,所以每个人都可以使用它们?
本地化通常由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 :: 我原来的文字可以在这里看到