用户的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搭建多语言网站的时候。