添加对自定义格式的支持

3.4 版本
维护中的版本

有时,你需要面对自定义格式(format)的翻译源。Translation组件足够灵活,可以支持它。只需创建一个加载器(loader,用于加载翻译文件),以及,一个可选的dumper(用于剥离出翻译内容)。

设想你有一个自定义的格式,里面的翻译信息(message)使用“单行的内容”来加以定义,用括号包住了键和message。翻译文件看上去像下面这样:

1
2
3
(welcome)(accueil)
(goodbye)(au revoir)
(hello)(bonjour)

创建自定义Loader 

要定义一个客制化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 

针对你的文件格式来创建一个自定义的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 方法。你必须传入domain参数,用于决定应被dump的信息列表。

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 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)