激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS文本的多語言適配以及實踐指南

iOS文本的多語言適配以及實踐指南

2021-12-28 17:21呂洪陽、趙杰 IOS

項目開發中考慮到不同國家的用戶,不同國家的語言,因而在APP里面做了多語言,所以下面這篇文章主要給大家介紹了關于iOS文本的多語言適配以及實踐的相關資料,需要的朋友可以參考下

 

背景

產品被多個國家使用,產品方希望產品擁有更好的多語言使用體驗,所以設計師提供多種字體來適配指定的語言?;谝陨媳尘?,客戶端需要快速給出解決方案并且上線。

 

字體包的多語言適配和實踐

 

 

需求分析

首先,在了解產品需求和設計方案之后,結合業務研發人員的痛點,整理出以下需求。

產品和設計的需求

  • 不同語言,對應字體包不相同。
  • 全局字體默認使用設計師指定的字體包。
  • 某些語言的字體包缺少某些字重版本,要求降級使用下一個字重版本。
  • 存在某些特殊文案不使用全局字體包(例如:中文,它有專屬的字體包,和語言環境無關)。
  • 產品迭代需要快速支持擴展,盡量減少研發投入成本。

設計師要求的字體包資源

iOS文本的多語言適配以及實踐指南

研發的痛點和需求

  • 存在公用組件(其他業務線都在使用,伴魚公共業務組件目前有50+),不能修改通用組件。
  • 僅殼工程支持且依賴字體包。
  • 字體包資源來源方式要靈活。

總結一下,產品和設計的需求強調字體適配的全局性、多樣性、可擴展性,研發關心的是解耦、職責單一、靈活性。

 

 

技術設計

分析過后,先確定技術框架的分層。

垂直分層和水平模塊

iOS文本的多語言適配以及實踐指南

如圖所示分3層,1.基礎組件提供核心實現,并支持需求擴展 2.業務組件(無相關修改)3.殼工程提供資源包和代理者。

FontPackage組件要負責什么?

  • FontPackageManager,負責綁定代理來獲取資源包,控制流程邏輯。
  • FontPackageExtension,負責AOP,增加文本屬性來滿足特殊場景的多樣性。
  • FontPackageModel,映射字體包資源的配置信息,明確了使用協議。上層業務可以增加和調整參數來配置字體包資源。

殼工程的資源包配置

  • env:國際編碼, default 表示設計師指定的默認字體。注意有些國際編碼代表一種語言,例如英語存在 en-US、en-GB 等多種編碼,需要統一為 en。
  • font:字重類型,0:light、1:medium、2:bold。斜體默認替換為medium
  • name:字體源文件的名稱。例如:GothamRndSSm-Medium

備注:因為設計師只要求3種字重,默認light字重,這個和系統提供的 UIFontWeight 不太一致。

//殼工程中的配置文件,反序列化傳回FontPackage層
//appfont.json
{
    "list": [{
        "env" : "vi",
        "note" : "越南語,按照國際編碼:vi、vi-VN。FontPackageManager 判斷國際編碼來對應",
        "data" : [{
                "font" : 0,
                "name" : "genjyuu_light(越南細)"
            },{
                "font" : 1,
                "name" : "genjyuu_medium(越南中)"
            },{
                "font" : 2,
                "name" : "genjyuu_bold(越南粗)"
            }
        ]
    }, {
        "env" : "default",
        "note" : "其他語種默認使用字體,但優先判斷設備的國際編碼來匹配字體包",
        "data" : [{
                "font" : 0,
                "name" : "GothamRndSSm-Light"
            },{
                "font" : 1,
                "name" : "GothamRndSSm-Medium"
            },{
                "font" : 2,
                "name" : "GothamRndSSm-Bold"
            }
        ]
    }
]}

添加字體包和配置文件,還有冷啟動流程:

冷啟動流程圖

iOS文本的多語言適配以及實踐指南

技術開發

FontPackage 功能組件共3個Class,200+行代碼。

首先,在冷啟動時候 FontPackage 根據 json 配置緩存語言編碼匹配到的字體包資源 Model。

然后使用 runtime hook UIFont 類的幾個構造函數,更換構造函數的 fontName 參數。目前確定5個構造函數:

//已處理
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize;
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight;
+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize;
+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize;
+ (UIFont *)fontWithName:(NSString *)fontName size:(CGFloat)fontSize;

