mekaeil/laravel-translation

此包已被废弃,不再维护。作者建议使用mcamara/laravel-localization包。

此包用于Laravel框架的多语言网站。

1.9 2019-02-20 18:23 UTC

This package is auto-updated.

Last update: 2020-01-18 20:35:55 UTC


README

Latest Version Build Admin Panel Template

此包用于Laravel框架的多语言网站。

安装

[步骤:1]

composer require mekaeil/laravel-translation

发布供应商 [步骤:2]

运行以下命令后,将发布这些文件

  • 管理面板的资源文件
  • 管理面板的资产文件(位于public路径)
  • 配置文件(config > laravel-translation.php)
  • 路由文件(routes > route.laratrans.php)
  • 翻译助手(app > LaraTransHelper)
php artisan vendor:publish 

迁移 [步骤:3]

在迁移之前,你应该查看配置文件。

  • 定义你的用户表、用户模型和用户ID
  • 如果你想更改翻译的表名,你可以更改它。
  • 添加或编辑中间件路由。

在用户模型中添加lang_id到可填充列中是很重要的。

config > laravel-translation.php

之后,你可以进行迁移。

php artisan migrate

添加Provider:config > app.php

\Mekaeil\LaravelTranslation\LaravelTranslationProvider::class,

在Kernel文件中添加中间件

use Mekaeil\LaravelTranslation\Http\Middleware\SetRouteBaseLocale;
use Mekaeil\LaravelTranslation\Http\Middleware\UserLocale;

-----

UserLocale::class,
SetRouteBaseLocale::class,
    

添加此路由
在此路由中,将重定向到基本语言环境。

Route::get('{uri?}', [
    'uses'      => 'PublicTransController@changeLocale',
])->where('uri', '.*');

在你的路径控制器中创建PublicTransController,并添加此设置重定向的功能。

    public function changeLocale(Request $request)
    {
        $locale = \Cookie::get('language') ?? app()->getLocale();
        $getURL = Translation::getUrlBaseLocale($locale);

        if (! \Request::is($getURL))
        {
            $newUrl = str_replace('/'.$locale,'',$getURL);
            return redirect()->to($newUrl);
        }

        return Translation::uri($getURL,$locale,'redirect');
    }

SEEDS [步骤:4]

....待续....

主要URL/路由

* http://your-domain.com/admin/translation/languages    (Route: admin.trans.lang.index)
* http://your-domain.com/admin/translation/base/list    (Route: admin.trans.base.index)
* http://your-domain.com/admin/translation/modules/list (Route: admin.trans.module.index)    
* http://your-domain.com/admin/translation/assets/list  (Route: admin.trans.assets.index)    

用法

:)

Blade

你可以在Blade中使用它

translation($text,$lang,$where)
_trans($text,$lang,$where)
  • $lang和$where是可选的。(默认根据项目的基本语言环境设置$lan)
  • $where可以是'file'或'db'之一(默认是'file')

使用英语语言中的键从数据库中获取翻译

translation('welcome','en','db')
_trans('welcome','en','db')

在'file'语言中搜索'welcome'键。

translation('welcome')
_trans('welcome')

在数据库中搜索'welcome'并显示它,如果找不到,则调用此方法 translation('welcome')

translation('welcome',null,'db')
_trans('welcome',null,'db')

如果你在翻译值中有HTML标签,当将其插入数据库时,你应该使用 {!! !!} 如此

{!! translation('welcome','en','db') !!}
{!! _trans('welcome','en','db') !!}


{{ getUserLocale() }}

语言区域和方向保存在cookie或会话中,但如果你想使用getUserLocale,你可以在Blade中使用此方法。

  • 第一个参数:$user [如果你想获取用户区域]
  • 第二个参数:[lang, dir] 如果你没有设置任何内容,则返回以json格式返回的语言数据。
{{ getUserLocale(null,'lang') }} // output : en

获取方向

{{ getUserLocale(null,'dir') }} // output : ltr

获取用户区域

