我的任务是在 Drupal 中对我们当前的 CMS 设置进行 i18n-ing。
我面临的问题是使用 module_invoke() 在节点内放置块。
我已经设法对块进行字符串翻译,当使用 UI 将块放置在区域中(块内容已成功翻译)时,这是有效的。
但是,当一个块被注入(inject)到一个节点时,像这样:
$block = module_invoke('block', 'block', 'view', 22); print $block['content'];
它没有被翻译,甚至更糟,根本没有显示。
我也使用 t() 尝试过这种变体。例如。:
$block = module_invoke('block', 'block', 'view', 22); print t($block['content']);
无济于事。
一般来说,我在 i18n 的块上遇到了一些麻烦。有没有人有推荐的方法来处理 drupal 中的块以进行翻译?我不想为每种语言创建不同的块。
最佳答案
所以..在Drupal的内部挖掘之后 - 并且拉扯了很多头发..我想出了一个几乎不错的解决方案。
基本上,使用此功能,我可以提取块的翻译版本:
function render_i18n_block($block_id, $region = "hidden"){
if ($list = block_list($region)) {
foreach ($list as $key => $block) {
// $key == <i>module</i>_<i>delta</i>
$key_str = "block_".$block_id;
if ($key_str == $key){
return theme('block', $block);
}
}
}
}
然后,在我的节点中,我简单地调用:
<?php echo render_i18n_block(<block_id>,<region>); ?>
可能存在一些问题,您的块可能不会显示在区域中(因此您无法将区域传递到 block_list)。对于这种情况,我只是创建了一个名为“隐藏”的区域,该区域不会在我的模板中的任何地方呈现,但可用于调用 block_list。
最后(这是我仍然需要找到一个好的解决方案的部分),我发现:includes/blocks/block.inc 中的 block_list() 有一点问题。
似乎 $theme_key 设置不可靠,除非从 theme() 函数(在 includes/themes.inc 中)调用 block_list() ..这会导致 SQL 返回一个空的结果集。 SQL 看起来像这样:
$result = db_query(db_rewrite_sql("SELECT DISTINCT b.* FROM {blocks} b LEFT JOIN {blocks_roles} r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = '%s' AND b.status = 1 AND (r.rid IN (". db_placeholders($rids) .") OR r.rid IS NULL) ORDER BY b.region, b.weight, b.module", 'b', 'bid'), array_merge(array($theme_key), $rids));
如您所见,如果未设置 theme_key,则它只会返回一个空结果。
现在我通过简单地添加来绕过这个:
if (!isset($theme_key)){$theme_key="<my_theme_name>";}
在 modules/blocks/block.inc::block_list() 大约第 429 行 .. 我仍然需要找到一个更好的方法来做到这一点。
关于Drupal module_invoke() 和 i18n,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4082197/