php 有没有办法在CodeIgniter 4中获得所有语言行?

p8h8hvxi  于 2022-12-17  发布在  PHP
关注(0)|答案(2)|浏览(127)

在CodeIgniter 3中,能够将所有语言行作为数组获取:

$this->lang->language

这对视图非常有用--不需要列出所有必需的语言字段,只需添加所有字段(从加载的语言文件中)。
在CodeIgniter 4中可以做到这一点吗?

deyfvvtc

deyfvvtc1#

这是我的解决方案。
创建App\Libraries类并扩展语言。

应用程序\库\i18n.php

<?php 

namespace App\Libraries;

use CodeIgniter\Language\Language;

class I18n extends Language {

    public function GetAllLanguage($with_class = false) {
        $result = array();
        $lang_arr = $this->language[$this->locale];
        
        if ($with_class == true) {
            return $lang_arr;
        }

        foreach ($lang_arr as $key => $value) {
            $result += $lang_arr[$key];
        }

        return $result;
    }
}

您可以在这个Libraries类中添加方法或其他东西。
然后将此代码添加到app\Config\Services.php

<?php

namespace Config;

use CodeIgniter\Config\BaseService;
use Config\Services as AppServices;
use Locale;

class Services extends BaseService
{
    //override Language
    //source code from system\Config\Services.php
    public static function Language($locale = null, $getShared = true) {
        if ($getShared) {
            return static::getSharedInstance('language', $locale)->setLocale($locale);
        }

        if (AppServices::request() instanceof IncomingRequest) {
            $requestLocale = AppServices::request()->getLocale();
        } else {
            $requestLocale = Locale::getDefault();
        }

        // Use '?:' for empty string check
        $locale = $locale ?: $requestLocale;

        return new \App\Libraries\I18n($locale); //override use Libraries
    }
}

然后您可以在控制器中使用。
当我有两个语言文件时。(语言\中文\菜单. php,语言\中文\文本. php)

$lang = \Config\Services::Language();
$lang->GetAllLanguage();
/**
array(157) {
 ["Login"] => "登入",
 ["BaseData"] => "基本資料",
 ...
 ["refresh"] => "刷新",
 ["AccountInfo"] => "使用者資訊",
 ["system_msg"] => "系統訊息",
 ...
 }
**/

$lang = \Config\Services::Language();
$lang->GetAllLanguage(true);
/**
array(2) {
  ["Menu"]=>
      array(26) {
        ["Login"] => "登入",
        ["BaseData"] => "基本資料"
        ...
      },
  ["Text"]=>
      array(131) {
        ["refresh"] => "刷新",
        ["AccountInfo"] => "使用者資訊",
        ["system_msg"] => "系統訊息",
        ...
      }
 }
**/

它起作用了。

xkrw2x1b

xkrw2x1b2#

可以,在CodeIgniter 4中可以将所有语言行作为数组获取。为此,可以使用Language类的language()方法,该方法返回指定语言的所有语言行的数组。
下面是如何使用language()方法的示例:

$languageLines = \Config\Services::language()->language;

这将返回default_locale配置选项中指定的缺省语言的所有语言行的数组。
如果要获取特定语言的语言行,可以将语言代码作为参数传递给language()方法:

$languageLines = \Config\Services::language()->language('fr');

这将返回法语的所有语言行的数组。
然后,可以在视图中使用此语言行数组来显示本地化字符串。例如:

echo $languageLines['welcome_message'];

在codeigniter 4中,实际上不需要这样做,因为您不需要加载语言文件来在视图中使用它们。
基本上,您可以在视图中执行此操作:

<?php echo lang('App.menu'); ?>

这将访问应用程序文件和语言行菜单。所以你可以有数百个语言文件,当你使用它们时,这些文件将根据需要用语言助手以正确的语言加载。
你只需要确保你使用的是正确的语言。这可以通过几种不同的方式来设置,你可以通过浏览器语言进入你的App/Config/App.php进行以下设置:

/**
 * --------------------------------------------------------------------------
 * Negotiate Locale
 * --------------------------------------------------------------------------
 *
 * If true, the current Request object will automatically determine the
 * language to use based on the value of the Accept-Language header.
 *
 * If false, no automatic detection will be performed.
 *
 * @var bool
 */
public $negotiateLocale = true;

您可以通过将当前语言存储在会话中,然后使用以下命令进行设置,从而对会话执行此操作:

service('request')->setLocale('YOUR NEW LOCALE HERE');

另一个选项(最好的一个)是在你的url中设置语言环境,并加载你所有的语言数据。

相关问题