@boblet

lest I forget (Oli Studholme)

Setting a language preference cookie

Once you’ve got language extensions and MultiViews working, you’ll probably want to set a cookie to record the user’s language preference. You can do this in a MT4 template like so:

<div class="lang-links"><mt:if name="page-lang" like=".en$"><a href="index.ja.html" onclick="createCookie('language','ja',365);">日本語</a> | English<mt:else>日本語 | <a href="index.en.html" onclick="createCookie('language','en',365);">English </a></mt:else></mt:if></div>

(Note this uses the previously mentioned page-lang snippet. Also there’s an extra space after “English” for line breaking purposes if you c&p.)

I used PPK’s createCookie Javascript:

function createCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

Now all you have to do is set these preferences in a .htaccess file:

# i18n with content negotiation
# enable MultiViews for extensionless URIs
Options +MultiViews +FollowSymLinks
# add acceptible languages
AddLanguage ja .ja
AddLanguage en .en
# set language priority
LanguagePriority ja en
# serve priority language if priority conflict or
#  no acceptable language (>= Apache 2.0.30)
ForceLanguagePriority Prefer Fallback
# override using cookies (theoretically)
SetEnvIf HTTP_COOKIE "language=en" prefer-language=en
SetEnvIf HTTP_COOKIE "language=ja" prefer-language=ja

I tried linking the script and calling it via ids:

document.getElementById('cookie-en').onclick = function () {
    createCookie('language','en',365);
}
document.getElementById('cookie-ja').onclick = function () {
    createCookie('language','ja',365);
}

but I’m currently doing things old-skool because … Apache’s caching seems to override this setting. Crap. To check for this reload pages that should be in a different language based on your cookie to preserve sanity. The FireFox Web Developer’s Toolbar has an excellent “View Cookie Information” option for testing cookies are being set correctly.

Notes

  1. boblet posted this