我正在寻找一种文化敏感的方法,在使用适当的文章(a / an)时将名词正确地插入句子中。如果在其他地方存在适当的方法,它可以使用String.Format,或者可能使用其他东西。
例如:
基本句子:“你正在看a / an {0}”
这应格式化为:“你正在看胡萝卜”或“你正在看一个鸡蛋。”
我目前正在通过手动检查要插入的单词的第一个字符,然后手动插入“a”或“an”来完成此操作。但我担心当应用程序本地化为其他语言时,这可能会限制我。
是否有解决此问题的最佳做法?
解决方案:似乎问题很复杂,以至于没有一个实用程序或框架以我最初的措辞来解决这个问题。似乎最好的解决方案(在我的情况下)是将文章与名词一起存储在数据库中,以便翻译人员可以拥有他们所需的控制级别。感谢所有的建议!
答案 0 :(得分:9)
问题甚至在英语中,a-vs-an不是由起始字母决定的,而是起始声音。您可以根据起始字母用英语做出相当不错的假设,但也有一些例外(例如“小时”,“用户”)。
最好的办法是可以选择单词的发音。
除此之外,接下来要做的最好的事情是列出一些常见的异常,然后猜测其余的异常。
来自Wikipedia:
“a”或“an”的选择是 由语音规则决定 而不是通过拼写惯例。 “安”是 受雇于演讲中删除 尴尬的声门停止(瞬间沉默 暂停)否则需要 在“a”和后续词之间,例如 “X射线”......以下 段落是“an”的拼写规则 如果是语音规则,可以使用它 不明白。
答案 1 :(得分:4)
除了lc(一小时,一顶帽子)所指出的问题外,不同语言的语法规则差异很大。例如,许多基于拉丁语的语言根据名词的“性别”和“数字”来切换名词的文章,有时可以从单词的最后几个字符推断,但与英语有相同的问题......很多例外。
如果您正在谈论本地化接口,我会在每种语言中存储带有名称的文章。如果您正在处理用户输入,我看不到一种简单的方法。
答案 2 :(得分:3)
在old text adventure computer games的日子里,解决这个问题的一种方法是制作事物名称的“a”,“an”,“the”等部分。在这些游戏中你看到“邮箱”时,没有聪明的AI来确定“a”。对象的名称是“邮箱”。在某些游戏中,它可能会说“你打开一个邮箱”,这听起来很愚蠢,而在其他游戏中它可以说“你打开邮箱”,这意味着输入的对象的另一个名称,用于不同的语法上下文。我建议你走这条路,而不是你现在的路线。
答案 3 :(得分:2)
其他语言有类似的问题,但在不同的情境中,例如取决于对象的性别或实际的对象数量(有些语言不仅区分一个和两个对象,但语法不同,一个,两个或者俄语中的两个以上的对象。)
使用德语的例子:
相当于“你正在看(n)X”将是:
“Du siehst ein X”
或“Du siehst eine X”
或“Du siehst einen X”
取决于对象X的性别。对象的性别是您无法猜测的,它仅根据历史传统链接到对象的名称。
因此,在大多数语言中没有简单的方法来实现这种区别。我的建议是始终使用适用于所有情况的配方,例如
“你正在看一个X型物体” 或者“你正在看(n)X” 或者“你正在看一个X”
答案 4 :(得分:1)
这对文化敏感度如何?你想要做什么只有才有意义。其他语言可能需要对句子进行完全不同的更改。有些人可能会修改名词,有些人可能会改变句子结构,有些人可能会对词语进行重新排序等等。
当您本地化为其他语言时,将 打破。没有自动解决方法。
作为一个简单的例子,考虑当你尝试写“{something}”时会发生什么 在英语中,你只需在单词前加上“the”,一切都很好。在法语中,您可以使用le,la或les作为前缀,具体取决于性别以及是否为复数。 在丹麦语中,您可以添加“en”或“et”后缀。因此,当单词表转换为“bord”时,“表格”变为“bordet”。并且“椅子”(stol)变得“被盗”。
唯一有意义的方法是让翻译控制整个句子。不要以为你可以在这里和那里插入一些与文化相关的词语。
所以在实践中,最好的解决方案可能是接受您的应用程序不能轻易地进行本地化。也许你可以确保它可以用于几种关键语言,除此之外,可以忽略这个问题。然后,如果您需要在将来的某个时间将应用程序翻译为语言X,请与翻译人员一起进行应用程序代码中所需的更改。
或者,你必须完全放弃尝试自己构建句子。确保句子正确的唯一方法是让翻译者写出整个句子。当然,当您希望能够交换单个单词时,这会导致问题。
答案 5 :(得分:0)
有一个名为.NET inflector的库,用于复数/单一化,可能会以相同的方式重新利用或扩展这种事物。你在这里寻找的是一般规则,然后你可以调整例外...例如,以字母组合开头的单词通常发音为元音。虽然这不是[严格来说]文化敏感的,但至少应该让你从英语开始。