【问题标题】:How to localize a string in unity where different languages may have different grammars如何在不同语言可能具有不同语法的情况下统一本地化字符串
【发布时间】:2020-04-20 03:55:49
【问题描述】:

我正在翻译一个 Unity 游戏,有些台词像

在 XXXX 处解锁

其中“XXXX”在运行时被任意子字符串替换。很容易替换通配符,但要翻译引号,我不能简单地连接 a + b,因为某些语言将在字符串之前或内部具有值。我想我需要有效地取消替换它,即隔离并保留子字符串并翻译它周围的任何内容。

问题是,虽然我可以轻松完成第二部分,但我想不出第一部分的任何途径。我知道要获取我要查找的字符索引,但是该值占用任意数量的字符,并且我不能使用空格,因为某些语言不使用它。不能使用数字检测,因为并非所有值都是数字。我尝试询问 Google,但我无法将“查找替换通配符的内容”翻译成关键字可搜索的内容。

简而言之,我正在寻找一种方法来找到“XXXX”(简单的部分),然后在字符串中找到替换它的任何内容(不太容易的部分)。

提前致谢。

【问题讨论】:

  • 如果您逐字翻译整个字符串并确保翻译中也包含 XXXX 会怎样?然后用翻译代替原文再做替换?翻译字符串 after 它已经完成了它的替换将要困难得多。
  • 请发布您的代码,这将为我们提供一个开始的地方......
  • 这是我一开始尝试做的,但自从 Unity 转向 Unity,我发现我必须翻译文本,因为它变得可见。到目前为止还没有任何代码,因为我无法粘贴任何东西。
  • XXXX 肯定是变量??你能不做 $"Unlock at {myvar}" 其中 myvar 是翻译的细节吗?
  • 就是这样,但我的翻译方法只将完成的文本作为输入。我确实想我可以制作另一种方法,将值作为辅助参数,所以我会尝试。

标签: c# string unity3d translation string-concatenation


【解决方案1】:

感谢大家的善意建议,我最终找到了解决方法。我存储了子字符串,并在一个特殊的翻译方法中引用了它,该方法确实接受了一个值。谢谢大家的热心帮助。

public static string TranslateWithValue (string text, string value, int language) {
    string sauce = text.Replace (value, "XXXX");
    sauce = Translate (sauce, language);
    sauce = sauce.Replace ("XXXX", value);
    return sauce;
}

【讨论】:

  • 您应该使用值列表或字典而不是单个字符串。
  • 我从您的回答中得知,文本中的关键字不是 XXXX,正如您在问题中描述的那样?否则,为什么要先更换呢?
  • 对于它的价值,它实际上是“XXXX”。我使用一个字符串文件,所以它实际上可以是任何东西。
【解决方案2】:

通常,我在这种情况下使用 string.Format。在您的情况下,我将声明 2 个可本地化的字符串: string unlockFormat = "Unlock at {0}"; string unlockValue = "next level"; 当您需要显示解锁条件时,您可以像这样组合字符串: string unlockCondition = string.Format(unlockFormat, unlockValue); 这将产生字符串“Unlock at next level”。

unlockFormat 和 unlockValue 都可以翻译,翻译者可以将 {0} 移动到任何需要的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多