一个 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 - 在一台设备上支持多个用户帐户的应用中的可更新应用内购买