57

主要なブラウザの実装には、text-transform: uppercaseトルコ語の文字に問題があるようです。私の知る限り(私はトルコ語ではありません)、4つの異なるi文字があります。ı i I İ最後の2つは、前の2つの大文字表現です。

ただし、に適用text-transform:uppercaseするı iと、ブラウザ(IE、Firefox、Chrome、Safariをチェック)I Iは正しくなく、単語の意味が大きく変わり、侮辱される可能性があります。(それは私が言われたことです)

私の解決策の調査では私の質問は明らかになりませんでした:この問題の回避策はありますか?最初の回避策は完全に削除することかもしれませんがtext-transform: uppercase、それはある種の最後の手段です。

面白いことに、W3Cのサイトにはこの問題のテストがありますが、この問題に関する詳細情報が不足しています。http://www.w3.org/International/tests/tests-html-css/tests-text-transform/generate?test=5

私はどんな助けにも感謝し、あなたの答えを楽しみにしています:-)

これがコーデックスです

4

7 に答える 7

95

これを解決するために、属性を追加langし、その値をに設定できます。tr

<html lang="tr">また<div lang="tr">

これが実際の例です。

于 2014-03-24T10:17:37.663 に答える
15

これは簡単で汚い回避策の例です-私が思っていたよりも速いです(2400タグのドキュメントでテストされました->遅延なし)。しかし、jsの回避策は最善の解決策ではないことがわかります

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-3">
</head>
<body>
<div style="text-transform:uppercase">a b c ç d e f g ğ h ı i j k l m n o ö p r s ş t u ü v y z (source)</div> <div>A B C Ç D E F G Ğ H I İ J K L M N O Ö P R S Ş T U Ü V Y Z (should be like this)</div>

<script>
    function getStyle(element, style) {
        var result;

        if (document.defaultView && document.defaultView.getComputedStyle) {
            result = document.defaultView.getComputedStyle(element, '').getPropertyValue(style);
        } else if(element.currentStyle) {
            style = style.replace(/\-(\w)/g, function (strMatch, p1) {
                return p1.toUpperCase();
            });
            result = element.currentStyle[style];
        }
        return result;
    }

    function replaceRecursive(element) {
        if (element && element.style && getStyle(element, 'text-transform') == 'uppercase') {
            element.innerHTML = element.innerHTML.replace(/ı/g, 'I');
            element.innerHTML = element.innerHTML.replace(/i/g, 'İ');    // replaces 'i' in tags too, regular expression should be extended if necessary
        }

        if (!element.childNodes || element.childNodes.length == 0) return;

        for (var n in element.childNodes) {
            replaceRecursive(element.childNodes[n]);
        }
    }

    window.onload = function() {    // as appropriate 'ondomready'
        alert('before...');
        replaceRecursive(document.getElementsByTagName('body')[0]);
        alert('...after');
    }
</script>

</body>
</html>
于 2010-10-01T08:06:06.867 に答える
7

これが、本番環境で使用しているalexのコードの拡張バージョンです。

(function($) {
  function getStyle(element, style) {
    var result;

    if (document.defaultView && document.defaultView.getComputedStyle) {
      result = document.defaultView.getComputedStyle(element, '').getPropertyValue(style);
    } else if(element.currentStyle) {
      style = style.replace(/\-(\w)/g, function (strMatch, p1) {
        return p1.toUpperCase();
      });
      result = element.currentStyle[style];
    }
    return result;
  }

  function replaceRecursive(element, lang) {
    if(element.lang) {
      lang = element.lang; // Maintain language context
    }

    if (element && element.style && getStyle(element, 'text-transform') == 'uppercase') {
      if (lang == 'tr' && element.value) {
        element.value = element.value.replace(/ı/g, 'I');
        element.value = element.value.replace(/i/g, 'İ');
      }

      for (var i = 0; i < element.childNodes.length; ++i) {
        if (lang == 'tr' && element.childNodes[i].nodeType == Node.TEXT_NODE) {
          element.childNodes[i].textContent = element.childNodes[i].textContent.replace(/ı/g, 'I');
          element.childNodes[i].textContent = element.childNodes[i].textContent.replace(/i/g, 'İ');
        } else {
          replaceRecursive(element.childNodes[i], lang);
        }
      }
    } else {
      if (!element.childNodes || element.childNodes.length == 0) return;

      for (var i = 0; i < element.childNodes.length; ++i) {
        replaceRecursive(element.childNodes[i], lang);
      }
    }
  }

  $(document).ready(function(){ replaceRecursive(document.getElementsByTagName('html')[0], ''); })
})(jQuery);

