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

Posted

技术标签:

【中文标题】一个 iOS 应用程序中的多个 Localizable.strings 文件【英文标题】:Multiple Localizable.strings files in one iOS app 【发布时间】:2011-01-27 00:21:38 【问题描述】:

是否可以在一个应用中拥有多个具有不同本地化的组件?

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

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

【问题讨论】:

【参考方案1】:

有一种方法很简单。

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

    要本地化的字符串 表名,就是一个文件名 评论,就像NSLocalizedString()

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

请参阅 Matt Gallagher 的 post 关于此。

【讨论】:

谢谢!我也很喜欢马特的文章,直到他说“避免本地化图像 - 它会给你带来痛苦和痛苦”,嗯。 没问题!关于本地化图像,这是非常真实的。维护图像很痛苦。在图像上绘制文本会更好。 太棒了!现在我可以在一个目录中创建一个可重用的组件,它自己的 classes/resources/localizable 字符串都在一个目录中,并将其放入新项目中,而不必担心合并全局 Localizable.strings 文件! 迅速:NSLocalizedString("String", tableName: "Table", comment: "Comment") @scot 如果这些多个字符串位于项目的不同模块或框架中,这仍然有效吗?【参考方案2】:

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

卢卡

【讨论】:

但是“正确的文件夹”是什么意思?就我而言,我想要 2 个具有相同名称的文件(“Localizable.strings”),我想知道这是如何工作的。 好的,好消息是您不必真正担心...我的意思是:如果您现在只有一个名为“Localizable.strings”的文件,请尝试执行正如我所说(选择它,打开信息,进入“常规”选项卡,按“使文件可本地化”按钮,在新打开的窗口中选择常规选项卡并按“添加本地化”按钮,然后选择该文件的新语言)...当您执行该操作时,xCode会为您在英语文件中移动旧文件“Localizable.strings”和意大利语中的新(重复)文件(或其他文件)创建“正确的文件夹” ) 文件,所以只需编辑它 ?这就是你会得到的。您将在 2 个不同的文件夹中拥有 2 个同名的不同文件,一个在文件夹“Italian.lproj”中,一个在“English.lproj”文件夹中,它们的文本可能不同,您将在一个文件夹中写入意大利语文本另一个是英文……这不是你的问题吗? 不,我问的是更具体的本地化案例。就我而言,我的应用程序中有一个名为 ShareKit 的模块,它是本地化的(有 en.lproj 和 de.lproj fodlers,里面有 Localizable.strings),我想将我自己的本地化添加到我自己的元素中,所以我要添加另一个一对 en.lproj 和 de.lproj 文件夹,其中包含同名的字符串文件 Localizable.strings。不过Cocoa Touch不喜欢这样也很正常。所以我正在寻找一种解决方法。【参考方案3】:

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

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

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

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

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

【讨论】:

【参考方案4】:

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

然后您可以考虑创建自己的“字典”文件并尝试对其进行本地化,然后将其读取并放入 NSDictionary 中,您可以在其中读取单个单词/值... 您可以在您的文件“myDict.plist”中插入一条记录,其中键“greeting”为字符串类型,意大利语为“ciao”,英文为“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 也读 cmets...

【讨论】:

对不起,我的第二个答案的第一个版本,我在 safary 中复制/过去时遇到了一些问题...... mhm...我在我的项目中尝试过...由于某种未知原因,字典文件始终以其默认语言读取,忽略设置,因此您必须执行不同的文件并调用使用时自己一个好: NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"myDict-ita" ofType:@"plist"];或: NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"myDict-eng" ofType:@"plist"];并且您只需阅读 ShareKit 使用的文件中的本地化单词就可以知道设置了什么语言... 我可以打开它的 Localizable.string 文件并在那里添加我的字符​​串。但在那种情况下,我正在更改 SharerKit,当我想稍后更新它时遇到问题等。所以我想知道是否有一个很好的解决方案来拥有一个额外的 Localizable.strings 文件并仍然使用 NSLocalizedString() 宏,但我猜哪有这回事。您使用 NSDictionaries 的解决方案听起来不错,但我仍然必须改变我的本地化习惯:)

以上是关于一个 iOS 应用程序中的多个 Localizable.strings 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 应用程序中的多个视图重复调用地理位置单例类

修复 iOS 中的多个按钮单击事件?

iOS - 在一台设备上支持多个用户帐户的应用中的可更新应用内购买

在 iOS 的多个视图中使用 UINavigationController 中的固定背景图像?

如何在 ios 应用程序中的谷歌地图上添加多个引脚

IOS项目目标中的多个Objective C桥接头