我在xCode中使用基础国际化来管理我的应用中的多种语言。
在xib文件中我有这个对象:
Xrj-9E-2VK it's an UITextView
在相应的字符串文件中:
"Xrj-9E-2VK.text" = "text translated in french"
但我的文字还是英文。
有任何建议吗?
答案 0 :(得分:12)
我找到了以下解决方法,直到Apple修复了iOS 7中仍存在的这个(严重)错误:
您实际上需要将“基本本地化方法”(= Xcode 5和iOS 7的首选方法)与使用“Localizable.strings”文件的“较旧”方法“混合”
1)创建文件'Localizable.strings'(文件 - >新 - > iOS - >资源 - > .strings文件)
2)使用Xcode为您使用的每种语言创建此文件的本地化版本(选择文件'Localizable.strings',在'本地化'下的文件检查器中单击您使用的每种语言旁边的选择按钮)。 / p>
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
答案 1 :(得分:8)
这仍然出现在Xcode 6& IOS 8,以前的答案并不能让我满意。
这是我简单快捷的解决方法:
然后你可以回到" Localizable Strings"如果你更喜欢... 在这种情况下,请注意您必须使用" Interface Builder Cocoa Touch XIB至少运行一次应用程序。"选择了选项。
答案 2 :(得分:5)
您可以使用NSLocalizedStringFromTable来检索由xcode的IB生成的文本,如下所示:viewDidLoad:
self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");
其中2Vy-59-WN8.text是生成的密钥,您可以在UITextView的Main.strings中找到。
BTW:这是一个xcode / IB错误,而不是iOS错误。答案 3 :(得分:2)
这是我的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的故事板中的恢复标识符。
答案 4 :(得分:1)
我使用Xcode 5.1.1和iOS7。
在左侧文件面板中选择要本地化的ViewController。 在右侧面板中,选择文件检查器。
您将看到"本地化..."按钮。点按按钮。您将看到一个可从中选择的语言下拉列表。选择Base,然后点击" Localize"。
在右侧面板中,本地化部分现在将具有" Base"选中,您的其他语言将被列出。选择您要支持的语言。离开" native"您的应用语言未选中。
肯定存在缓存问题。我发现只有在我从模拟器中删除应用程序并删除Xcode的派生数据后才会出现更改。
答案 5 :(得分:1)
提交Apple的错误。让他们知道这种情况正在发生,并导致你(和我)时间和挫折。这整个本地化系统不是让我们回到NSLocalizedString ..
答案 6 :(得分:1)
如果要使用现有的MainStoryboard.strings文件,可以使用localizedStringForKey以编程方式分配textview的文本:value:table:like this
[[NSBundle mainBundle] localizedStringForKey:@"abc-12-3ba.text" value:@"" table:@"MainStoryboard"]
答案 7 :(得分:0)
<强>更新强>
实际更改文本的最佳方法是直接使用UITextView中的setter。
如果您的文字格式为 NOT ,请使用:
[textView setText:NSLocalizedString(key, comment)];
如果您的文字 IS 已格式化,则必须使用:
[textView setAttributedText:[[NSMutableAttributedString alloc] initWithString:NSLocalizedString(key, comment)]];
您不再需要使用更新后的方法来解决此问题。
<强> WORKARROUND 强>
为了能够实现这一点,我找到的最简单的解决方案是简单地添加一个额外的UITextView,其中翻译的文本与另一个完全相同并隐藏它。
要显示正确的视图,我在控制器的viewDidLoad方法中执行此操作:
NSString *language = [[NSLocale preferredLanguages] firstObject];
if ([language isEqualToString:FRENCH_LANGUAGE]) { //@"fr"
UITextView.hidden = YES;
UITextViewFR.hidden = NO;
}
虽然这个解决方案绝对不优雅,但当你不必保留大量翻译时,它肯定是一个很好的解决方法。
话虽这么说,使用故事板本地化字符串是行不通的。添加IBOutlet并使用NSLocalizedString设置text属性也不起作用。我一直在寻找一个解决方案,似乎没有人能真正找到一个明确的答案。
答案 8 :(得分:0)
Xcode 7似乎还有错误...
在尝试任何复杂的事情之前,请尝试以下3个简单的步骤:
答案 9 :(得分:0)
在Xcode 11.5中仍然会出现此问题。我决定改用UILabel,并且按预期方式提取了本地化的文本。当您在视图中保留静态文本时,这是一个简单的解决方法。只需记住将maxLines设置为更高的数字即可。
答案 10 :(得分:0)
我终于找到了原因。缺少其中一行的分号字符。我已经把分号和问题解决了
答案 11 :(得分:-1)
XIB文件没有自己的“.strings”文件。您可以使用ibtool从XIB生成“.strings”,然后在翻译后再次使用ibtool将翻译嵌入到本地化的XIB中。
如果您仍然只有一个英文XIB,则需要使用Xcode创建一个法语XIB,然后执行ibtool过程。