Как сделать текстовое преобразование: верхний регистр правильно работает с греческим?

Проблема, с которой я столкнулся, связана с капитализацией греческих символов свойством text-transform: uppercase.

На греческом языке гласные могут иметь острые акценты, как маленькие, так и кепки, например, один на греческом языке - ένα. В начале предложения будет Ένα. Но когда слово или фраза написано в все колпачки, тогда греческая грамматика говорит, что она должна иметь без акцентированных букв.

Как и сейчас, CSS text-transform: uppercase использует буквы греческого алфавита, сохраняя акценты, которые являются грамматически неправильными (поэтому ένα становится ΈΝΑ, а оно должно быть ΕΝΑ).

Как мне сделать text-transform: uppercase правильно работать для греческого?

Ответ 1

CSS будет обрабатывать этот штраф, если он знает, что язык является греческим. Простое указание греческих символов не указывает CSS, что язык является греческим; для которого требуется атрибут lang для некоторого родительского элемента (вплоть до тега html).

<p lang='el' style="text-transform: uppercase">ένα</p>

должен выполнить задание для вас, рендеринг

ΕΝΑ

Смотрите скрипту в http://jsfiddle.net/34tww2g8/.

Ответ 2

То, что вы описываете, на самом деле не является ошибкой в ​​CSS. CSS предназначен для стилизации элементов страницы. Это агностическое определение, независимо от культуры. То, что вы описываете, потребует, чтобы CSS обрабатывал локализацию страницы, основываясь на специфическом для культуры стилизованном CSS. (en, fr, au...).

В Интернете есть ряд ссылок, которые обсуждают глобализацию и локализацию, а также CSS.

Проверьте сайт Mozilla, который обсуждает этот же вопрос. Посмотрите раздел "Создание локализованного пользовательского интерфейса"

Ответ 3

Ответ Torazaburo верен, но для старых браузеров (в основном, версия IE) нет надлежащей поддержки символов с акцентом на греческий язык, и поэтому вам нужно использовать javascript для замены акцентированных символов без акцента.

replaceAccented();
function replaceAccented(){
var e = document.getElementsByTagName('*'), l = e.length, i;
if( typeof getComputedStyle == "undefined")
    getComputedStyle = function(e) {return e.currentStyle;};
for( i=0; i<l; i++) {
    if( getComputedStyle(e[i]).textTransform == "uppercase") {
        // do stuff with e[i] here.
        e[i].innerHTML = greekReplaceAccented(e[i].innerHTML);
    }
}
}
function greekReplaceAccented(str) {
    var charList = {'Ά':'Α','ά':'α','Έ':'Ε','έ':'ε','Ή':'Η','ή':'η','Ί':'Ι','ί':'ι','ΐ':'ϊ','Ό':'Ο'
                                ,'ό':'ο','Ύ':'Υ','ύ':'υ','ΰ':'ϋ','Ώ':'Ω','ώ':'ω','ς':'Σ' 
    };
    return str.replace(/./g, function(c) {return c in charList? charList[c] : c}) ;
}

Вот рабочая функция в fiddle.

Вы можете прокомментировать //replaceAccented(), чтобы узнать, что на самом деле зафиксировано JavaScript или проверить, какой браузер может понадобиться для такого решения.