更具描述性的语言字符串占位符?

时间:2009-12-18 15:44:49

标签: php smarty template-engine

<?LANG(no_download, 'you are not allowed to download')

而不是

$lang[no_download]

我认为这是在模板中嵌入语言字符串的更好方法。

在几乎所有PHP应用程序中,主要的语言占位符格式类似于<?=$lang['no_download']?>{{no_download}}。其他设计人员/开发人员/翻译人员很难在不参考语言文件的情况下解读占位符所代表的内容。

为了使语言占位符更具描述性,为什么我们不将原始字符串与占位符一起包含在内? e.g。

<?=lang( 'no_download' , 'You are not allowed to download this file because you have exceeded your quota' )?>

第二个参数是一个虚拟参数,因此lang()函数没有对它进行任何操作。

乍看之下,人们可能会认为它过于冗长,给模板标记添加了混乱。 但在我看来,它不是一个有效的参数,因为语言字符串如果没有语言意识就会占用占位符那么多的空间。

我想听听你对此的看法。

4 个答案:

答案 0 :(得分:1)

编辑 没有看到这被标记为Smarty。如果你想要Smarty特定答案,请忽略我的答案。

我不同意有主要的占位符格式。一般来说,格式取决于您如何处理翻译,而且可能会有所不同。

除此之外,提供默认语言字符串作为翻译标签并不罕见。例如,在Zend Framework手册中,这是他们usage example的一部分。如果您的翻译适配器支持,那没有错。如果它需要ID,那么它不是一个选项。

就个人而言,我更喜欢ID并尝试根据它们在应用程序中的用法来命名,例如: form.label.login.username或cart.checkout或flashmessage.notice。

使用ID还提供了另一层分离。鉴于发短信可能不属于开发人员或模板设计师的责任,最好在模板中使用ID。

答案 1 :(得分:1)

在我看来,考虑为你的参赛作品设置好的描述性“键”是明智之举...... 你的“no_download”键没有很好地描述消息,因为它没有动词。

Keys,必须以良好的命名约定以及变量和函数命名。

您的密钥应该是例如:

{{user_quota_exeeded}}

{{user_quota_exeeded_alert}}

从长远来看,如果你的“真正的字符串”被改变而模板中的“虚拟参数”没有改变,它会欺骗你的一些同事/客户/ ....

此外,它会强制您输入两次消息。

有关wikipedia的命名惯例的更多信息。

答案 2 :(得分:0)

Gettext已经这样做了。它是这样的:

_('Gettext does this already. It goes something like this:');

答案 3 :(得分:0)

这些都是很棒的答案,很棒的见解,伙计们。

Arno,我非常了解命名约定。 我的示例语言密钥确实不是很恰当地命名,但它只是作为一个例子。在我的Web应用程序的整个翻译过程中,我遇到了难以用几个字符串概括/描述的字符串,因此想到将默认语言字符串包含为翻译标签。我敢肯定,如果你在翻译方面做得足够多,你会遇到这种情况。

无论如何,看到Zend&amp; amp; Gettext已经采用了这种方法。

突然出现的另一个问题是性能损失。

将使用函数调用,例如LANG()占用的资源比简单地打印$ lang []数组要多得多吗?

dya的想法是什么?