ios - 在 IOS 中一次加载本地化字符串列表

标签 ios

我想显示一个包含本地化字符串列表的表格。

最直接的方法是:

a) 将数据源指向我的 ViewController

b) 定义一个数组

c) 在我的 ViewController 中分配数组并使用来自本地化资源 (NSLocalizedString) 的字符串初始化 (arrayWithObjects)

d) 在 UITableViewDataSource 委托(delegate)方法中使用这个数组

我主要关心的是项目 b)。结构看起来很重,我想知道我是否可以以某种方式一次指定和加载整个本地化字符串列表。

最佳答案

您的意思是您想要一个包含所有 Localizable.strings 文件中定义的键的数组吗?

这实际上很容易,因为 .strings 文件的格式对应于包含字典的 plist 格式的 Old-ASCII-Style(通常需要出现的封闭花括号在这种旧的 ASCII 样式 plist 格式中包含一个被默默忽略的字典)。

因此,您可以简单地将 Localizable.strings 文件的内容加载到 NSDictionary 中,一切顺利!

NSString* stringsPath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings"];
NSDictionary* locStringsDict = [NSDictionary dictionaryWithContentsOfFile:stringsPath];
NSLog(@"locStringsDict = %@", locStringsDict);
NSArray* localizedStrings = locStringsDict.allValues;
NSLog(@"All localized strings in current language = %@", localizedStrings);

当然,如果您只需要一些本地化的字符串,您可以:

  • 要么将您想要的字符串放在一个单独的“.strings”文件中(又名不同的字符串表)
  • 或者创建一个包含与您需要的字符串相对应的所有键的 NSArray,然后遍历它们以构建这些键的本地化字符串的 NSArray,在每个键条目上调用 NSLocalizedString

[编辑]

请注意,strings 文件似乎在嵌入到最终应用程序之前被编译成二进制 plists(刚刚在示例项目中对其进行了测试)。因此,一旦您的应用程序运行,Localizable.strings 文件是一个二进制 plist(即 [NSString stringWithContentsOfFile:stringsPath encoding:0 error:nil]返回您的Localizable.strings 文件的原始内容,但一些二进制数据被解释为一些垃圾字符串,并且原始文件不再可访问)

所以如果你想保持键的顺序,唯一的选择是在编译之前解析原始的 strings 文件,而不是在运行时。最好的选择可能是恕我直言,使用 plutil -convert xml1 Localizable.strings -o -strings 文件转换为 XML Plist,并从那里提取 key ,对于使用一些简单的 XSLT 样式表的示例。样式表甚至可以直接将提取的键转换为一些新的 XML plist,它将以预期的顺序表示这些键的 NSArray,因此您可以通过代码将此 plist 加载到 NSArray 中并在运行时使用它们。

关于ios - 在 IOS 中一次加载本地化字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12254261/

相关文章:

iOS 键盘和 TextView 错误 - "use of undeclared variable"

ios - 如何在 iphone iOS 中使用参数在 SQLITE 中形成 LIKE 语句?

objective-c - SBJSON 编码包含另一个对象数组的对象

objective-c - enumerateGroupsWithTypes 在主线程中轮询时不会执行 block

ios - UIButton 子类突出显示错误(即使在点击或触摸后突出显示仍然存在)

ios - 改变 UICollectionViewCell 手势命中框的形状

iOS 在我的应用程序中播放/执行 flash swf。 Apple 会拒绝我的应用程序吗?

ios - 如何正确隐藏范围按钮

ios - ReactiveCocoa 中的 Map 或 flattenMap

ios - 在 iOS 上编码为数据的 Int 数字在 macOS 上解码后为 nil