【问题标题】:October CMS - Translate Backend with RainLab Translate Plugin十月 CMS - 使用 RainLab 翻译插件翻译后端
【发布时间】:2018-08-09 19:11:24
【问题描述】:

在我的应用程序中,我有一个包含大约 80 个可翻译字段的自定义插件。该表单将在后端(针对管理员)和前端(针对最终用户)中以相同的标签提供。

我想使用 Rainlab Translate 插件来翻译所有字段的标签,以便管理员可以轻松更改它们以满足他们的需求。

问题是所有后端翻译都存储在文件系统中(例如/plugins/my-plugin/lang/en/lang.php)。

是否可以使用Rainlab Translate 插件管理自定义插件的翻译?这将避免 php 翻译文件和数据库之间出现重复。

到目前为止,我已经安装了 Rainlab Translate 插件来翻译法语和德语的前端。

谢谢你们!

【问题讨论】:

    标签: php octobercms octobercms-plugins octobercms-backend


    【解决方案1】:

    我想出了一个解决方案,创建一个自定义插件来扩展十月 CMS 后端翻译服务。我在插件的 boot() 方法中添加了以下代码:

     // Custom Backend Translator that handles the Backend localisation with the Rainlab Translator plugin
        $this->app->singleton('translator', function ($app) {
            $loader = $app['translation.loader'];
    
            // When registering the translator component, we'll need to set the default
            // locale as well as the fallback locale. So, we'll grab the application
            // configuration so we can easily get both of these values from there.
            $locale = $app['config']['app.locale'];
            // extending October CMS Translator class
            $trans = new Translator($loader, $locale);
            // setting locale to message
            Message::$locale = $locale;
    
            $trans->setFallback($app['config']['app.fallback_locale']);
    
            return $trans;
        });
    

    我创建了一个 Translator 类,它扩展了默认类并实现了数据库查找翻译。如果没有找到翻译,它还会回退到基于默认数组文件的翻译。

    <?php namespace Author\MyPlugin\Classes\Translation;
    
    use Author\MyPlugin\Classes\Translation\Message as Message;
    
    class Translator extends \October\Rain\Translation\Translator
    {
        /**
         * Get the translation for the given key.
         *
         * @param  string $key
         * @param  array $replace
         * @param  string $locale
         * @return string
         */
        public function get($key, array $replace = [], $locale = null)
        {
            // getting translation from database
            $message = Message::trans($key);
            // if there's a translation we return it
            if ($message != null && $message !== $key) {
                return $message;
            }
            // otherwise fallback to file array translations
            return parent::get($key, $replace, $locale);
        }
    }
    

    以及Message类的代码如下:

    <?php namespace Author\MyPlugin\Classes\Translation;
    
    
    class Message extends \RainLab\Translate\Models\Message
    {
        /**
         * Creates or finds an untranslated message string.
         * @param  string $messageId
         * @return string
         */
        public static function get($messageId)
        {
            if (!self::$locale) {
                return $messageId;
            }
    
            if (!is_string($messageId)) {
                return null;
            }
    
            // we let full translation key for the backend
            if (!\App::runningInBackend()) {
                $messageCode = self::makeMessageCode($messageId);
            } else {
                $messageCode = $messageId;
            }
    
            /*
            * Found in cache
            */
            if (array_key_exists($messageCode, self::$cache)) {
                return self::$cache[$messageCode];
            }
    
            /*
             * Uncached item
             */
            $item = static::firstOrNew([
                'code' => $messageCode
            ]);
    
            /*
             * Create a default entry
             */
            if (!$item->exists) {
                $data = [static::DEFAULT_LOCALE => $messageId];
                $item->message_data = $item->message_data ?: $data;
            }
    
            /*
             * Schedule new cache and go
             */
            $msg = $item->forLocale(self::$locale, $messageId);
            self::$cache[$messageCode] = $msg;
            self::$hasNew = true;
    
            return $msg;
        }
    }
    

    欢迎对此解决方案的任何反馈。

    【讨论】:

    • 后端表单标签翻译的代码是在哪里写的???
    【解决方案2】:

    理论上我认为应该可以返回一个通过 Translate 实例加载的数组,而不是返回一个预定义的数组。

    因此,不是在lang/en/lang.php 中返回一个简单的数组,而是用与前端的键匹配的键填充数组。

    所以而不是:

    return [
        'key' => 'language-string'
    ];
    

    做这样的事情:

    • 检索所有语言键
    • 遍历所有键并获得正确的语言字符串
    • 向关联数组添加键

    更新:

    我能找到的最快方法是创建一个包含所有相关键的配置文件,并在rainlab_translate_messages 表的查询中使用它。 您将所有值转换为正确的格式(assoc 数组)并将其返回到 lang.php 文件中。

    它非常hacky,感觉很脏,而且可能很容易出错。但应该可以。

    注意:如果有人想出了更好的方法,请使用它。这不是我真正建议的事情。但是,嘿,我想它有效。

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 2020-04-03
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      相关资源
      最近更新 更多