ここではready()関数にのみjQueryを使用していることに注意してください。jQuery互換性ラッパーは、関数の名前空間を作成するための便利な方法でもあります。それ以外は、2つの関数はjQueryにまったく依存していないため、それらを引き出すことができます。

アレックスの元のバージョンと比較して、これはいくつかの問題を解決します:

  • トルコ語と他のラテン語のコンテンツを混合した場合、それがないと非トルコ語で不適切な変換が行われるため、繰り返し実行されるlang属性を追跡します。これに従ってhtml、ではなく基本要素を渡しbodyます。lang="en"不適切な大文字化を防ぐために、トルコ語以外のタグを付けることができます。

  • 以前の方法では、テキストとチェックボックスが含まれるラベルなど、テキストと要素が混在するノードでは機能しなかっTEXT_NODESたため、変換が適用されるのはこの方法だけです。innerHTML

サーバー側のソリューションと比較していくつかの顕著な欠点がありますが、いくつかの大きな利点もあります。その主な利点は、サーバー側がどのスタイルがどのコンテンツに適用されているかを意識することなく、カバレッジが保証されることです。コンテンツのいずれかがインデックスに登録され、Googleの概要に表示されている場合(たとえば)、配信時に小文字のままにしておくとはるかに優れています。

于 2012-01-05T13:13:25.857 に答える
4

Firefox Nightlyの次のバージョン(Firefox 14になるはずです)にはこの問題の修正があり、ハッキングなしでケースを処理する必要があります(CSS3仕様で要求されているとおり)。

残酷な詳細はそのバグで利用可能です:https ://bugzilla.mozilla.org/show_bug.cgi?id = 231162

彼らはまた、私が思うfont-variantの問題を修正しました(font-variantが何をするのかわからない人は、https://developer.mozilla.org/en/CSS/font-variantを参照してください。変更しますが、ドキュメントはブラウザに依存せず、Wikiなので...)

于 2012-03-29T20:21:40.230 に答える
0

この問題の根本的な原因は、これらすべてのブラウザで使用されているUnicodeライブラリによるこれらのトルコ語文字の誤った処理にあるはずです。したがって、そのためのフロントエンド側の修正があるとは思えません。

誰かがこの問題をこれらのユニコードライブラリの開発者に報告する必要があり、それは数週間/月で修正されるでしょう。

于 2010-09-28T15:27:34.170 に答える
0

text-transformとブラウザに依存できない場合は、サーバー上でテキストを大文字でレンダリングする必要があります(ユーザーが入力するときにテキストを大文字にしないでください)。そこでは、国際化に対するより良いサポートが必要です。

于 2010-09-29T15:44:11.790 に答える
0

この回避策には、Javascriptが必要です。それをしたくないが、テキストを前処理できるサーバー側があれば、このアイデアはそこでも機能します(私は思います)。

まず、トルコ語で実行しているかどうかを検出します。もしそうなら、大文字にしようとしているものをスキャンして、問題のある文字が含まれているかどうかを確認します。含まれている場合は、それらの文字をすべて大文字に置き換えてください。次に、大文字のCSSを適用します。問題のある文字はすでに大文字であるため、これは完全に問題のない(ゲットー)回避策であるはずです。Javascriptの場合、影響を受ける要素で.innerHTMLを処理する必要があると思います。

実装の詳細が必要な場合はお知らせください。Javascriptの文字列操作メソッドを使用してJavascriptでこれを行う方法を知っています。この一般的な考え方は、ほとんどの方法であなたをそこに導くはずです(そしてうまくいけば私に賞金をもらえます!)

-ブライアンJ.スティナー-

于 2010-09-29T16:46:10.323 に答える