[英]UiTextView localized with xib strings file
我在 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 下仍然出现,之前的答案让我不满意。
这是我简单快速的解决方法:
如果您愿意,您可以返回到“Localizable Strings”...在这种情况下,请注意您必须至少运行一次带有“Interface Builder Cocoa Touch XIB”的应用程序。 选择了选项。
您可以使用 NSLocalizedStringFromTable 来检索由 xcode 的 IB 生成的文本,如下所示,在 viewDidLoad 中:
self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");
其中 2Vy-59-WN8.text 是生成的键,您可以在 UITextView 的 Main.strings 中找到。
顺便说一句:这是一个 xcode/IB 错误,而不是 iOS 错误。
如果您想使用现有的 MainStoryboard.strings 文件,您可以使用 localizedStringForKey:value:table: 以编程方式分配 textview 的文本:
[[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的过程。
看看这里: https : //developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/Articles/LocalizingInterfaces.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.