一个iOS应用程序中的多个Localizable.strings文件

时间:2011-01-27 00:21:39

标签: iphone cocoa-touch ios localization

是否可以让多个组件在应用程序中具有单独的本地化?

例如,我想在我的应用程序中本地化字符串,但也使用本地化的ShareKit(因此我的包将在不同位置包含2个Localizable.strings)。 所以,ShareKit包含像en.lproj和de.lproj这样的文件夹,它们包含Localizable.strings文件,我想为我的项目的其余部分创建相同的内容,但要将它们分开。

我试过将它们分开,这导致我的应用程序的字符串没有被使用。有什么想法吗?

4 个答案:

答案 0 :(得分:83)

有一种方法可以做到这一点非常简单。

有几个用于本地化的宏,其中一个是NSLocalizedStringFromTable()。这需要三个参数:

  1. 要本地化的字符串
  2. 表名,只是一个文件名
  3. 评论,就像NSLocalizedString()
  4. 一样

    如果您使用表名,那么您可以拥有另一个字符串文件,即如果我NSLocalizedStringFromTable(@"name", @"MyStrings", @"whatever");,则将我的字符串放在MyStrings.strings中,它将使用该字符串。

    见Matt Gallagher的post关于此事。

答案 1 :(得分:0)

每个文件/资源​​都可以本地化,也可以是IB .xib文件或图像jpg / png, 你只需要在你的项目中选择一个文件,打开信息,进入“常规”选项卡/部分,然后按“make file localizable”...... 然后你可以添加你想要的任何语言,xCode将创建一个复制第一个文件的新文件,并将其放在正确的文件夹中...

卢卡

答案 2 :(得分:0)

好吧,我不知道ShareKit,但我想你不能编辑它的文本文件,只是将你的新单词添加到那些文件中,不是吗?

那么您可以考虑创建自己的“字典”文件并尝试对其进行本地化,然后将其读取并放入NSDictionary中,您可以在其中读取单个单词/值... 您可以在文件“myDict.plist”中插入一条记录,其中键入的“问候”类型为String,其值为“ciao”,意大利语为“hallo”,英语为“hallo”

NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"myDict" ofType:@"plist"];
NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile:bundle];
NSString *greetingsTranslatedInTheGoodLanguage = [savedStock objectForKey:@"greeting"];
// just to try what you have read:
NSLog (@"translated by your own dictionary: %@", greetingsTranslatedInTheGoodLanguage);
[savedStock release];

卢卡

PS 阅读评论......

答案 3 :(得分:0)

不可能按照你的要求去做。您可以拥有多个Localizable.strings文件,但在各自的.lproj文件夹中只能使用一种语言。

我知道您不想编辑ShareKit Localizable.strings文件,因为在更新时会很麻烦,但我认为您需要查看它实际需要做多少工作。根据您需要支持的语言数量,本地化您自己的字符串并将它们添加到ShareKit Localizable.strings文件的底部可能比实现您自己的本地化方案更少。

顺便说一句,要检测设备当前设置的语言,您可以使用:

NSArray *preferedLocalizations = [[NSBundle mainBundle] preferredLocalizations];

这为您提供了两个字母的语言代码字符串数组。索引0处的项目是当前选择的语言。如果您需要根据语言做出逻辑决策,这可能会有所帮助。