showapp/laravel-translation-manager

管理 Laravel 翻译

1.1.1 2023-06-19 20:36 UTC

README

轻松管理 Laravel 中的翻译。

Laravel-Translation-Manager by HighSolutions

安装

将以下行添加到您的 Laravel Web 应用的 composer.json 文件的 require 部分

    "require": {
        "highsolutions/laravel-translation-manager": "^1.0"
    }

运行 composer update 安装包。

然后,通过添加服务提供者条目来更新 config/app.php

'providers' => [
    // ...
    HighSolutions\TranslationManager\ManagerServiceProvider::class,
];

接下来,发布所有包资源

    php artisan vendor:publish --provider="HighSolutions\TranslationManager\ManagerServiceProvider"

这将添加到您的项目中

- migration - database table for storing translations
- configuration - package configurations
- views - configurable views for translation management
- translations - translations for webinterface

请记住启动迁移

    php artisan migrate

工作流程

此包不会替换翻译系统,只会将 PHP 文件导入/导出到数据库,并使其在浏览器中可编辑。包包含用于在网站上实时编辑内容的辅助工具。

工作流程如下

- Import translations: Read all translation files and save them in the database
- Find all translations in php/twig sources
- Optionally: Listen to missing translation with the custom Translator
- Optionally: Mark not-translated records as not-translated (suffix command)
- Translate all keys through the webinterface
- Export: Write all translations back to the translation files.

用法

在默认配置下,您可以通过 http://yourdomain.com/translations 访问包。您可以按需更改。

配置

命令

导入命令

导入命令将在 app/lang 中搜索所有字符串并将其加载到数据库中,这样您可以轻松地管理它们。

    php artisan translations:import

注意:默认情况下,只有新字符串会被添加。数据库中已有的翻译将保持不变。如果您想用文件中的值替换所有值,请添加 --replace(或 -R)选项:php artisan translations:import --replace

在源代码中查找翻译

查找命令/按钮将在应用目录中的所有 php/twig 文件中搜索,以查看它们是否包含翻译函数,并尝试提取组/项名称。找到的键将添加到数据库中,以便可以轻松地进行翻译。这可以通过 Web 界面或通过 Artisan 命令完成。

    php artisan translations:find

导出命令

导出命令将数据库内容写回到资源/lang PHP 文件中。这将覆盖现有的翻译并删除所有注释,因此在使用之前请务必备份您的数据。提供组名称以定义您想发布的组。如果您想导出所有组,请使用 * 作为组名称。

    php artisan translations:export <group>

例如,当您有 2 个区域(en/pl)时,使用 php artisan translations:export reminders 将写入 resources/lang/en/reminders.phpresources/lang/pl/reminders.php

清理命令

清理命令将搜索所有 NULL 翻译并删除它们,以便您的界面更加整洁。注意:空翻译永远不会导出。

    php artisan translations:clean

重置命令

重置命令只是清除数据库中的所有翻译,这样您可以从头开始(通过新的导入)。在这样做之前,请确保导出您的工作(如果有必要)。

    php artisan translations:reset

克隆命令

克隆命令将基本语言(langFrom 参数)的目录复制并保存为新语言(langTo 参数)。在此操作完成后,您需要启动导入命令。

    php artisan translations:clone langFrom langTo

后缀命令

后缀命令分析来自新区域(langNew 参数)的所有翻译,如果值与原始语言(langOriginal 参数)相同,则将在新区域翻译的值末尾添加后缀,以标记此翻译需要翻译。后缀是区域代码(例如 EN)的大写形式。

    php artisan translations:sufix langOriginal langNew

检测缺失的翻译

大多数翻译可以通过使用查找命令(见上文)找到,但对于动态键(变量/自动表单等),通过“监听”缺失的翻译可能会有所帮助。要检测缺失的翻译,我们可以用自定义提供者替换 Laravel TranslationServiceProvider。在您的 config/app.php 中,注释掉原始 TranslationServiceProvider 并添加此包中的提供者。

    //'Illuminate\Translation\TranslationServiceProvider',
    'HighSolutions\TranslationManager\TranslationServiceProvider',

这将扩展翻译器,并在找不到键时创建新的数据库条目,因此您需要访问使用它们的页面。这样,它就会在Web界面中显示出来,可以被编辑并在稍后导出。您不应在生产环境中使用此功能,仅用于在生成环境中翻译视图,然后只需切换回来。

实时编辑

