目录
- 一、问题出现场景
- 二、如何收集需要本地化字符串
前言
首先说明为什么要写这一篇?这一篇的重点是什么?
问:需要本地化的时候,你还在一个个抽取到Localizable.strings,再翻译成对应的文本吗?你不觉得这样的方式很笨吗?如果原本的项目都没本地化,那你现在去抽,是不是要抽取到si。。。
你可能会反问我,不一个个抽,难道你还能一下子都抽取出来吗?是的,我有!这也是我为什么要写这一篇的原因。如果不是,那网上一大堆的本地化,我何必重复累诉。
一、问题出现场景
为什么会有这样的场景出现,场景如下:
最近在整理公司的一些老项目的时候,之前的开发人员,压根没做本地化,导致现在要将项目中的语言根据当地改成那边的文字(比如大的如不同国家,小的如不同地区的方言文字)。如果我一个个去每个文件里抽,那我一天48个小时都不够用,而且一点技术含量都没有,简直是弱智的表现。所以,既然"偷懒"作为一个程序员的"优良"品质,我们就应该好好想一想怎么样才能做到最快最好。所以下面将着重介绍如何高效的处理本地化这一点。
二、如何收集需要本地化字符串
1、基本命令介绍
genstrings -o en.lproj *.m
但是这个命令只能生成当前目录的,并没有遍历子目录,所以基本没用
附:genstrings命名的基本语法:
genstrings [-a] [-q] [-o <outputDir>] sourcefile
其中参数:
-a 在存在的文件后面追加内容
-q 关闭多个键/值对的警告
-o 指定输出目录
因此如果我们想输出到en.lproj目录,则代码如下:
genstrings -o en.lproj *.m
2、高级命令介绍
所谓高级,只是多了个遍历所有的子目录文件的方法而已,先忽略这种叫法。即遍历所有的子目录文件,去生成Localizable.strings,命令如下:
②高级命令:
错误:find ./ -name *.m -print0 | xargs -0 genstrings -o en.lproj("错误写法,执行无效, 因为*.m处两边少了双引号")
正确:find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj(正确写法,亲测有效)
等价于:
正确:find . -name \*.m | xargs genstrings -o en.lproj (正确,未亲测)
此命令会去把当前cd到的目录下的所有文件(含子目录中的文件)有用到NSLocalizedString函数的key值都写到文件里。
两个命令执行的前提都是你得必须在你所cd到的文件夹下,创建要将生成的Localizable.strings放在什么位置,在上面的命令中是放在en.lproj文件夹中,当然这个名字我们也可以随便取。最后最后,真正本地化的时候,需要安装系统的en.lproj名字来。
两个命令执行的结果都是:如果命令行中的 en.lproj文件夹中没有Localizable.strings,那么其会自动创建Localizable.strings文件,并在其中补全东西。如果有,则会去更新它的内容。
3、详细操作步骤
通过终端命令genstrings生成字符串资源文件的步骤如下:
①、构造需要本地化的字符串
对项目中需要本地化的字符串设置NSLocalizedString,如
NSString *ok = NSLocalizedString(@"OK", @"dialog button");
NSString *ok = NSLocalizedStringFromTable(@"Ok", @"commonTable", @"dialog button");
附:本地化中可能遇到的含格式的字符串的时候,怎么写?参考AFNetworking的写法如下:
[NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode]
②、执行命令
打开终端,cd到项目文件夹下(包含en.lproj和zh-Hans.lproj)
执行上面的命令find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj(正确写法,亲测有效)
③、生成的资源文件在哪?
答:如果使用NSLocalizedStringFromTable(key, tbl, comment)来获取字符串,资源文件会以tbl参数作为文件名,比如上诉生成的资源文件为:commonTable.strings
附:执行命令遇到的常见问题
有时候执行命令后常出现这样的问题,
之前一直以为是命令处理的文件个数有限,后来才发现原来是我们的本地化代码有些地方没写对,或者没写完全。
比如:
①情况1:
或
这种问题,可全局查找";
替换掉那些语句有问题的为", "cjcomment");
即可解决问题。
②情况2:
下面这个是括号没对,右括号是中文的括号,不是英文的(对于这种问题,我们可以搜索中文的括号,将项目中的中文括号,替换成英文括号即可解决绝大部分问题,甚至是全部问题)
所以,为了解决类似的问题,要养成项目中所有的括号,都用英文的括号表示吧。
End
结束!