在 iOS 上本地化剪切|复制|粘贴菜单
Posted
技术标签:
【中文标题】在 iOS 上本地化剪切|复制|粘贴菜单【英文标题】:Localizing the Cut|Copy|Paste menu on iOS 【发布时间】:2012-06-27 11:16:22 【问题描述】:我在本地化我制作的丹麦应用程序时遇到了一些问题。 (语言,不是糕点)
我已在 info.plist 中将 CFBundleDevelopmentRegion 设置为 da_DK 以表示丹麦语,但出现文本输入的弹出窗口仍然是英语,即使在运行丹麦语操作系统的手机上也是如此。
如何更改职位名称?
测试设备是未越狱的 iPhone 4S,运行 ios 5.1,iOS 设置为丹麦语,并关联丹麦语 iTunes 帐户。
我不使用 .xibs 进行设计。所有接口都被编程为视图控制器。
【问题讨论】:
换手机的时候应该会变,这是个奇怪的案例 确实如此。重启了好几次,从键盘上看,iphone的语言是丹麦语……很好奇…… 呵呵!这很好笑!也许您应该就此向 Apple 提交事件报告? 在三种不同的设备上测试...都产生相同的结果。 :我 【参考方案1】:在 Xcode 的文件树 (Project Navigator) 中选择您的项目。在右侧窗格中再次选择您的项目。选择信息并添加您的语言。
我创建了一个sample project,结果如下:
【讨论】:
您好,+1 表示对此的科学方法,但您可以尝试包含 git repos 中缺少的 .strings 文件吗? InfoPlist.strings 缺少德语、土耳其语和丹麦语... 我修复了这个问题并添加了一个 NSLocalizedString 调用。我将 InfoPlist 重命名为默认名称 Localizable.strings。我不知道,为什么 Xcode 选择了另一个名字。【参考方案2】:您可以直接在 info.plist 中执行此操作。像这样的:
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>de</string>
<string>es</string>
<string>ja</string>
</array>
【讨论】:
【参考方案3】:尝试在 Info.plist 中添加/设置“本地化资源可以混合”标志为 YES。
【讨论】:
【参考方案4】:您必须将您的应用本地化为丹麦语,以使标准 UI 元素以该语言显示。这是为了避免使用混合语言的 UI。
如果你不使用 xibs,你通常会通过在你的项目中添加一个Localizable.strings
文件来做到这一点。在 Xcode 的“添加文件”对话框中,您可以使用“字符串文件”模板(在“资源”下)。
要实际本地化字符串文件,请打开文件检查器 (⌘
⌥
1
) 并单击“本地化”部分中的 +
按钮。您最终会在项目导航器中将文件显示为一个组,每种语言都有一个子条目。
字符串文件的格式为:
"Label_Text" = "Smørrebrød";
(别忘了分号)
要在您的代码中使用本地化字符串,您可以像这样使用NSLocalizedString
宏:
myLabel.text = NSLocalizedString(@"Label_Text", nil);
(第二个参数用于注释。如果您使用genstrings 工具从代码中提取可本地化的字符串并将生成的文件提供给专业翻译人员,这将非常有用。)
如果使用英文字符串作为键,可以将英文版的Localizable.strings
留空(但不要删除)。
拥有用户选择的语言的 Localizable.strings
文件也会导致标准 UI 元素(例如编辑菜单、照片选择器等)以该语言显示。
【讨论】:
【参考方案5】:如果您无法按照@vikingosegundo 提供的官方方式使其工作,您可以通过一些创意工程来做到这一点(创意如,天哪,这很危险)。当我不小心覆盖了[NSBundle localizedStringForKey:value:tableName:]
时,我发现了这个方法。
1) 使用以下方法向 NSBundle 添加类别:
#import <objc/runtime.h>
+ (void) load
Method original, swizzled;
original = class_getInstanceMethod(self, @selector(localizedStringForKey:value:table:));
swizzled = class_getInstanceMethod(self, @selector(swizzled_localizedStringForKey:value:table:));
method_exchangeImplementations(original, swizzled);
- (NSString*) swizzled_localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
NSLog(@"Key: %@. Value: %@", key, value);
return [self swizzled_localizedStringForKey: key value:value table:tableName];
2) 在我只是记录键/值的地方,您想要放置一个 if ([key isEqualToString: xxx] ) 块。在那里,您想要捕获(至少部分)以下关键值:剪切、复制[菜单]、选择、全选、粘贴、删除[菜单]、替换...、定义、说话、暂停。这些是可以出现在那里的默认值。
3) 获取值后,您可以在自定义表中查找或使用硬编码值。如果您在自定义表格中查找,请确保在您的 swizzled 方法中有一个陷阱,以避免自定义表格中出现无限循环。
注意:为什么需要调酒?因为这会覆盖您应用程序的所有 Apple 文本。您仍然需要所有其他字符串的默认值,因此您需要调整以获取您不感兴趣的字符串的默认值。
祝你好运。 保罗
【讨论】:
【参考方案6】:搜索您的 .xib 是否已本地化(您将在右侧面板的检查器中找到它)如果是,请转到您的项目/目标设置按 + 号并选择“将英语复制到丹麦语”或其他内容意思相同(我目前无法检查正确的项目)
顺便说一句,它叫 iPhone 4S。
【讨论】:
我不使用 .xibs 进行设计。所有接口都被编程为视图控制器。 如前所述,我没有使用界面生成器。我以编程方式构建我所有的观点。 我还没有看到任何没有 MainWindow.xib 的项目。我也不知道没有它的应用程序会起作用。 当然。 xib 文件仅用于在构建视图时提供视觉帮助。我更喜欢通过代码来完成。 我知道这一点,我只是想知道是否可以在没有 MainWindow.xib 的情况下创建应用程序。我刚刚读了一些帖子,你是完全正确的。在这种情况下,您需要搜索其他语言设置。除了 CFBundleDevelopmentRegion,我不知道还有什么地方可以本地化。以上是关于在 iOS 上本地化剪切|复制|粘贴菜单的主要内容,如果未能解决你的问题,请参考以下文章