wazza/dom-translate

一个Laravel包,它将使用内置的Blade指令来定义特定短语进行自动翻译,然后在屏幕上渲染。

v2.2.1 2024-07-21 05:55 UTC

This package is auto-updated.

Last update: 2024-09-21 06:19:51 UTC


README

GitHub issues GitHub stars GitHub license GitHub version

Laravel翻译包

一个利用Laravel指令提供自动翻译所有Blade短语或单词的库。

示例:将HTML静态数据用英语编写,并在实时显示不同语言。

概述

该库使用三个数据库表(domt_phrasesdomt_translationsdomt_languages)来高效地管理翻译。

  1. 页面加载时,系统会使用@transl8()指令中提供的短语在domt_translations表中搜索特定翻译。

    Laravel通常会缓存视图,因此如果整个页面的内容没有变化,步骤1-4不会触发,因为缓存的视图将直接加载。

  2. 如果找到翻译,则返回并显示在页面上,而不需要调用API。
  3. 如果没有找到翻译(尚未翻译),将调用Google翻译API(或另一个定义的提供者)来检索新的翻译。
  4. 然后将新翻译的文本插入到数据库中,以避免将来为相同的短语进行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_SESSIONtrue,则翻译将保存到会话中,并用作检索的第一点。
  • 如果没有在会话中找到翻译,或者如果DOM_TRANSLATE_USE_SESSIONfalse,则将从数据库中检索翻译,前提是它们已经被存储在那里。
  • 如果仍然找不到翻译,或者如果DOM_TRANSLATE_USE_SESSIONDOM_TRANSLATE_USE_DATABASE都为false,则将从第三方翻译服务(例如,Google翻译)中获取翻译。
  • 根据DOM_TRANSLATE_USE_SESSIONDOM_TRANSLATE_USE_DATABASE是否为true,检索到的翻译将保存到会话或数据库中。
  • 我们强烈建议将DOM_TRANSLATE_USE_DATABASE设置为true(如果未在.env中指定,则默认为true),以确保我们不重复进行API调用(调用API比数据库/会话查找要慢)。

注意:如果您没有Google Cloud Platform帐户,请注册并创建一个新的项目。向其中添加Cloud Translation API。您可以使用Insomnia测试您的API密钥。

insomnia

查看您可能想要进行的任何配置文件更改。配置文件已发布到主配置文件夹。

一切都设置好了!😉

重启您的服务,并使用@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中添加(在撰写时,有免费选项可用)。