Drupal模块_invoke()和i18n
我的任务是在Drupal中设置我们当前的CMS。 我面临的问题是使用module_invoke()在节点中放置块 我已经成功地对块进行了字符串转换,当一个块被放置在一个区域中(块内容被成功转换)时,这种转换就可以使用UI了 然而,当一个块被注入一个节点时,如下所示:Drupal模块_invoke()和i18n,drupal,internationalization,Drupal,Internationalization,我的任务是在Drupal中设置我们当前的CMS。 我面临的问题是使用module_invoke()在节点中放置块 我已经成功地对块进行了字符串转换,当一个块被放置在一个区域中(块内容被成功转换)时,这种转换就可以使用UI了 然而,当一个块被注入一个节点时,如下所示: $block = module_invoke('block', 'block', 'view', 22); print $block['content']; 它没有被翻译,甚至更糟的是,根本没有显示出来 我还使用t()尝试了这个变
$block = module_invoke('block', 'block', 'view', 22); print $block['content'];
它没有被翻译,甚至更糟的是,根本没有显示出来
我还使用t()尝试了这个变体。e、 g:
无济于事
一般来说,我对i18n的块有点麻烦。有没有人推荐在drupal中处理块的方法来翻译它们?我不希望为每种语言创建不同的块 这可能会帮助您:
更新:t()函数允许您传入要使用的语言代码。So。。在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);
}
}
}
}
正如您所看到的,如果没有设置theme_键,那么它只会返回一个空结果。
目前,我只需添加以下内容,即可绕过此问题:
if (!isset($theme_key)){$theme_key="<my_theme_name>";}
if(!isset($theme_key)){$theme_key=“”;}
在modules/blocks/block.inc::第429行附近的block_list()中。。我仍然需要找到一个更好的方法来做到这一点
- 10如果有人建议我如何确保在调用block_list之前设置$theme_key:)
- 创建这样的函数
<?php
function stg_allcontent2($allC, $level
= "1") {
global $language; $lang = $language->language;
foreach ($allC as $acKey => $ac) {
if($ac['link']['options']['langcode']
== $lang){ if ($level == "1")
$toR .= "";
if (is_array($ac['below']))
$class="expanded"; else
$class="leaf";
$toR .= "<li class=\"".$class."\">" . l($ac['link']['link_title'], $ac['link']['link_path']) . "</li>";
if ($level != "1") $toR .= ""; if (is_array($ac['below'])) $toR .= "<ul class=\"menu\">".stg_allcontent2($ac['below'], "2")."</ul>"; if ($level == "1") $toR .= ""; }
}
return $toR; } ?>
<?php echo '<ul class="menu">'; echo stg_allcontent2(menu_tree_all_data($menu_name
= 'menu-header', $item = NULL)); echo '</ul>'; ?>
像这样打电话
<?php
function stg_allcontent2($allC, $level
= "1") {
global $language; $lang = $language->language;
foreach ($allC as $acKey => $ac) {
if($ac['link']['options']['langcode']
== $lang){ if ($level == "1")
$toR .= "";
if (is_array($ac['below']))
$class="expanded"; else
$class="leaf";
$toR .= "<li class=\"".$class."\">" . l($ac['link']['link_title'], $ac['link']['link_path']) . "</li>";
if ($level != "1") $toR .= ""; if (is_array($ac['below'])) $toR .= "<ul class=\"menu\">".stg_allcontent2($ac['below'], "2")."</ul>"; if ($level == "1") $toR .= ""; }
}
return $toR; } ?>
<?php echo '<ul class="menu">'; echo stg_allcontent2(menu_tree_all_data($menu_name
= 'menu-header', $item = NULL)); echo '</ul>'; ?>
由于我使用了
$block = module_invoke('block', 'block_view', 'block_id');
print render($block['content']);
将块注入我的节点。但是,在Drupal参考中查找时,我发现了一条标题为“在Drupal 7中呈现块更好地使用块API”的注释,其中包含以下代码:
function block_render($module, $block_id) {
$block = block_load($module, $block_id);
$block_content = _block_render_blocks(array($block));
$build = _block_get_renderable_array($block_content);
$block_rendered = drupal_render($build);
return $block_rendered;
}
我只是将其取消功能以直接使用,如下所示:
$block = block_load('block', 'block_id');
$block_content = _block_render_blocks(array($block));
$build = _block_get_renderable_array($block_content);
print render($build);
对我来说,它就像一个符咒。但是请注意,此方法也会打印块标题,因此您可能希望在原始语言中将其设置为“无”。另外:是否有人知道是否可以将语言传递给模块\u invote。e、 g.:$block=module_invoke('block','block','view',22',en'),谢谢你。我已经经历了这些,并且似乎已经在字符串本地化方面取得了进展(至少在某种程度上——据我所知——当一个块使用Drupal UI放入一个区域时,它正在被翻译。问题是,即使字符串在理论上是本地化的,当我使用代码呈现块时(如上所述),该语言未应用于呈现的代码:(谢谢!适合我。
$block = block_load('block', 'block_id');
$block_content = _block_render_blocks(array($block));
$build = _block_get_renderable_array($block_content);
print render($build);