本地化自定义SiriKit意图

23

我的Xcode版本是v10,我正在为SiriKit开发一个自定义意图,目标是iOS 12。

在Xcode 10中,自定义意图是在.intentdefinition文件中设计的,您可以在其中定义自己的参数以及意图短语的标题和Siri快捷方式。使用具有.intentdefinition文件的项目构建会使Xcode自动为该意图生成一个INIntent派生类。

我的问题是,为了支持英语以外的其他语言,使用户能够操作自定义意图的快捷方式时在“通用” > “Siri与搜索”中显示该意图的标题以及系统语言,我需要为我的.intentdefinition文件提供本地化的意图标题。

当我尝试在文件检查器中为我的.intentdefinition文件添加另一种语言,然后构建项目时,我会得到以下错误信息:

duplicate output file '/Users/.../IntentDefinitionGenerated/Intents/MyCustomIntent.swift' on task: IntentDefinitionCodegen /Users/.../ru.lproj/Intents.intentdefinition

这可能是因为Xcode看到.lproj文件夹中存在多个.intentdefinition文件并尝试为每个文件生成同名的类所致。

我如何为iOS 12本地化我的.intentdefinition文件?


你成功注册了自定义词汇吗? - Mohmmad S
@tobi 不好意思,还是同样的编译器错误。 - Desmond Hume
5个回答

33

前往intentdefinition文件 -> 文件检视器(File Inspector) -> 选择本地化(Select Localize) -> 现在选择您的intentdefinition文件的当前语言。

这将把您现有的intentdefinition文件转换为当前语言。

现在再次选择相同的intentdefinition文件,添加其他语言 - 这将创建一个新的Intents.strings文件,您可以在其中自定义其他区域设置的文本。

本地化的 Intents.intentdefinition 文件

本地化后的 Intents.intentdefinition 文件


9
有人知道吗?如果你按照上述步骤操作,然后在以后的某个时间点向意图定义文件中添加了一些字符串,如何将这些新增的字符串添加到本地化字符串文件中呢? - Muxor
4
无效。它会产生编译器错误: 显示最近的消息 :-1: 多个命令产生“.../SiriIntentsExtension.build/Objects-normal/arm64/NIIntentClassName.o”: 1)目标“SiriIntentsExtension”(项目“project”)有针对Swift源文件的编译命令 2)目标“SiriIntentsExtension”(项目“priject”)有针对Swift源文件的编译命令 - Desmond Hume
@DesmondHume 你尝试清理你的构建文件夹了吗?还要检查nevan的答案 https://dev59.com/n1QK5IYBdhLWcg3wJMm0#52533945 - Noor
4
我所做的是移除了所有本地化内容(取消勾选复选框,删除文件),然后再次添加它们(勾选复选框)。如果你正在使用Git或其他源代码控制工具,你应该能够看到有哪些更改。 - Tom Kraina
生成的 Intents.strings 文件将有一堆 6 个字符的键... 有没有办法使它们更易读?如果我添加了新内容,我需要查看 .intentdefinition 文件的源代码以获取 ID 吗?... - Lord Zsolt
显示剩余2条评论

7
我和 @desmond-hume 遇到了同样的问题。在我的情况下,我有一个旧的 xcode 项目,在"Base"可用之前已经包含了一些本地化内容。初始的 .intentdefinition 文件必须被添加为基础本地化。从那里开始,可以添加更多的本地化,Xcode 将仅为每个本地化添加一个 .strings 文件。
如果没有基础本地化,Xcode 会为每个本地化添加一个新的 .intentdefinition,这会导致 "multiple commands produce...." 错误。
您可以通过复选框在主项目设置中添加一个基础本地化。 一些旧项目(像我的)也可能会遇到这个问题: iOS - Using Base localization pane is always empty

你是人中之王!谢谢! - Kokaubeam

3
看起来你已经本地化了你的意图定义文件(因为Xcode把它放在了一个“ru.lproj”文件夹中),所以问题可能是你在“编译源代码”构建阶段有两份文件的副本。
请前往:
项目 -> 应用程序目标 -> 构建阶段 -> 编译源代码
查找重复条目。如果你找到了重复的条目,请删除其中一个副本。
你也可以尝试使用“编辑器 -> 验证设置…”来查找重复项。
你也可以尝试清理构建。

0

我最近为我的应用程序本地化了意图,但在最初的本地化之后,我添加了另一个意图。

在至少我检查过的Xcode 10.2.1中,当您选择项目的顶层时,有一个“导出本地化”选项。 它会要求您保存输出。 当您调查输出时,您应该看到每种语言都支持的.xcloc文件夹。 深入到“本地化内容”下的.xliff并打开它。

enter image description here

在那里,你将找到你需要的宝藏物品,并且你正在寻找那些没有“目标”的物品。

enter image description here

在 Apple 的 dub dub 工程师向我展示了这个,但我个人对这个过程并不满意,因为你必须编辑它,然后重新导入它(假设你将文件发送给翻译人员并获得 .xliff 返回)。

然而,Intents 的烦恼在于它使用任意的 ID 而不是可读的内容。

我还没有找到更简单的方法(但希望这可以帮助你)来定位缺失的翻译。


为了找到缺失的翻译,建议您使用能够读取xcloc文件夹、解析xliff文件并给出缺失翻译摘要的应用程序,而不是在文本编辑器中查看xliff文件。其中一款允许您一次分析整个xcloc文件夹(如上面截图中的OrderBossLocalization)的应用程序是Loca Studio。基本的审查和编辑功能是免费的。(完全披露:我是这个应用程序的开发人员之一) - guru_meditator

0

你必须检查项目->信息中的“使用基本国际化”

接下来使用顶部答案方法创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接