Now I'm working on some cyrillic site (bilingual, Russian and Ukrainian only). There is some issues about non-Latin characters in page titles:
1. sapphire/javascript/UpdateURL.js - default javascript is valid only for Latin characters; on cyrillic it "suggests" bare blank URL segments or series of "-". Common solution will be enabling Unicode URL segments like this: http://ru.wikipedia.org/wiki/Ãœøûðý, but for certain language/alphabet it can be hacked with transliteration.
Here's my patched sapphire/javascript/UpdateURL.js for Cyrillic:
var cyrChars = new Array('ÃÂ','Ñ','Ã’','Ó','Ãâ€','Õ','ÃÂ','Ö','×','ÃËœ','Ãâ„¢','ÃÅ¡','Û','ÃÅ“','ÃÂ','Þ','ß','à','á','â','ã','ä','ÃÂ¥','ç','æ','è','é','ÃÂ','î','ï','ë','ê','ì',
'ð','ñ','ò','ó','ô','õ','Ñ‘','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ','Ñ€','ÑÂ','Ñ‚','у','Ñ„','Ñ…','ч','ц','ш','щ','ÑÂ','ÑŽ','\ÑÂ','Ñ‹','ÑŠ','ÑŒ',
'Ä','Ñâ€','Ç','Ñ—','Æ','Ñ–','Ã’Â','Ò‘');
var transChars = new Array('A','B','V','G','D','E','Jo','Zh','Z','I','J','K','L','M','N','O','P','R','S','T','U','F','H','Ch','C','Sh','Csh','E','Ju','Ja','Y','\`','\'',
'a','b','v','g','d','e','jo','zh','z','i','j','k','l','m','n','o','p','r','s','t','u','f','h','ch','c','sh','csh','e','ju','ja','y','\`','\'',
'Ye','ye','Yi','yi','I','i','G','g');
function translitCyrillic(from){
var to = "";
var len = from.length;
var character, isCyr;
for(i=0; i < len; i++){
character = from.charAt(i,1);
isCyr = false;
for(j=0; j < cyrChars.length; j++){
if(character == cyrChars[j]){
isCyr = true;
break;
}
}
to += (isCyr) ? transChars[j] : character;
}
return to;
}
/* some lines skipped - inserting translitCyrillic call here: */
var newSuggestion = urlSegmentField.suggestNewValue( translitCyrillic(this.value.toLowerCase()) );
/* ... */
2. sapphire/core/model/SiteTree.php - I have moved URL Segment input/fieldset from "meta" tab to "main". I have to set or check URL for almost every page, fixing very long auto-suggested URLs and so on.
3. sapphire/core/control/ContentController.php - small addition to render multi-language controls in templates without widgets. Really I don't need complex logic here, so I just wrote a method:
/**
*
* Returns just current language code - for multilanguage switching etc
*/
function CurrentLang() {
return Translatable::current_lang();
}
And now my language switching code in template is really dumb'n'simple:
<% if CurrentLang == ru %>
<span class="i18n-link"><a href="$Link?lang=ru" class="active">RU</a></span>
<span class="i18n-link"><a href="$Link?lang=uk">UK</a></span>
<% end_if %>
<% if CurrentLang == uk %>
<span class="i18n-link"><a href="$Link?lang=ru">RU</a></span>
<span class="i18n-link"><a href="$Link?lang=uk" class="active">UK</a></span>
<% end_if %>
And this is only beginning...