NAME

Template::Multilingual::Parser - Multilingual template parser

SYNOPSIS

use Template;
use Template::Multilingual::Parser;

my $parser = Template::Multilingual::Parser->new();
my $template = Template->new(PARSER => $parser);
$template->process('example.ttml', { language => 'en'});

DESCRIPTION

This subclass of Template Toolkit's Template::Parser parses multilingual templates: templates that contain text in several languages.

<t>
  <en>Hello!</en>
  <fr>Bonjour !</fr>
</t>

Use this module directly if you have subclassed Template, otherwise you may find it easier to use Template::Multilingual.

Language codes can be any string that matches \w+, but we suggest sticking to ISO-639 which provides 2-letter codes for common languages and 3-letter codes for many others.

METHODS

new(\%params)

The new() constructor creates and returns a reference to a new parser object. A reference to a hash may be supplied as a parameter to provide configuration values.

Parser objects are typically provided as the PARSER option to the Template constructor.

Configuration values are all valid Template::Parser superclass options, and one specific to this class:

LANGUAGE_VAR

The LANGUAGE_VAR option can be used to set the name of the template variable which contains the current language. Defaults to language.

my $parser = Template::Multilingual::Parser->new({
   LANGUAGE_VAR => 'global.language',
});

You will need to set this variable with the current language value at request time, usually in your Template subclass' process() method.

parse($text)

parse() is called by the Template Toolkit. It parses multilingual sections from the input text and translates them to Template Toolkit directives. The result is then passed to the Template::Parser superclass.

sections

Returns a reference to an array of tokenized sections. Each section is a reference to hash with either a nolang key or a lang key.

A nolang key denotes text outside of any multilingual sections. The value is the text itself.

A lang key denotes text inside a multilingual section. The value is a reference to a hash, whose keys are language codes and values the corresponding text. For example, the following multilingual template:

foo <t><fr>bonjour</fr><en>Hello</en></t> bar

will parse to the following sections:

[ { nolang => 'foo ' },
  {   lang => { fr => 'bonjour', en => 'hello' } },
  { nolang => ' bar' },
]

LANGUAGE SUBTAG HANDLING

This module supports language subtags to express variants, e.g. "en_US" or "en-US". Here are the rules used for language matching:

  • Exact match: the current language is found in the template

    language    template                              output
    fr          <fr>foo</fr><fr_CA>bar</fr_CA>        foo
    fr_CA       <fr>foo</fr><fr_CA>bar</fr_CA>        bar
  • Fallback to the primary language

    language    template                              output
    fr_CA       <fr>foo</fr><fr_BE>bar</fr_BE>        foo
  • Fallback to first (in alphabetical order) other variant of the primary language

    language    template                              output
    fr          <fr_FR>foo</fr_FR><fr_BE>bar</fr_BE>  bar
    fr_CA       <fr_FR>foo</fr_FR><fr_BE>bar</fr_BE>  bar

AUTHOR

Eric Cholet, <cholet@logilune.com>

BUGS

Multilingual text sections cannot be used inside TT directives. The following is illegal and will trigger a TT syntax error:

[% title = "<t><fr>Bonjour</fr><en>Hello</en></t>" %]

Use this instead:

[% title = BLOCK %]<t><fr>Bonjour</fr><en>Hello</en></t>[% END %]

The TAG_STYLE, START_TAG and END_TAG directives are supported, but the TAGS directive is not.

Please report any bugs or feature requests to bug-template-multilingual@rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Template-Multilingual. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SEE ALSO

Template::Multilingual

ISO 639-2 Codes for the Representation of Names of Languages: http://www.loc.gov/standards/iso639-2/langcodes.html

COPYRIGHT & LICENSE

Copyright 2009 Eric Cholet, All Rights Reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.