michele-angioni / multi-language
一个用于处理多语言本地化的Laravel包。
Requires
- php: >=7.0.0
- laravel/framework: ~5.1
Requires (Dev)
- mockery/mockery: dev-master
- phpunit/phpunit: 5.7.*
README
介绍
Multi Language是一个Laravel 5.1+包,用于处理本地化。它作为Laravel本地化的包装器,简化了将默认语言文件翻译成新语言的过程。
在Laravel 5.1 - 5.3或PHP 5.6中存在兼容性或错误时,请使用版本0.3。
安装
Multi Language可以通过Composer安装,只需将"michele-angioni/multi-language": "~0.4"
添加到您的composer.json文件中,然后运行composer update
。
配置
在app.php配置文件的providers数组下添加以下服务提供者
MicheleAngioni\MultiLanguage\MultiLanguageServiceProvider:class, MicheleAngioni\MultiLanguage\MultiLanguageBindServiceProvider:class
Multi Language可以通过运行artisan命令php artisan vendor:publish
发布配置文件,从而进行高度定制。
它将在您的config目录中创建ma_multilanguage.php
文件。然后您可以在config目录中的config.php文件中编辑以定制Multi Language的行为
- allowed_languages:允许的语言数量。它可以用来防止创建新的支持语言
- allowed_nested_arrays:在lang文件中允许的最大嵌套数组数量
- language_files_path:语言文件的路径
- max_text_length:语言键允许的最大文本长度
- safe_mode:启用/禁用安全模式。如果启用安全模式,则只能创建与默认区域设置文件同名的文件。此外,只能将默认区域设置中已存在的键添加到新语言中。
使用方法
MicheleAngioni\MultiLanguage\LanguageManager
类是访问所有Multi Language功能的类。默认情况下,它将使用Laravel文件系统管理器和Laravel本地化功能。
您可以在您的一个类的构造函数中注入它,或者直接使用Laravel应用外观App::make('MicheleAngioni\MultiLanguage\LanguageManager')
并使用其方法
- getLanguagesPath():获取当前语言文件的路径
- setLanguagesPath($path):设置语言文件的路径
- setMaxTextLength($value):动态设置允许的最大文本长度
- getDefaultLocale():获取默认区域设置语言。当在选定语言中找不到语言键时将使用它
- getLocale():获取当前使用的区域设置语言
- setLocale($locale):设置当前使用的区域设置语言
- setSafeMode($bool):动态更改安全模式设置
- getAvailableLanguages():获取可用语言的列表,即lang目录下的目录语言
- getLanguageFiles($useDefaultLocale = false):获取输入语言的文件列表
- getLanguageFile($fileName, $useDefaultLocale = false):返回输入文件(不带扩展名)中包含的所有键
- getLanguageFileKey($fileName, $key):返回在指定区域设置输入文件(不带扩展名)中输入键的值
- createNewLanguage($newLocale) : 在languages目录下为输入的locale创建一个新目录
- writeLanguageFile($fileName, array $inputs) : 将输入数组写入到/lang/locale目录下的php文件中,输入文件名为参数
- buildArray(array $inputs) : 将使用点符号表示的数组转换为将要写入文件的最终数组
- convertArrayToDotNotation(array $array) : 将包含嵌套数组的数组转换为点符号表示的数组
(可选) 自定义文件系统和翻译器
默认情况下,语言管理器使用Laravel文件系统管理器和Laravel本地化功能。您可以通过定义自己的文件系统(必须实现MicheleAngioni\MultiLanguage\FileSystemInterface
)和翻译器(必须实现MicheleAngioni\MultiLanguage\TranslatorInterface
)来覆盖它。这两个新文件可以通过在app.php配置文件中注释掉'${MicheleAngioni\\MultiLanguage\\LanguageManagerBindServiceProvider}'行,并在新的服务提供者中定义自定义绑定来注入到语言管理器构造函数中。
示例
假设我们在app/lang/en目录下有一个users.php
文件
/app ├--/controllers ├--/lang | └--/en | └--users.php
其中包含
<?php return array( "password" => "Passwords must be at least six characters and match the confirmation.", "user" => "We can't find a user with that e-mail address.", "token" => "This password reset token is invalid.", "sent" => "Password reminder sent!", );
假设我们想要创建一个西班牙语的版本。我们可以创建一个处理语言管理的控制器
<?php use MicheleAngioni\MultiLanguage\LanguageManager; class LanguagesController extends \BaseController { private $languageManager; function __construct(LanguageManager $languageManager) { $this->languageManager = $languageManager; } }
并写下一些处理请求的方法。
public function index() { $languages = $this->languageManager->getAvailableLanguages(); // ['en'] return View::make('languages')->with('languages', $languages) }
上面的$languages变量将只是一个包含单个值的数组['en']
,因为我们只在/lang目录下的/en文件夹中。
我们现在需要一个英语文件的列表
public function showFiles() { $files = $this->languageManager->getLanguageFiles(); // ['users'] return View::make('languagesFiles')->with('files', $files) }
showFiles()方法将只返回['users']
,因为我们只有一个文件在我们的/lang/en文件夹中。
让我们看一下文件的内容
// $fileName = 'users'; public function showFile($fileName) { $file = $this->languageManager->getLanguageFile($fileName) return View::make('languagesFile')->with('file', $file) }
上述方法返回一个包含文件内容的数组。
现在让我们创建一个西班牙语的版本。首先,我们必须在/lang目录下创建/es
文件夹
public function createNewLanguage() { // [...] Input validation $this->languageManager->createNewLanguage($input['locale']); return Redirect::route('[...]')->with('ok', 'New language successfully created.'); }
然后,显然我们需要一个视图来提交西班牙语句子,这留给你。必须从视图发送一个具有key => sentence
结构的关联数组到以下方法
public function saveFile($locale, $fileName) { // [...] Input validation $this->languageManager->setLocale($languageCode); $this->languageManager->writeLanguageFile($fileName, $input['all']); return Redirect::route('[...]')->with('ok', 'Lang file successfully saved.'); }
贡献指南
支持遵循PSR-1、PSR-2和PSR-4 PHP编码标准和语义版本。
请将您在问题页面中发现的任何问题报告。欢迎提交拉取请求。
许可证
支持是免费软件,根据MIT许可证条款分发。
联系方式
请随时与我联系。