前期提要
因为想要制作一款iOS软件应用,想着应用能够显示本地化的名称以及内容,比如日本使用显示日语、美国使用显示英文等。
环境配置
- Mac Sonoma 14.5
- Xcode Version 15.4 (15F31d)
- iOS 17.5
本地化语种配置
首先本地化设置中添加本地化语种,添加路径:
左侧顶部应用 -> PROJECT -> 应用名称 -> Localizations
然后在底部找到添加按钮
然后将需要本地化的语种添加进来
全部配置完成后,我们可以查看配置的语种列表,这里我将简体中文作为默认语种
本地化应用标题
首先在项目中创建一个String文件
双击Strings File文件并进行创建,这个文件只能命名为InfoPlist,如果不使用该命名则无法实现本地化。
然后依次勾选Localization列表中的各语种
注:如果没有找到右侧列表,可以点击右上角的侧边按钮展开。
注:点击右侧语种时要从上而下依次点击,左侧列表会根据右侧点击的顺序进行创建排序,如果点击右侧语种时是乱序,左侧显示的文件也是乱序,这会导致进行翻译对应时出现困难。
勾选完成后,我们可以发现左侧InfoPlist文件下面会自动创建对应的语种文件,比如我们要让应用在简体中文下显示“存钱猪猪”,我们可以在左侧找到InfoPlist ( Chinese, Simplified ) 文件并配置:
"CFBundleDisplayName" = "存钱猪猪";
其他语种则同样配置对应的CFBundleDisplayName字段。
实现效果如下:
本地化应用内容
在项目中新建一个本地化文件
找到名为:String Catalog的文件并双击进行创建。
创建完成后,会自动生成一个Localizable文件,我们可以点击这个文件,并将各语种进行本地化。
注意,这个文件的命名为Localizable,自定义命名也可能导致本地化词条实现。
我们可以点击其他语种,比如French(Canada)
这里我们可以看到多了一个Default Localization(zh-Hans),各字段的含义分别为:
1、Key表示本地化语言调取时的关键词,我们在视图中使用String(localized: Key)调取
2、Default Localization(zh-Hans)表示默认语种是中文以及对应的中文内容
3、本地化语种字段,表示需要翻译成对应的语种内容
4、Comment表示备注
其中需要注意的是,本地化的字段内容属于“牵一发而动全身”,新增一个文字内容就需要将全部的本地化字段进行汉化,工作量还是有的。比如我这个应用的提示内容大概20条左右,然后我设置了40个语种,工作量大概在6-8个小时左右,还是很费时间和精力的。
提示:在翻译本地化语种时,建议导入和导出批量翻译(可参考Apple的导入本地化和导出本地化版本文章),或者使用Ai进行翻译能够减少大量的工作量,不建议逐条翻译,工作量巨大且难以维护。
实现效果
实现代码:
let love = String(localized: "爱来自中国山东日照")
Text(love)
预览效果:
全部代码:
import SwiftUI
struct ContentView: View {
var body: some View {
let love = String(localized: "爱来自中国山东日照")
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text(love)
}
.padding()
}
}
#Preview {
ContentView()
}
注:Localized后面的内容,就是我们前面提到Localizable文件中的Key字段。
相关文章
- Xcode本地化失效问题:https://fangjunyu.com/2024/06/02/xcode%e6%9c%ac%e5%9c%b0%e5%8c%96%e5%a4%b1%e6%95%88%e9%97%ae%e9%a2%98/
- Xcode本地化词条文件失效:https://fangjunyu.com/2024/06/05/xcode%e6%9c%ac%e5%9c%b0%e5%8c%96%e8%af%8d%e6%9d%a1%e6%96%87%e4%bb%b6%e5%a4%b1%e6%95%88/
- Swift本地化显示异常问题:Localizable与插值不兼容:https://fangjunyu.com/2024/10/17/swift%e6%9c%ac%e5%9c%b0%e5%8c%96%e6%98%be%e7%a4%ba%e5%bc%82%e5%b8%b8%e9%97%ae%e9%a2%98%ef%bc%9alocalizable%e4%b8%8e%e6%8f%92%e5%80%bc%e4%b8%8d%e5%85%bc%e5%ae%b9/
- Swift取消Text的自动本地化实现:https://fangjunyu.com/2024/10/18/swift%e5%8f%96%e6%b6%88text%e7%9a%84%e8%87%aa%e5%8a%a8%e6%9c%ac%e5%9c%b0%e5%8c%96%e5%ae%9e%e7%8e%b0/
- Swift本地化应用名称失效问题:https://fangjunyu.com/2024/10/29/swift%e6%9c%ac%e5%9c%b0%e5%8c%96%e5%ba%94%e7%94%a8%e5%90%8d%e7%a7%b0%e5%a4%b1%e6%95%88%e9%97%ae%e9%a2%98/
附录
设置默认语种
左侧顶部应用 -> PROJECT -> 应用名称 -> Localizations,点击任意语种后,底部有一个“Set Default”按钮,可以设置默认语种。
主流语种列表
如果想要针对主要的人群进行本地化适配,根据SIL国际的民族语研究(夏季语言学研究院(2023年)),依母语使用人数排列
- 汉语(1,407,132,000)
- 西班牙语(532,000,000)
- 英语(322,000,000)
- 孟加拉语(189,000,000)
- 印地语/乌尔都语(182,000,000)
- 阿拉伯语(174,950,000)
- 葡萄牙语(170,000,000)
- 俄语(170,000,000)
- 日语(125,000,000)
- 德语(98,000,000)
- 法语(79,572,000)
大量语种列表
本次我打算涵盖大部分语种,因此我使用的本地化语种共40个:
- Chinese, Simplified – 简体中文
- Arabic – 阿拉伯语
- Catalan – 加泰罗尼亚语
- Chinese (Hong Kong) – 香港繁体中文
- Chinese, Traditional – 繁体中文
- Croatian – 克罗地亚语
- Czech – 捷克语
- Danish – 丹麦语
- Dutch – 荷兰语
- English – 英语
- English (Australia) – 英语(澳大利亚)
- English (India) – 英语(印度)
- English (United Kingdom) – 英语(英国)
- Finnish – 芬兰语
- French – 法语
- French (Canada) – 法语(加拿大)
- German – 德语
- Greek – 希腊语
- Hebrew – 希伯来语
- Hindi – 印地语
- Hungarian – 匈牙利语
- Indonesian – 印度尼西亚语
- Italian – 意大利语
- Japanese – 日语
- Korean – 韩语
- Malay – 马来语
- Norwegian Bokmål – 挪威语(博克马尔语)
- Polish – 波兰语
- Portuguese (Brazil) – 葡萄牙语(巴西)
- Portuguese (Portugal) – 葡萄牙语(葡萄牙)
- Romanian – 罗马尼亚语
- Russian – 俄语
- Slovak – 斯洛伐克语
- Spanish – 西班牙语
- Spanish (Latin America) – 西班牙语(拉丁美洲)
- Swedish – 瑞典语
- Thai – 泰语
- Turkish – 土耳其语
- Ukrainian – 乌克兰语
- Vietnamese – 越南语
CFBundleDisplayName和CFBundleName
CFBundleDisplayName 是显示在用户界面上的应用名称。这个名称会出现在主屏幕图标下面以及设备的设置中。当想要本地化应用名称时,通常会使用这个键。它允许不同的语言和地区设置不同的应用名称,以便用户可以在其本地语言中看到应用名称。CFBundleName
CFBundleName 是应用程序的内部名称,通常不会显示给用户。这个名称通常用于应用程序包的标识符和其他内部使用的配置。它可以是一个简短的标识符,通常由开发者设置,并且在不同的语言环境下不需要本地化。
- 显示位置:
- CFBundleDisplayName:显示在用户界面上,如主屏幕图标下面和设备的设置中。
- CFBundleName:内部使用,通常不直接显示给用户。
- 用途:
- CFBundleDisplayName:用于本地化和用户界面展示。
- CFBundleName:用于内部标识和应用程序包的配置。
- 本地化:
- CFBundleDisplayName:通常需要进行本地化,以便不同语言的用户看到本地化的应用名称。
- CFBundleName:通常不需要本地化。
String catalog、strings File(Legacy)、Stringsdict File(Legacy)
在 Xcode 中,本地化字符串有多种存储和管理方式,包括 String Catalog、strings 文件(Legacy)、和 stringsdict 文件(Legacy)。它们各自有不同的用途和适用场景。下面详细介绍这三种方式及其区别:
1. String Catalog
概述
String Catalog 是 Xcode 12 及更高版本中引入的新特性,旨在简化和改进字符串管理和本地化流程。
特点
- 集中管理:所有本地化字符串集中在一个地方,便于管理和维护。
- 可视化编辑:提供图形界面,可以直接在 Xcode 中查看和编辑不同语言的字符串。
- 支持复用:允许字符串在多个文件和模块之间复用。
- 自动本地化:支持自动将字符串添加到适当的语言包中。
- 性能优化:相比传统的 strings 文件,加载速度更快,性能更高。
使用场景
- 大型项目:适用于有大量字符串需要管理和本地化的大型项目。
- 频繁更新:适用于需要频繁更新本地化内容的项目。
2. strings 文件(Legacy)
概述
strings 文件是早期的本地化方式,依旧被广泛使用。它是一个简单的键值对文件,每一对键值代表一个本地化字符串。
特点
- 文本格式:采用纯文本格式,容易阅读和编辑。
- 简单直观:结构简单,适合小规模本地化。
- 广泛支持:几乎所有的 iOS 和 macOS 项目都支持这种方式。
使用场景
- 小型项目:适用于本地化需求不多的小型项目。
- 简单本地化:适用于简单的键值对本地化,没有复杂的字符串复用需求。
3. stringsdict 文件(Legacy)
概述
stringsdict 文件用于管理包含复数形式的本地化字符串。它基于 XML 格式,能够处理更复杂的字符串替换和复数规则。
特点
- 复数支持:提供对复数形式的支持,可以根据数量动态选择不同的字符串。
- 复杂规则:适用于需要复杂字符串替换和规则的场景。
- XML 格式:结构较为复杂,但功能强大。
使用场景
- 复数形式:适用于需要处理复数形式的项目。
- 复杂本地化规则:适用于本地化规则复杂的项目。
选择合适的方式
选择哪种本地化管理方式取决于项目需求:
- String Catalog:推荐用于大型项目或频繁更新的项目,提供集中管理和更高的性能。
- strings 文件(Legacy):适用于简单、本地化需求不高的项目,易于使用和维护。
- stringsdict 文件(Legacy):适用于需要处理复数和复杂本地化规则的项目。
参考资料
- 为 App 扩展新市场:https://developer.apple.com/cn/localization/
- Localizing and varying text with a string catalog:https://developer.apple.com/documentation/xcode/localizing-and-varying-text-with-a-string-catalog
- 世界语言:https://zh.wikipedia.org/wiki/%E4%B8%96%E7%95%8C%E8%AA%9E%E8%A8%80
- How to localize bundle display name in iPhone app?https://stackoverflow.com/questions/2871990/how-to-localize-bundle-display-name-in-iphone-app