在我的应用程序中,我有一个自定义插件,其形式大约有80个可翻译字段。该表单将在后端(针对管理员)和前端(针对最终用户)中提供相同的标签。
我想使用Rainlab Translate插件翻译所有字段的标签,以便管理员可以轻松更改它们以满足他们的需求。
问题是所有后端翻译都存储在文件系统中(例如/plugins/my-plugin/lang/en/lang.php)。
是否可以使用Rainlab Translate插件管理自定义插件的翻译?这样可以避免在php翻译文件和数据库之间出现重复。
到目前为止,我已经安装了Rainlab Translate插件,用法语和德语翻译前端。
谢谢你们!
答案 0 :(得分:1)
我想出了一个创建自定义插件的解决方案,该插件扩展了10月CMS后端转换器服务。我已将以下代码添加到我的插件的boot()方法中:
>>> request = {"data":{"a":[{"data": {"b": {"data": {"c": "d"}}}}]}}
>>> unwrap_data(request)
{'a': [{'b': {'c': 'd'}}]}
我创建了一个Translator类,它扩展了默认类并实现了翻译的数据库查找。如果没有找到翻译,它还会回退到默认的基于数组文件的翻译。
// 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;
});
以下Message类的代码:
<?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);
}
}
欢迎任何有关此解决方案的反馈。
答案 1 :(得分:0)
理论上我认为应该可以返回通过Translate实例加载的数组,而不是返回预定义的数组。
因此,不是在lang/en/lang.php
中返回一个简单数组,而是使用与前端键匹配的键填充数组。
所以而不是:
return [
'key' => 'language-string'
];
做这样的事情:
更新:
我能找到的最快捷的方法是创建一个包含所有相关密钥的配置文件,并在rainlab_translate_messages
表的查询中使用它。
您将所有值转换为正确的格式(assoc数组),并在lang.php
文件中返回此值。
这是疯狂的hacky,感觉很脏,可能非常容易出错。但应该工作。
注意:如果有人想出更好的方法,请使用它。这不是我建议的。但是,嘿,我猜它有效。