我正在测试本地化功能的小型iOS 7项目存在以下问题.
NSString *title = NSLocalizedString(@"MY_BUTTON", @"My comment for my button");
[self.myButton setTitle:title forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)
/*我对我的按钮的评论*/"MY_BUTTON"="我的[VALUE]按钮"; 其中VALUE = Base,Dutch; 所以标签应该是我的基本按钮和我的荷兰按钮
问题:如果我使用模拟器的语言作为荷兰语启动我的应用程序,标签是(按预期)"我的荷兰按钮".如果我用英文启动它,标签是"我的基本按钮"(好吧......)
但是,如果我将手机的语言设置为法语启动它,而我之前将其设置为荷兰语,则按钮的标签不会默认为Base,而是再次显示"My Dutch Button"
有什么想法吗?
谢谢
我是原生iOS开发的新手,并且一直在玩本地化的故事板.
我通过更新故事板的文件来本地化我的故事板中的文本UILabel和UIButton对象Main.strings:
// UIButton:
"cEx-Yi-RY8.normalTitle" = "Done";
// UILabel:
"1l2-H9-hRc.text" = "Safety information!";
Run Code Online (Sandbox Code Playgroud)
我怎么做同样的UITabBarItem?我试过了:
//UITabBarItem:
"oSH-y1-hFoB.title" = "Scan";
Run Code Online (Sandbox Code Playgroud)
但它不起作用:(
我不明白为什么......我可以看到可以在UITabBarController中手动更新文本:
- (void)viewDidLoad
{
//...
item.title = NSLocalizedString(@"scan", nil);
}
Run Code Online (Sandbox Code Playgroud)
但后来我必须将这些翻译放在一个单独的Localizable.strings文件中,这似乎很蹩脚.
另一方面,至少翻译Localizable.strings有些可读,"scan" = "Scan";而不是"oSH-y1-hFoB.title" = "Scan";......
仍然......我没有关注为什么有些东西在Interface Builder中工作,但其他东西没有,你必须手动完成.
我讨厌必须添加所有这些样板代码来做重复的事情,比如在UI中本地化文本,当框架应该只能为我做.(如果它可以为UIButton做,为什么不是UITabBarItem ...)
或者我只是忽略了什么?
我是iOS的国际化和本地化的新手.我正在运行genstrings:
find . -name \*.m | xargs genstrings -o en.lproj生成我的Localizable.strings文件.它按字母顺序(按键)构建文件.
为了便于翻译,我希望键和值按照它们在.m文件中的出现顺序排序.这可能与genstrings?我在其man页面上找不到相关信息.
我有一个相当复杂的项目,包括几个大型的本地化子项目.
我的大多数子项目都是通过一个Localizable.strings文件进行本地化的.此文件将复制到SubProjectName.bundle目标中,该目标与SubProjectName.a主项目中的静态库一起使用.这很好用.
但是,我的一个子项目包含许多本地化的.strings文件.无论设备(或模拟器)的配置方式如何,此项目都无法读取除英语之外的任何语言的字符串.
例如,这行代码始终返回英文字符串:
[[NSBundle myResourcesBundle] localizedStringForKey:@"MY_TEST_STRING" value:@"" table:@"MyTable"]
Run Code Online (Sandbox Code Playgroud)
其中MyTable对应于本地化为多种语言的MyTable.strings文件.当我查看.app包时,所有本地化都在那里,坐在应用程序内的"MyBundle.bundle"资源中.
但是,以下代码在所有本地化中正确查找给定字符串的翻译:
for (NSString *language in [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"])
{
NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle myResourcesBundle] pathForResource:language ofType:@"lproj"]];
NSLog(@"%@: %@", language, NSLocalizedStringFromTableInBundle(@"MY_TEST_STRING", @"MyTable", bundle, nil));
}
Run Code Online (Sandbox Code Playgroud)
因此,当bundle是实际MyBundle.bundle/<LanguageCode>.lproj文件夹时,字符串查找起作用.但显然这违背了iOS提供的自动查找的目的.
(注意,[NSBundle myResourcesBundle]上面只是一个静态便捷方法来获取子项目的自定义包).
-
编辑:我一直在试验这个,如果我en.lproj从子项目的包中删除文件夹,那么它正确使用设备或模拟器的区域设置.
例如,我有:
MyApp.app/
|
- MyResources.bundle/
|
- en.lproj/
|
- zh-Hans.lproj/
Run Code Online (Sandbox Code Playgroud)
当我将模拟器(或设备)设置为简体中文时,它会查找字符串,en.lproj即使语言环境是zh-Hans.如果我删除en.lproj文件夹并重新启动应用程序,它会正确使用zh-Hans本地化.
我在调试我的NSLocalizedString实现时遇到了一些麻烦.应该很简单,但无论我做什么,该函数只返回KEY字符串.
我正在使用XCode 4.5和iOS6,所以我:
File.strings."KEY" = "TestEnglish";到我的英语File.strings"KEY" = "TestSpanish";到我的西班牙语File.stringsNSLog(@"Localization: %@\n", NSLocalizedString(@"KEY", nil));到我的.m文件中.当我运行应用程序时,值"KEY"始终显示在打印中NSLog.
为了更多地进入这个,我也尝试了这个:
NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
NSString *str = [[NSBundle bundleWithPath:path] localizedStringForKey:@"KEY" value:@"" table:nil];
NSLog(@"Localization: %@\n", str);
Run Code Online (Sandbox Code Playgroud)
仍然是值"KEY"打印,但是,path是一条有效的道路.
有没有人知道如何调试这个?我觉得我已经阅读了所有的SO问题/答案,但没有一个建议有帮助.
我意识到当它无法匹配键时NSLocalizedString返回KEY字符串,但我不知道如何调试为什么我的应用程序可能与KEY不匹配.
我也删除/清理了十几次应用程序.
有没有办法让本地化的字符串进入iOS游乐场?我有一些从右到左的语言翻译,其中包括我必须使用十六进制编辑器编辑的格式代码(以确保代码的顺序正确),我希望手动检查格式化字符串的输出确保它有效.
另外,是否有任何Mac OS文本编辑器允许您以从左到右的模式显示阿拉伯语和希伯来语?
我正在将应用程序本地化为西班牙语,并且使用Unicode将字符编码为该语言的Localizable.strings文件.例如,我有条目:
"login.saveSettings"="Guardar configuraci\\u00F3n:";Run Code Online (Sandbox Code Playgroud)它完全像UILabel中显示的那样("Guardar configuraci \\ u00F3n:"),而不是"Guardarconfiguración:".我尝试了不同的变体,例如"\ u00F3"或"\\ U00F3",但没有任何成功.
我用这种方式使用NSLocalizedString:
self.saveSettingsLabel.text = NSLocalizedString(@"login.saveSettings", @"Save Settings:");
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
谢谢你的帮助!米哈伊
我正在构建一个我已经发布的应用程序版本,但有一些更改.它不是一个精简/完整版本关系,但它们足够相似,我正在使用具有不同目标的相同项目.
我想重新编写我在新版本的第一个版本中使用的几乎所有字符串,并且想知道解决此问题的最佳方法.我没有在声明每个字符串之前使用#ifdef/#else语句,而是考虑使用NSLocalizedStrings.但是,实际语言仍然相同.
我在这篇文章中读到你可以自己设置语言,所以大概我可以发明自己的语言并将其设置为那个.但我想知道这是不是最好的办法?任何建议都是最受欢迎的.
我正在使用NSLocalizedString一个特定的消息,如果第二个参数作为一个变量传递,它可以正常工作,但如果第二个参数的写入与设置的变量完全相同Use of undeclared identifier 'NSLocalizedString',Too many arguments provided to function-like macro invocation则会失败.我有使用变量的工作代码,这很好,我只是想了解在其他情况下无法知道如何避免它的原因.
使用以下声明:
NSString *branchTitle = [branchDictionary objectForKey:@"Title"];
NSString *localString = [NSMutableString stringWithFormat:@"%@ node title", branchTitle];
Run Code Online (Sandbox Code Playgroud)
这没关系,工作正常:
[navItem setTitle:NSLocalizedString(branchTitle, localString)];
Run Code Online (Sandbox Code Playgroud)
...但是,这似乎与我相同,但由于上述错误而失败:
[navItem setTitle:NSLocalizedString(branchTitle, [NSMutableString stringWithFormat:@"%@ node title", branchTitle])];
Run Code Online (Sandbox Code Playgroud)
在这里和其他地方搜索我没有找到解释.我阅读了每个错误消息和各种NSLocalizedString问题的一些点击,但没有任何将它们联系在一起的内容.我发现的第二条错误消息暗示可能是clang的问题和语句中的逗号数量,表明即使额外的逗号在NSMutableString消息中,它仍被视为额外的参数NSLocalizedString.这有任何意义吗?
这个问题并不重要,但该声明旨在根据从字典中提取的英文版本设置导航栏标题的本地化版本,该字典因不同视图而异.该NSMutableString部分根据英文标题定义了本地化的注释.
编辑:根据下面接受的答案解决此问题后,我注意到另一个相关问题.该声明localString正在产生"Unused variable"编译器警告,但显然正在使用它.这也是因为它在C-macro中并且为了完整性,我在这里添加一个关于抑制该警告的相关帖子的链接:如何在Xcode中摆脱"未使用的变量"警告
NSLocalizedString只有一半的时间可以恢复所引用键的预期值.其他时候我回到NSLocalizedString中指定的密钥名称,并且在每次其他运行时都会一直发生.
目前,我目前只支持英语.
我打电话给:
NSString *someText = NSLocalizedString(@"mystring.keyname", nil);
Run Code Online (Sandbox Code Playgroud)
en.lproj/Localizable.strings的内容:
"mystring.keyname" = "Hello there!";
Run Code Online (Sandbox Code Playgroud)
当它不能正常工作时,someText's价值就是mystring.keyname.
以下是我测试可靠性的方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSLog(@"Strings file: %@", [bundle pathForResource:@"Localizable" ofType:@".strings"]);
NSLog(@"Localizations: %@", [bundle localizations]);
NSLog(@"Local Dict: %@", [bundle localizedInfoDictionary]);
NSLog(@"localizedStringForKey: %@", [bundle localizedStringForKey:@"mystring.keyname"value:@"Wha happened?" table:nil]);
NSLog(@"Localized String: %@", NSLocalizedString(@"mystring.keyname", @"Are you sure you want to start a new game?"));
}
Run Code Online (Sandbox Code Playgroud)
这会在每次运行时打印出预期值:
Run #1:
Local Dict: (null)
localizedStringForKey: Hello there!
Localized String: Hello there! …Run Code Online (Sandbox Code Playgroud) ios ×7
objective-c ×6
localization ×5
cocoa-touch ×2
iphone ×2
xcode ×2
base ×1
genstrings ×1
nsbundle ×1
target ×1
uikit ×1
uistoryboard ×1
unicode ×1
xcode6 ×1