Kev*_*lar 10 iphone localization internationalization
我正在尝试找到一种可管理的方式来翻译iPhone应用程序中的每个可见字符串.官方苹果文档说使用.strings文件编写程序字符串,同时使用xcode中内置的"添加本地化文件"选项来本地化nib文件.
我看到的问题是,如果UI在本地化发生后需要更改,那么我们需要单独更新每种语言的nib,这不是最佳的.是否有更简单的方法可能将nib文件中显示的字符串绑定到.strings文件中的相关值?或者我是否必须以编程方式为每个ui元素设置这些字符串(这稍微好些但仍然很烦人)?
bdu*_*gan 15
Apple的内置命令行程序ibtool可以让你这样做.您可以从XIB转储字符串,对它们进行本地化,然后基于现有的XIB创建新的XIB,但使用本地化的字符串.因此,您可以随时拥有一组XIB,并在本地化字符串更改时重新创建它们.更多信息:http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/.
您能做的最好的事情就是递归循环每个视图,然后在它们上设置文本:
static void translateView(NSBundle *bundle, UIView *view)
{
id idView = view;
if ([idView respondsToSelector:@selector(text)] && [view respondsToSelector:@selector(setText:)])
[idView setText:[bundle localizedStringForKey:[idView text] value:nil table:nil]];
if ([idView respondsToSelector:@selector(title)] && [view respondsToSelector:@selector(setTitle:)])
[idView setTitle:[bundle localizedStringForKey:[idView title] value:nil table:nil]];
if ([idView respondsToSelector:@selector(placeholder)] && [view respondsToSelector:@selector(setPlaceholder:)])
[idView setPlaceholder:[bundle localizedStringForKey:[idView placeholder] value:nil table:nil]];
if ([idView respondsToSelector:@selector(prompt)] && [view respondsToSelector:@selector(setPrompt:)])
[idView setPrompt:[bundle localizedStringForKey:[idView prompt] value:nil table:nil]];
if ([idView respondsToSelector:@selector(titleForState:)] && [view respondsToSelector:@selector(setTitle:forState:)])
[idView setTitle:[bundle localizedStringForKey:[idView titleForState:UIControlStateNormal] value:nil table:nil] forState:UIControlStateNormal];
if ([idView isKindOfClass:[UITabBar class]] || [idView isKindOfClass:[UIToolbar class]])
for (UIBarItem *item in [idView items])
[item setTitle:[bundle localizedStringForKey:[item title] value:nil table:nil]];
for (UIView *subview in [view subviews])
translateView(bundle, subview);
}
Run Code Online (Sandbox Code Playgroud)
警告:您可能必须检查其他选择器集才能捕获所有内容。这不是最佳实践,但看起来工作量少得多
| 归档时间: |
|
| 查看次数: |
6303 次 |
| 最近记录: |