Swift 中的国际化 (i18n):iOS 和 macOS 完整指南
国际化 (i18n) 是将应用程序设计为无需工程更改即可适应不同语言和地区的过程。在 Apple 生态系统(iOS、macOS、watchOS、tvOS)中,本地化工具直接内置于 Swift 和 Xcode 中。在本文中,我们将详细介绍如何使用 NSLocalizedString 和现代的 String Catalog 来创建多语言应用程序。
基础:NSLocalizedString
Swift 中国际化的基本机制是 NSLocalizedString 函数。它在 .strings 或 .xcstrings(String Catalog)文件中查找字符串的翻译。
let greeting = NSLocalizedString("hello_world", comment: "主屏幕上的问候语")print(greeting) // 根据设备语言输出翻译comment 参数为翻译人员提供提示。键 "hello_world" 在整个项目中必须是唯一的。
创建本地化文件
在 Xcode 中,您可以通过 Project Info > Localizations 添加支持的语言。之后,将为每个 .strings 文件或 Storyboard 创建本地化子文件。
Localizable.strings(英文)示例内容:
"hello_world" = "Hello, World!";"welcome_message" = "Welcome to our app %@";俄语版本(Localizable.strings (Russian)):
"hello_world" = "Привет, мир!";"welcome_message" = "Добро пожаловать в наше приложение %@";带参数的字符串格式化
对于包含动态数据的字符串,请使用格式说明符。在 Swift 中,可以通过两种方式实现:
方法 1:String(format:)
let userName = "Иван"let points = 150let message = String(format: NSLocalizedString("user_score", comment: "用户分数"), userName, points)print(message) // "Иван набрал 150 очков"在本地化文件中:
"user_score" = "%@ набрал %d очков";方法 2:Swift 字符串插值 (iOS 15+)
let message = "\\(userName) набрал \\(points) очков"然而,此方法不适用于本地化,因为不同语言的词序可能不同。请仅使用 String(format:) 或带有屈折变化的 AttributedString。
复数形式
俄语有复杂的变格规则:"1 файл"、"2 файла"、"5 файлов"。为此,Apple 提供了 stringsdict (XML) 或带有复数规则的 String Catalog。
stringsdict 示例
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>files_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@files@</string> <key>files</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d 个文件</string> <key>few</key> <string>%d 个文件</string> <key>many</key> <string>%d 个文件</string> <key>other</key> <string>%d 个文件</string> </dict>
```