最后統一使用 +fontWithName:size: 函數初始化,fontName 為自定義字體包。

函數 -fontpackage_name: 根據原 fontName 更換為對應的自定義字體包。

//FontPackageExtension.m 
//UIFont+FontPackage.m



+ (UIFont *)xxxFontPackage_systemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight {
    NSString *fontName = @"";
    if (weight == UIFontWeightMedium) {
        fontName = @"medium";
    } else if (weight > UIFontWeightMedium) {
        fontName = @"bold";
    }
    return [self fontWithName:fontName size:fontSize];
}

+ (UIFont *)xxxFontPackage_italicSystemFontOfSize:(CGFloat)fontSize {
    //斜體默認是medium
    return [self fontWithName:@"medium" size:fontSize];
}

+ (UIFont *)xxxFontPackage_boldSystemFontOfSize:(CGFloat)fontSize {
    return [self fontWithName:@"bold" size:fontSize];
}

+ (UIFont *)xxxFontPackage_systemFontOfSize:(CGFloat)fontSize {
    return [self fontWithName:@"" size:fontSize];
}

+ (UIFont *)xxxFontPackage_fontWithName:(NSString *)fontName size:(CGFloat)fontSize {
    fontName = [self fontpackage_name:fontName];
    return [self xxxFontPackage_fontWithName:fontName size:fontSize];
}



+ (NSString *)fontpackage_name:(NSString *)fontName {
    fontName = [fontName lowercaseString];
    FontPackageFont replaceFont = FontPackageFontLight; //默認light
    if ([fontName containsString:@"medium"]) {
        replaceFont = FontPackageFontMedium;
    } else if ([fontName containsString:@"bold"]) {
        replaceFont = FontPackageFontBold;
    }
    //匹配替換的字體
    NSString *replaceFontName = [[FontPackageManager shareInstance].fontPackageInfo.dataMap objectForKey:@(replaceFont)];
    return replaceFontName;
}

 

文本信息的多語言適配和實踐

針對海外用戶做語言本地化也是一項重要的產品功能,但很多組件在開發之初并未預留本地化拓展的接口,客戶端需要提供一套優雅的解決方案來應對此問題。

需求分析

1、產品和設計的需求

  • 語言本地化
  • 未提供本地化的語言,默認使用產品指定的語言
  • 快速支持新語言本地化

2、技術要求

  • 接入成本低,不需要對成熟組件做改動
  • 解耦,其他組件無需依賴本功能

技術設計

垂直分層和水平模塊

iOS文本的多語言適配以及實踐指南

如圖所示分3層:1、基礎組件提供需求擴展 2、業務組件(基本不需要修改,如有特殊屬性需求可以依賴基礎組件)3、殼工程提供資源包和以及資源包的更新

LocalizedString 組件要負責什么?

  • LocalizedString,負責文字本地化適配。
  • LocalizedTool,負責語言包的配置、讀取、更換功能。
  • LocalizedExtension,負責AOP,補充某些屬性。

語言包目錄如下:

語言包目錄

iOS文本的多語言適配以及實踐指南

可以看到,語言包是按照語言碼進行命名的,方便在使用中及時定位到對應文件并讀?。ù嬖诙喾N編碼的語言,統一使用其基礎類)。同時,在殼工程中會對本地語言包進行刷新,App啟動后會檢查是否有新的語言包可用,如果有會保證數據同步。

配置好語言包后,接下來需要冷啟動時初始化LocalizedString 組件。啟動時組件任務流程圖如下:

冷啟動流程圖

iOS文本的多語言適配以及實踐指南

 

技術開發

考慮到字符串最終都會依托于 UILabel 進行展示,[UILabel setText:]會作為設置展示文本的唯一收口。所以我們對[UILabel setText:]進行了 hook 和拓展,其內部操作流程圖如下:

AOP流程圖

iOS文本的多語言適配以及實踐指南

LocalizedString 組件有 NSString、UILabel 分類分別做了屬性拓展。具體代碼如下:

@interface UILabel (Localized)
@property (nonatomic, assign) BOOL isAutoLocalized; ///< 設置的文字是否要自動轉換成本地化的語言,默認YES
@end

@interface NSString (Localized)
@property (nonatomic, copy) NSString *oriStr; ///< 上次本地化的字符串原始值
@property (nonatomic, copy) NSString *localizedStr; ///< oriStr 本地化后的字符串
@end

