当前位置:   article > 正文

iOS多语言漫谈(含自动化迁移旧项目)_ios 多语言base

ios 多语言base

目录

概览
各种资源的国际化

1.文本
2.图片
3.nib
4.其他资源

特定模块/功能的国际化

1.APP图标
2.应用名与权限提示
3.启动图(LaunchScreen)
4.app调系统资源页面的国际化
5.涉及服务端数据内容的国际化

app内更改语言

1.更改语言的方案
2.未做国际化的旧项目迁移


概览

国际化的本质是为每种语言单独提供一份资源(文本,图片,音视频等)。
本文术语
本地化:指单独一种语言
国际化:多种语言的合体

在工程的Localizations中每新增一种语言,xcode会提示我们生成对应的文件,而后也生成了对应的文件夹。
新增本地化语言

新增中文简体后生成的文件夹与文件
两种语言

iOS为这些文件提供了快捷的国际化方案。对于字符串资源文件生成相应语言的字符串文件放在对应的文件夹中,而XIB和StoryBoard则可选整个文件和字符串资源。具体的方案后续讨论。
image.png

如果忘了添加某个资源的具体语言文件,或者后续增加的资源文件,可以通过该资源文件的 文件监察器File Inspector 中的 Localize按钮添加。
image.png

Localizable.stringsInfoPlist.strings在国际化方案中是常见的。

  • Localizable.strings
    这个是读取多语言字符串方法NSLocalizedString默认会加载的文件,如果自定了这个文件名字,则使用NSLocalizedStringFromTable指定table即可
  • InfoPlist.strings
    info.plist的字符串国际化文件,系统默认读取,名字固定

各种资源的国际化

1. 文本

添加了多语言的字符串资源文件处于可展开状态,子级有着相应语言的副本。我们把相应语言的文本放在副本里面就行了。

字符串文件中具体的格式是"key" = "value";笔者发现写成key = "value";也是不会有问题的(但是不加双引号不能有空格,会识别不了),比如应用名称的本地化:
应用名称的国际化
看截图,最终的应用名称是后面那一个,说明有效且 被覆盖了

使用NSLocalizedString(key, comment)来读取字符串。第二个参数comment可以是nil,可以是一段为空的字符串,也可以是对key的注释。

看一下这个方法的实现

#define NSLocalizedString(key, comment) \
	    [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]

...
/* Method for retrieving localized strings. */
- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

localizedStringForKey:value:table:是NSBundle的对象方法,由此可见,可以加载不同的包名和字符串资源表的字符串。也提供了相关宏

#define NSLocalizedStringFromTable(key, tbl, comment) \
	    [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
	    [bundle localizedStringForKey:(key) value:@"" table:(tbl)]
  • 1
  • 2
  • 3
  • 4

重要:当找不到相应的语言strings或value时会直接返回key,如果你用英文的内容作为Key,甚至都可以不用维护英文本地化。

2. 图片

Xcode5之后图片资产(Assets.xcassets)不再支持国际化了,单张图片资源的方式仍然可用,使用方式同字符串。将需要国际化的图片拖入工程,选择文件监察器,点击Localize并选择多个语言后即可生成如如字符串资源一样的可展开状态了。要配置不同语言的图片前往该语言目录替换即可。
图片国际化

这个系统提供的方案支持Interface Builder版的nib资源国际化(当然Localizable Strings 方式很显然只是字符串而已),也支持+ imageNamed: 加载方式的国际化。

还有个只适合用于纯代码,不支持nib的方式。就是把图片的名称做字符串国际化,然后再使用+ imageNamed: 加载。

另外,针对+imageWithContentsOfFile:的加载方式,可以通过分类的方式,根据语言修改相应的加载路径。

PS:图片的国际化带来的是多份的副本,如果国际化中需要做的具体本地化语言较多,必然造成包的急剧增大。所以建议能避免就避免。

3. nib文件(XIB和StoryBoard)

StoryBoard本地化

nib文件的国际化方式上面提到有两种方式:

  • 只做字符串资源(Localizable Strings)
  • 整个nib文件(Interface Builder CocoaTouch XIB/StoryBoard)

nib文件有一个大坑,画重点

各个本地化的nib修改不会同步,nib的修改也不会同步至字符串资源

也就是说第一种方案每增加一种语言就得再画一个页面,本地化语言多的话,额外工作量惊人。
第二种方案,也得自己将新增的字符串拷贝出来。

如果要把更新同步的过程做成自动化,当然也是字符串方便一点。用整个nib文件做国际化比字符串资源方式强的地方也就是以下两点了

  • 图片
  • 不同本地化不同布局

一般也不会去根据不同本地化语言去修改布局,阿拉伯国家也就改个文本方向,这个特性视图自带,全局修改即可。

[UIView appearance].semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
  • 1

nib中的图片资源用代码也可轻松解决,综上笔者建议针对nib文件只做字符串资源(Localizable Strings)。

所以,上面的图片方案选了支持nib的方案,然后现在不用了 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/74805
推荐阅读