Objective c 在iOS上本地化剪切|复制|粘贴菜单

Objective c 在iOS上本地化剪切|复制|粘贴菜单,objective-c,ios,cocoa-touch,localization,plist,Objective C,Ios,Cocoa Touch,Localization,Plist,我在本地化我制作的丹麦应用程序时遇到了一些问题。语言,而不是糕点 我已经在我的info.plist中将CbundleDevelopmentRegion设置为da_DK for danish,但是文本输入的弹出窗口仍然是英文的,即使在运行丹麦操作系统的手机上也是如此 以乔布斯的名义,我怎样才能改变这一点 该测试设备是一款非越狱iPhone 4S,运行iOS 5.1,iOS设置为丹麦语,并有一个丹麦itunes帐户 我不使用.xib进行设计。所有界面都编程为ViewController。搜索您的.x

我在本地化我制作的丹麦应用程序时遇到了一些问题。语言,而不是糕点

我已经在我的info.plist中将CbundleDevelopmentRegion设置为da_DK for danish,但是文本输入的弹出窗口仍然是英文的,即使在运行丹麦操作系统的手机上也是如此

以乔布斯的名义,我怎样才能改变这一点

该测试设备是一款非越狱iPhone 4S,运行iOS 5.1,iOS设置为丹麦语,并有一个丹麦itunes帐户


我不使用.xib进行设计。所有界面都编程为ViewController。

搜索您的.xib是否本地化。如果是,您将在右侧面板的inspector中找到它。如果是,请转到您的项目/目标设置按+-符号,然后选择Duplicate English to Danish或类似的内容。此时,我无法检查正确的项目


顺便说一句,它叫iPhone4S。

在Xcode的文件树项目导航器中选择您的项目。在右侧窗格中再次选择项目。选择信息并添加您的语言

我创建了一个,结果如下:


您必须将应用程序本地化为丹麦语,以使标准UI元素以该语言显示。这是为了避免使用混合语言的UI

如果不使用xibs,通常会向项目中添加一个本地化的.strings文件。在Xcode的“添加文件”对话框中,可以使用参考资料下的字符串文件模板进行此操作

要实际本地化字符串文件,请打开文件检查器⌘ ⌥ 1并单击本地化部分中的+按钮。最后,文件将在项目导航器中显示为一个组,每个语言都有一个子条目

字符串文件的格式为:

"Label_Text" = "Smørrebrød";
别忘了分号

要在代码中使用本地化字符串,可以使用NSLocalizedString宏,如下所示:

myLabel.text = NSLocalizedString(@"Label_Text", nil);
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleLocalizations</key>
<array>
  <string>en</string>
  <string>de</string>
  <string>es</string>
  <string>ja</string>
</array>    
第二个参数用于注释。如果您使用该工具从代码中提取可本地化的字符串,并将生成的文件提供给专业翻译人员,那么这将非常有用

如果使用英文字符串作为键,则可以将英文版本的Localizable.strings保留为空,但不要删除它


使用用户选择的语言创建一个Localizable.strings文件也会导致标准UI元素,如编辑菜单、照片选择器等,以该语言显示。

如果您无法按照@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方法中有一个陷阱,以避免自定义表中出现无限循环

NB:你为什么要喝口水?因为这超越了所有苹果文本应用程序。您仍然需要所有其他字符串的默认值,因此您需要swizzle来获取您不感兴趣的字符串的默认值

祝你好运。
Paul

尝试添加/设置Info.plist中的本地化资源可混合标志为YES。

您可以直接在Info.plist中执行此操作。大概是这样的:

myLabel.text = NSLocalizedString(@"Label_Text", nil);
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleLocalizations</key>
<array>
  <string>en</string>
  <string>de</string>
  <string>es</string>
  <string>ja</string>
</array>    

当你换电话的时候,它应该会改变,这确实是一个奇怪的案例。已经重启了几次设备,从键盘上可以看到,iphone的语言是丹麦语。。。好奇……呵呵!真有趣!也许你应该就此向苹果提交一份事故报告?在三种不同的设备上测试。。。所有的结果都是一样的II设计时不使用.xib。所有界面都编程为ViewController。如前所述,我没有使用interface builder。我正在通过编程构建我的所有视图。我还没有看到任何没有MainWindow.xib的项目。我也不知道一个没有它的应用程序会工作。当然。在构建视图时,xib文件仅用于提供视觉帮助。我更喜欢通过代码来完成这一切。我知道这一点,我只是想知道是否有可能在没有MainWindow.xib的情况下创建一个应用程序。我刚读了一些帖子,你完全正确。在这种情况下,您需要搜索其他语言设置。我不知道还有什么地方,除了CbundledevelopmentRegion之外,你可以本地化其他东西。您好,这里是+1,用于查找这方面的科学方法,但是你能尝试包括git repos中丢失的.strings文件吗?InfoPlist.string缺少德语、土耳其语和丹麦语…我修复了这一问题,并添加了一个NSLocalizedString调用。我改名为t 他将InfoPlist转换为Localizable.strings(默认名称)。我不知道,为什么Xcode选择了另一个名字。