使用不同的元素数进行本地化

时间:2012-10-04 17:52:57

标签: ios nslocalizedstring localizable.strings

在他们打开我的申请时,我想热烈欢迎我的用户。所以我想用不同的句子随机显示它们。每种语言的消息数量都不同。

解决此问题的首选方法是什么?

我的想法:

  1. 将计数保存在字符串文件中 - >不喜欢这个想法,因为这必须保持 "welcomeCount" = "5"; "welcomeN" = "Hi....";

  2. 分隔讯息 - >不喜欢这个想法,因为你必须要记住这一点 "welcomeMessages" = "Hey there...|MessageN";

  3. 有人想以优雅的方式解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您可以将欢迎消息存储在本地化属性列表中。

  • 在Xcode中,转到文件 - >新 - >档案......
  • 选择资源 - >属性列表模板,例如“Welcome.plist”作为文件名。
  • 在Xcode中选择Welcome.plist并将根对象的类型从 Dictionary 更改为 Array
  • 选择Welcome.plist,转到文件检查器,然后单击“制作本地化...”。然后选择Welcome.plist所需的本地化版本,例如英语和德语。
  • 现在您有一个可以单独编辑的每种语言的Welcome.plist。
  • 要添加字符串,请单击属性列表中的“+”符号。

在您的程序中,您可以使用

轻松加载列表
NSString *path = [[NSBundle mainBundle] pathForResource:@"Welcome" ofType:@"plist"];
NSArray *messages = [NSArray arrayWithContentsOfFile:path];

根据用户的语言,将正确的“正确”列表加载到数组messages中。您可以选择

随机消息
int idx = arc4random_uniform([messages count]);
NSString *msg = [messages objectAtIndex:idx];

答案 1 :(得分:0)

为了最大程度地减少维护,您可以使用二进制搜索来查找可用的变体数量。假设您在Localizable.strings中有以下内容:

"Welcome_0" = "Hello";
"Welcome_1" = "Hi";
"Welcome_2" = "What up";
"Welcome_3" = "Howdy";

您可以使用以下方式查找计数:

int lower = 0, upper = 10;
while (lower < upper - 1) {
    int mid = (lower + upper) / 2;
    NSString *key = [NSString stringWithFormat:@"Welcome_%i", mid];
    BOOL isAvailable = ![key isEqualToString:NSLocalizedString(key, @"")];
    if (isAvailable) lower = mid;
    else upper = mid;
}

最后使用以下方法选择随机消息:

NSString *key = [NSString stringWithFormat:@"Welcome_%i", rand() % upper];
NSString *welcome = NSLocalizedString(key, @"");