paint-brush
Swift 本地化的演变:从字符串到字符串目录经过@mniagolov
112 讀數

Swift 本地化的演变:从字符串到字符串目录

经过 Maksim Niagolov8m2024/06/12
Read on Terminal Reader

太長; 讀書

Swift 提供了强大的工具,可轻松将本地化整合到应用程序中。本指南介绍了 Swift 本地化的转变,从早期技术到最新工具,以帮助开发人员充分利用这些功能。本地化可增强用户体验,扩大其覆盖范围,并可能对软件在国际层面上的成功产生重大影响。
featured image - Swift 本地化的演变:从字符串到字符串目录
Maksim Niagolov HackerNoon profile picture

如今,世界已成为一个全球市场,您的移动应用程序支持不同语言和文化的能力不仅是一种选择,而且是一种必需。本地化可以增强用户体验、扩大其覆盖范围,并可能对软件在国际层面上的成功产生重大影响。


对于 iOS 开发人员来说,Swift 提供了强大的工具,可轻松将本地化整合到应用程序中。本指南介绍了 Swift 本地化的过渡,从早期技术到最新工具,以帮助开发人员充分利用这些功能。


本地化的早期挑战

最初,Swift 刚推出时,它继承了 Objective-C 的本地化基础架构,该基础架构围绕Localizable.strings文件和NSLocalizedString函数构建。这样,开发人员必须手动编辑本地化字符串并在不同语言文件之间进行同步,这个过程既容易出错又耗时。

Localizable.strings的基础知识

可本地化文件是一个简单的键值对文件,其中的字符串以“key”=“value”格式存储,其中“key”是代码标识符,“value”是用户将看到的本地化字符串。需要将此文件复制并翻译成每种支持的语言,然后放入相应的“.lproj”目录中,例如“en.lproj”代表英语,而“de.lproj”代表德语。

Localizable.strings条目的示例

 "hello_world_key" = "Hello, World!";


在 Swift 代码中,可以按如下方式检索此字符串:

 let greeting = NSLocalizedString("hello_world_key", comment: "The default greeting")


NSLocalizedString 函数通过使用Localizable.strings中的键可以更轻松地访问本地化内容。


此功能接受一个键,提供一个后备值,并为译者添加注释。提供注释至关重要,因为它为译者提供了提高翻译准确性和适用性的潜台词。


示例:根据一天中的时间向用户致意:

 func greetingBasedOnTime() -> String { let hour = Calendar.current.component(.hour, from: Date()) let key = hour < 12 ? "good_morning_key" : "good_evening_key" return NSLocalizedString(key, comment: "Greeting based on time of day") }


使用相应的Localizable.strings条目如下所示:

 "good_morning_key" = "Good morning!"; "good_evening_key" = "Good evening!";


以下是您在使用 Localizable. 字符串时可能会遇到的一些挑战:
1)可扩展性问题。

随着字符串数量的增加,处理起来也变得越来越困难。随着时间的推移,管理多个 .strings 文件变得非常麻烦。


2)重复。

每种语言都需要一个单独的文件,这会导致潜在的不一致和在管理字符串时重复的工作。如果只支持一种语言,这可能不是问题,但当你需要管理多种语言时,有时会变得很麻烦。


3)缺乏背景。

然而,注释可以添加到 NSLocalizedString 中——即使它们并不总是能帮助译者完全理解上下文,也可能会导致翻译不准确。开发人员通常懒得去正确填写它们。

转换为stringsdict以实现复数化

stringsdict文件的引入为 Swift 本地化带来了重大改进,主要解决了复数问题。主要原因是不同语言的复数形式不同,对英语有效的方法可能对俄语或阿拉伯语等其他语言无效。


stringsdict推出之前,管理它们非常困难。stringsdict 使程序员能够确定“一”、“少数stringsdict 、“多”和“其他”等类别的规则,从而确保跨语言翻译的相同正确性。


理解stringsdict文件

Stringsdict文件是一个 XML 属性列表,用于创建根据数值本地化的字符串。此功能旨在正确处理复数形式,因为不同的语言对复数形式的处理规则各不相同。

stringsdict文件的结构

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>numberOfSongs</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@songs@</string> <key>songs</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One song</string> <key>other</key> <string>%d songs</string> </dict> </dict> </dict> </plist>


使用stringsdict进行复数化的示例

假设我们有一个应用程序,显示用户已阅读的文章数量。在屏幕上,它应该显示一条消息,以正确的复数形式显示已阅读的文章数量。


