2010-11-06 75 views
3

我已经完成了一些网站和应用程序,支持多种语言,我已经在代码中使用了语言xml文件和关键字。对于我的网络应用程序,我相信这种方法很糟糕。我喜欢阅读和理解我的HTML代码。此代码没有任何意义:翻译Web应用程序的不同方法

<h1><?= translate('main_headline'); ?></h1> 

它看起来不错的开始,但是刚刚结束了不愉快的程序员,因为添加新功能的过程,现在需要把东西在个XML所有的时间。

我的解决方案(我只是写了一个简单的测试PHP解析器一个小时前,你认为这将在一个大型项目的工作?)

我用英语作为我的基本语言,这是我如何源文件的外观:

<h1>{{ I love colors }}</h1> 

我的解析器将使用文本(真实文本)作为字典数组的关键字。在这个例子中,我正在从美国英语翻译成英国英语。

$dictionary['I love colors']['en_GB'] = 'I love colours' 

因为它已经在源文件中,所以我的基础语言不需要字典。

还有很多东西像缓存,回退,字典存储等。你认为它可以在大型项目中工作吗?那里有我没有考虑过的事情?

+0

这种类型的字典是由phpBB成功使用的(尽管没有解析方面的东西。)但是,每种语言应该有一个字典文件,如果你需要en_GB, (1)避免加载20种语言,并且(2)在访问字典时不需要将其作为关键字。 – 2011-09-19 05:33:35

回答

3

与此相关的一个缺陷是应用程序的两个不同部分可能需要对同一个词/短语进行不同的翻译。最明显的例子是homograph,例如, “关闭”(附近)和“关闭(关闭),但也有其他的可能性也

一个人为的短语的例子是:

在一个部分,‘我爱我的色彩’只是指文字颜色。
在另一方面,它的意思是“我爱我的标志”

应:

$dictionary['I love my colors']['es_ES'] 

是“我encantan错误彩之”或“我encanta英里班德拉”它以某种方式既

这就是为什么通常在消息目录中使用唯一ID或行号的原因。

+0

我不认为他建议它动态翻译每个单词。人会手动翻译每个短语并对这些翻译进行硬编码。 – 2010-11-06 21:53:59

+0

@ Thr4wn,我知道他没有使用自动翻译功能。正如我所说,他的消息目录的问题是它只考虑原始文本。如果应用程序的两个部分使用相同的文本用于不同的目的,这将失败。 Jochen的解决方案很好,因为它为每封邮件提供了一个唯一的ID。其他解决方案(例如GNU gettext)使用原始行号。 – 2010-11-06 21:56:09

+0

啊,我明白你现在在说什么。 – 2010-11-06 22:00:14

0

是的,这是一个很好的方法。

我们使用类似于: || 4332 ||我喜欢颜色||

然后你可以解析你的文件,提取所有的ID(4332),并在数据库中查找翻译。

+0

你如何跟踪所有的ID? – Znarkus 2010-11-06 23:35:20

0

编辑:其他的反应,现在是更好的比我:)

我不知道有第二种选择的任何问题(而且我也没有经验,国际化的工作)。

我看到第二个选择的唯一潜在问题是可逆性。如果有人返回并更改文字以表示“我喜欢颜色”,则有人必须总是确保他们回到翻译并更改英文键。但是,你在做i18n的事实让我认为已经有人的工作是处理繁琐的翻译工作,所以我不会将其视为一个问题。

0

我更喜欢为这类东西使用组合标签,这样我可以在上下文和意义上包含注释,这些东西对翻译人员非常有用。例如:

<h1><l10n id="blah" notes="This is a header for a section on blah blah, title case">Blah Blah</l10n></h1> 

同样,你可以使用由属性为alttitle文本。

虽然您需要注意不同的上下文(HTML,<script><style>,PHP,各种模板语言...)。你还需要小心词序和性别问题,但这些都是标准的L10N问题。

然后,您可以将所有翻译的文件预处理为单独的目录(每种语言一个),并避免在运行中生成翻译的开销。

1

一些考虑和想法。

  • 将短语重复使用降到最低。我的经验是,使翻译的维护更容易。

  • 语法必须与语言无关,因为您可能会使用自己的文件类型来翻译PHP,JS,HTML等。换句话说,不仅PHP模板需要解析,.js文件也可能包含文本。

    {{ <img src="heading-en.png" alt="Heading" /> }} 
    alert('{{ some text }}'); 
    
  • 上面的alert例如将打破,如果翻译文本包含在',应该得到某种处理。

  • 您必须以某种方式允许翻译中的变量数据。请考虑下面的例子。

    {{ <?= $num ?> apples cost <span class="price"><?= $price ?></span> with <?= $discount ?>% discount }} 
    

    这可能无法正常工作,或者至少不允许变量名称更改或内联表达式。下面的例子会更好。

    {{ 
        %num% apples cost <span class="price">%price%</span> with %discount%% discount 
        } num:<?= $num ?> 
        , price$:<?= $price*$discount ?> 
        , discount:<?= round($discount*100) ?> 
    } 
    

    ..其中价格$可能意味着它是一个价格,并转换为正确的货币。

  • 应该处理货币。

只是想起了几件事情。祝你好运;-)