我们可以为语言字符串使用变量钩子吗?

时间:2015-04-27 作者:Benn

我用它来本地化主题中的字符串

__(\'Background image\', \'themename\');
有很多本地化的字符串,但为了确保主题lang文件和本地化字符串可以快速更改,我想使用如下内容

$theme_name = \'themename\';// this would be global var or var from a theme class

__(\'Background image\', $theme_name); // or  $myClass->themename
然后在任何需要的地方使用该变量。这样,主题的所有者可以快速更改主题名称,而不必遍历所有位置。

你认为这有问题吗?

2 个回复
最合适的回答,由SO网友:kraftner 整理而成

是的,这是有问题的,因为i18n tools 解析主题以生成*。用于翻译的pot文件无法理解这一点,因为它们不运行PHP代码,而只是以文本形式搜索代码。

这里是a blogpost detailing on why this may cause trouble:

一句话:在所有翻译函数中,字符串中不允许有PHP变量,无论出于何种原因。仅限纯单引号字符串

但不管怎样DRY 太棒了!实际上我已经说过了i18n tools 它们可以帮助您自动添加textdomain。甚至还有一个Grunt plugin 为了实现自动化,还可以选择替换/重命名textdomains,这将解决您的实际问题。如果你需要更多的帮助,请发表评论。

SO网友:fischi

这样的技术有一个很大的优点,也有一个很大的缺点。

好处是,正如您所提到的,所有者可以动态更改主题名称,从而更改翻译的来源。如果您有一个特殊的用例,例如不同版本的翻译,这可能非常有用。

我有一个项目,我使用第一个字符串作为变量。使用此方法,我可以动态转换从不同函数返回的字符串,在我的示例中是从API返回的。具体而言,我收到的错误如下AdError.INVALID_INPUT, 我可以输出每种语言的错误描述。

问题是,最大的缺点是,您无法在主题/插件中找到所有字符串。许多翻译程序(或WPML之类的插件)循环遍历您的文件并搜索__()_e() 函数(以及所有其他翻译函数),并解析字符串以创建翻译的引用。

如果在调用中使用变量,则无法找到textdomain的字符串或translationstring的字符串,因为它们是动态的,并且没有硬编码到文件中。

如果选择此路径,则需要一个额外的文件,其中定义了所有翻译:

__( \'Your new String\', \'yourtheme\' );
__( \'Your new String2\', \'yourtheme\' );
如果您使用.mo-文件,这会变得更容易一些,因为您只需更改文件,但只要添加另一个字符串,所有翻译文件也必须更新。

结论

一般来说,我不鼓励您对textdomains使用这种方法。只需在整个主题文件中搜索/替换就会容易得多(大多数编辑器只需点击几下即可完成)。

如果您想要翻译您不知道的字符串或动态生成的字符串,这可以是一个很大的简化。只需确保在gettext 函数,以确定所需的翻译是否已在翻译系统/生产订单/采购订单文件中识别。

像这样的事情应该会奏效(未经测试):

add_filter( \'gettext\', \'f711_check_for_translations\', 10, 3 );

function f711_check_for_translations( $translated, $text, $domain ) {
    if ( $text == $translated ) {
        AddNewStringToTranslationStrings( $text ); // Function to add the string to your translation strings, however you are going to do that.
    }
    return $translated;
}

结束

相关推荐

Plugin Localization

我刚刚为wp构建了我的第一个插件,即使它不是一个伟大的“代码诗意”;)它正常工作。这是一个使用GalleryView 3.0 jquery插件转换默认wp库的插件(http://spaceforaname.com/galleryview).我唯一不能做的就是本地化。此插件的本地化意味着转换管理界面,在这里可以配置jquery插件选项来更改结果库的外观。我试着关注网络上数百万的教程,在论坛上阅读了很多关于这个问题的帖子,并遵循了codex的指南。。。但仍然没有运气。这就是我所做的:每个文本行都位于gette