實現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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...