實現iOS中的多語言切換

来源:https://www.cnblogs.com/Julday/archive/2020/04/15/12704862.html
-Advertisement-
Play Games

前言 我們日常使用App中,只有中文就夠了,然而如果我們的App是面向國際化的,那麼多語言就必不可少。本文整理了在iOS中多語言的實現。 準備工作 添加支持的語言 選擇工程,在info下麵的Localizations中,點擊加號按鈕,添加支持的語言 建立strings文件 方法1.選擇一個story ...


前言

  • 我們日常使用App中,只有中文就夠了,然而如果我們的App是面向國際化的,那麼多語言就必不可少。本文整理了在iOS中多語言的實現。

準備工作

添加支持的語言

  • 選擇工程,在info下麵的Localizations中,點擊加號按鈕,添加支持的語言

建立strings文件

  • 方法1.選擇一個storyboard,例如預設的Main.storyboard,Localization欄中勾選支持的語言。系統就會生成對應的文件。
  • 方法2.我們直接新建strings資源文件。在該文件的File InspecterLocalization欄中勾選支持的語言。

準備對應文案

  • 例如在Localizable.strings(English)中,
"消息" = "Messages";
"搜索" = " Search";

 

實現

  • 思路:
    • 偏好設置中存儲我們設置的語言,預設是簡體中文
    • 當我們切換多語言的時候,更改偏好設置中存儲的語言
    • 顯示的時候,傳入key。
    • 如果設置了其他語言,就根據對應的bundle中的key取出對應value來顯示

切換多語言的實現

定義巨集

  • 定義多語言的巨集,如下,定義了三種巨集,分別是簡體中文,繁體中文,英文,韓文
#define Chinese_Simple @"zh-Hans"
#define Chinese_Traditional @"zh-Hant"
#define English_US @"en"
#define Korean @"ko"

 

定義偏好設置的文件名稱

#define Language_Key @"eagle_languageKey"

 

設置多語言

/// 設置多語言
/// @param language 語言
- (void)setNewLanguage:(NSString *)language
{
    NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key];
    if ([language isEqualToString:setLanguage]) {
        return;
    }
    // 簡體中文
    else if ([language isEqualToString:Chinese_Simple]) {
        [[NSUserDefaults standardUserDefaults] setObject:Chinese_Simple forKey:Language_Key];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    // 繁體中文
    else if ([language isEqualToString:Chinese_Traditional]) {
        [[NSUserDefaults standardUserDefaults] setObject:Chinese_Traditional forKey:Language_Key];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    // 英文
    else if ([language isEqualToString:English_US]) {
        [[NSUserDefaults standardUserDefaults] setObject:English_US forKey:Language_Key];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    // 韓語
    else if ([language isEqualToString:Korean]) {
        [[NSUserDefaults standardUserDefaults] setObject:Korean forKey:Language_Key];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
}

 

使用

#define languageStringWithKey(key) [[LanguageTools sharedInstance] getStringForKey:key]

NSString *title = languageStringWithKey(@"確定");

具體實現如下,先偏好設置存儲的當前語言獲取對應bundle,然後拿到這個bundle之後,根據key找到對應的值。

// 根據語言名獲取bundle
- (NSBundle *)bundle
{
    NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key];
    //預設是簡體中文
    if (setLanguage == nil || [setLanguage isEqualToString:@"zh-Hans-CN"]) {
        setLanguage = Chinese_Simple;
    }
    NSString * bundlePath = [[NSBundle mainBundle] pathForResource:setLanguage ofType:@"lproj"];

    return [NSBundle bundleWithPath:bundlePath];
}

// 根據key獲取value
- (NSString *)getStringForKey:(NSString *)key
{
    NSBundle * bundle = [[LanguageTools sharedInstance] bundle];
    if (bundle) {
        NSString * valueString = NSLocalizedStringFromTableInBundle(key, @"Localizable", bundle, @"HelloWord");
        if (!KCNSSTRING_ISEMPTY(valueString)) {
            return valueString;
        }
        DDLogInfo(@"\n********** have not add key **********\n \"%@\" = \"%@\" \n****************************",key,key);
        return NSLocalizedString(key, @"HelloWord");
    }
    return NSLocalizedString(key, @"HelloWord");
}

 

 

NSLocalizedString

  • NSLocalizedString是一個定義在NSBundle.h中的巨集,用途是尋找當前系統語言對應的Localizable.strings文件中的某個key的值。

  • 第一個參數是key的名字,第二個參數是對這個“鍵值對”的註釋,在用genstrings工具生成Loclizable.strings文件時會自動加上去。例如上面代碼中的HelloWord就是註釋。

  • NSLocalizedString系列的四個巨集,其實最終都是調用了[bundle localizedStringForKey:(key) value:(val) table:(tbl)]。根據我們的自定義程度不同可以選擇不同的巨集。

#define NSLocalizedString(key, comment) \
        [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
        [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
        [bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
        [bundle localizedStringForKey:(key) value:(val) table:(tbl)]

上面基本就是實現一個可控的多語言版本的實現過程。

推薦

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL2008 的收縮日誌 由於SQL2008對文件和日誌管理進行了優化,所以以下語句在SQL2005中可以運行但在SQL2008中已經被取消:SQL2005 清空日誌的方法:Backup Log DNName with no_loggodump transaction DNName with no ...
  • Mongodb視圖可以讓查詢數據變的更加方便,索引讓查詢數據變得更加快捷,本文介紹如何使用Mongodb的視圖功能和索引功能 ...
  • 根據應用場景,不定時更新,歡迎大家把自己遇到的問題留言,稍後完善。 1 mySql三範式 1.1 第一範式(1NF) (必須有主鍵,列不可分)資料庫表中的任何欄位都是單一屬性的,不可再分 1.2 第二範式(2NF) (當一個表是複合主鍵時,非主鍵的欄位不依賴於部分主鍵(即必須依賴於全部的主鍵欄位)) ...
  • compose file 15672 是 Web 管理頁面的埠:http://localhost:15672/ ...
  • node+mysql的資料庫操作; 1 //引入mysql 2 var mysql = require('mysql'); 3 //進行資料庫連接設置 4 var connection = mysql.createConnection({ 5 host : 'localhost', 6 user : ...
  • MySql可視化工具 曾經用過Navicat的破解版,最近下載了Navicat Premium15,試用期後我就想搞個破解版的,正好在看《深入淺出MySQL》,書中用的是MysqlWorkBench,那就懶得去找破解版了咯,搞不好又帶一堆流氓軟體。 Navicat 與MysqlWorkBench的比 ...
  • MongoDB是非關係型資料庫NoSQL的代表,作為一款可分散式存儲的資料庫,對文檔的操作是MongoDB的重中之重。在本文中,我們將著重為大家介紹如何在MongoDB中插入文檔。 MongoDB一共為我們提供了三種方式用於插入文檔: db.collection.insertOne() :插入一個指 ...
  • getIdentifier int id = context.getResources().getIdentifier("tv_col"+(i+1),"id",context.getPackageName()); textView = findViewById(id); ⭐除此之外,它還可以用於獲取 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...