mekaeil / laravel-translation
Requires
- php: >=7.0
- laravel/framework: 5.*
README
此包用于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配置文件中,您可以在Cookie或Session上设置在浏览器中保存用户数据的方式。
在会话中清除缓存项
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);
}
}