muratsplat / multilang
一个Laravel扩展包,使多语言内容的CRUD ORM过程变得简单。
Requires
- php: >=5.4.0
- illuminate/config: 4.2.*
- illuminate/database: 4.2.*
- illuminate/events: 4.2.*
- illuminate/support: 4.2.*
- illuminate/validation: 4.2.*
Requires (Dev)
- mockery/mockery: 0.9.*@dev
- orchestra/testbench: 2.2.*
- phpunit/phpunit: 4.8.*
- symfony/translation: 2.5.*
README
##Laravel 4.2的多语言包
一个Laravel扩展包,使多语言内容的CRUD ORM过程变得简单。
!!本项目的开发已停止!!
##要求
- PHP >=5.4 或 HHVM最新版
- Composer
- Laravel 4.2.x
##安装
将 muratsplat/multilang 添加到 composer.json 中的依赖项
"require" : { "muratsplat\multilang": "dev-master" },
使用 composer update 更新您的包,或使用 composer install 安装。
您也可以在终端中使用 composer require muratsplat/multilang 添加包。
此包仅支持使用Composer安装。
###配置
首先,您应该将包的服务提供者添加到您的Laravel应用中
'Muratsplat\Multilang\MultilangServiceProvider',
您还可以添加包的别名
'MultiLang' =>'Muratsplat\Multilang\Facades\MultiLang',
最后,通过如下命令安装包的配置
在项目的主目录中
php artisan config:publish muratsplat/multilang
现在,您可以通过编辑 ..app/config/packages/muratsplat/multilang/config.php 来更改包的配置
##使用示例
让我们想象一个简单的Laravel应用。我们想要拥有多语言页面。在这种情况下,常见的做法是首先创建两个模型。对于它们,让我们通过Laravel迁移来创建表。
看看这个
php artisan migrate:make create_pages_table
页面将是我们主要模型的表。表中应仅包含常用属性。迁移看起来像这样
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('pages', function(Blueprint $t) { $t->increments('id'); $t->boolean('enable')->default(0); // you can add more for your needs // but don't add columns for multi language $t->timestamp('created_at')->nullable(); $t->timestamp('updated_at')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('pages'); } }
第二步是创建用于仅多语言内容的其他表。
php artisan migrate:make create_pageLangs_table
让我们再次编辑创建的迁移。
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePageLangsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('pageLangs', function(Blueprint $t) { $t->increments('id'); $t->integer('page_id')->unsigned(); // it is required column. Column name can be changed // but you have to change the name in the package's configure file. // look at ..app/config/package/muratsplat/multilang/config.php $t->integer('__lang_id__')->unsigned(); $t->string('title', 200)->nullable(); $t->string('content', 1500)->nullable(); // you can add more.. $t->timestamps(); $t->foreign('page_id')->references('id')->on('pages'); // This reference is optional. If you want to language model // to manage app languages, the refrences is recommended. // Having a Language model make be easy to manage language $t->foreign('__lang_id__')->references('id')->on('languages'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('contents'); } }
拥有语言模型可能会有用。对于我创建的每个Web应用,我创建一个结构来管理语言。基本来说,您可以使用以下方式创建Language模型
use Illuminate\Database\Migrations\Migration; class languages extends Migration { public function up() { Schema::create('languages', function($t) { $t->increments('id'); $t->string('lang_code', 10); $t->string('name', 50); $t->string('name_native', 50); $t->tinyInteger('enable' )->default(0); $t->boolean('default')->default(false); $t->timestamps(); $t->index('lang_code'); $t->unique(array('lang_code', 'name')); }); } public function down() { Schema::drop('languages'); } }
如果您决定创建Language模型,请记住建立如下引用
// in pageLangs migration class $t->foreign('__lang_id__')->references('id')->on('languages');
您可以使用seeder类为语言模型创建默认数据
class DatabaseLanguagesSeeder extends Seeder { // reference : http://www.loc.gov/standards/iso639-2/php/code_list.php // reference : http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes public function run() { Language::create(array('name' => 'Turkish', 'name_native' => 'Türkçe', 'lang_code' => 'tr', 'enable' => 1 , 'default' => 1)); Language::create(array('name' => 'English', 'name_native' => 'English', 'lang_code' => 'en', 'enable' => 1)); Language::create(array('name' => 'German', 'name_native' => 'Deutsch', 'lang_code' => 'de', 'enable' => 1)); Language::create(array('name' => 'French', 'name_native' => 'Français', 'lang_code' => 'fr', 'enable' => 1)); Language::create(array('name' => 'Russian', 'name_native' => 'русский язык', 'lang_code' => 'ru', 'enable' => 1)); Language::create(array('name' => 'Arabic', 'name_native' => 'العربية', 'lang_code' => 'ar', 'enable' => 1)); } }
表已准备好。现在是创建模型的时候了。
在示例中,主要模型将是Page模型。主要模型必须实现'Muratsplat\Multilang\Interfaces\MainInterface'接口,并使用'Muratsplat\Multilang\Traits\MainTrait'特性。
页面模型
use Muratsplat\Multilang\Interfaces\MainInterface; use Muratsplat\Multilang\Traits\MainTrait; class Page extends \Eloquent implements MainInterface { use MainTrait; /** * The database table used by the model. * * @var string */ protected $table = 'pages'; protected $fillable = array('enable'); /** * Validation Rules * * @var array */ public $rules = array( 'enable' => 'required', ); /** * Defining inversed relation to Content * * @return PageLang */ public function PageLangs() { return $this->hasMany('PageLang', 'page_id', 'id'); } /** * to get Language Models. * use HasMany relationship to access language model * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function langModels() { return $this->PageLangs(); } }
对于pageLangs表,我们正在创建PageLang模型。PageLang必须实现'Muratsplat\Multilang\Interfaces\LangInterface'接口,并必须在其中使用'Muratsplat\Multilang\Traits\LangTrait'特性。如下所示
use Muratsplat\Multilang\Interfaces\LangInterface; use Muratsplat\Multilang\Traits\LangTrait; class PageLang extends \Eloquent implements LangInterface { use LangTrait; /** * The database table used by the model. * * @var string */ protected $table = 'pageLangs'; protected $fillable = array('content_id', 'lang_id', 'title', 'content'); /** * Validation Rules * * @var array */ public $rules = array( 'title' => 'max:100|RequiredForDefaultLang:@,1,Title', 'content' => 'max:15000|RequiredForDefaultLang:@,1,Content', ); /** * Defining inversed relation to Content * * @return PageLang */ public function Page() { return $this->belongsTo('Page', 'id', 'page_id'); } /** * to get Language Models. * use HasMany relationship to access language model * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function mainModel() { return $this->Page(); } }
多语言引入了新的规则。'RequiredForDefaultLang'规则验证默认语言ID的元素。如果默认语言是土耳其语,并且土耳其语元素为空,则验证失败。
'RequiredForDefaultLang'接受三个参数。第一个是选择元素的名称前缀,第二个参数是默认语言ID,最后一个参数是错误消息中的替换。
您可以通过编辑 '..app/lang/en/validation.php' 来添加规则的消息。
示例
"required_for_default_lang" => ":explain, is required for default language."
验证规则可以放在模型中。但这是可选的。您可以在控制器中添加规则。建议在模型中添加规则。这样做可以使控制器保持整洁。
动态表单示例
您可以在视图层创建如下表单。
//..page.blade.php {{Form::open(['action'=>['PageController@store']])}} {{Form::text('enable', 'Aktif')}} @foreach($langs as $v) {{Form::text("title@$v->id", 'Bir başlık giriniz..')}} {{Form::textarea("content@$v->id")}} @endforeach {{Form::close()}}
此表单将POST数据发送到控制器...
$rawPost = array(
"enable" => 1,
'title@1' => "Foo English",
'content@1' => "Simple example of content in English",
'title@2' => 'Foo Türkçe',
'content@2' => 'Türkçe bir içerik langur lungur bir yoğurt',
"title@3" => 'здравствуйте',
"content@3" => 'Путинхороший человек. Он любит русские , я думаю, россияне любят его.'
);
您可以在控制器中使用MultiLang。
$rules = ['enable' => 'required']; // if the rule is in models, it is overwrote on same rule in models. // So one of in model is updated by overwriting // Rules parameter is optional. // If you have been defined rules in Page model, rules parameter is not need. if(MultiLang::create($rawPost, new Page(), $rules)) { // it is in success } else { $instace = MultiLang::getInstance(); Redirect::route('panel.create')->withErrors($instace)->withInput(); }
让我们创建一个包装器来一次性访问两个模型
$wantedLangId = 3; $defaultLangId = 1; // if the value is null or empty, returns PageLang models by Language id $wrapper = MultiLang::makeWrapper(Page::find(1), $wantedLangId,$defaultLangId); echo $wrapper->title; // returns: "здравствуйте" echo $wrapper->content // returns: "Путинхороший человек. Он любит русские , я думаю, россияне любят его."
您可以使用如下方式强制显示所需的语言模型
$wrapper->wanted(2)->force()->title; // "Foo Türkçe" // 99 language id is not existed and so no record is on PageLang Model ! $wrapper->wanted(99)->force()->title; // null
##事件
您可以使用MultiLang事件设置所需的语言
private function setMultilangWrapperByEvent($lang_id = 1) { $events = App::make('events'); /* setting wanted lang by using event */ $events->listen('multilang.wrapper.creating',function(MultiLang $event) use($lang_id) { $event->getWrapperInstance()->setWantedLang($lang_id); }); }
##待办事项
- 部分缓存支持(无主模型)👍
- 支持PHP7
- 计划在数据库的一个表中存储所有语言属性👈
- 完整缓存支持
- 简洁清晰的文档
- 修复主要错误
- 发布L4和L5的稳定版本
##许可证
版权 (C) 2014 Murat ÖDÜNÇ GPLv3