首页 文章

10月CMS - 使用RainLab Translate插件翻译后端

提问于
浏览
0

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

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

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

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

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

感谢你们!

2 回答

  • 0

    我想出了一个解决方案,创建了一个自定义插件,扩展了10月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;
        }
    }
    

    欢迎提供此解决方案的任何反馈 .

  • 1

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

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

    所以代替:

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

    做这样的事情:

    • 检索所有语言键

    • 遍历所有键并获得正确的语言字符串

    • 将关键字添加到关联数组

    Update:

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

    这是疯狂的hacky,感觉很脏,可能非常容易出错 . 但应该工作 .

    Note: If someone comes up with a better way, please use that. This isn't really something I would advise. But hey, I guess it works.

相关问题