muratsplat/multilang

一个Laravel扩展包,使多语言内容的CRUD ORM过程变得简单。

v0.0.13 2016-02-20 14:02 UTC

This package is not auto-updated.

Last update: 2024-09-25 15:04:31 UTC


README

##Laravel 4.2的多语言包

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

一个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