SwiftUI本地化教程

2021-02-17 01:50:46 Lingua Greca

本文共6198个字,阅读需16分钟

阅读模式 切换至双语

在2019年的WWDC上,苹果推出了SwiftUI,这是一个现代化的声明性API,用于为所有苹果平台构建用户界面,这让开发者社区感到惊讶。从那以后,这家来自库比蒂诺的科技巨头不断改进这个框架,使之成为构建生产应用程序的一个引人注目的解决方案。 鉴于这种流行,下面的SwiftUI教程试图概述使用SwiftUI构建的iOS应用程序本地化的关键步骤。为了使事情简单明了,我们将在此过程中构建一个简单的应用程序。在撰写本文时,我们使用的是Xcode12.3。请确保在参考本教程时使用最新版本。 基本设置 正在本地化UI字符串 SwiftUI中内插字符串的本地化 SwiftUI本地化中复数的处理 正在添加翻译 测试定位 正在导出本地化 正在导入本地化 今天到此为止! 基本设置 要开始工作,请打开Xcode并创建一个新的iOS项目。我们将把我们称为‘快速本地化’。这只是一个简单的应用程序,它将帮助我们更好地理解如何在SwiftUI中实现本地化。我们的应用程序的基本语言将是英语,同时支持法语和中文。 创建项目后,从project navigator中选择项目名称,然后单击Info选项卡。在“本地化”下,单击加号以添加要支持的语言和地区,在本例中为简体中文和法语。 在接下来的工作表中,选择要本地化的资源文件--在我们的示例中是launchscreen.storyboard--然后单击Finish。这是一个基本的设置,也适用于本地化使用UIKit构建的iOS应用程序。 SwiftUI的本地化自动工作,开箱即用。相当惊人,对吧?这是可能的,因为大多数SwiftUI视图和视图修饰符采用LocalizedStringKey结构作为参数。稍后会有更多关于这方面的内容。 让我们继续创建一个名为'Localizable'的字符串文件,它将保存我们想要本地化的文本。选择File New File…,在Resources下选择Strings File,然后单击Next。将其命名为Localizable,然后单击Create。 正在本地化UI字符串 在ContentView.swift中,我们有一个文本视图,其字符串最终需要本地化。 文本视图中的“Hello,World!”字符串是用于查找localizable.strings文件中文本的翻译版本的键。通常,如果LocalizedStringKey API没有找到键的任何匹配文本,它将在支持本地化的应用程序的文本视图中显示键。 这是由于LocalizedStringKey结构符合ExpressibleByStringInterpolation协议,后者又继承自ExpressibleByStringLiteral协议。这允许您在文本视图中使用字符串文本,如'Hello,World!‘,该文本视图将自动转换为LocalizedStringKey结构的实例。基本上,您可以使用文本(“Hello,World!”) 或文本(LocalizedStringKey(“Hello,World!”)) 而且你还是会达到同样的结果。 请注意,如果您使用字符串文字初始化文本视图,它将使用init(_:tableName:bundle:comment:)初始值设定项,该初始值设定项将字符串解释为键,并使用它在您提供的表中搜索匹配对。如果您没有提供,它将使用默认表localizable.strings。但是,如果使用变量名初始化文本视图,则视图将使用init(_:)初始值设定项,该初始值设定项不会本地化字符串。 您可以指定本地化文件的表名,包含字符串文件的包(如果您没有提供主包,它将使用主包),以及包含与上述文本视图初始化中的本地化器的键-值对相关信息的注释。 如果您的应用程序非常大,有许多用于本地化的内容块,您可以决定将其拆分为不同的。strings文件,并将文件名指示为表名。在localizable.strings文件(英文)中,添加以下内容: 在你的文本视图中,使用新添加的键初始化视图,运行app,你会得到屏幕上显示的‘你好,世界!’。不要忘记在。strings文件中键-值对的末尾添加分号,否则,Xcode将触发无效输入的构建错误。 到目前为止,您的ContentView.swift文件应该如下所示: SwiftUI中内插字符串的本地化 SwiftUI支持开箱即用的字符串插值,因为LocalizedStringKey符合ExpressibleByStringInterpolation协议,该协议允许我们将动态数据注入到字符串值中。 下面是一个更好理解的例子。假设我们希望在文本视图中显示类似'My name is John'的内容,其中的名称是动态的,可能是从对后端的API调用返回的。然而,在我们的示例中,我们将只拥有一个字符串类型的变量名。将以下内容添加到Localizable.strings(英文)文件中。 在contentView.swift文件中,为类型字符串var name=“john”引入一个新的变量名。您的ContentView.swift文件将如下所示: 当你运行应用程序时,你应该会看到屏幕上显示‘我的名字是约翰’。现在,让我们做一点实验。给name变量分配一个整数值6,然后再次尝试运行应用程序。你注意到什么了?按键显示在屏幕上。这是因为%@是一个对象(其中包括字符串)的说明符。我们将不得不为int使用一个不同的说明符以使其正常工作。在Localizable.strings文件中,将title-name的说明符从%@更改为%lld,使该行看起来如下所示: 尝试再次运行应用程序,一切都将再次看起来良好。要了解更多关于字符串格式化程序的信息,请查看格式说明符。 SwiftUI本地化中复数的处理 为了创建传递给LocalizedStringKey的可本地化字符串的复数变体,需要向项目中添加一个stringsdict文件。当你想在视图中呈现“一个苹果”(当你只有一个苹果)和“十个苹果”(当你有十个苹果)时,添加复数变体会很有用。 让我们向项目中添加一个stringsdict文件。选择File New File…并确保您在正确的目标操作系统(本例中为iOS)。在Resources下选择Stringsdict File,然后单击Next。在显示的工作表中,键入复数作为文件名,然后单击“创建”。 现在,让我们编辑刚才添加的文件。LocalizedStringKey是我们将传递给LocalizedStringKey结构的键。将其更改为水果计数%lld。 将NSSringLocalizedFormatKey值%#@VARIABLE@更改为%#@apple@,并将下面的变量字典更改为“apple”。展开'apple'字典并将lld string FormatValueTypeKey作为值添加到NSSringFormatValueTypeKey中。此字符串格式说明符将根据您所处理的数据类型而有所不同。在我们的例子中,我们处理的是Int,这就是为什么我们使用lld。 我们现在必须通过在“零”到“其他”类别中输入格式化字符串来定义复数变体。我们只关注两个案例,“一个”和“另一个”。对于“one”,添加值%lld apple,对于“other”,添加值%lld apples。继续删除其他不使用的类别。如果您已经正确地完成了所有操作,那么您修改后的文件应该如下所示。 让我们测试一下,看看是否一切都按预期运行。然而,在此之前,我们将介绍在视图主体中使用VStack来帮助我们呈现两个文本视图。引入一个int类型的新变量appleCount。在VStack闭包中,添加另一个文本视图,即text(“fruit-count\(appleCount)”)。 您的代码结构现在应该如下所示: 尝试测试应用程序。看来它并不像预期的那样起作用,这可能是什么原因造成的呢?好吧,我们之所以有fruit-count 2(它是我们在第二个文本视图中显示的关键字),是因为我们将stringsdict文件命名为“plurals”。默认的查找表名称通常为“Localizable.StringsDict”。如果我们将我们的stringsdict文件命名为“Localizable.stringsdict”,那么一切都将按预期工作。为了使它正常工作,我们必须在第二个文本视图初始化中指定复数作为表名,而不使用扩展部分,即再次测试text(“fruit-count\(appleCount)”,tableName:“Plurals”),然后一切都将正常工作。 到目前为止工作很出色!让我们向前迈进,为它增添一丝曲折。假设您想要显示其他类型的水果,如橘子和芒果,即显示类似于“2个苹果”,“1个芒果”或“3个橘子”的内容。 打开Plurals.Stringsdict文件,并将NSSringLocalizedFormatKey更改为%#@Apple@,%#@mango@和%#@Orange,即我们希望它呈现的方式(“2个苹果”,“1个芒果”和“3个橙子”)。将“apple”的变体复制成“mango”和“orange”,并进行必要的更改。 由于我们将在文本视图中的字符串插值中传入三个变量,我们需要向本地化的字符串键添加两个%lld字符串格式说明符,即fruit-count%lld%lld%lld。 新修改的文件应该如下所示: 一切准备就绪。在我们的代码内部,我们需要再引入两个变量来保持mango和Orange的计数。请将您的代码更新为下面的代码。 再次测试您的代码,所有的事情都应该像预期的那样工作。到目前为止,这是一次相当的学习之旅,你在这里做得真的很棒!有关在本地化中添加多个变体的更多信息,请查看这个Xcode帮助文档。 正在添加翻译 我们现在已经为本地化做好了充分的准备。单击我们在最开始创建的localizable.strings文件。在“文件检查器”中,选择“本地化”。弹出窗口将询问您是否希望将文件本地化为基本语言英语。单击Localize。 您还必须勾选其他语言的复选框,中文和法文。完成后,在Localizable.strings文件夹下将有三个文件,分别用于基本语言英语,汉语和法语。对plurals.stringsdict文件执行相同的操作。 对于本地化文本内容,您应该非常小心地处理这个过程,因为如果应用程序本地化做得不对,就会破坏其目的。你只是不想失去那些可能会因为你的应用程序的母语内容而感到冒犯的用户。这就是为什么我们在本文中将不提供对可本地化字符串的转换。出于学习的目的,你可以自己翻译内容,但在现实生活中,这是你应该依靠专业翻译的地方。 你可以使用谷歌翻译或任何其他机器翻译服务将文本分别翻译成中文和法文。在提供中文和法文本地化文本的同时,您只需要更改值而不需要更改键。例如,在您的localizable.strings文件中,您只需要翻译My name is in“title-name%@”=“My name is%@”;分别为Localizable.strings(中文,指定)和Localizable.strings(法语)文件中的中文和法语。 您还必须对plurals.stringsdict文件执行同样的操作。您只需将apple,mango和orange分别在Plurals.stringsdict(中文,指定)和Plurals.stringsdict(法语)文件中翻译成中文和法语。至此,您已经完全本地化了应用程序。为到目前为止的好工作干杯! 测试定位 SwiftUI功能强大,实际上,你可以实时预览应用程序的本地化,而无需在模拟器或物理设备上运行,这无疑有助于缩短开发时间。 当您需要支持多种语言和地区,并且希望在UI上感受它们的外观时,这尤其有用。为此,苹果引入了环境变量--其中一个是专门针对语言和地区的。让我们尝试在预览中对语言和地区使用这个环境变量。 添加。environment(\.locale,init(identifier:“zh-Hans”)),其中zh-Hans是中文的区域设置标识符,指定给ContentView实例。单击画布上的Resume按钮,如果添加环境变量后没有反映任何变化,则刷新画布。好的方面是,你可以从预览中同时测试中文和法文。您只需要在SwiftUI中使用Group来对您的视图进行分组即可。创建一个ContentView的新实例,并添加一个带有'fr'标识符的环境变量。 您的ContentView_Previews结构将如下所示: 您现在可以在预览中同时测试中文和法语。相当令人印象深刻,对吧? 注意,在您的环境变量中更改此语言标识符将只反映在画布中的预览中。但是,如果您想测试您的本地化是否在模拟器或真实设备中工作良好,那么按照下面的步骤操作。 选择“编辑方案”“运行选项”,并将应用程序语言更改为要测试的任何语言。您还可以选择应用程序区域。编辑设置后,再次运行应用程序。 正在导出本地化 下一步是通过选择您想要支持的语言导出本地化,并将它们发送给您的本地化程序。请按照以下步骤进行操作。 在Project navigator中,选择项目,然后选择Editor Export for Localization。 在对话框中,输入文件夹名称,选择要导出文件夹的位置,取消选中English,因为我们不想翻译English,最后单击Export。 Xcode为每种语言创建一个Xcode本地化目录文件夹(扩展名为。xcloc)。这些文件夹中的每个都包含您标记为可本地化的资源和资产。然后可以将目录文件夹发送到本地化程序,以便立即开始工作。xcloc文件夹包含。xliff(标准XML本地化交换文件格式)文件,其中包含我们的本地化程序可以开始翻译的提取的字符串。 正在导入本地化 一旦您的本地化程序完成了对目录文件夹中内容的本地化,他们就会将其发送回您,而您所需要做的就是将其导入回您的项目中。Xcode为您处理一切。在Project navigator中,选择项目,然后选择Editor Import Localizations。如果您有多个。xcloc文件夹,并且它们包含在所有语言的一个文件夹中,请选择该文件夹,然后将各个。xcloc文件夹导入回项目。一旦导入,你的应用程序就完全本地化了。 今天到此为止! 干得好!如果您已经做到了这一点,那么您已经完成了一项了不起的工作,遵循了我们SwiftUI本地化教程的所有步骤。既然您已经为本地化准备好了您的应用程序,那么您就可以让短语来完成繁重的任务了。唱起来14天的试用,如果你有任何问题,随时在下面留言或评论! 想了解更多iOS app本地化的信息,敬请参考以下文章: 如何最大限度地利用移动应用程序本地化 自动化iOS情节提要本地化 带有短语的高级iOS OTA翻译 iOS iOS应用本地化(iOS应用l10n) iOS国际化(iOS i18n) iOS本地化(iOS l10n)

以上中文文本为机器翻译,存在不同程度偏差和错误,请理解并参考英文原文阅读。

阅读原文