首页 > 其他分享 >Xcode - APP语言本地化(国际化)

Xcode - APP语言本地化(国际化)

时间:2023-03-08 21:35:05浏览次数:37  
标签:文件 APP 本地化 Xcode 字符串 strings 语言

前言

1 - 语言本地化,又叫做语言国际化。是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言

如何实现语言本地化:APP 名称本地化、代码中字符串本地化、图片本地化、storyboard/xib 本地化

实现 APP 语言本地化

1 - 首先要配置需要国际化的语言:这是国际化之前的准备工作。无论我们是国际化 APPT 名称、代码中的字符串、图片、还是 storyboard/xib,都需要进行这一步的准备工作。一个项目中需要且仅需要配置一次

① 选中project -> Info -> Localizations,然后点击 +,添加需要国际化/本地化的语言,如下图(默认需要勾选Use Base Internationalization)

② 日本语

2 - 应用名称本地化。是指同一个 APP 的名称,在不同的语言环境下(也就是手机设备的语言设置)显示不同的名称。比如微信在简体中文环境下 App 名称显示为微信,在英语环境下显示为 weChat

① 选中 Info.plist 后新建 command + N 文件,选择 Strings File(iOS -> Resource -> Strings File)。文件名字命名为 InfoPlist 且必须是这个名字,完事后 Xcode 左侧导航列表就会出现名为 InfoPlist.strings 的文件,如下图

② 选中 InfoPlist.strings 在 Xcode 的 File inspection(文件检查器)中点击 Localize,目的是选择我们需要本地化的语言,选择日本语(系统默认英语)。完事之后Xcode 右侧的 File inspection 变成了下图的样式

③ 此时 Xcode 左侧的 InfoPlist.stirings 多了一个箭头。如下图

从图中可以看出 InfoPlist.strings 文件下包含了English、 日本语这两种语言文件。原理:程序启动时会根据操作系统设置的语言,自动加载 InfoPlist.strings 文件下对应的语言文件,然后显示应用程序的名字

④ 接下来分别用不同的语言给 InfoPlist.strings 下的文件设置对应的名字即可:分别在 InfoPlist.strings(english) 、InfoPlist.strings(French) 中加入对应的代码

// 英语文件
CFBundleDisplayName = "English Name";// CFBundleDisplayName 可以使用双引号,也可以不使用双引号
// 日语文件
"CFBundleDisplayName" = "にほんご";

⑤ 修改模拟器语言环境为日本语。APP 名称如下

注:过去本地化 APP 名称,需要在 Info.plist 文件中增加一个名为 Application has localized display name 的 BOOL 类型的 Key,且要将其值设置为 YES,目的是让 APP 支持本地化 APP 名称,但是如今可以忽略这一步

3 - 代码中字符串的本地化:所谓字符串本地化就是指 APP 内的字符串在不同的语言环境下显示不同的内容。比如 主页 这个字符串在中文语言环境下显示 主页,在英语环境下显示 home

① 其实字符本地化和 APP 名称本地化过程如出一辙,只是创建的文件名成不一样(文件名必须是 Localizable.strings),上述步骤完全相同,这里不再赘述。我们直接看 Localize 后 Xcode 左侧的 Localizable.stirings 文件,同样以日本语为例

② 分别在 Localizable.strings 文件中以 Key-Value 的形式为代码中每一个需要本地化的字符串赋值

// 英语文件
"下一页" = "Next Page";
// 日语文件
"下一页" = "じよう";

③ 最后在需要本地化的代码中使用 Foundation 框架自带的 NSLocalizedString(key, comment) 这个宏根据 Key 获取对应的字符串即可

// NSLocalizedString 实质
// 第一个参数是内容:根据第一个参数去对应语言的文件中取对应的字符串
// 第二个参数将会转化为字符串文件里的注释,可以传 nil,也可以传空字符串 @""
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

效果如下(日语)

注:以英语为例,其实我们不需要给 Localizable.strings(English) 文件添加 Key-Value。原因:系统根据某个 key 去获取对应的字符串时,如果没有找到那么就会以 key 作为 value 返回。所以即使没有给键添加值那么在英语环境下 btn 最终显示的 title 会是 下一页

// 英语文件
"下一页";

效果如下

4 - 图片本地化

① 首先添加需要本地化的语言,就是配置所要国际化的语言,以日语为例

② 将图片 icon.png 拖入工程中,选中 icon.png 文件展开 Xcode 右侧的 file Inspection 后点击 Localize(过程同上,我们直接跳过)。完事后应该是这样的

