2010-11-02 248 views
3

我任务是国际化-ING我们当前的CMS设置在Drupal。 我面临的问题是使用module_invoke()将块放置在节点内。Drupal的module_invoke()和国际化

我已设法字符串翻译块,即工作时的块被放置在一个区域使用UI(块内容被成功地翻译)。

然而,当一个块被注入到一个节点像这样:

$block = module_invoke('block', 'block', 'view', 22); print $block['content']; 

它是没有得到翻译,或更糟的是,未显示在所有。

我已经采用t也尝试该变型中()。例如:

$block = module_invoke('block', 'block', 'view', 22); print t($block['content']); 

无济于事。

一般来说,我有一点麻烦与国际化的块。有没有人有推荐的方法来处理与Drupal中的块有关翻译它们?我宁愿不为每种语言创建不同的块。

+1

另外:没有人知道,如果语言可以传递给module_invote。例如为:$块= module_invoke( '块', '块', '观看',22个,成 'en') – toast38coza 2010-11-02 22:44:37

回答

2

所以..在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。

最后(这是我仍然需要找到一个很好的解决方案的一部分),我发现block_list()中:包括/块/ block.inc有一点问题的。

看来$ theme_key不能可靠地设置,除非block_list()被从theme()函数(在includes/themes.inc中)调用..这会导致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>";} 
模块/块/ block.inc :: block_list()围绕线429

..我还需要制定出一个更好的方式来做到这一点。

  • 10与建议任何人对我怎么能确保$ theme_key呼吁block_list :)
0

这可能会帮助您:http://drupal-translation.com/content/translating-block-contents#

更新:T()函数允许你在语言代码中使用过。

+0

由于patic。我已经通过,并* *似乎已经得到它与本地化字符串(至少在某种程度上是工作 - 据我可以告诉 - 当一个块被投进使用Drupal的UI它被翻译的区域。 的问题是,即使弦理论本地化,当我使用的代码(如上)渲染块,语言不被应用于渲染代码:( – toast38coza 2010-11-03 13:26:57

1

创建这样的函数

<?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>'; ?> 
3

我有完全一样的问题,因为你,因为我用的是

$block = module_invoke('block', 'block_view', 'block_id'); 
    print render($block['content']); 

将块注入我的节点。然而,在Drupal的参考仰视module_invoke,我发现了标题为“渲染块在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); 

对我而言,它就像一个魅力。但请注意,此方法也会打印块标题,因此您可能需要使用原始语言将其设置为“无”。

+0

这个工作对我的感谢! – dayuloli 2015-03-05 10:15:28

+0

谢谢!适用于我。 – Stillfinder 2016-06-06 10:35:49