Multi-language translation implementation
  • We're currently building a multi-language site in Vae and I needed some simple i18n string translation. I've seen a few others ask for this feature so here's two simple implementations anyone can use.

    Syntax

    <span><v:t>Hello world!</v:t></span> => <span>Bonjour tout le monde</span>


    Single language

    This assumes you're only translating from the original language to the second language (you could easily upgrade this to support additional languages by using the multi-language variant below).

    Setting either _GET[lang] or _COOKIE[lang] enables translation.

    Required structure:

    • Settings
        • Translations
            • Text - Text (e.g "About us")
            • Translation - Text (e.g "A propos de nous")

    Code (put this in __vae.php):

    function translate($attributes, $tag, $context, $callback) {
    $locale = $_REQUEST['lang'];
    $key = vae_render_tags($tag, $context);

    if ($locale) {
    $language = language($locale);

    if ($language) {
    $translation = (string)vae(sprintf('settings/translations[text="%s"][language=%d]', $key, $language->id))->translation;

    if ($translation) {
    return $translation;
    }
    }
    }

    return $key;
    }

    vae_register_tag('t', array(
    'handler' => 'translate'
    ));


    Multi-language translation

    This implementation supports any number of languages but with the cost of extra complexity.

    Required structure:
    • Settings
        • Languages
            • Name - Text (e.g. "English")
            • Locale code - Text (e.g "en")

        •Translation names
            • Name - Text (e.g "About us")

        • Translations
            • Language - Single association to Languages
            • Name - Single association to Translation names
            • Translation - Text (e.g "A propos de nous")

    Code (put this in __vae.php):

    function translate($attributes, $tag, $context, $callback) {
    $key = $tag['tags'][0]['innerhtml'];
    $settings = vae('settings');

    $translationId = (int)$settings->get(sprintf('translation_names[name="%s"]', $key))->id;

    if ($translationId) {
    $languageCode = $_REQUEST['lang'];
    $languageId = (int)$settings->get(sprintf('languages[%s]', $languageCode ? sprintf('locale_code="%s"', $languageCode) : 1))->id;

    if ($languageId) {
    $translation = (string)$settings->get(sprintf('translations[name=%d][language=%d]', $translationId, $languageId))->translation;

    if ($translation) {
    return $translation;
    }
    }
    }

    return $key;
    }

    vae_register_tag('t', array(
    'handler' => 'translate'
    ));

  • 1 Answer sorted by
  • This is so awesome. Thanks for sharing!

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In Apply for Membership

In this Discussion