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

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

相关推荐
Anhty16 小时前
2026最新免费手机音频处理工具 !!
android·功能测试·ios·智能手机·音视频
2501_9159090618 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
初雪云20 小时前
UniApp 云打包拿到 IPA 后,真正的发布工作才刚开始
ios·自动化·编辑器·产品经理·iphone
Lancker21 小时前
没有 Mac 也能上架 iOS:GitHub Actions 全自动构建 + 签名 + TestFlight 送审实录
macos·ios·github
茶底世界之下21 小时前
晚霞要多暖?用 Awaking 只改色温做一次取舍
ios
酒神dnspup1 天前
多地区网站可用性监控怎么做?DNSPup 从基线到告警的完整实战
运维·ios·云计算·iphone·dns·网络监控
福兮说1 天前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
茶底世界之下2 天前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
ZZH_AI项目交付2 天前
实时字幕负责快,本地录音负责不丢:一个 iOS 录音功能为什么需要两条链路
ios·ai编程
Cc.Y2 天前
Swift深度链接的极简之道
ios·cocoa·swift