You are here

Drupal8多语言问题 语言名字的修改

用户的Drupal8多语言网站,里面的多语言切换的区块,英文总是显示“English(英文)”,想把它给改掉,但是不行。

这个区块由language模块提供,我们检查了这个模块的源代码,写的比较抽象:

  public function build() {

    $build = [];

    $route_name = $this->pathMatcher->isFrontPage() ? '<front>' : '<current>';

    $type = $this->getDerivativeId();

    $links = $this->languageManager->getLanguageSwitchLinks($type, Url::fromRoute($route_name));


    if (isset($links->links)) {

      $build = [

        '#theme' => 'links__language_block',

        '#links' => $links->links,

        '#attributes' => [

          'class' => [

            "language-switcher-{$links->method_id}",

          ],

        ],

        '#set_active_class' => TRUE,

      ];

    }

    return $build;

  }

  

  检查getLanguageSwitchLinks,这个函数的调用,我们看到是

  LanguageManagerInterface接口。

  我们找到核心的 LanguageManager里面的这个方法为空。

  

  这里Drupal用的是依赖注入,具体的实例,需要进一步的查找,我们这里用到的是LanguageNegotiationUrl.php里面提供的方法:

   public function getLanguageSwitchLinks(Request $request, $type, Url $url) {

    $links = [];

    $query = $request->query->all();


    foreach ($this->languageManager->getNativeLanguages() as $language) {

      $links[$language->getId()] = [

        // We need to clone the $url object to avoid using the same one for all

        // links. When the links are rendered, options are set on the $url

        // object, so if we use the same one, they would be set for all links.

        'url' => clone $url,

        'title' => $language->getName(),

        'language' => $language,

        'attributes' => ['class' => ['language-link']],

        'query' => $query,

      ];

    }


    return $links;

  }


在foreach循环里面,添加一段代码, 

\Drupal::logger('language')->notice('name:' . $language->getName()); 


我们在这里检查一下,这个时候,语言的名字是什么。如果这个时候,已经被修改了,应该是模块或者其他原因;

如果这里没有修改,那么基本可以确定是在Drupal的主题层,修改的语言的名字。


注意,Drupal8下面,修改源代码时,千万不要在当前目录下面备份代码。特别是这样的备份:

LanguageNegotiationUrl.bak.php

直接导致白屏。


LanguageNegotiationUrl.phpbak应该是可以接受的,也不建议。直接备份到本地即可。



通过日志检查的结果是,在这个地方,语言的名字已经被修改了。


应该不是主题层的问题。检查语言名字的配置界面,发现Drupal8下面,语言的配置,采用的是配置实体。我突然想到了,Drupal8多语言的一个bug,默认语言变更引起的bug。

在数据库的config表里面,搜索language,发现有两个相同的记录:

language.entity.en

其中一个是遗留的记录,删除那个即可。

这是由于默认语言,在Drupal8安装好了以后,切换了默认语言导致的。


不建议切换默认语言,特别是用Drupal8搭建多语言网站的时候。


论坛:

Drupal版本: