如题,app支持中文,英文,日文三种语言。希望在其他语言的情况下都使用英文。如何实现啊,网上看到的自己实现Localized,有没有苹果原生的方法来指定啊
走同样的路,发现不同的人生
將專案plist中的開發地區改為en即可
en
<key>CFBundleDevelopmentRegion</key> <string>en</string>
蘋果的多語言原理 名詞介紹Localizable.strings 多語言文件,用於本地化App內的字串Localizable.strings 多语言文件,用于本地化App内的字符串InfoPlist.strings 多语言文件,用于本地化App名称Base 多语言默认文件,被其它多语言 (Chinese, English, ...) 继承和覆盖,不会被iOS直接使用,只有当对应的多语言文件中没有找到相应条目时才会到BaseInfoPlist.strings 多語言文件,用於本地化App名稱Base 多語言預設文件,被其它多語言(Chinese, English, ...) 繼承和覆蓋,不會被iOS直接使用,只有當對應的多語言文件中沒有找到相應條目時才會到Base中查找,作用跟函數參數的預設值差不多。 查找原理App啟動時,iOS會遍歷用戶設定的語言優先級去和App的多語言文件匹配如果匹配,會使用對應的語言如果不匹配,會使用plist 中開發地區所對應的語言 zh-Hans日语 ja英语 en簡體中文 zh-Hans日文 ja英文
蘋果的多語言原理
名詞介紹Localizable.strings 多語言文件,用於本地化App內的字串Localizable.strings 多语言文件,用于本地化App内的字符串InfoPlist.strings 多语言文件,用于本地化App名称Base 多语言默认文件,被其它多语言 (Chinese, English, ...) 继承和覆盖,不会被iOS直接使用,只有当对应的多语言文件中没有找到相应条目时才会到BaseInfoPlist.strings 多語言文件,用於本地化App名稱
Localizable.strings
InfoPlist.strings
Base
查找原理App啟動時,iOS會遍歷用戶設定的語言優先級去和App的多語言文件匹配如果匹配,會使用對應的語言如果不匹配,會使用plist
zh-Hans日语 ja英语 en簡體中文 zh-Hans
zh-Hans
ja
英文
你好,用我提供的 DPLocalizedString 方法代替系统的 NSLocalizedString 即可。
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; }
題主 你好,我為你提供一個想法,具體的實現 可能需要你自己根據需求來做。
取得機器預設語言
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{ //设置语言为英文... }
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]; }
我的筆記裡有些關於總結國際化內容。
將專案plist中的開發地區改為
🎜更多介紹🎜 🎜en
即可你好,用我提供的
DPLocalizedString
方法代替系统的NSLocalizedString
即可。題主 你好,我為你提供一個想法,具體的實現 可能需要你自己根據需求來做。
取得機器預設語言
2.判斷該語言
iOS的國際化來說一直都覺得處理起來非常麻煩,也一直想找找一個比較完美的解決方案來解決國際化問題。之前分享過一篇過於國際化的文章,現在再深入分析。
因為文章之前寫的。原文章已經被更新啦。會在最後更新出來。
一.存在問題
1.官方沒有給出一套關於國際化的完美的處理方式。
2.沒有適配這種語言的時候不能指定顯示其他語言。它會預設選擇上一次的語言。
3.大版本更新後,資料更新不相容之前的版本。
4.新增特定的語言資源檔案和程式碼回傳的語言沒有對應起來。
二.國際化框架思想
針對上面的這些問題,我是啟用了一個plist來處理國際化問題。
plist裡的key和value做一個對應,如果取得目前的語言和plist對應起來就顯示目前的語言,不然就顯示指定的語言。
三.實作方式
在特定的語言基礎上加上對應的語言包。用NSLocalizedString來取得對應的語言。
取得當前語言
判斷當前語言是否為適配的語言
s就是當前非中文或英文下的語言,目前可以把英文去掉,因為判斷不判斷英文都是要處理成英文的。顯示如下
文章連結
我的筆記裡有些關於總結國際化內容。