当您在数据库中有翻译时,可以在合适的时候使用transEditable方法代替trans。为此,您需要执行几个步骤

通过添加服务提供商的条目来更新config/app.php

'providers' => [
    // ...
    HighSolutions\TranslationManager\TranslationServiceProvider::class,
];

将这两个方法添加到app\helpers.php文件中。

if (!function_exists('transEditable')) {
    /**
     * Translate the given message and wraps it in .editable container to allow editing
     *
     * @param  string  $id
     * @param  array   $parameters
     * @param  string  $domain
     * @param  string  $locale
     * @return \Symfony\Component\Translation\TranslatorInterface|string
     */
    function transEditable($id = null, $parameters = [], $domain = 'messages', $locale = null) {
        return app('translator')->transEditable($id, $parameters, $locale);
    }
}

if (!function_exists('isLiveTranslationEnabled')) {
    /**
     * Return true if live translation enabled
     *
     * @return bool
     */
    function isLiveTranslationEnabled() {
        return Request::cookie('live-translation-enabled') || config('translation-manager.live_translation_enabled');
    }
}

在您的布局视图中添加这些脚本和样式(见布局定制部分)

    <link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"/>
    <style>
        .editable-click {
            border-bottom-color: red;
            cursor: pointer;
        }

        .editableform .control-group {
            display: block;
        }

        .editable-input {
            display: block;
        }

        .editable-input > textarea {
            width: 100% !important;
        }

        .editable-buttons {
            margin: 10px 0 0;
            text-align: right;
            width: 100%;
        }

        .editable-buttons .editable-submit {
            float: right;
            margin-left: 10px;
        }
    </style>
    // ...
    <script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>

如果您想将所有链接转换为非链接,请添加以下小脚本

<script>
    $('.editable').parent('a').replaceWith(function () {
            return $('<div/>', {
                html: this.innerHTML
            });
        }
    );
</script>

最后一步是添加此JS文件

jQuery(document).ready(function($){

    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            settings.data += "&_token=" + $(':hidden[name="_token"]').val();
        }
    });

    $('.editable').editable().on('hidden', function(e, reason){
        var locale = $(this).data('locale');
        if(reason === 'save'){
            $(this).removeClass('status-0').addClass('status-1');
        }
        if(reason === 'save' || reason === 'nochange') {
            var $next = $(this).closest('tr').next().find('.editable.locale-'+locale);
            setTimeout(function() {
                $next.editable('show');
            }, 300);
        }
    });

    $(document).on('click', 'a', function(event) {
        if (event.target.localName !== 'a' && event.target.className.indexOf('editable-submit') !== -1) {
            event.preventDefault();
            return false;
        }
    });
});

现在您可以使用transEditable辅助程序,当实时编辑处于活动状态(通过isLiveTranslationEnabled检查)时,用户可以点击文本,会显示弹出窗口,可以更改文本。保存更改将导致将文本保存到数据库并导出到翻译文件。如果实时编辑未处于活动状态,用户将看到标准文本。

您可以使用此辅助程序如下

	<div class="text">{!! transEditable('auth.failed') !!}</div>

不要在不可点击的元素(如title属性、alt属性)内部使用此功能。要启动链接内部的弹出窗口,请点击边界而不是文本。

更新日志

1.1.0

  • 支持Laravel 7.x和8.x

1.0.0

  • 支持Laravel 6.0

0.6.0

  • 不再需要STRICT_MODE

0.5.1

  • 修复搜索翻译

0.5.0

  • 更改视图路径

0.4.7

  • 在配置文件中删除闭包

0.4.5

  • Laravel 5.6支持

0.4.4

  • 修复翻译标题弹出窗口

0.4.3

  • 新配置(弹出位置和基本语言)
  • 更新有关必要JS脚本的文档

0.4.0

  • 新命令:克隆和后缀
  • 改进导出命令

0.3.7

  • 新的配置选项以排除语言

0.3.6

  • 支持自动发现和Laravel 5.5

0.3.0

  • 支持子目录
  • 支持数组翻译
  • 新设计
  • 权限管理
  • 视图翻译
  • 实时编辑

0.2.0

  • Barryvdh版本的包

路线图

  • 将一个地区的翻译复制到另一个地区,带有地区后缀。
  • 检测错误的文件。
  • 支持供应商的翻译文件。
  • 单元测试!

致谢

此包最初由Barry vd. Heuvel创建,并在此处提供:laravel-feed

目前由HighSolutions开发,这是一家来自波兰的软件公司,热爱Laravel。