为什么你的App需要国际化?
\n想象一下:你开发了一款很棒的iOS应用。它运行完美,界面赏心悦目,来自俄罗斯的用户给了它五星好评。但如果你的代码能说英语、中文,或者从右向左阅读的阿拉伯语呢?
\nSwift中的国际化不仅仅是翻译按钮。它是一种架构方法,让你的应用能够使用用户的语言,尊重他们的文化习惯(日期格式、货币、计量单位),并且在语言环境变化时不会崩溃。
\n在本文中,我们将详细讲解如何使用现代Xcode工具和最佳实践,在Swift项目中正确实现i18n(国际化)。准备好让你的代码成为全球公民了吗?开始吧!
\n\nSwift中的本地化基础:从NSLocalizedString到String Catalog
\n经典方法:NSLocalizedString
\n最基本的工具是NSLocalizedString宏。它会在.strings文件中查找翻译,如果找不到,则显示键名(或默认值)。
let hello = NSLocalizedString("hello_world", comment: "主屏幕上的问候语")\nprint(hello) // 根据设备语言输出翻译\n注释不仅仅是一种形式。它帮助翻译人员理解上下文:"hello_world"可以是问候语或章节标题。始终编写有意义的注释。
\n\nString Catalog — 新标准(Xcode 15+)
\n忘掉一大堆Localizable.strings文件吧。Xcode 15引入了String Catalog(.xcstrings)。这是一个支持多种语言、复数形式和上下文注释的单一文件。
创建catalog的方法:File → New → File → String Catalog。添加一个键——就完成了:
// 代码保持不变!\nlet welcome = NSLocalizedString("welcome_message", comment: "对新用户的问候")\n\n// 在String Catalog中,你只需添加en、ru、ar等语言的翻译\n优点:无需同步文件,编码错误几率更低,内置复数形式支持。
\n\n数字和日期格式化:文化代码
\n错误做法:硬编码日期格式为"dd.MM.yyyy"。在美国,他们写"MM/dd/yyyy",在日本——"yyyy年MM月dd日"。Swift用DateFormatter和NumberFormatter来拯救你。
可以自豪展示的日期
\nlet date = Date()\nlet formatter = DateFormatter()\nformatter.dateStyle = .long\nformatter.timeStyle = .none\nformatter.locale = Locale.current // 自动适配设备语言\n\nlet localizedDate = formatter.string(from: date)\n// 对于en:"January 15, 2025"\n// 对于ru:"15 января 2025 г."\n// 对于de:"15. Januar 2025"\nprint(localizedDate)\n不使用dateFormat字符串!使用.short、.medium、.long——它们已经考虑了文化规则。
数字和货币:尊重逗号和点
\n在俄罗斯,数字1234.56写成"1 234,56",而在美国是"1,234.56"。NumberFormatter知道这一点:
\nlet price = 1234.56\nlet numberFormatter = NumberFormatter()\nnumberFormatter.numberStyle = .currency\nnumberFormatter.locale = Locale.current\n\nlet localizedPrice = numberFormatter.string(from: NSNumber(value: price))!\n// 对于en_US:"$1,234.56"\n// 对于ru_RU:"1 234,56 ₽"\n// 对于de_DE:"1.234,56 €"\nprint(localizedPrice)\n\n复数形式:一、二、多——不要猜测
\n"一——多"规则只适用于英语。在俄语中,有"1 минута"、"2 минуты"、"5 минут"。在阿拉伯语中,有六种形式!String Catalog和NSStringPluralRule优雅地解决了这个问题。
在String Catalog中,你添加一个键,指定类型为"Plural",然后填写各种形式:
\n// 在代码中