搜尋

首頁  >  問答  >  主體

iOS 国际化如何指定默认语言

如题,app支持中文,英文,日文三种语言。希望在其他语言的情况下都使用英文。如何实现啊,网上看到的自己实现Localized,有没有苹果原生的方法来指定啊

怪我咯怪我咯2771 天前423

全部回覆(4)我來回復

  • 巴扎黑

    巴扎黑2017-04-18 09:53:57

    將專案plist中的開發地區改為en即可

    <key>CFBundleDevelopmentRegion</key>
        <string>en</string>

    蘋果的多語言原理

    名詞介紹
    Localizable.strings 多語言文件,用於本地化App內的字串Localizable.strings 多语言文件,用于本地化App内的字符串
    InfoPlist.strings 多语言文件,用于本地化App名称
    Base 多语言默认文件,被其它多语言 (Chinese, English, ...) 继承和覆盖,不会被iOS直接使用,只有当对应的多语言文件中没有找到相应条目时才会到BaseInfoPlist.strings 多語言文件,用於本地化App名稱

    < code>Base 多語言預設文件,被其它多語言(Chinese, English, ...) 繼承和覆蓋,不會被iOS直接使用,只有當對應的多語言文件中沒有找到相應條目時才會到Base中查找,作用跟函數參數的預設值差不多。


    查找原理App啟動時,iOS會遍歷用戶設定的語言優先級去和App
    的多語言文件匹配
    如果匹配,會使用對應的語言如果不匹配,會使用plist

    中開發地區所對應的語言

    zh-Hans
    日语 ja
    英语 en簡體中文 zh-Hans

    日文 ja

    英文

    🎜更多介紹🎜 🎜

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 09:53:57

    你好,用我提供的 DPLocalizedString 方法代替系统的 NSLocalizedString 即可。

    #define CURR_LANG   ([[NSLocale preferredLanguages] objectAtIndex:0])
    
    + (NSString *)DPLocalizedString:(NSString *)translation_key {
        
        NSString * LocalizableStr = NSLocalizedString(translation_key, nil);
        
        if (!([CURR_LANG rangeOfString:@"ja"].length >0) &&
            !([CURR_LANG rangeOfString:@"zh-Hant"].length >0) &&
            !([CURR_LANG rangeOfString:@"zh-Hans"].length >0)) {
            
            NSString * path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
            
            NSBundle * languageBundle = [NSBundle bundleWithPath:path];
            
            LocalizableStr = [languageBundle localizedStringForKey:translation_key value:@"" table:nil];
            
        }
        
        return LocalizableStr;
    }
    

    回覆
    0
  • 黄舟

    黄舟2017-04-18 09:53:57

    題主 你好,我為你提供一個想法,具體的實現 可能需要你自己根據需求來做。

    1. 取得機器預設語言

    NSArray  *languages = [NSLocale preferredLanguages];
    //获得首选语言版本
    NSString *language = [languages objectAtIndex:0];

    2.判斷該語言

    if ([language hasPrefix:@"zh-Hans"]) { //简体中文
                   //do...
                } else if ([language hasPrefix:@"zh-TW"] || [language hasPrefix:@"zh-HK"] || [language hasPrefix:@"zh-Hant"]) {//繁体中文  由于繁体又有台湾繁体和香港繁体之分 进行判断然后为繁体
                } else if ([language hasPrefix:@"en"]) {//英文
                   
     
                }else if ([language hasPrefix:@"ja"]){//日文
    
                }else{
                //设置语言为英文...    
            }

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:53:57

    iOS的國際化來說一直都覺得處理起來非常麻煩,也一直想找找一個比較完美的解決方案來解決國際化問題。之前分享過一篇過於國際化的文章,現在再深入分析。
    因為文章之前寫的。原文章已經被更新啦。會在最後更新出來。
    一.存在問題
    1.官方沒有給出一套關於國際化的完美的處理方式。
    2.沒有適配這種語言的時候不能指定顯示其他語言。它會預設選擇上一次的語言。
    3.大版本更新後,資料更新不相容之前的版本。
    4.新增特定的語言資源檔案和程式碼回傳的語言沒有對應起來。

    二.國際化框架思想

    針對上面的這些問題,我是啟用了一個plist來處理國際化問題。
    plist裡的key和value做一個對應,如果取得目前的語言和plist對應起來就顯示目前的語言,不然就顯示指定的語言。

    三.實作方式
    在特定的語言基礎上加上對應的語言包。用NSLocalizedString來取得對應的語言。
    取得當前語言

    NSArray * allLanguages = [defaults objectForKey:@"AppleLanguages"];
    NSString * CURR_LANG = [allLanguages objectAtIndex:0]; 

    判斷當前語言是否為適配的語言

    if (![CURR_LANG hasPrefix:@"en"] && ![CURR_LANG hasPrefix:@"zh"])
    {
       NSString * path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
       NSBundle * languageBundle = [NSBundle bundleWithPath:path];
       s = [languageBundle localizedStringForKey:translation_key value:@"" table:nil];
    }

    s就是當前非中文或英文下的語言,目前可以把英文去掉,因為判斷不判斷英文都是要處理成英文的。顯示如下

    if (![CURR_LANG hasPrefix:@"zh"])
    {
       NSString * path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
       NSBundle * languageBundle = [NSBundle bundleWithPath:path];
       s = [languageBundle localizedStringForKey:translation_key value:@"" table:nil];
    }

    文章連結

    我的筆記裡有些關於總結國際化內容。

    回覆
    0
  • 取消回覆