{{ getUserLocale(\Auth::user()) }}
/// output:
{
    "id": 1,
    "name": "en",
    "display_name": "English",
    "status": 1,
    "default": 0,
    "created_at": "2019-01-03 08:40:32",
    "updated_at": "2019-01-17 11:00:50",
    "direction": "ltr"
}

还有另一种获取用户区域的方法

{{ getUserLocale() }}

/// output :
{
    "id": 1,
    "name": "en",
    "display_name": "English",
    "status": 1,
    "default": 0,
    "created_at": "2019-01-03 08:40:32",
    "updated_at": "2019-01-17 11:00:50",
    "direction": "ltr"
}

重要

如果你想使用 getUserLocale(),不要传递任何参数,因为如果用户登录他的账户,则返回用户的语言,否则返回项目中的默认语言。

AJAX切换语言/更改区域

[1]:在控制器中通过此数据传递给视图

$langs      = Translation::allLangs(true,true); // get data with pluck
 
return view('home', compact('langs'));

[2]:创建选择框

<select class="switchLang">
    @foreach($langs as $key => $value)
        <option value="{{ $key }}" {{ $key == \Cookie::get('language') ? 'selected' : '' }} >{{ $value }}</option>
    @endforeach
</select>
 
//////// OUTPUT :
 
<select class="switchLang">
    <option value="en" selected="selected">English</option> 
    <option value="fa">فارسی</option>
    <option value="ku">کوردی</option>
</select>

设置jQuery中的AJAX

<script>
    $(document).ready(function () {


            // ON CHANGE SELECT
            $('select.switchLang').on('change', function () {

                var languageID  = $(this).find(":selected").val();
                var route       = "{{ route(config('laravel-translation.switch_language')) }}";
                var userID      = "{{ \Auth::user() ? \Auth::user()->id : null }}";


                $.ajaxSetup({
                    headers: {
                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                    }
                });

                var formData = new FormData();
                formData.append('lang', languageID);
                formData.append('userID', userID);

                $.ajax({
                    url           : route,
                    type          : 'POST',
                    data          : formData,
                    contentType   : false,
                    processData   : false,

                    success: function(data)
                    {
                        // console.log(data.url);
                        console.log('Language changed successfully!');
                        // location.reload();
                        window.location.replace(data.url)
                    },
                    error: function () {
                        console.log('Error Response!!!');
                    }
                });

            });
            
            

    });
</script>

另一种样式[按钮点击]

<div class="lang-switch lang-button" style="top: -195px;">
    @foreach($langs as $key => $value)
        <span class="{{ $key == \Cookie::get('language') ? 'active' : '' }}" data-key="{{ $key }}">{{ $value }}</span>
    @endforeach
</div>

Ajax

    // CLICK BUTTON
    $('.lang-switch > span').on('click', function ()
    {
        if($(this).hasClass("active")){
            return false;
        }

        var languageID  = $(this).data('key');
        var route       = "{{ route(config('laravel-translation.switch_language')) }}";
        var userID      = "{{ \Auth::user() ? \Auth::user()->id : null }}";

        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });


        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        var formData = new FormData();
        formData.append('lang', languageID);
        formData.append('userID', userID);

        $.ajax({
            url           : route,
            type          : 'POST',
            data          : formData,
            contentType   : false,
            processData   : false,

            success: function(data)
            {
                console.log(data.url);
                console.log('Language changed successfully!');
                window.location.replace(data.url)
            },
            error: function () {
                console.log('Error Response!!!');
            }

        });

    });

在Blade主题中创建自己的辅助函数

您可以在blade主题中定义自己的辅助函数来翻译单词。在文件顶部使用此方法

use Mekaeil\LaravelTranslation\Repository\Facade\Translation;

将此函数添加到您的 helper 文件中。

if (!function_exists('YOUR_FUNCTION_NAME'))
{

    /**
     * @param $word
     * @param null $lang
     * @param string $where
     * @return mixed
     */
    function YOUR_FUNCTION_NAME($word, $lang=null, $where='file')
    {
        return Translation::translation($word,$lang,$where);
    }

}


控制器

首先您应该在您的控制器中使用 TransHelper

