支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
有时,你需要面对自定义格式(format)的翻译源。Translation组件足够灵活,可以支持它。只需创建一个加载器(loader,用于加载翻译文件),以及,一个可选的dumper(用于剥离出翻译内容)。
设想你有一个自定义的格式,里面的翻译信息(message)使用“单行的内容”来加以定义,用括号包住了键和message。翻译文件看上去像下面这样:
1 2 3 | (welcome)(accueil)
(goodbye)(au revoir)
(hello)(bonjour) |
要定义一个客制化loader,令其能够读取这些文件的内容,你必须创建一个全新的类,该类实现 LoaderInterface
接口。load()
方法将获取到文件名并把它解析成数组。然后,它会创建将被返回的目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Loader\LoaderInterface;
class MyFormatLoader implements LoaderInterface
{
public function load($resource, $locale, $domain = 'messages')
{
$messages = array();
$lines = file($resource);
foreach ($lines as $line) {
if (preg_match('/\(([^\)]+)\)\(([^\)]+)\)/', $line, $matches)) {
$messages[$matches[1]] = $matches[2];
}
}
$catalogue = new MessageCatalogue($locale);
$catalogue->add($messages, $domain);
return $catalogue;
}
} |
一旦创建,它就可以作为“其他类型”的loader来使用:
1 2 3 4 5 6 7 8 | use Symfony\Component\Translation\Translator;
$translator = new Translator('fr_FR');
$translator->addLoader('my_format', new MyFormatLoader());
$translator->addResource('my_format', __DIR__.'/translations/messages.txt', 'fr_FR');
var_dump($translator->trans('welcome')); |
它将输出 "accueil"。
针对你的文件格式来创建一个自定义的dumper也是可以的,这在使用提取命令时(extraction commands)很有用。这么做时,必须创建一个实现了 DumperInterface
接口的类。把剥离出的内容写入文件时,继承 FileDumper
类以便少写几行代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\FileDumper;
class MyFormatDumper extends FileDumper
{
public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
{
$output = '';
foreach ($messages->all($domain) as $source => $target) {
$output .= sprintf("(%s)(%s)\n", $source, $target);
}
return $output;
}
protected function getExtension()
{
return 'txt';
}
} |
formatCatalogue()
创建了output字符串,可以被FileDumper类的 dump()
方法用来创建文件。dumper可以像其他内置的dumper那样使用。在下例中,定义在YAML文件中的翻译信息将被按照指定格式被剥离成一个文件文件:
1 2 3 4 5 6 7 | use Symfony\Component\Translation\Loader\YamlFileLoader;
$loader = new YamlFileLoader();
$catalogue = $loader->load(__DIR__ . '/translations/messages.fr_FR.yml' , 'fr_FR');
$dumper = new MyFormatDumper();
$dumper->dump($catalogue, array('path' => __DIR__.'/dumps')); |
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。