英语和波兰语的Localizable.stringsdict

 <!-- English --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One article</string> <key>other</key> <string>%d articles</string> </dict> </dict> <!-- Polish --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>Jeden artykuł</string> <key>few</key> <string>%d artykuły</string> <key>many</key> <string>%d artykułów</string> <key>other</key> <string>%d artykułu</string> </dict> </dict>


这里,波兰语本地化清楚地展示了某些语言中复数形式的复杂性,需要使用多个复数类别(一、几个、很多、其他)才能正确表示不同的数字上下文。


快速实施:

通过在调用NSLocalizedString时引用文件中定义的键,可以在代码中使用stringsdict条目。

 let count = getArticleCount() let formatString = NSLocalizedString("article_count", comment: "Count of articles read by a user") let message = String(format: formatString, count)

这种方法允许您自适应地修改输出字符串以匹配受支持语言的语法;所有这些只需一行代码即可完成。


stringsdict的好处

  • 效率:这有助于节省管理和修改本地化文件所花费的时间和精力。
  • 准确性:在开发环境中直接提供更多上下文,有助于提高单词翻译的准确性。
  • 灵活性:支持对本地化内容进行实时动态调整。

使用字符串目录的现代本地化技术

Xcode 15 引入的新功能之一是字符串目录,它旨在帮助开发人员比以前更轻松地本地化 iOS 和 macOS 应用程序。虽然Localizable.stringsstringsdict是存储和组织字符串的有用资源,但字符串目录在管理本地化字符串方面更具凝聚力,并且 UI 更友好。


这些是弦乐目录中应该强调的主要方面:

  • 可视化编辑器:与传统的简单的纯文本文件相比,字符串目录是在 Xcode 中的可视化编辑器的帮助下进行编辑的,从而可以更轻松地添加、修改或删除本地化字符串。


  • 内联文档:开发人员可以直接在字符串目录中提供描述和上下文,这显著提高了翻译的清晰度和正确性。


  • 动态本地化:字符串目录支持动态本地化,因此开发人员无需退出应用程序即可更改本地化字符串,这对于测试和迭代开发来说是理想的。


  • 高级复数化和适应性:它还通过提供对复数形式的更精细控制以及根据 UI 元素和设备类型而变化的文本克服了stringsdict的一些缺点。


快速实施:

假设在消息传递应用程序中,您必须通知用户他们未读的消息数量。通知必须是动态的,显示收到的消息数量,并应根据内容类型进行调整。


分步设置:

  1. 创建字符串目录:向您的项目添加一个新的字符串目录。这将生成一个.stringcatalog文件。


  2. 添加条目:使用编辑器为每个需要本地化的字符串添加条目。然后为每个条目指定键、默认值以及任何复数规则或自适应参数。


  3. 本地化内容:为每种支持的语言提供翻译,指定复数的不同形式、适合设备类型的格式等。


  4. 在代码中实现:在 Swift 代码中使用本地化标识符引用这些字符串。


 <!-- String Catalog Entry --> <key>unread_messages_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@messages@</string> <key>messages</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>You have one unread message.</string> <key>other</key> <string>You have %d unread messages.</string> </dict> </dict>


您可以像这样访问该字符串:

 let unreadCount = fetchUnreadMessagesCount() let message = NSLocalizedString("unread_messages_count", value: "You have \(unreadCount) unread messages.", comment: "Notify about unread messages") print(message)



字符串目录的好处

  • 效率:节省管理本地化文件所需的时间和精力。


  • 准确性:通过在开发环境中提供更多额外的直接上下文来提高准确性。


  • 灵活性:支持对本地化内容进行实时甚至动态更新,这在快速开发周期中特别有用。

挑战

虽然字符串目录提供了显著的改进,但也带来了挑战。首先,这是一个学习曲线;需要时间来适应新的系统或创建事物的方式。开发人员可能面临的另一个潜在挑战与将字符串目录集成到已经创建并使用传统本地化文件的现有项目中所需的时间和调整有关。

结论

Swift 中的字符串目录是本地化技术的最新改进,它提供的工具不仅功能强大,而且灵活且用户友好。通过将该技术作为开发生命周期的一部分,团队将大大提高本地化流程的效率和质量;因此,将创造出更好的全球产品。


我将不断更新本文,介绍 Swift 本地化工具的最新进展。如果您觉得我遗漏了什么,或者您对我所说的内容有想法,您可以在下面的评论框中分享。请务必关注我,获取更多有趣的信息和最新消息!