簡體   English   中英

使用 xib 字符串文件本地化的 UiTextView

[英]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 下仍然出現,之前的答案讓我不滿意。

這是我簡單快速的解決方法:

  1. 選擇 XIB,然后在文件檢查器中
  2. 在“本地化”下方,找到不起作用的語言
  3. 將“Localizable Strings”更改為“Interface Builder Cocoa Touch XIB”

XCODE XIB 檢查器文件截圖

  1. 運行應用程序,現在翻譯應該沒問題了!

如果您願意,您可以返回到“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 個簡單步驟:

  1. 從設備(不是模擬器)中刪除應用程序
  2. 產品 -> 清潔
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM