iOS 国际化与本地化完整指南

一、基础概念

1. 术语区分

  • 国际化 (Internationalization, i18n): 让应用支持多语言的设计过程

  • 本地化 (Localization, l10n): 将应用适配到特定语言/地区的过程

  • Locale : 语言+地区的组合,如 zh_CN, en_US

二、项目配置

添加支持的语言

复制代码
1. 项目设置 → Project → Info → Localizations
  点击 + 号添加语言(如 Chinese (Simplified))
复制代码
 2. 或者通过 Info.plist 文件
XML 复制代码
<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>zh-Hans</string>
    <string>ja</string>
</array>

三、文本国际化

创建 Localizable.strings 文件

复制代码
1. File → New → File → Strings File
2. 命名为 "Localizable"
3. 选中文件,在右侧 File Inspector 中点击 Localize...
4. 选择要支持的语言

各语言版本内容

Localizable.strings (English - Base)
*

XML 复制代码
// 基础用法
"welcome_message" = "Welcome to our App!";
"login_button" = "Log In";
"logout_button" = "Log Out";

// 带参数的字符串
"welcome_user" = "Welcome, %@!";
"items_count" = "You have %d items";
"price_format" = "Price: $%.2f";

// 复数形式
"apple_count" = "%d apple";
"apple_count_plural" = "%d apples";

Localizable.strings (Chinese)
*

XML 复制代码
"welcome_message" = "欢迎使用我们的应用!";
"login_button" = "登录";
"logout_button" = "退出登录";

"welcome_user" = "欢迎, %@!";
"items_count" = "您有 %d 个项目";
"price_format" = "价格: ¥%.2f";

"apple_count" = "%d 个苹果";
"apple_count_plural" = "%d 个苹果";

在代码中使用

Swift 复制代码
// 基本用法
let welcome = NSLocalizedString("welcome_message", comment: "欢迎消息")
let loginText = NSLocalizedString("login_button", comment: "登录按钮")

// 带参数的用法
let userName = "张三"
let welcomeUser = String(format: NSLocalizedString("welcome_user", comment: ""), userName)

let itemCount = 5
let itemsText = String(format: NSLocalizedString("items_count", comment: ""), itemCount)

三、 相关应用

监听语言变化

Swift 复制代码
// 监听语言变化通知
NotificationCenter.default.addObserver(
    self,
    selector: #selector(languageChanged),
    name: .languageChanged,
    object: nil
)
  • 查看当前本地化状态
Swift 复制代码
 func printLocalizationInfo() {
        print("=== 本地化调试信息 ===")
        print("首选语言: \(Locale.preferredLanguages)")
        print("当前区域: \(Locale.current.identifier)")
        print("当前语言: \(Bundle.main.preferredLocalizations.first ?? "未知")")
        
        // 测试本地化字符串
        let testKey = "welcome_message"
        let localized = NSLocalizedString(testKey, comment: "")
        print("测试键 '\(testKey)': \(localized)")
        
        // 检查所有支持的本地化
        if let bundlePath = Bundle.main.path(forResource: "Localizable", ofType: "strings") {
            print("本地化文件路径: \(bundlePath)")
        }
        
        // 列出所有可用的本地化
        if let localizations = Bundle.main.localizations {
            print("支持的本地化: \(localizations)")
        }
    }

注意事项

  • 资源文件的命名 :确保你的图片、XIB 文件等资源的命名也支持国际化。例如,可以使用 Image.png, Image-zh-Hans.png, Image-zh-Hant.png, 和 Image-en.png

  • 重新启动应用:动态更改语言后,可能需要重新启动应用程序才能完全生效。这是因为某些 UI 元素(如 UITabBarItem 的标题)在初始化后不会自动更新。

  • 测试:确保在真实设备和模拟器上测试所有支持的语言,以验证国际化是否正确。

相关推荐
ssshooter13 小时前
Tauri 踩坑 appLink 修改后闪退
前端·ios·rust
二流小码农17 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
开心就好20251 天前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
开心就好20251 天前
免 Xcode 的 iOS 开发新选择?聊聊一款更轻量的 iOS 开发 IDE kxapp 快蝎
后端·ios
恋猫de小郭2 天前
Apple 的 ANE 被挖掘,AI 硬件公开,宣传的 38 TOPS 居然是"数字游戏"?
前端·人工智能·ios
东坡肘子2 天前
OpenClaw 不错,但我好像没有那么需要 -- 肘子的 Swift 周报 #125
人工智能·swiftui·swift
忆江南2 天前
iOS 深度解析
flutter·ios
没有故事的Zhang同学2 天前
05-主题|事件响应者链@iOS-应用场景与进阶实践
ios
FeliksLv3 天前
尝试给Lookin 支持 MCP
ios
没有故事的Zhang同学3 天前
01-研究系统框架@Web@iOS | JavaScriptCore 框架:从使用到原理解析
ios