在 Xamarin 中使用 watchOS 本地化
针对多种语言调整 watchOS 应用
使用标准 iOS 方法本地化 watchOS 应用:
- 在情节提要元素上使用本地化 ID;
- 与情节提要关联的 .strings 文件;
- 代码中使用的文本的 Localized.strings 文件。
默认情节提要和资源位于 Base 目录中,特定于语言的翻译和其他资源存储在 .lproj 目录中。 iOS 和 Watch OS 将自动使用用户的语言选择来加载正确的字符串和资源。
由于 Apple Watch 应用有两个部分 - Watch 应用和 Watch 扩展 - 两个位置都需要本地化的字符串资源,具体取决于它们的使用方式。
Watch 应用和 Watch 扩展中的本地化文本和资源是不同的。
Watch 应用
Watch 应用包含描述应用用户界面的情节提要。 任何支持本地化的控件(例如 Label
和 Image
)都有一个本地化 ID。
每个特定于语言的 .lproj 目录应包含 .strings 文件,其中包含每个元素的翻译(使用本地化 ID),以及由情节提要引用的图像。
Watch 扩展
Watch 扩展是应用代码运行的位置。 通过代码向用户显示的任何文本都需要在该扩展中进行本地化,而不是在 Watch 应用中进行本地化。
该扩展还应包含特定于语言的 .lproj 目录,但 .strings 文件仅需要对代码中使用的文本进行翻译。
全球化 Watch 解决方案
全球化是使应用程序可本地化的过程。
对于 Watch 应用,这意味着设计情节提要时要考虑不同的文本长度,确保每个屏幕布局根据显示的文本进行适当调整。 还需要确保 Watch 扩展代码中引用的任何字符串都可以使用 LocalizedString
方法进行翻译。
Watch 应用
默认情况下,Watch 应用未配置本地化。 需要移动默认的情节提要文件并为翻译创建一些其他目录:
创建 Base.lproj 目录并将 Interface.storyboard 移入其中。
为你要支持的每种语言创建 <language>.lproj 目录。
.lproj 目录应包含一个 Interface.strings 文本文件(文件名应与存储板的名称匹配)。 可以选择性地将需要本地化的任何图像放入这些目录。
进行这些更改后,Watch 应用项目如下所示(仅添加了英语和西班牙语文件):
情节提要文本
编辑情节提要时,请选择每个元素并注意“属性”面板中显示的“本地化 ID”:
在 Base.lproj 文件夹中,创建如下所示的键值对,其中键由本地化 ID 和控件上的属性名称组成,用点 (.
) 联接。
"AgC-eL-Hgc.title" = "WatchL10nEN"; // interface controller title
"0.text" = "Welcome to WatchL10n"; // Welcome
"1.text" = "Language settings are in Apple Watch App"; // How to change language
"2.title" = "Greetings"; // Greeting
"6.title" = "Detail";
"39.text" = "Second screen";
请注意,在此示例中,本地化 ID 可以是一个简单的数字字符串(例如“0”、“1”等)或更复杂的字符串(例如“AgC-eL-Hgc”)。 Label
控件具有 Text
属性,而 Button
具有 Title
属性,这反映在其本地化值的设置方式中 - 请务必使用小写属性名称,如以上示例所示。
在手表上呈现情节提要时,将根据用户选择的语言自动提取并显示正确的值。
情节提要图像
示例解决方案还在每个语言文件夹中包含一个 gradient@2x.png 图像。 该图像对于每种语言可能有所不同(例如,它可能嵌入了需要翻译的文本,或使用本地化的图标)。
只需在情节提要中设置图像的“图像”属性,系统就会根据用户选择的语言在手表上呈现正确的图像。
注意:由于所有 Apple Watch 均配备了 Retina 显示屏,因此仅需要 @2x 版本的图像。 无需在情节提要中指定 @2x。
Watch 扩展
Watch 扩展需要类似的目录结构来支持本地化,但没有情节提要。 扩展中的本地化字符串仅是 C# 代码引用的字符串。
代码中的字符串
Localized.strings 文件的结构与情节提要关联的文件的结构略有不同。 在这种情况下,我们可以选择任何“键”字符串;Apple 的建议是使用一个反映实际文本(将以默认语言显示)的键:
"Breakfast time" = "Breakfast time!"; // morning
"Lunch time" = "Lunch time!"; // midday
"Dinner time" = "Dinner time!"; // evening
"Bed time" = "Bed time!"; // night
NSBundle.MainBundle.LocalizedString
方法用于将字符串解析为其翻译后的对应内容,如以下代码所示。
var display = "Breakfast time";
var localizedDisplay =
NSBundle.MainBundle.LocalizedString (display, comment:"greeting");
displayText.SetText (localizedDisplay);
代码中的图像
可通过两种方式设置代码填充的图像。
可以通过将
Image
控件的值设置为 Watch 应用中已存在的图像的字符串名称来更改该控件,例如displayImage.SetImage("gradient"); // image in Watch App (as shown above)
可以使用
FromBundle
将图像从扩展移动到手表,应用将自动根据用户选择的语言选择正确的图像。 在示例解决方案中,每个语言文件夹中都包含一个 language@2x.png 图像,该图像通过以下代码显示在DetailController
上:using (var image = UIImage.FromBundle ("language")) { displayImage.SetImage (image); }
请注意,引用图像的文件名时无需指定 @2x。
如果从远程服务器下载图像并在手表上呈现,则第二种方法也适用;但是在这种情况下,应确保下载的图像根据用户的偏好正确本地化。
本地化
配置解决方案后,翻译器需要根据你希望支持的每种语言处理 .strings 文件和图像。
可以根据需要创建任意数量的 .lproj 目录(为每种受支持的语言各创建一个)。 使用语言代码为它们命名,例如 en、es、de、ja、pt-BR 等(分别表示英语、西班牙语、德语、日语和巴西葡萄牙语)。
附加的示例使用(由机器生成的)翻译来演示如何本地化 watchOS 应用。
Watch 应用
这些值用于翻译 Watch 应用情节提要中定义的用户界面。 键值是每个情节提要控件的本地化 ID 和要翻译的属性的组合。
建议在文件中添加包含原文的注释,以便翻译人员知道如何翻译。
es.lproj/Interface.strings
下面显示了情节提要的(机器翻译)西班牙语字符串。 为每一行添加注释会很有帮助,因为否则很难知道本地化 ID 引用哪个对象:
"AgC-eL-Hgc.title" = "Spanish"; // app screen heading
"0.text" = "Bienvenido a WatchL10n"; // Welcome to WatchL10n
"1.text" = "Ajustes de idioma están en Apple Watch App"; // Change the language in the Apple Watch App
"2.title" = "Saludos"; // Greetings
"6.title" = "2nd"; // second screen heading
"39.text" = "Segunda pantalla"; // second screen
Watch 扩展
在将信息显示给用户之前,将在代码中使用这些值来翻译信息。 键由开发人员在编写代码时选择,通常包含要翻译的实际字符串。
es.lproj/Localizable.strings 文件
(机器翻译的)西班牙语字符串:
"Breakfast time" = "la hora del desayuno"; // morning
"Lunch time" = "hora de comer"; // midday
"Dinner time" = "hora de la cena"; // evening
"Bed time" = "la hora de dormir"; // night
测试
更改语言首选项的方法在模拟器和物理设备之间有所不同。
模拟器
在模拟器上,使用 iOS“设置”应用(模拟器主屏幕中的灰色齿轮图标)选择要测试的语言。
手表设备
使用手表进行测试时,请在配对的 iPhone 上的“Apple Watch”应用中更改手表的语言。