- 3.1 APP 内的本地化切换
iOS APP 内的本地化切换【修订】
- 3.2 一个语言对应多个字符串资源文件的方案
- 3.3 iOS本地化字符串指定参数顺序(应用:app内的多语言切换)
iOS本地化字符串指定参数顺序(应用场景:app内的多语言切换)【修订】
前言
使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言
如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lproj作为拓展名
当本地化的应用程序需要载入某一资源时,如图像、属性列表、nib文件,应用程序会检查用户的语言和地区,并查找相匹配的本地化文件夹。如果找到了相应的文件夹,就会载入这个文件夹中的资源
I、nib& info.plist 本地化
- 本地化前的准备
先创建本地化文件夹(zh-Hans.lproj),让应用程序支持对应的语言环境,并选择选择当前需要本地化的资源
打开ViewController.xib(Chinese)文件,修改里面的文字信息
info.plist 的国际化
II、图片本地化
应用场景:不同的语言登录现显示对应的图片
- 预先准备好的图片替换对应语言的图片即可
例如替换中文 zh-Hans.lproj文件夹中的home.png
- 在代码中照常使用图片即可
[UIImage imageNamed:@"icon_hyxq_youhuiq"];
III、字符串本地化
应用场景: iOS APP 内的国际化切换 (对话框中的文字)、 应用名称本地化
3.1 APP 内的本地化切换
- 【iOS APP 内的国际化切换】1、字符串的本地化、2、自定义解析本地化字符串的工具类LanguageManager、3、例子:登录界面切换中英文。
从CSDN下载【iOS APP 内的国际化切换】demo源码:https://download.csdn.net/download/u011018979/19089505
文章:https://kunnan.blog.csdn.net/article/details/103733872
原理:
1、自定义解析本地化字符串的工具类LanguageManager
2、应用内切换语言生效的技术实现:采用销毁根控制器,重新进入一次
3、本地化字符串指定参数顺序
- 效果
划重点
1、字符串的本地化 2、自定义解析本地化字符串的工具类LanguageManager、 3、例子:登录界面切换中英文(内含demo)
应用内切换语言生效的技术实现:
1、销毁根控制器,重新进入一次(采用)
2、通过发通知,到各个控制器更新文字(不采用)
3.2 一个语言对应多个字符串资源文件的方案
应用场景:解决部分英文国际化没有生效的问题
存储国际化英文字符串的.string文件长度受限,需修改逻辑拆分子文件存储。
如果你的字符串资源文件名不是Localizable.strings,如KN.strings,那么你就得使用NSLocalizedStringFromTable()、NSLocalizedStringFromTableInBundle
来读取本地化字符串:
//NSLocalizedStringFromTable(key, tbl, comment) NSLocalizedStringFromTable(@"Tip", @"KN", nil);
- 完整的读取代码如下:
//程序的本地化,引用国际化的文件 #define QCTLocal(x, ...) HZLocalizedString(x, nil) #define HZLocalizedString(key, comment) HZLocalizedStringFromTable(key, @"Localizable", nil) #define HZLocalizedStringFromTable(key, tbl, comment) [[HZLanguageManager defaultManager] stringWithKey:key table:tbl] - (NSString *)stringWithKey:(NSString *)key table:(NSString *)table { //假如为跟随系统 if (self.languageType==HZLanguageTypeSystem) { return NSLocalizedString(key, nil); } //返回对应国际化文字 if (_bundle) {// 修改成为,从另外一个文件找,先从文件找,如果找不到就从文件二找。 //NSLocalizedStringFromTableInBundleWithKey return [self NSLocalizedStringFromTableInBundleWithKey:key table:table]; } return NSLocalizedStringFromTable(key, table, nil); } //{// 修改成为,从另外一个文件找,先从文件找,如果找不到就从文件二找。 - (NSString*)NSLocalizedStringFromTableInBundleWithKey:(NSString *)key table:(NSString *)table{ NSString* tmp = key; if(_bundle){ tmp =NSLocalizedStringFromTableInBundle(key, table, _bundle, nil); if([tmp isEqualToString:key]){ // 继续从备份表查找 NSLog(@"开始从Localizable1 找key:%@", tmp); tmp =NSLocalizedStringFromTableInBundle(key, @"Localizable1", _bundle, nil); // NSLog([NSString stringWithFormat:@"结束从Localizable1 找key:%@",tmp]); NSLog(@"结束从Localizable1 找key:%@", tmp); } } return tmp; }
- 效果
从CSDN下载【iOS APP 内的国际化切换】demo源码:https://download.csdn.net/download/u011018979/19089505
文章:https://kunnan.blog.csdn.net/article/details/103733872
原理:
1、自定义解析本地化字符串的工具类LanguageManager
2、应用内切换语言生效的技术实现:采用销毁根控制器,重新进入一次
3、本地化字符串指定参数顺序
———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z929118967/article/details/108793150
IV 、genstrings本地化工具的使用
➜ MainViewControllerDemo git:(master) ✗ genstrings Usage: genstrings [OPTION] file1.{m,c,cpp,swift} ... filen.{m,c,cpp,swift} Options -h shows this message and exits. -encoding encoding assume input files use specified encoding. -SwiftUI enables SwiftUI Text() support. -a append output to the old strings files. -s substring substitute 'substring' for NSLocalizedString. -skipTable tablename skip over the file for 'tablename'. -noPositionalParameters turns off positional parameter support. -u allow unicode characters. -macRoman read files as MacRoman not UTF-8. -d attempt to detect encoding if read fails. -q turns off multiple key/value pairs warning. -bigEndian output generated with big endian byte order. -littleEndian output generated with little endian byte order. -o dir place output files in 'dir'. Please see the genstrings(1) man page for full documentation
- 生成字符串资源文件的另一种方式(通过终端命令genstrings)
苹果推出的一个用于自动从代码的NSLocalizedString
提取生成国际化字符串的工具;
如果使用NSLocalizedStringFromTable(key, tbl, comment)
来获取字符串,资源文件会以tbl参数作为文件名
使用步骤:
- 首先添加获取字符串的代码,比如在ViewController.m
NSString *tip = NSLocalizedString(@"Tip", @"dialog title"); NSString *ok = NSLocalizedString(@"Ok", @"dialog button"); NSString *tip1 = NSLocalizedStringFromTable(@"Tip", @"ios进阶", @"dialog title"); NSString *ok1 = NSLocalizedStringFromTable(@"Ok", @"ios进阶", @"dialog button");
- 打开终端,定位到ViewController.m所在的文件夹,输入
genstrings ViewController.m
命令,生成字符串资源文件
-rw-r--r--@ 1 mac staff 714 9 17 11:52 ViewController.m ➜ MainViewControllerDemo git:(master) ✗ genstrings ViewController.m ➜ MainViewControllerDemo git:(master) ✗ ls -lrt -rw-r--r-- 1 mac staff 140 9 17 11:54 ios进阶.strings -rw-r--r-- 1 mac staff 140 9 17 11:54 Localizable.strings
- 将资源文件导入项目即可,然后打开资源文件,可以发现已经生成了key和comment
➜ MainViewControllerDemo git:(master) ✗ cat Localizable.strings ??/* dialog button */ "Ok" = "Ok"; /* dialog title */ "Tip" = "Tip"; ➜ MainViewControllerDemo git:(master) ✗ cat ios进阶.strings ??/* dialog button */ "Ok" = "Ok"; /* dialog title */ "Tip" = "Tip";