使用 sqlite 进行 iPhone 本地化?

Posted

技术标签:

【中文标题】使用 sqlite 进行 iPhone 本地化?【英文标题】:iPhone localization with sqlite? 【发布时间】:2009-08-11 13:57:05 【问题描述】:

如何为 iPhone 本地化数据库中的文本?我看到的示例在 .m 文件或 .xib 中有硬编码字符串。例如:

NSString firstName = NSLocalizedString(@"First Name", @"This is the first name");

如果您需要本地化的字符串在数据库中会怎样?我还没有找到关于这种本地化的讨论。但是,鉴于许多 iPhone 应用程序都使用 sqlite,我想这非常普遍。

【问题讨论】:

【参考方案1】:

NSLocalizedString 只是一个预处理器宏,它转换为对NSBundle 的localizedStringForKey:value:table: 的调用——所以基本上你可以使用在运行时获取的字符串而不是硬编码的字符串并将其传递给 NSBundle。当然,缺点是没有快速的方法来编译翻译器需要本地化的所有字符串的列表。

例子:

NSString *key = fetchKeyFromDB(...);
NSString *localizedString = [[NSBundle mainBundle] localizedStringForKey:key value:@"default string" table:nil];

【讨论】:

我没有创建任何额外的资源文件,所以此时没有发生任何事情。我所有的文本都在数据库中。我是否应该为要本地化的每种语言和每个数据库行创建字符串文件?有很多东西要保持同步。如果我要针对五种语言进行本地化,这意味着我需要为每个数据库(英语)行条目设置五个字符串文件……因为数据库全是英语? developer.apple.com/iphone/library/documentation/MacOSX/… 是的,您需要 5 个 .strings 文件。当然,无论您如何实现它,保持 5 种语言的本地化字符串都需要保持同步。另一种方法是避免使用 Cocoa 的本地化 API,而是将所有本地化字符串保留在数据库中(即包含键、语言、国家和字符串列的表)。 你会如何实现这个?假设我在 DB/plist 中有 name_en、name_fr、name_es。您将如何为当前活动的语言环境调用正确的字段?【参考方案2】:

我只是想知道同样的事情,但找不到任何关于这是如何处理的(以及我是如何结束这篇文章的)。 OTTOMH,我在想您可能对每种支持的语言都有不同的数据库。也许仍然遵循一般的国际化/本地化指南,并为每种支持语言创建一个单独的目录,例如 en.lproj 和 it.lproj,然后将您的数据库命名为“en_data.db”和“it_data.db”(或任何命名约定你喜欢)并将它们放在各自的目录中。诀窍是然后检测应用程序中的运行时语言并为该语言加载适当的数据库。同样,这只是一个猜测,我在实践中从未做过(就像我说的,我想知道同样的事情)

【讨论】:

以上是关于使用 sqlite 进行 iPhone 本地化?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据(SQLite/iPhone)——设计注意事项?

在 iPhone/iPod Touch 上本地存储包含 333,000 行的 sqlite DB 是不是可行?

在 iphone 上实现增量搜索

iphone sqlite页面缓存不断增长

iPhone 更改应用名称

如何测试 iPhone 应用程序更新?