![](/img/trans.png)
[英]Localization of iOS Storyboard: UITextView texts are not localized?
[英]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.