php:用数组实现多语言(PHP 7.4.2)

发布时间 2023-03-25 11:06:40作者: 刘宏缔的架构森林

一,适用的场景:

      旧系统需要增加多语言,不想改变原有的运行环境,
      所以没有使用gettext,选择简单的用数组来实现

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

         对应的源码可以访问这里获取: https://github.com/liuhongdi/
         或: https://gitee.com/liuhongdi

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,php代码:

1,定义一个功能类

<?php

/*

   简单实现i18n功能的类,
   可适用于旧网站的改造

*/
class locale {

//日文
var $arr_ja = [
    "top"=>[
    "magazine"=>"雑誌管理",
    "source"=>"素材管理",
    "user"=>"ユーザー管理",
    "system"=>"システム管理",
  ],];

//英文
var $arr_en = [
    "top"=>[
    "magazine"=>"magazine",
    "source"=>"source",
    "user"=>"user",
    "system"=>"system",
  ],];

//简中
var $arr_zh = [
    "top"=>[
    "magazine"=>"杂志管理",
    "source"=>"资源管理",
    "user"=>"用户管理",
    "system"=>"系统管理",
  ],];

//语言数组
var $arr_lang = [
    "zh","en","ja"
    ];

    /*
        得到当前要显示的语言名字,
        先判断是否已保存在cookie
        如果cookie中不存在,
        则取浏览器的语言
        如果都没有,则选择中文
    */
    public function getLocale(){
         $default = "zh";
         //判断有无cookie
         if (isset($_COOKIE['locale'])) {
            if (in_array($_COOKIE['locale'], $this->arr_lang)){
                 return $_COOKIE['locale'];
            } else {
                 //无cookie取浏览器的语言
                 $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
                 if (in_array($lang, $this->arr_lang)){
                    return $lang;
                 } else {
                    return $default;
                 }
            }
         } else {
                //无cookie取浏览器的语言
              $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
              if (in_array($lang, $this->arr_lang)){
                    return $lang;
                 } else {
                    return $default;
              }
         }

    }

    /*
        得到语言的数据
    */
    public function getLanguage($lang){
        if ($lang == 'zh') {
            return $this->arr_zh;
        } else if ($lang == 'en') {
            return $this->arr_en;
        } else if ($lang == 'ja') {
            return $this->arr_ja;
        } else {
            return $this->arr_zh;
        }
    }
}
?>

2,在通用的controller当中调用locale类

$localeObj = new locale();
$lang = $localeObj->getLocale();
$arr = $localeObj->getLanguage($lang);
$smarty->assign("lang", $arr);

3,smarty模板中调用:

<ul class="nav" id="mobile-nav">
                        <li class="dropdown">
                            <a id="linkMaga" href="/v/index/"><i id="iconMaga" class="icon-file icon-white"></i> {$lang.top.magazine} </a>
                        </li>

                        <li class="dropdown">
                            <a id="linkSource" href="/v/imagecenter/"><i id="iconSource" class="icon-th icon-white"></i> {$lang.top.source} </a>
                        </li>


                        <li class="dropdown">
                            <a  id="iconUser" href="/v/usercenter/"><i id="iconUser" class="icon-book icon-white"></i> {$lang.top.user} </a>
                        </li>


                    <li class="dropdown">
                        <a id="linkSystem" href="/v/syscenter/"><i id="iconSystem" class="icon-th icon-white"></i> {$lang.top.system} </a>
                    </li>
                </ul>

三,测试效果:

日文

 

 英文

四,查看php的版本:

[lhdop@blog ~]$ /usr/local/soft/php7/bin/php --version
PHP 7.4.2 (cli) (built: Apr 20 2022 16:49:58) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies