簡體   English   中英

故事板中UITextView的本地化

[英]Localization for UITextView in storyboard

所以我在故事板中有一個帶有不同按鈕,標簽和一些文本視圖的應用程序,我直接在故事板中輸入文本。 我啟用了基本本地化並添加了幾種語言。

這為Base(英語)和其他語言生成了故事板,其中包含項目對象ID列表。 我翻譯了所有內容,標簽和按鈕(ALL OF THEM)工作並以我設置的語言顯示。

然而,無論我設置哪種語言,文本字段都會顯示初始英文文本...文本視圖是否還有其他步驟?

所以,我做了一些研究,似乎為了使其正常工作,需要以編程方式設置UITextView的文本。

資料來源: Devforums.apple

引用:

據我所知,必須使用NSLocalizedString在代碼中設置諸如文本視圖/字段的text屬性之類的字符串。 WWDC 2013視頻會議的第一個半小時#219讓你的應用程序世界准備就緒,如果你有時間觀看它

因此,似乎解決方法(如果您不想以編程方式設置文本)是在發布應用程序之前將字符串文件轉換為故事板。 這似乎按預期工作,並顯示UITextView正確本地化。

編輯:找到另一種允許保留.strings文件的解決方法。

- (void)viewDidLoad

for(UIView* v in self.view.subviews)
{
    if([v isKindOfClass:[UITextView class]])
    {
        UITextView* txv = (UITextView*)v;
        NSString *loctxt = [txv.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        txv.text = NSLocalizedString(loctxt, @"");
    }
}

這會從故事板中的任何內容生成Percent Escapes編碼的字符串,如下所示:

Hello%20World

Localizable.strings文件中,使用上面的鍵作為鍵,這將在運行時為應用的語言環境在應用程序中生成本地化文本,如下所示:

"Hello%20World" = "Hallo Welt";

Percent轉義會處理基本字符串中的所有轉義字符。

如果有人仍然感興趣,我已經以不同的方式解決了這個問題,這將允許您仍然使用由Xcode為故事板生成的SAME .Strings文件。

該解決方案分為兩部分:

在視圖的.m文件中添加以下代碼:

- (void)viewDidLoad
{
    [super viewDidLoad];
    for(UIView* view in self.view.subviews)
    {
        if([view isKindOfClass:[UITextView class]] && view.restorationIdentifier)
        {
            UITextView* textView = (UITextView*)view;
            NSString *textViewName = [NSString stringWithFormat:@"%@.text",textView.restorationIdentifier];
            textView.text = NSLocalizedStringFromTable(textViewName, @"Main", nil);
           //change this to be the same as the name of your storyboard ^^^
        }
    }
    // Do any additional setup after loading the view.
}

並在身份檢查器的故事板中將“對象ID”復制到“恢復ID”字段。

這將在屏幕加載時將新的本地化文本應用於所有UITextView,並允許您使用已生成的字符串文件。

由於我對德米特里的回答的評論不能很好地格式化,我在此重復這個作為答案。 他的解決方案的Swift版本如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
    for view in self.view.subviews {
        if let tv = view as? UITextView, ident = view.restorationIdentifier {
            tv.text = NSLocalizedString("\(ident).text", tableName: "Main", comment: "")
        }
    }
    // Do any additional setup after loading the view.
}

(注意,在Swift中, NSLocalizedString替換了幾個Objective-C宏,其中一個是NSLocalizedStringFromTable

PS:不幸的是,在iOS 10中,這似乎不再起作用了。 相反,該調用返回作為第一個參數提供的id(例如“ abc-xy-pqr.text ”)。 有任何想法嗎?

我為組件制作了自己的類別。

例如,一個按鈕:

#import <UIKit/UIKit.h>
@interface LocalizedButton : UIButton
@end

#import "LocalizedButton.h"

@implementation LocalizedButton

- (id)initWithCoder:(NSCoder *)aDecoder {
    NSLog(@"Loading LocalizedButton: initWithCoder");
    if ((self = [super initWithCoder:aDecoder])){
        [self localizeButton];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame{
    NSLog(@"Loading LocalizedButton: initWithFrame");
    self = [super initWithFrame:frame];
    if (self) {
       [self localizeButton];
    }
    return self;
}

-(void) localizeButton{
    self.titleLabel.adjustsFontSizeToFitWidth = YES;
    NSString* text = NSLocalizedString(self.titleLabel.text, nil);
    [self setTitle:text forState:UIControlStateNormal];
    [self setTitle:text forState:UIControlStateHighlighted];
    [self setTitle:text forState:UIControlStateDisabled];
    [self setTitle:text forState:UIControlStateSelected];
}

@end

您可以在以下網址上找到完整的代碼: https//github.com/exmo/equizmo-ios/blob/master/Quiz/LocalizedButton.m

當我用引用本地化文件id.storyboard的正確id(例如“MainStoryboard”)替換“Main”時, https ://stackoverflow.com/users/1950945/stefan的Swift解決方案適用於iOS 10.2。 “MainStoryboard.storyboard”)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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