我在 xCode 中使用基本国际化来管理我的应用程序中的多种语言。
在 xib 文件中,我有这个对象:
Xrj-9E-2VK it's an UITextView
在相应的字符串文件中:
"Xrj-9E-2VK.text" = "text translated in french"
但我的文字仍然是英文的。
有什么建议吗?
我在 xCode 中使用基本国际化来管理我的应用程序中的多种语言。
在 xib 文件中,我有这个对象:
Xrj-9E-2VK it's an UITextView
在相应的字符串文件中:
"Xrj-9E-2VK.text" = "text translated in french"
但我的文字仍然是英文的。
有什么建议吗?
在 Apple 修复 iOS 7 中仍然存在的这个(严重)错误之前,我找到了以下解决方法:
您实际上需要将“基本本地化方法”(= Xcode 5 和 iOS 7 的首选方法)与使用“Localizable.strings”文件的“旧”方法“混合”
1)创建文件'Localizable.strings'(文件 -> 新建 -> iOS -> 资源 -> .strings 文件)
2) 使用 Xcode 为您使用的每种语言创建此文件的本地化版本(选择文件“Localizable.strings”,在“本地化”下的文件检查器中单击您使用的每种语言旁边的选择按钮)。
3)在您的 viewController 中为 UITextField 创建一个 IBOutlet @property :
@property (weak, nonatomic) IBOutlet UITextView *localizedTextView;
4) 在“viewDidLoad”下添加以下代码:
self.localizedTextView.text = NSLocalizedString(@"textFieldKey", @"comment for the translator");
5) 在每个“Localizable.strings”文件中添加:
"textFieldKey" = "你想放在textField中的翻译文本";
应该这样做!
请记住,Apple 可能会在不久的将来某个地方修复此错误,在这种情况下,翻译将从“基础本地化故事板”(其中包含对象引用的故事板,例如“a8N-K9-eJb.text” =“一些翻译文本”。在这种情况下,您可以删除“Localization.strings”文件,并再次对 UITextField 使用基本本地化
这仍然出现在 Xcode 6 & IOS 8 下,之前的答案并不让我满意。
这是我简单快捷的解决方法:
然后,如果您愿意,您可以返回“可本地化的字符串”……在这种情况下,请注意,您必须使用“Interface Builder Cocoa Touch XIB”至少运行一次应用程序。选择的选项。
您可以使用 NSLocalizedStringFromTable 在 viewDidLoad 中检索由 xcode 的 IB 生成的文本,如下所示:
self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");
其中 2Vy-59-WN8.text 是生成的密钥,您可以在 UITextView 的 Main.strings 中找到。
顺便说一句:这是一个 xcode/IB 错误,而不是 iOS 错误。
如果您想使用现有的 MainStoryboard.strings 文件,您可以使用本地化StringForKey:value:table: 像这样以编程方式分配文本视图的文本
[[NSBundle mainBundle] localizedStringForKey:@"abc-12-3ba.text" value:@"" table:@"MainStoryboard"]
这是我的 Swift 2 答案:
我们不想在每个 UIViewController 中重复修复,所以让我们从扩展开始:
import UIKit
extension UIViewController {
// if the property "Selectable" = NO it will reset the font and fontcolor when setText is used.
// So turn Selectable ON
func localizeUITextViewsFromStoryboard(storyboardName: String) {
for view in self.view.subviews {
if let textView = view as? UITextView,
let restorationIdentifier = textView.restorationIdentifier {
let key = "\(restorationIdentifier).text"
let localizedText = NSLocalizedString(key, tableName: storyboardName, comment: "")
if localizedText != key {
textView.text = localizedText
}
}
}
}
}
在需要此修复的每个 UIViewController 中,我们编写
override func viewDidLoad() {
super.viewDidLoad()
self.localizeUITextViewsFromStoryboard("Main")
}
此代码使用 UITextViews 的恢复 ID。这意味着我们需要将对象 ID 复制到情节提要中每个 UITextView 的恢复标识符。
我让它与 Xcode 5.1.1 和 iOS7 一起工作。
在左侧文件面板中选择要本地化的 ViewController。在右侧面板中选择文件检查器。
您将看到一个“本地化...”按钮。点击按钮。您将看到一个可供选择的语言的下拉列表。选择基地,然后点击“本地化”。
在右侧面板中,本地化部分现在将选择“基础”,并且将列出您的其他语言。选择您要支持的语言。不选中您的应用程序的“本地”语言。
肯定存在缓存问题。我发现有时只有在我从模拟器中删除应用程序以及删除 Xcode 的派生数据后才会出现更改。
向 Apple 提交错误。让他们知道这正在发生,并给你(和我)带来时间和挫败感。整个本地化系统不是让我们回退到 NSLocalizedString..
更新
实际更改文本的最佳方法是直接使用 UITextView 中的 setter。
如果您的文本未格式化,只需使用:
[textView setText:NSLocalizedString(key, comment)];
如果您的文本已格式化,则必须使用:
[textView setAttributedText:[[NSMutableAttributedString alloc] initWithString:NSLocalizedString(key, comment)]];
您不再需要通过更新的方法使用解决方法。
解决方法
为了能够实现这一点,我找到的最简单的解决方案是简单地添加一个额外的 UITextView 与翻译文本完全相同的位置并将其隐藏。
为了显示正确的视图,我在控制器的 viewDidLoad 方法中执行此操作:
NSString *language = [[NSLocale preferredLanguages] firstObject];
if ([language isEqualToString:FRENCH_LANGUAGE]) { //@"fr"
UITextView.hidden = YES;
UITextViewFR.hidden = NO;
}
尽管此解决方案绝对不优雅,但当您不必保留大量翻译时,它无疑是一个很好的解决方法。
话虽如此,使用情节提要本地化字符串不起作用。添加 IBOutlet 并使用 NSLocalizedString 设置文本属性也不起作用。我环顾四周寻找解决方案,似乎没有人真正能够找到一个明确的答案。
Xcode 7 似乎仍然有问题...
在尝试任何复杂的事情之前,请尝试以下 3 个简单的步骤:
祝你好运。
这个问题在 Xcode 11.5 中仍然存在。我决定改用 UILabel 并且本地化文本正在按预期获取。当您在视图中保留静态文本时,这是一个简单的解决方法。请记住将 maxLines 设置为更高的数字。
我终于找到了原因。其中一行缺少分号字符。我已经把那个分号和问题修复了
XIB 文件没有自己的“.strings”文件。您可以使用 ibtool 从 XIB 生成“.strings”,然后在翻译后再次使用 ibtool 将翻译嵌入到本地化的 XIB 中。
如果您仍然只有一个英文 XIB,则需要使用 Xcode 创建一个法文 XIB,然后执行 ibtool 流程。