iOS-i18N国际化

前言

项目国际化效果是根据不同语言及地区显示对应语言的界面内容,需要对工程中的资源、字符串等进行相应的国际化操作。在实际的项目需求中,有可能进行应用内语言切换,除了默认的跟随系统之外,还要实现动态的语言版本切换;国际化后相应的会增加安装包的大小,主要是因为资源文件的多语言版本数据造成的。

语言切换方式

  • 手机系统设置语言
  • App 在支持语言里切换
  • App 内部语言切换管理

国际化操作

  • App 名称
  • 权限使用说明
  • 原生代码中字符串
  • 图片、文件、音视频等资源文件
  • Storyboard / Xib 文件
  • 时间
  • 网络请求数据(后端支持国际化数据)

项目配置语言

国际化的准备工作是配置需要国际化的语言,这是我们国际化操作的必要配置。

  • 配置语言


    iShot_2022-11-12_17.11.47.png
  • 结果如下


    iShot_2022-11-12_17.12.52.png
1. App 名称

App 名称国际化是指应用在不同的语言环境下显示不同的名称,也就是手机设备的语言设置;
注意 App 名称只受手机设备系统的语言影响,也就是上面切换语言的第一种方式控制的;

  • 创建 InfoPlist.strings 文件、配置需要国际化的语言
    iShot2022-11-14 10.56.28.png
  • InfoPlist.strings 文件中设置不同语言对应的 App 名字
/// en
CFBundleDisplayName = "LocalizeDemo";
/// zh-Hans
CFBundleDisplayName = "本地化示例";
/// zh-Hant
CFBundleDisplayName = "本地話示例";
2. 权限使用说明

应用在使用到系统权限时,会询问用户是否同意使用该权限,说明理由的文案需要国际化

  • InfoPlist.strings 文件中设置不同语言对应的权限 key 对应的描述
NSBluetoothAlwaysUsageDescription = "APP需要您的允许才能允许蓝牙与设备通信";
NSBluetoothPeripheralUsageDescription ="APP需要您的允许才能允许蓝牙与设备通信";
NSCalendarsUsageDescription ="APP需要您的允许才能访问日历";
NSCameraUsageDescription ="APP需要您的允许才能使用照相机功能";
NSContactsUsageDescription ="APP需要您的允许才能访问您的通讯簿";
NSLocationAlwaysUsageDescription ="APP需要您的允许才能始终启用位置功能 ";
NSLocationWhenInUseUsageDescription ="APP需要您的允许才能始终启用位置功能 ";
NSMicrophoneUsageDescription ="APP需要您的允许才能录制";
NSPhotoLibraryAddUsageDescription ="APP需要您的允许才能将照片保存到相册 ";
NSPhotoLibraryUsageDescription ="APP需要您的允许才能访问相册";
NSSpeechRecognitionUsageDescription ="APP需要您的允许才能使用语音识别";
NSAppleMusicUsageDescription = "APP需要你的允许才能访问多媒体";
3. 原生代码中字符串

字符串国际化指 App 内的字符串在不同的语言环境下显示不同的内容;字符串国际化和 App 名称国际化相同,只是创建的文件不一样,必须是 Localizable.strings

  • Localizable.strings 文件中设置不同语言对应的字符串展示的内容
/// en
"这是一个示例!" = "Here's an example!";
/// zh-Hans
"这是一个示例!" = "这是一个示例!";
/// zh-Hant
"这是一个示例!" = "這是一個示例!";
  • 代码中使用
/// 国际化字符串宏定义,key:需要国际化的字符串,comment:一个注释,一般设置为nil
NSLocalizedString(<#T##key: String##String#>, comment: <#T##String#>)
// 举例
Text(NSLocalizedString("这是一个示例!", comment: ""))
4. 图片、文件、音视频等资源文件
  1. 图片国际化
    图片存放方式:Assets.xcassets、项目文件夹;
    针对不同的存放方式,图片国际化也有对应的方式;
  • Assets.xcassets

    Assets资源文件直接设置支持的语言,不同语言设置对应的资源图片,使用时直接使用同一个文件名


    iShot2022-11-14 11.04.33.png
/// 直接使用文件名加载图片
Image("icon")
  • 项目文件夹存放

项目文件夹存放图片时,有两种国际方式:
(1).不同语言存放不同文件名的资源文件, Localizable.strings 文件中配置不同语言的资源图片名字,通过国际化字符串的方式获取对应的图片资源

iShot2022-11-14 11.07.04.png

/// en
"book" = "book_en";
/// zh-Hans
"book" = "book_hans";
/// zh-Hant
"book" = "book_hant";
/// 通过国际化字符串的方式获取对应的图片资源
 Image(uiImage: UIImage(named: NSLocalizedString("book", comment: ""))!)

(2).图片资源文件直接设置支持的语言,不同语言对应文件夹下存放对应的资源文件,使用时直接使用同一个文件名


iShot2022-11-14 11.10.20.png
/// 直接使用文件名加载图片
Image(uiImage: UIImage(named: "cup")!)
  1. 文件、音视频等资源文件国际化
    文件、音视频等存放方式与图片存放在项目文件夹中一样,国际化方式通图片存放在项目文件夹中的国际化方式相同
    iShot2022-11-14 11.13.19.png
5. Storyboard / Xib 文件

Storyboard / Xib 文件国际化原理和字符串差不多,需要开启Storyboard / Xib 文件的国际化支持,在Storyboard / Xib 文件右侧添加需要国际化的语言,然后Xcode会自动生成xxx.strings文件,我们只需要翻译该文件中的字符串即可,如下图所示:

iShot_2022-11-13_17.43.09.png

/// zh-Hans
"A6V-b6-9hZ.text" = "测试";
/// zh-Hant
"A6V-b6-9hZ.text" = "測試";

UILabel的text属性,其中 key 是 Storyboard 自动生成的控件的唯一编码,value则是我们需要国际化的字符串,只需要将翻译好的字符串进行替换就可以了。

6. 时间

时间涉及业务和显示的地方,在不同时区时间应该是不一样的,让应用根据不同的时区来显示时间。

  • 前后端统一系统中和时间相关的字段,都需要返回时间戳格式
  • 通过 NSDateFormatter 对象将时间戳转换成可用的字符串, NSDateFormatter 对象里面 TimeZone 属性,默认系统当前时区,无需 setTimeZone,获取到的时间就是当前系统对应的时间,随系统时区切换,时间会跟着变化。
7. 网络请求数据(后端支持国际化数据)

建议在请求头header中增加当前展示语言类型的字段,服务端获根据语言类型返回对应语言的数据,一般差异会体现在文案、图片等方面

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容