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 的标题)在初始化后不会自动更新。

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

相关推荐
黑化旺仔1 小时前
【OC】KVO
macos·ios·objective-c·cocoa
HouWan3 小时前
SwiftUI 小技巧:如何读取 SwiftUI Font 的详细信息
ios·swiftui·apple
李游Leo3 小时前
HarmonyOS 7 实战开发 05:把页面做到可上线状态
ios·harmonyos
终端安全笔记9 小时前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机
传奇开心果编程9 小时前
【SwiftUI入门练中学】第1课 从零开始
学习·ui·ios·swiftui·swift
丿Wayne15 小时前
iOS Token 刷新实战(Actor 避免并发重复刷新)
ios·swift·token·actor·swift并发
终端安全笔记1 天前
iOS 27 给了租赁一个新工具,但它只认受监督的设备
android·网络·安全·ios
大熊猫侯佩1 天前
独立 App 首发完成 iPhone Duo 展开态适配
ios·swiftui·swift
光影少年1 天前
setImmediate 和 setTimeout(0) 的区别
android·前端·react.js·ios·前端框架
2501_916008892 天前
SSE 和 gRPC 流式接口如何抓包,调试 SSE 与 gRPC 流式接口
网络协议·计算机网络·网络安全·ios·adb·https·udp