Swift 中的国际化 (i18n):NSLocalizedString 和 String Catalog

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
```html

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>
```                    

推荐