2011-11-29 485 views
52

我有一個帶有一些視圖的iPhone故事板。例如,導航項目標題被命名爲News,其應該被翻譯爲其他語言。如何本地化iOS故事板

當我向故事板添加新本地化時,它爲我的當前故事板創建了新語言的副本。在這裏,我可以更改導航項目的標題,但對我而言,它看起來不太有用。如果我的故事板包含100個視圖,並且需要支持10種語言,該怎麼辦?如果我需要更改原始故事板中的某些內容,則必須對所有語言進行相同的更改。這似乎很奇怪。在哪些情況下這可能有用?

我能做些什麼呢?我應該只有英文故事板,並使用NSLocalizedString手動翻譯ViewController中的每個元素?

+9

@WTP:相反,你應該使用*多*故事板,如果你有很多。 5或10個故事板肯定比100個Xibs好。 –

+0

檢查[在iOS 6中使用單一故事板文件進行基本國際化](http://forums.macrumors.com/showthread.php?t=1467446),您將找到一個詳細的方法來執行您所需的操作。 – mikezang

+0

看看這個: http://stackoverflow.com/questions/38631740/how-to-shift-all-uiview-from-left-to-right-in-ios-objective-c/38631847#38631847 – Dhiru

回答

10

您可以通過更改UI元素的標題在代碼中做本地化:

self.title = NSLocalizedString("News", nil); 

如果要本地化您的應用程序在荷蘭例如,你有這樣的Dutch.lproj/Localizable.strings

"News" = "Nieuws"; 

然後,您可以爲每個UI元素和語言執行此操作。

+1

@丹尼斯Madsen是的。 – 2011-12-06 19:46:26

+0

如果您需要對UI進行一些調整(例如翻譯時間過長並被截斷)?這是本地化xib文件而非通過NSLocalizedString以編程方式替換文本時輕鬆完成的一件事。但我不知道故事板是否允許這樣做(我還沒有嘗試故事板)。 – Clafou

+1

@Clafou您可以將大小放在可本地化的字符串中,並在運行時將它們轉換爲數字。 – 2012-01-29 12:46:55

6

你可能會在這裏找到這個視頻教程有用:

http://www.youtube.com/watch?v=cF1Rf02QvZQ

的方法是有一個單獨的故事板爲每種語言本地化, 然後讓腳本需要傳播你所做的更改的護理所有其他語言的原始故事板 。

39

從iOS 6開始,您可以決定使用Base Internationalization:所有storyboard和xib/nib文件只在名爲Base.lproj的文件夾中存在一次。 GUI元素的本地化放置在每個本地化目錄中的相關.strings文件中。

例如「MainStoryboard.storyboard」將被放置在Base.lproj中。名爲「MainStoryboard.strings」的關聯文件放置在en.lproj中,並適用於您所應用的任何本地化。

這真的很帥,特別是與佈局約束相結合!

+0

基本國際化是否適用於iOS 5或4?謝謝! –

+4

不幸的是只有iOS 6和更好。如果您將iOS 5設置爲目標,則會收到錯誤消息。 – freytag

1

我建議你學習的命令行ibtool它可以幫助你的ASIST本地化中的所有故事板:)這裏是這裏http://www.albertmata.net/articles/introduction-to-internationalization-using-storyboards-on-ios-5.html

+0

我相信這是故事板本地化的方式! – Josejulio

+1

鏈接死了試試http://www.lwxted.com/blog/2012/localization-ios-development/檢查這個應用程序https://github.com/EldhoseIssac/LocalizationHelper幫助本地化 – Eldhose

+0

@實驗鏈接不好太。 – ThomasW

107

在iOS 6中的教程有Info選項卡下的項目設置,上面寫着「使用基地國際化」。如果您勾選此框,它會將所有字符串從Storyboard中移出並放入國際化的.strings文件中。

這樣你就不必擁有多個Storyboard的副本。

enter image description here

+3

http://forums.macrumors.com/showthread.php?t=1467446 –

+0

本地化沒有任何代碼:https://iosdevcenters.blogspot.com/2016/12/localize-your- apps-to-support-multiple.html –

+0

如何在故事板內容更改時更新這些字符串文件? – algrid

3

對於iOS 5中,我使用這樣的本地化我的標籤故事板的部署目標應用程序在我的上一個故事板第一的ViewController是UITabBarController

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    // ... 

    if ([self.window.rootViewController isKindOfClass:UITabBarController.class]) { 
     UITabBarController *tabBarController = (UITabBarController *) self.window.rootViewController; 

     // Localize tab items 
     NSArray *tabBarItems = tabBarController.tabBar.items; 

     [tabBarItems enumerateObjectsWithOptions:NSEnumerationConcurrent 
             usingBlock:^(UITabBarItem *item, NSUInteger tabIndex, BOOL *stop) { 
      NSString *keyName = [NSString stringWithFormat:@"tabBarItem%i", tabIndex]; 
      item.title = NSLocalizedString(keyName, @"TabBarItems"); 
     }]; 
    } else { 
     // The root view controller is not the UITTabBarController 
    } 

    // ... 
} 

,並有東西像這樣在我Localizable.strings文件:

// MARK: TabBar 
"tabBarItem0" = "My First Tab Label"; 
"tabBarItem1" = "My Second Tab Label"; 
"tabBarItem2" = "My Third Tab Label"; 
+0

這可以工作,但敲出標籤欄項目圖標,直到我添加以下內容:[tabBarItems [0] setImage:[UIImage imageNamed:@「tabIcon1.png」]];等等,用於標籤欄中的每個項目 –

2

您可能會發現多語種本地化有用爲w埃爾。不用在代碼中調用NSLocalizedString(),您可以直接在Storyboard中指定它的關鍵字。您可以避免不必要的出口並減少樣板代碼。

https://github.com/negusoft/Polyglot

相關問題