纯代码实现Auto Layout的Obj-C iOS App是否需开启Base Internationalization?
嘿,我太懂你这种情况了——全程纯代码撸Auto Layout,连个storyboard或者xib的影子都没有,现在要做国际化,结果搜出来一堆资料都在说要开Base Internationalization,这玩意儿跟你的应用完全不搭对吧?别慌,你的路子其实走对了,而且纯代码的国际化反而比用界面文件的情况更直接!
首先得明确:Base Internationalization是专门给storyboard/xib设计的,用来把界面里硬编码的字符串分离到strings文件里。你纯代码开发的话,完全不需要开启这个功能,直接专注于NSLocalizedString相关的配置就好。
第一步:创建本地化字符串文件
- 右键项目目录 → 选择「New File」
- 在iOS模板里找到「Strings File」,命名为
Localizable.strings(这个是默认文件名,NSLocalizedString会自动找它,除非你要自定义本地化bundle,否则别乱改) - 选中刚创建的
Localizable.strings,在右侧「File Inspector」面板里找到「Localizations」板块,点击「Localize...」,选你想用的基础语言(比如English)
第二步:添加要支持的目标语言
- 回到项目设置的「Info」标签页,找到「Localizations」区域,点击左下角的「+」号,选择你要添加的语言(比如简体中文、日语等)
- 弹出的对话框里,
Localizable.strings会被自动选中,直接点「Finish」就行,这样每个语言都会生成对应的Localizable.strings文件(存放在各自的.lproj文件夹里)
第三步:填充本地化内容
每个语言的Localizable.strings文件都遵循"key" = "本地化文本";的格式来写:
比如英文版本(en.lproj/Localizable.strings):
"welcome_msg" = "Welcome to My App!"; "btn_login" = "Login"; "hint_input_name" = "Please enter your username";
简体中文版本(zh-Hans.lproj/Localizable.strings):
"welcome_msg" = "欢迎来到我的应用!"; "btn_login" = "登录"; "hint_input_name" = "请输入你的用户名";
第四步:在代码里正确使用NSLocalizedString
你之前已经在调用NSLocalizedString了,确保格式正确就好:
// 用key获取对应语言的文本,第二个参数是给翻译人员看的注释 NSString *welcomeText = NSLocalizedString(@"welcome_msg", @"首页的欢迎提示语"); UILabel *welcomeLabel = [[UILabel alloc] init]; welcomeLabel.text = welcomeText; // 给按钮设置本地化标题 UIButton *loginBtn = [UIButton buttonWithType:UIButtonTypeSystem]; [loginBtn setTitle:NSLocalizedString(@"btn_login", @"登录按钮的标题") forState:UIControlStateNormal];
实用小技巧:如果你的代码里有大量
NSLocalizedString,可以用genstrings命令行工具自动提取key和注释,生成基础的strings文件,省得手动敲。在项目根目录执行:genstrings -o en.lproj *.m这个命令会扫描所有
.m文件,把所有NSLocalizedString的内容提取出来,生成en.lproj下的Localizable.strings
第五步:测试本地化效果
- 快速测试:在Xcode里打开「Edit Scheme」→「Run」→「Options」,找到「Application Language」,选择你添加的语言,运行应用就能看到效果
- 真实场景测试:在设备的「设置」→「通用」→「语言与地区」里切换系统语言,重启应用查看
额外注意事项
- 如果有图片需要本地化(比如不同语言的引导图),可以给每个语言创建对应的
.lproj文件夹,把图片放进去,代码里直接用图片名加载,系统会自动根据当前语言匹配对应图片 - 要是你需要自定义本地化逻辑(比如从服务器下载语言包),可以自己创建
NSBundle对象来加载指定的strings文件,但大部分纯代码应用用默认的系统逻辑就足够了
放心,你这种纯代码的方式其实是国际化里最灵活的,完全不需要依赖Base Internationalization那个针对界面文件的功能,只要把Localizable.strings配置好,代码里正确调用NSLocalizedString就搞定了!
内容的提问来源于stack exchange,提问作者Gallymon

