wazza / dom-translate
一个Laravel包,它将使用内置的Blade指令来定义特定短语进行自动翻译,然后在屏幕上渲染。
Requires
- php: ^8.1
- ext-json: *
- guzzlehttp/guzzle: ^7.4
- illuminate/support: ~10
Requires (Dev)
- fakerphp/faker: ^1.20.0
- laravel/legacy-factories: ~1
- mockery/mockery: ^1.2
- orchestra/testbench: ~8
- phpunit/phpunit: ~10
README
Laravel翻译包
一个利用Laravel指令提供自动翻译所有Blade短语或单词的库。
示例:将HTML静态数据用英语编写,并在实时显示不同语言。
概述
该库使用三个数据库表(domt_phrases、domt_translations和domt_languages)来高效地管理翻译。
- 页面加载时,系统会使用
@transl8()指令中提供的短语在domt_translations表中搜索特定翻译。Laravel通常会缓存视图,因此如果整个页面的内容没有变化,步骤1-4不会触发,因为缓存的视图将直接加载。
- 如果找到翻译,则返回并显示在页面上,而不需要调用API。
- 如果没有找到翻译(尚未翻译),将调用Google翻译API(或另一个定义的提供者)来检索新的翻译。
- 然后将新翻译的文本插入到数据库中,以避免将来为相同的短语进行API调用。
注意:为了确保快速检索翻译,每个短语都会被散列并存储在索引表列中。所有搜索都是针对此索引列进行的,以获得最佳性能。
安装
此项目的最低要求是PHP 8.0。
按照以下步骤安装包
composer require wazza/dom-translate php artisan vendor:publish --tag="dom-translate-config" php artisan vendor:publish --tag="dom-translate-migrations" php artisan migrate
将DOM_TRANSLATE_GOOGLE_KEY={your_google_api_key}添加到您的.env文件并运行
php artisan config:cache
以下是所有支持的环境变量键及其默认值(如果未提供)。KEY(例如,DOM_TRANSLATE_GOOGLE_KEY)是必需的。
DOM_TRANSLATE_USE_SESSION=true
DOM_TRANSLATE_USE_DATABASE=true
DOM_TRANSLATE_LOG_LEVEL=3
DOM_TRANSLATE_LOG_INDICATOR=dom-translate
DOM_TRANSLATE_PROVIDER=google
DOM_TRANSLATE_GOOGLE_KEY=
DOM_TRANSLATE_BING_KEY=
DOM_TRANSLATE_HASH_SALT=DzBQ2DxKhNaF
DOM_TRANSLATE_HASH_ALGO=sha256
DOM_TRANSLATE_LANG_SRC=en
DOM_TRANSLATE_LANG_DEST=af
- 如果
DOM_TRANSLATE_USE_SESSION为true,则翻译将保存到会话中,并用作检索的第一点。 - 如果没有在会话中找到翻译,或者如果
DOM_TRANSLATE_USE_SESSION为false,则将从数据库中检索翻译,前提是它们已经被存储在那里。 - 如果仍然找不到翻译,或者如果
DOM_TRANSLATE_USE_SESSION和DOM_TRANSLATE_USE_DATABASE都为false,则将从第三方翻译服务(例如,Google翻译)中获取翻译。 - 根据
DOM_TRANSLATE_USE_SESSION和DOM_TRANSLATE_USE_DATABASE是否为true,检索到的翻译将保存到会话或数据库中。 - 我们强烈建议将
DOM_TRANSLATE_USE_DATABASE设置为true(如果未在.env中指定,则默认为true),以确保我们不重复进行API调用(调用API比数据库/会话查找要慢)。
注意:如果您没有Google Cloud Platform帐户,请注册并创建一个新的项目。向其中添加Cloud Translation API。您可以使用Insomnia测试您的API密钥。
查看您可能想要进行的任何配置文件更改。配置文件已发布到主配置文件夹。
一切都设置好了!😉
重启您的服务,并使用@transl8指令更新您的Blade文件。只有新的未翻译短语会触发API调用。对于相同短语的后续请求,将从数据库中检索。
HTML Blade 示例
以下是一些如何在HTML(Blade)文件中使用翻译Blade指令的示例
<div> {{-- Default usage: Only provide a phrase --}} <p>@transl8("I like this feature.")</p> {{-- Specify a destination language --}} <p>@transl8("We need to test it in the staging environment.", "de")</p> {{-- Specify both source and destination languages --}} <p>@transl8("Wie weet waar Willem Wouter woon?", "en", "af")</p> {{-- Language-specific directives --}} <p>@transl8fr("This phrase will be translated to French.")</p> <p>@transl8de("This phrase will be translated to German.")</p> <p>@transl8je("This phrase will be translated to Japanese.")</p> {{-- A phrase that will not be translated --}} <p>This phrase will not be translated.</p> </div>
Blade 指令示例
默认情况下提供了四个指令(@transl8()是主要的)。您可以在Laravel的AppServiceProvider文件中添加更多(在register()方法下)。
// Register the default Blade directive - @transl8() // Only the phrase argument is required. Default source and destination languages are sourced from the config file. // - Format: transl8('Phrase','target','source') // - Example: transl8('This must be translated to French.','fr') Blade::directive('transl8', function ($string) { return \Wazza\DomTranslate\Controllers\TranslateController::phrase($string); }); // Register language-specific Blade directives // French - @transl8fr('phrase') Blade::directive('transl8fr', function ($string) { return \Wazza\DomTranslate\Controllers\TranslateController::translate($string, "fr", "en"); }); // German - @transl8de('phrase') Blade::directive('transl8de', function ($string) { return \Wazza\DomTranslate\Controllers\TranslateController::translate($string, "de", "en"); }); // Japanese - @transl8je('phrase') Blade::directive('transl8je', function ($string) { return \Wazza\DomTranslate\Controllers\TranslateController::translate($string, "je", "en"); });
未来开发(待办事项)
- 翻译并不总是完美的。创建一个“短语 vs 翻译”管理部分,允许管理员用户更改(更新)带有更正的翻译短语。
- 创建替代翻译引擎。目前,仅支持通过
Wazza\DomTranslate\Controllers\ApiTranslate\GoogleTranslate()使用Google Translate。其他要考虑的选项包括NLP翻译、Microsoft Translator等。
// Line 14 in 'wazza\dom-translate\config\dom_translate.php' // Third-party translation service providers 'api' => [ 'provider' => env('DOM_TRANSLATE_PROVIDER', 'google'), 'google' => [ 'controller' => "Wazza\DomTranslate\Controllers\ApiTranslate\GoogleTranslate", 'endpoint' => "https://www.googleapis.com/language/translate/v2", 'action' => "POST", 'key' => env('DOM_TRANSLATE_GOOGLE_KEY', null), // https://console.cloud.google.com/apis/credentials ], // To contribute, fork the project and add more translation providers here, implementing CloudTranslateInterface ],
运行本地测试
运行以下命令以执行测试
.\vendor\bin\phpunit
重要:要使最后两个断言测试工作,请在您的.env文件中将您的个人Google Translate密钥作为DOM_TRANSLATE_GOOGLE_KEY=xxx添加,或者直接在phpunit.xml文件下的DOM_TRANSLATE_GOOGLE_KEY中添加(在撰写时,有免费选项可用)。