use Mekaeil\LaravelTranslation\Repository\Facade\Translation;

语言

获取所有语言的基础集合

Translation::allLangs();

获取活动语言的基础集合

Translation::allLangs(true);

获取活动语言的基础PLUCK数据

Translation::allLangs(true,true);

获取项目中的默认语言。

Translation::defaultLang();

获取用户默认语言,如果用户在自账户中选择了语言,否则返回系统中的默认语言。

$user = Auth::user();
return Translation::defaultLang($user->id);

基础翻译单词

获取数据库中的所有单词

Translation::baseWords();

获取英语单词(分页:15)

Translation::baseWords(null ,'en' , 15);

获取波斯语的欢迎词

Translation::baseWords('welcome' ,'fa');

获取当前本地化下的欢迎词

Translation::baseWords('welcome');

设置用户语言

  • $userID : 用户ID(int)
  • $langID : 语言ID(int)(默认:null)
  • $langWith : cookie或session,(string)(默认:cookie)
Translation::setUserLocale($userID, $langID, $langWith)

将ID为27的用户语言设置为之前用户选择的语言!

Translation::setUserLocale(27)

将ID为27的用户语言设置为ID为3的语言

Translation::setUserLocale(27,3)

将ID为27的用户语言设置为ID为3的语言,并使用session进行用户设置

Translation::setUserLocale(27,3,'session')

清除缓存

在设置任何配置文件之前,这是非常重要的。在laravel-translation配置文件中,您可以在CookieSession上设置在浏览器中保存用户数据的方式。

在会话中清除缓存项

Translation::clearCache('language','session');

在会话中清除缓存数组

Translation::clearCache(['language','direction'],'session');

如果您设置了存储保存数据,则不需要传递第二个参数。

清除缓存项

Translation::clearCache('language');

清除缓存数组

Translation::clearCache(['language','direction']);

清除用户浏览器中存在的所有SESSION

Translation::clearCache('all','session');

资源

获取资源函数

  • $where : 默认=前端[前端,后端]
  • $type : 默认=null [link_style,styleـcustom,link_script,scriptـcustom]
  • $lang : 默认=null,使用默认区域设置 [en,fa]
Translation::getAssets($where, $type, $lang)

获取为前端添加的所有资源

Translation::getAssets($where='front-end')
获取在cookie中定义的资源

获取并保存blade中为语言定义的样式

    @php
        setAssets();
        $asset =\Cookie::get('assets');
        $asset =json_decode($asset);
    @endphp

    @if($asset)
        ///// create style and script tags
        {!! $asset->link_style ?? '' !!}
        {!! $asset->link_script ?? '' !!}
    @endif

或在主blade文件中添加自定义样式。

@if( \Cookie::get('direction') == 'rtl' )
    <link rel="stylesheet" href="{{ asset('css/rtl.css') }}">
@endif

重要

在setAssets()方法中,首先搜索包含资产键的cookie,如果找到它,我们不需要执行查询,但如果您想更新和更改cookie,请传递包含TRUE的第二个参数。

setAssets('front-end',true);

当用户想要更改其语言时,此cookie将更新。

覆盖 trans() 方法

如果您在blade中使用了trans()或__()方法,并想要覆盖此方法,您可以按照以下步骤操作

  • (1) 需求插件
composer require funkjedi/composer-include-files:dev-master
  • (2) 更新您的项目composer.json文件,将您的辅助文件添加到"include_files"。
// composer.json (project)
"autoload": {
    "files": [
        "app/Http/Helpers.php"
    ],
    "psr-4": {
        "App\\": "app/"
    }
}
  • (3) 在helpers.php文件中添加trans()方法
use Mekaeil\LaravelTranslation\TransHelper;


class Trans{
    use TransHelper;

    public function translator($word,$lang,$where){
        return $this->translation($word,$lang,$where);
    }
}

if (!function_exists('trans')){

    function trans($word, $lang=null, $where=null){
        $accessTrans = new Trans();
        return $accessTrans->translator($word,$lang,$where);
    }  
}