【问题标题】:Drupal - different images for different languagesDrupal - 不同语言的不同图像
【发布时间】:2010-09-03 14:10:43
【问题描述】:

我必须“i18n”现有的 drupal 安装并添加第二语言。

我在主页上有一张图片,在 CSS 文件中定义为“背景图片”。

图像包含文本,因此我需要根据 URL 显示不同的图像:

http://example.com/en/

http://example.com/es/

如何根据用户语言(基于 URL)在主页上显示不同的图像?

我对 Drupal 还很陌生,所以请不要以为我什么都知道!!!

更新:我希望我可以将特定图像定义为“EN”并添加一个“ES”替代方案,该图像有一个 URL(可以在模板或 css 等中使用) ),但根据用户语言,Drupal 会提供特定于语言的版本。这将是理想的。

update2:或者也许另一种方法是可能的 - 创建一个仅包含图像的新“内容类型”,以便:http://example.com/node/23 返回纯图像二进制文件 (image/jpeg) - 然后这个节点可以像其他节点一样被国际化/翻译。我真的很难找到 i18n 图像的“Drupal”方式......

update3:Drupal 是否将用户语言存储在会话中?如果是这样,我可以编写自己的脚本,阅读会话语言并提供特定语言的图像,对吗?并完全避免 Drupal(例如:http://example.com/i18n-image.php?img=logo - 丑陋,但你明白了),如果是这样,Drupal 如何存储会话用户语言?

【问题讨论】:

    标签: css image drupal localization internationalization


    【解决方案1】:

    您可以使用国际化模块:http://drupal.org/project/i18n

    并使用函数“i18n_get_lang()”获取当前语言。

    根据语言命名文件:

    image_LANGUAGE.jpg
    image_fr.jpg
    image_es.jpg
    

    要嵌入图像:

    <img src="<?php echo base_path().path_to_theme().'/images/'; ?>image_<?php echo i18n_get_lang(); ?>.jpg" />
    

    编辑:

    为 CSS 文件实现类似的东西:

    您可以根据语言创建各种 CSS 文件:

    styles.css
    styles_fr.css
    styles_es.css
    

    在主文件 (styles.css) 中,您可以放置​​与特定语言无关的所有 CSS。 您可以将与特定语言相关的 CSS 放入其他文件中。

    styles_fr.css:

    div.item1 { background: url('../images/item1_fr.jpg'); }
    

    styles_es.css:

    div.item1 { background: url('../images/item1_es.jpg'); }
    

    然后在 template.php 文件中为页面创建一个 preprocess 函数,该函数将包含基于当前语言的特定 CSS 样式表:

    function YOURTHEME_preprocess_page(&$vars, $hook){
      drupal_add_css(path_to_theme().'/css/styles.css');
      drupal_add_css(path_to_theme().'/css/styles_'.i18n_get_lang().'.css');
    }
    

    或者你可以直接在模板文件中使用drupal_add_css()。

    【讨论】:

    • +1 这听起来很像最简单的解决方案。
    • 太棒了!这还差不多!另外,我怎样才能在css文件中实现类似的东西?我是 Drupal 的新手,也许资源图像(上传的图像等)和站点图像(图标和背景)之间存在区别 - 有没有 i18n 图标的方法?如果是这样,我可以使用这种机制吗?还有一种方法可以在 drupal 中使用“动态”css(例如:styles.css.php),以便我可以包含用于切换 css 背景图像等的 i18n_get_lang() 函数? (感谢您的回答,我们越来越近了!!!
    • 我用 CSS 文件的实现更新了我的答案。
    【解决方案2】:

    我会选择 hook_preprocess_page。例如,根据语言切换样式表可能是个好主意:

    function foobar_hook_preprocess_page(&$variables, $hook) {
      global $language;
      if($language != 'en') {
        $sheets = array();
        foreach($variables['css']['all']['theme'] as $stylesheet => $value) {
          if (strstr($stylesheet, path_to_theme())) {
            $stylesheet = str_replace('.css', '-'. $language->language .'.css', $stylesheet);
          }
          $sheets[$stylesheet] = $value;
        }
        $vars['css']['all']['theme'] = $sheets;
        $vars['styles'] = drupal_get_css($vars['css']);
      }
    }
    

    如需进一步解释,请参阅此博文:http://becircle.com/language_based_stylesheet_switching_your_theme

    【讨论】:

    • 谢谢,但我不想更改样式表——我不想为每种语言维护两个(三个、四个或 n 个)版本的样式表。 Drupal 是否有一种简单的方法可以加载特定语言的徽标/图像?这肯定是任何多语言网站都应该具备的基本功能类型吗?另外,我完全不知道我会将代码放在哪里 - 在节点内?在我自己的 php 脚本中? (感谢回复)
    • 您可以使用此代码添加一个依赖于语言的样式表,如下所示: function foobar_hook_preprocess_page(&$variables, $hook) { global $language; $variables['css']['all']['theme'][] = path_to_theme() 。 '/语言-' 。 $语言->语言。 '.css'; }
    【解决方案3】:

    只是为了扩展您对 Drupal 7 的回答:有一个全局变量 $language,它提供了一个标准类,其中包含有关当前语言的许多信息,包括带有语言短代码的 $language-&gt;language

    modules/locale/locale.admin.inc中定义。

    所以打电话

    <?php
    global $language;
    print 'images/'.$language->language.'/image.png';
    ?>
    

    在您的主题中并捕获所有“$language->language is undefined”错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2018-06-05
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多