最近在做一个多语言网站项目,需要给一个多级导航栏编写语言包。虽然ThinkPHP 6.0多语言功能引入了语言分组,但其分组最深只能支持两层,在如我的这种情况下无法满足需要。
可通过修改框架src/think/Lang.php
来实现多层级的支持。
在src/think/Lang.php
中,替换对应方法:
public function has(string $name, string $range = ''): bool
{
$range = $range ?: $this->range;
if ($this->config['allow_group'] && strpos($name, '.')) {
$names = explode('.', $name);
$i = 0;
$temp = $this->lang[$range];
foreach ($names as $key) {
if(!isset($temp[strtolower($key)])) return false;
$temp = $temp[strtolower($key)];
$i++;
}
return is_string($temp);
}
return isset($this->lang[$range][strtolower($name)]);
}
public function get(string $name = null, array $vars = [], string $range = '')
{
$range = $range ?: $this->range;
// 空参数返回所有定义
if (is_null($name)) {
return $this->lang[$range] ?? [];
}
if ($this->config['allow_group'] && strpos($name, '.')) {
$names = explode('.', $name);
$i = 0;
$temp = $this->lang[$range];
foreach ($names as $key) {
if(!isset($temp[strtolower($key)])) {
$temp = $name;
break;
}
$temp = $temp[strtolower($key)];
if($i > sizeof($names)) break;
$i++;
}
$value = is_string($temp) ? $temp : $name;
} else {
$value = $this->lang[$range][strtolower($name)] ?? $name;
}
// 变量解析
if (!empty($vars) && is_array($vars)) {
/**
* Notes:
* 为了检测的方便,数字索引的判断仅仅是参数数组的第一个元素的key为数字0
* 数字索引采用的是系统的 sprintf 函数替换,用法请参考 sprintf 函数
*/
if (key($vars) === 0) {
// 数字索引解析
array_unshift($vars, $value);
$value = call_user_func_array('sprintf', $vars);
} else {
// 关联索引解析
$replace = array_keys($vars);
foreach ($replace as &$v) {
$v = "{:{$v}}";
}
$value = str_replace($replace, $vars, $value);
}
}
return $value;
}
发表回复