目录
- 一、问题出现场景
- 二、如何收集需要本地化字符串
前言
首先说明为什么要写这一篇?这一篇的重点是什么?
问:需要本地化的时候,你还在一个个抽取到Localizable.strings,再翻译成对应的文本吗?你不觉得这样的方式很笨吗?如果原本的项目都没本地化,那你现在去抽,是不是要抽取到si。。。
你可能会反问我,不一个个抽,难道你还能一下子都抽取出来吗?是的,我有!这也是我为什么要写这一篇的原因。如果不是,那网上一大堆的本地化,我何必重复累诉。
一、问题出现场景
为什么会有这样的场景出现,场景如下:
最近在整理公司的一些老项目的时候,之前的开发人员,压根没做本地化,导致现在要将项目中的语言根据当地改成那边的文字(比如大的如不同国家,小的如不同地区的方言文字)。如果我一个个去每个文件里抽,那我一天48个小时都不够用,而且一点技术含量都没有,简直是弱智的表现。所以,既然”偷懒”作为一个程序员的”优良”品质,我们就应该好好想一想怎么样才能做到最快最好。所以下面将着重介绍如何高效的处理本地化这一点。
1、添加本地化的输出文件
输入文件名,默认是Localizable
1 | // Localizable.strings |
如果你想将本地化的文件进一步区分到不同文件,请输入另外的名字,且使用时候如下:
1 | // LocalizableDownloader.strings |
只有一个本地化文件时候显示样式是如下:
/image-20250309005203038.png)
2、添加想要的文件
在右侧Localization中勾选想要的本地化语言,可在左侧文件列表,可发现InfoPlist.stirings左侧多了一个箭头,点击箭头可以展开,显示支持的本地化语言。
二、如何收集需要本地化字符串
1、基本命令介绍
genstrings -o en.lproj *.m
但是这个命令只能生成当前目录的,并没有遍历子目录,所以基本没用,所以不推荐,建议用后面的 find 方法
附:genstrings命名的基本语法:
1 | genstrings [-a] [-q] [-o <outputDir>] sourcefile |
2、高级命令介绍
所谓高级,只是多了个遍历所有的子目录文件的方法而已,先忽略这种叫法。即遍历所有的子目录文件,去生成Localizable.strings,命令如下:
1 | ②高级命令: |
3、详细操作步骤
通过终端命令genstrings生成字符串资源文件的步骤如下:
①、构造需要本地化的字符串
对项目中需要本地化的字符串设置NSLocalizedString,如
1 | NSString *ok = NSLocalizedString(@"OK", @"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
结束!



