DevsDawn
DevsDawn

让ThinkPHP 6.0语言包支持多级分组

最近在做一个多语言网站项目,需要给一个多级导航栏编写语言包。虽然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;
}
若无特别说明,本文采用 CC BY-SA 4.0 协议进行许可。如需转载,请附上本文链接和本声明。
本文链接:https://devsdawn.com/2020/02/thinkphp-6-0-language-pack-multi-level-support/
DigitalOcean云服务,美国上市公司,注册即送200USD体验金
Vultr云服务,全球25+地域,注册即送100USD体验金

发表回复

textsms
account_circle
email

DevsDawn

让ThinkPHP 6.0语言包支持多级分组
最近在做一个多语言网站项目,需要给一个多级导航栏编写语言包。虽然ThinkPHP 6.0多语言功能引入了语言分组,但其分组最深只能支持两层,在如我的这种情况下无法满足需要。 可通过修改框…
扫描二维码继续阅读
2020-02-05