josephnc / translation
自动Laravel 5翻译器
Requires
- php: ^7.1
- guzzlehttp/guzzle: ^6.3
- illuminate/database: 5.*
- illuminate/support: 5.*
- stichoza/google-translate-php: ^4.0
- viniciusgava/google-translate-api: ^2.0
Requires (Dev)
- mockery/mockery: ^0.9.4
- orchestra/testbench: ~3.0
- phpunit/phpunit: ~4|~5
This package is auto-updated.
Last update: 2024-09-24 08:02:47 UTC
README
描述
从https://github.com/stevebauman/translation分叉和更新
现在是最快的Laravel 5自动翻译器
例如
控制器
public function index() { return view('home.index'); }
视图
@extends('layout.default') {{ ___trans('Welcome to our home page') }}
已查看
Welcome to our home page
当你访问页面时,你不会注意到任何不同,但如果你看看你的数据库,你的默认应用程序区域设置已经创建,并且与该区域设置的翻译。
现在如果我们设置区域设置为不同的,比如法语(fr),它会自动为你翻译。
控制器
public function index() { App::setLocale('fr'); // Or Translation::setLocale( 'fr' ); return view('home.index'); }
视图
@extends('layout.default') {{ __trans('Welcome to our home page') }}
已查看
Bienvenue sur notre page d'accueil
我们甚至可以使用占位符来动态内容
视图
{{ __trans('Welcome :name, to our home page', ['name' => 'John']) }}
已查看
Bienvenue John , à notre page d'accueil
请注意,我们没有真正更改视图中的文本,这意味着对你(开发者!)来说,一切在你的区域设置中都是完全可读的,这意味着不再需要管理大量的翻译文件,并试图解读那个点注释的翻译路径中的文本
安装
需要翻译包
composer require josephnc/translation
将服务提供者添加到你的config/app.php
配置文件中
JosephNC\Translation\TranslationServiceProvider::class,
将外观添加到你的config/app.php
配置文件中的别名中
'Translation' => JosephNC\Translation\Facades\Translation::class,
发布迁移
php artisan vendor:publish --provider="JosephNC\Translation\TranslationServiceProvider"
运行迁移
php artisan migrate
一切准备就绪!
用法
在应用程序的任何地方,可以使用简短函数(可以在配置文件中禁用)
__trans('Translate')
或
Translation::translate('Translate')
这在blade视图中通常非常有用
{{ __trans('Translate') }}
你甚至可以通过简单地插入你的内容来轻松地翻译模型
{{ __trans($post->title) }}
或使用占位符
{{ __trans('Post :title', ['title' => $post->title]) }}
在你的translations
数据库表中,你会看到如下内容
| id | text | data |
1 'Translate' {"en":"Translate","fr":"Traduire"}
要为用户会话切换语言,你只需要调用
App::setLocale('fr') // Setting to French locale // Or use this, they both work Translation::setLocale('fr') // Setting to French locale
当调用Translation::setLocale($code)
方法时,会自动创建区域设置,并且当调用翻译函数时,它会为新的区域设置自动创建一个新的翻译记录,其中包含默认区域设置的翻译。默认区域设置是从laravel的app.php
配置文件中获取的。
你现在可以更新新记录上的翻译,并在需要的地方显示
__trans('Translate me!')
需要翻译单个文本而不设置用户默认区域设置怎么办?
只需将区域设置传递到上述翻译函数的第三个参数中,如下所示
视图
{{ __trans('Our website also supports russian!', [], 'ru') }}
{{ __trans('And french!', [], 'fr') }}
已查看
Наш сайт также поддерживает России !
Et françaises !
这对于显示您的网站支持不同的语言而无需更改整个网站语言非常有用。您还可以像通常那样执行替换
视图
{{ __trans('Hello :name, we also support french!', ['name' => 'John Doe'], 'fr') }}
已查看
Bonjour John Doe , nous soutenons aussi le français !
路由
使用区域设置前缀将您的网站翻译起来 couldn't be easier。首先在您的app/Http/Kernel.php
文件中,插入区域设置中间件
/** * The application's route middleware. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, // Insert Locale Middleware 'locale' => \JosephNC\Translation\Middleware\LocaleMiddleware::class ];
现在,在您的app/Http/routes.php
文件中,在路由组前缀中插入中间件和以下Translation方法
Route::group([ 'prefix' => Translation::getRoutePrefix(), 'middleware' => ['locale'], ], function () { Route::get('home', function () { return view('home'); }); });
现在,你应该能够访问如下的路由
https:///home
https:///en/home
https:///fr/home
自动翻译
默认情况下,配置文件中启用了自动翻译。它使用这个出色的包
Stichoza Google Translate PHP.
Viniciusgava Google Translate PHP.
使用自动翻译会将插入的文本发送到google,并将返回的文本保存到数据库中。一旦翻译保存在数据库中,就永远不会将其发送回google进行重新翻译。这意味着你不必担心谷歌可能设定的限制。你实际上拥有那个翻译。
问题/关注点
为什么我的数据库翻译中占位符的地方出现了下划线?
当您在翻译中添加占位符,并添加替换数据时,例如
__trans('Hi :name', ['name' => 'John'])
翻译会解析数据数组中的每个条目,以查看占位符是否实际存在于插入的数据中。例如,在您数据库中的翻译字段中,保存的内容如下
__trans('Hi :name', ['name' => 'John']) // Hi __name__ __trans('Hi :name', ['test' => 'John']) // Hi :name
由于插入的占位符数据与字符串中的占位符不匹配,文本将保持不变。下划线的原因是谷歌翻译会尝试翻译包含 :name
的文本,然而在占位符两边提供双下划线可以防止谷歌翻译该特定单词,允许我们翻译其他所有内容,同时保留占位符。然后在运行时,翻译将替换占位符的双下划线变体(在这种情况下为 __name__
)。
如果我更新/修改翻译函数内的文本,会发生什么?
如果您修改翻译函数内的文本,将创建一条新记录,您需要再次翻译它。这是故意为之,因为修改后可能是一个完全不同的翻译。
例如使用
{{ __trans('Welcome!') }}
并将其修改为
{{ __trans('Welcome') }}
将自动生成新的翻译记录。
自动翻译有最大文本量限制吗?
该包使用 Viniciusgava的 谷歌翻译客户端,如果发生任何错误则回退到 Stichoza的。
然而,Stichoza的 新的3.0更新允许您在每个请求中翻译多达4200个单词(已测试,可能允许更多)。