IPhone本地化:是否可以轻松翻译nib文件而无需复制每种语言的笔尖?
-
03-07-2019 - |
题
我正在尝试找到一种可管理的方式来翻译iPhone应用程序中的每个可见字符串。官方苹果文档说使用.strings文件编写程序字符串,同时使用内置的“添加本地化文件”。 xcode中的选项可以本地化nib文件。
我看到的问题是,如果UI在本地化发生后需要更改,那么我们需要单独更新每种语言的nib,这不是最佳的。是否有更简单的方法可能将nib文件中显示的字符串绑定到.strings文件中的相关值?或者我是否必须以编程方式为每个ui元素设置这些字符串(这稍微好些但仍然很烦人)?
解决方案
您可以做的最好的事情是递归遍历每个视图,然后在其上设置文本:
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);
}
警告:您可能必须检查其他选择器组以捕获所有内容。这不是最佳做法,但似乎工作要少得多
其他提示
Apple的内置命令行程序ibtool可以让你这样做。您可以从XIB转储字符串,对它们进行本地化,然后基于现有的XIB创建新的XIB,但使用本地化的字符串。因此,您可以随时拥有一组XIB,并在本地化字符串更改时重新创建它们。更多信息: http://www.bdunagan.com/ 2009/03/15 / ibtool定位制成易/ 。
我想你想了解一下命令行工具:ibtool。它应该简化你想要做的事情。
您可以按照以下简单指南自动本地化您的笔尖而不会复制它们:
也许你应该手动更新每个字符串。假设您有一个不同语言的字符串数组或xml文件,当用户更改语言时,只需从数组中获取已翻译的字符串,然后将其更改为UI。
马
我总是在viewDidLoad()方法中设置所需的所有字符串,只在.xib中有占位符。这样我只需更新.string文件即可轻松本地化任何.xib
不隶属于 StackOverflow