TLingC's Zone
TLingC's Zone
让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;
    }
赞赏
首页      开发      让ThinkPHP 6.0语言包支持多级分组

推荐文章

发表评论

textsms
account_circle
email

TLingC's Zone

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