Drupal模块_invoke()和i18n

Drupal模块_invoke()和i18n,drupal,internationalization,Drupal,Internationalization,我的任务是在Drupal中设置我们当前的CMS。 我面临的问题是使用module_invoke()在节点中放置块 我已经成功地对块进行了字符串转换,当一个块被放置在一个区域中(块内容被成功转换)时,这种转换就可以使用UI了 然而,当一个块被注入一个节点时,如下所示: $block = module_invoke('block', 'block', 'view', 22); print $block['content']; 它没有被翻译,甚至更糟的是,根本没有显示出来 我还使用t()尝试了这个变

我的任务是在Drupal中设置我们当前的CMS。 我面临的问题是使用module_invoke()在节点中放置块

我已经成功地对块进行了字符串转换,当一个块被放置在一个区域中(块内容被成功转换)时,这种转换就可以使用UI了

然而,当一个块被注入一个节点时,如下所示:

$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);