對 UILabel 的分類拓展可以判斷 Label 是否需要被本地化;對 NSString 的分類拓展會對本地化后的結果進行緩存,當同一個 string 對象再次本地化時,可以快速從緩存拿到結果減少在 map 中的檢索次數、提高效率。類拓展的方式也保證了本組件的侵入性極低。
整個工程使用了 pod 進行集成,基礎組件無需聲明依賴,對本組件有依賴要求的只在特定業務中出現。hook + pod 的方式保證了本組件的靈活使用和充分解耦。

與NSLocalizedString的兼容

從上面的流程介紹可以看到,本地化替換發生在對 Label 設置文本的時候,不同于 NSLocalizedString 需要先顯式本地化再設置文本的方式。所以,當使用方提前對文本進行了本地化,本組件的自動本地化不生效??紤]到本組件主要應用于新語言地區,NSLocalizedString 尚未配置對應的結果,故目前仍然可以使用本組件兜底。我們也會后續優化本組件,完成與 NSLocalizedString 的兼容,更加方便本組的使用。

 

拓展

由于上述方法只適用于[UILabel setText:]這種形式的無侵入調整,對于字符串拼接的情況,仍需要開發人員使用 LocalizedString 類對子串進行逐一本地化。同時,為了支持以后可能的應用內變更語言,LocalizedString 也提供了動態變更語言包功能。LocalizedString 主要 API 如下:

/**
 @brief 直接返回指定 key 對應的 本地化文字
 @param key 轉譯文件表中的key
 */
+ (NSString *)forKey:(NSString *)key;

 /**
 @brief 根據指定的 language code,返回key 對應的 本地化文字
 @param key 轉譯文件表中的key
 @param langCode語言編碼
 */
+ (NSString *)forKey:(NSString *)key langCode:(NSString *)langCode;

/**
 @brief 設置當前默認的語言編碼
 @param langCode語言編碼
 */
+ (void)setCurrentLangCode:(NSString *)langCode;

 

總結

在多個產品同時的迭代情況下,使用組件化已經變得非常普遍,不斷地重構優化組件來保證低耦合。當面對國際化場景時,需要沉淀打磨國際化適配框架來支撐業務高效迭代,并且不能給其他業務造成負擔。

目前以上功能都已上線,滿足了產品的需求,解決了研發的痛點。

到此這篇關于iOS文本的多語言適配以及實踐的文章就介紹到這了,更多相關iOS文本多語言適配內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

作者介紹

  • 呂洪陽,伴魚 iOS 工程師,伴魚繪本iOS端負責人
  • 趙杰,伴魚 iOS 工程師,負責伴魚繪本客戶端研發,功能降級框架等工作

參考

  • https://developer.apple.com/documentation/uikit/uifont
  • http://www.lingoes.cn/zh/translator/langcode.htm

原文鏈接:https://tech.ipalfish.com/blog/2021/08/29/reading_ios_internationlization/

延伸 · 閱讀

精彩推薦
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
主站蜘蛛池模板: 成人三级免费电影 | 成人aaaaa片毛片按摩 | 91短视频在线观看 | 久久骚| xxxxhd73国产 | 午夜小电影 | 国产精品成人亚洲一区二区 | 激情av在线| 欧洲精品色 | 综合97| 成人激情视频网站 | 免费久久久久 | 免费的性生活视频 | 动漫孕妇被羞羞视频 | 亚洲精品成人久久久 | 曰本三级日本三级日本三级 | wwwav国产 | 精品国产一区二区三区在线观看 | 国产一级淫片在线观看 | 久久精品视频4 | 欧美一级黄色网 | 凹凸成人精品亚洲精品密奴 | 国产色视频在线观看免费 | 国产精品91久久久 | 欧美日韩国产一区二区三区在线观看 | 日韩精品免费一区二区三区 | 亚洲一区二区免费视频 | 91福利社在线 | 国内精品久久久久久久星辰影视 | 91精品久久久久久久 | 亚洲成人久久精品 | 欧美黑大粗硬毛片视频 | 国产91对白叫床清晰播放 | 99sesese| 一区二区三区日韩 | 一区二区三高清 | 成人资源在线观看 | 久草在线观看首页 | 色屁屁xxxxⅹ免费视频 | 久久久久久久一区 | 成人国产精品久久久 |