当我的用户打开我的应用程序时,我想热烈欢迎他们。所以我想有不同的句子来随机显示它们。每种语言的消息数量不同。
解决此问题的首选方法是什么?
我的想法:
将计数也保存在字符串文件中 -> 不喜欢这个想法,因为必须维护
"welcomeCount" = "5";
"welcomeN" = "Hi....";
分隔消息 -> 不喜欢这个想法,因为你必须注意这一点
"welcomeMessages" = "Hey there...|MessageN";
有人想以优雅的方式解决这个问题吗?
当我的用户打开我的应用程序时,我想热烈欢迎他们。所以我想有不同的句子来随机显示它们。每种语言的消息数量不同。
解决此问题的首选方法是什么?
我的想法:
将计数也保存在字符串文件中 -> 不喜欢这个想法,因为必须维护
"welcomeCount" = "5";
"welcomeN" = "Hi....";
分隔消息 -> 不喜欢这个想法,因为你必须注意这一点
"welcomeMessages" = "Hey there...|MessageN";
有人想以优雅的方式解决这个问题吗?
您可以将欢迎消息存储在本地化的属性列表中。
在您的程序中,您可以轻松加载列表
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];
为了最大限度地减少维护,您可以使用二进制搜索来找出可用的变体数量。假设您的 中有以下内容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, @"");