scottybo/laravel-translator
thiagocordeiro/laravel-translator 的分支,用于在 PHP 和 Vue/JS 中搜索翻译键,并将它们插入到单独的 JSON 文件中进行翻译
Requires
- php: >=7.0.0
- laravel/framework: >=5.4
Requires (Dev)
- phpunit/phpunit: ~6.0
This package is not auto-updated.
Last update: 2024-09-23 16:41:59 UTC
README
这是 Laravel-Translator(《https://github.com/thiagocordeiro/laravel-translator》)的分支版本,增加了生成 Vue 翻译文件和 PHP 翻译文件的能力。它略微重构,以便与翻译字符串而不是命名键良好地协同工作。
在添加翻译时遵循以下简单规则
- 始终使用
__()
而不是lang()
、trans()
等 - 任何包含
"
的字符串必须使用"
替换 - 字符串上始终使用
""
而不是''
,即{{ __("可以翻译的字符串") }}
- 在嵌入 HTML 时,始终使用
''
而不是""
,即<a href=''></a>
- 在嵌入 HTML 时,始终使用
{!! !!}
而不是{{ }}
- 永远不要将翻译断行,这将会创建额外的空格/制表符
- 关于复数化、大小写等,请参阅: https://laravel.net.cn/docs/5.6/localization
Laravel Blades 中的翻译
对于简单字符串
{{ __("String that can be translated") }}
对于包含变量的字符串
{{ __("Hi :name, welcome to :app", ['name' => 'Scott', 'app' => 'Widgets 3000']) }}
JavaScript/Vue 中的翻译
翻译没有更新?清除缓存! $ php artisan cache:clear
Vue 模板和 JavaScript 代码中使用的字符串存储在 /resources/lang/_javascript/
中,并从一般的 PHP/系统翻译中单独处理。这是为了确保访客只下载在 JS 中使用的翻译,以保持文件大小小,以便快速下载。
我们在系统的每一页上加载 <script src="/js/lang-{lang}.js"></script>
。URL 实际上是一个 Laravel 路由,它加载相应的语言文件(例如 /resources/lang/_javascript/{lang}.json
),并返回一个 json 编码的翻译字符串。这个字符串存储在变量:window.i18n 中,然后可以通过 JavaScript 引用。
// Load the translations for javascript strings Route::get('js/lang-{locale}.js', function ($locale) { try { // config('app.locales') gives all supported locales if (!array_key_exists($locale, config('app.locales'))) { $locale = config('app.fallback_locale'); } // Add locale to the cache key $json = \Cache::rememberForever("lang-{$locale}.js", function () use ($locale) { $path = base_path().'/resources/lang/_javascript/'.$locale.'.json'; $data = file_get_contents($path); return $data; }); } catch (Exception $e) { $json = $e->getMessage(); } $contents = 'window.i18n = ' . json_encode($json, config('app.debug', false) ? JSON_PRETTY_PRINT : 0) . ';'; $response = \Response::make($contents, 200); $response->header('Content-Type', 'application/javascript'); return $response; });
在生成此字符串的过程中,将告诉 Laravel 永久缓存此响应。因此,如果您更新了翻译文件,您需要通过 php artisan cache:clear
清除缓存。
为了保持翻译逻辑的一致性,我们有一个 Vue 原型变量 __
,它处理翻译的转换(在 /resources/assets/js/app.js
中)
window._ = require('lodash'); // Localization of strings, see README Vue.prototype.__ = (string, args) => { i18n_array = JSON.parse(window.i18n); let value = _.get(i18n_array, string); _.eachRight(args, (paramVal, paramKey) => { alert(`:${paramKey}`); value = _.replace(value, `:${paramKey}`, paramVal); }); return value; };
对于简单字符串
{{ __("String that can be translated") }}
对于包含变量的字符串
{{ __("Hi :name, welcome to :app", {'name': 'Scott', 'app', 'Widgets 3000'}) }}
Laravel-translator 扫描您的项目 resources/view/
、resources/js/
和 app/
目录,以查找 lang(...)
和 __(...)
函数,然后根据第一个参数的值创建键并将它们插入到 JSON 翻译文件中。
安装
您只需要求此软件包即可
$ composer require scottybo/laravel-translator
此软件包会自动注册提供者,查看 Laravel 软件包发现。
Composer 完成安装后,您可以通过运行以下命令更新您的项目翻译键
$ php artisan translator:update
如果出于任何原因 artisan 找不到 translator:update
命令,您可以在您的 config/app.php
文件上手动注册提供者
return [ ... 'providers' => [ ... Translator\TranslatorServiceProvider::class, ... ] ]
用法
首先,您必须创建您的 JSON 翻译文件
app/
resources/
lang/
pt.json
es.json
fr.json
lang/
_javascript/
pt.json
es.json
fr.json
继续按照您习惯的方式工作,当Laravel内置的翻译函数找不到给定的键时,它将返回自身,所以如果您创建英文键,您不需要创建英文翻译
blade: <html> {{ __('Hello World') }} </html> controllers, models, etc.: <?php __('Hello World');
您还可以在翻译键中使用参数
__('Welcome, :name', ['Arthur Dent'])
输出
translator:update
命令将扫描您的代码以识别新的翻译键,然后它将在app/resources/lang/
文件夹中更新所有JSON文件,添加这些键。