[英]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.