③ 右击 icon.png -> show in Finder 会发现在 en.Iproj/ja.Iproj 文件中多了一个名为 ICON.png 的图片

④ 现在 en.Iproj/ja.Iproj 文件中图片默认是一模一样,我们只需把 ja/lproj 中的图片替换掉即可:拉进一张同名图片 ICON.png

效果如下(日本语)

结语

1 - 查看/切换本地语言

① 应用启动时首先会读取 NSUserDefaults 中的 key 为 AppleLanguages 对应的value,该 value 是一个 String 数组,也就是说我们访问这个名为 AppleLanguages 的 key 可以返回一个 string 数组,该数组存储着 APP 支持的语言列表,数组的第一项为 APP 当前默认的语言(默认日本语)

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
    
    NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
    NSString *currentLanguage = languages.firstObject;
    NSLog(@"模拟器当前语言:%@",currentLanguage); // 模拟器当前语言:ja-US
}

② 我们也就可以给 AppleLanguages 这个 key 赋值来达到切换本地语言的效果

日志输出

效果如下:可实现 APP 字符串本地化和图片本地化,但是手机本身的语言环境仍是日本语,这也就意味着 APP 应用名称同样是日本语

     

2 - 多人协作下的字符串本地化

① 项目开发中独立开发的还是少数,经常会有多人开发的情况。如果多人同时操作本地化文件,极有可能会存在冲突。另一方面我们又不希望自己的本地化文件受到对方的污染。上面介绍的代码中字符串的本地化是使用的是默认的文件 Localizable,那么如何让系统加载我们自己命名的本地化文件而非系统默认的Localizable.strings 呢?这就是 NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>) 的用处 ② 如果你的 strings 文件名字不是 Localizable 而是自定义的话,如 XXX.strings,那么就要使用 NSLocalizedStringFromTable 来读取本地化字符串
// key:系统根据 key 取字符串
// tbl:自定义strings文件的名字
// comment:可以不传
NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)

③ 新建 XXX.strings 文件并完成需要国际化的语言配置,如下图

④ 代码配置

效果如下

 

标签:文件,APP,本地化,Xcode,字符串,strings,语言
From: https://www.cnblogs.com/self-epoch/p/17193110.html

相关文章

  • 每日打卡APP界面优化与功能完善
    每日打卡APP界面优化与功能完善   ......
  • mybatis02_Mapper代理开发
    1、创建项目并添加依赖、连接数据库,编写mybatis的配置文件项目结构如下所需依赖如下(创建的是聚合工程,请根据自己的是实际情况选择合适的版本)<properties><ma......
  • 【Azure Function App】在ADF(Azure Data Factory)中调用 Azure Function 时候遇见 Fa
    问题描述在ADF(AzureDataFactory)中,调用AzureFunctionApp中的Function,遇见了 FailedtogetMIaccesstokenTherewasanerrorwhilecallingendpointwitherr......
  • 怎么做好APP性能测试?
    随着智能化生活的推进,我们生活中不可避免的要用到很多程序app。有的APP性能使用感很好,用户都愿意下载使用,而有的APP总是出现卡顿或网络延迟的情况,那必然就降低了用户的......
  • AppUploader教程:如何使用该工具制作Apple证书
    ​ AppUploader下载安装操作 AppUploader是一款方便快捷的开发者工具,提供了多项实用的功能。本文将介绍AppUploader的下载和安装步骤,帮助您快速使用该工具。1.下载A......
  • uniapp 使用 socket.io通讯 服务端nodejs+express
    uniapp安装: npmisocket.io-clientonLoad:function(){ var_this=this; _this.socket=io.connect('http://localhost:30000/',{transports:['websock......
  • QueryWrapper用法
    @Test   publicvoidsquery(){       //创建QueryWrapper对象       QueryWrapper<User>queryWrapper=newQueryWrapper<>();       //......
  • WebApplicationBuilder和HostBuilder的区别
    创建区别WebApplicationBuildervarbuilder=WebApplication.CreateBuilder(args);//在UseKestrel()方法中指定IP和端口builder.WebHost.UseKestrel(options=>{......
  • 理解Call Apply Bind
    在JavaScript解析器解析的时候,会创建执行上下文,其中有一位属性thisValue,也就是this。this分为全局this和函数this,函数的this会指向函数的宿主对象,也就是谁调用函数this......
  • uniapp整包更新、热更新
    ##uniapp整包更新和热更新组件支持vue3支持打开安卓、苹果应用市场,支持wgt静默更新##插件地址  整包更新和热更新组件支持vue3支持打开安卓、苹果应用市场,wgt静默......