Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 希腊文和文本转换:大写_Javascript_Css_Internationalization - Fatal编程技术网

Javascript 希腊文和文本转换:大写

Javascript 希腊文和文本转换:大写,javascript,css,internationalization,Javascript,Css,Internationalization,我编写了一个web应用程序,其中包含几种语言的翻译(其中一种是希腊语) 当在标题上显示某个翻译时,设计规则是文本应该是大写的,这在世界上任何其他语言中都是可以的,但是当涉及到希腊语时,浏览器不知道如何处理重音(请参阅),因此他们显示了错误的大写字符串 从我上面链接的补丁中,我将其转换为Javascript,运行了一些针对它的用例,并且运行正常。现在我要做的就是: 如果不向每个需要大写的元素(有很多)添加uppercase类,我可以使用computed样式属性查询DOM?Ie.给我所有具有计算的文

我编写了一个web应用程序,其中包含几种语言的翻译(其中一种是希腊语)

当在标题上显示某个翻译时,设计规则是文本应该是大写的,这在世界上任何其他语言中都是可以的,但是当涉及到希腊语时,浏览器不知道如何处理重音(请参阅),因此他们显示了错误的大写字符串

从我上面链接的补丁中,我将其转换为Javascript,运行了一些针对它的用例,并且运行正常。现在我要做的就是:


如果不向每个需要大写的元素(有很多)添加
uppercase
类,我可以使用computed样式属性查询
DOM
?Ie.给我所有具有计算的
文本转换的元素:大写

好的,仅供参考,我的解决方案如下:

GREEK_CHARS = {
  LOWER_ALPHA                : 0x03B1
  LOWER_ALPHA_ACC            : 0x03AC
  LOWER_EPSILON              : 0x03B5
  LOWER_EPSILON_ACC          : 0x03AD
  LOWER_ETA                  : 0x03B7
  LOWER_ETA_ACC              : 0x03AE
  LOWER_IOTA                 : 0x03B9
  LOWER_IOTA_ACC             : 0x03AF
  LOWER_IOTA_ACC_DIAERESIS   : 0x0390
  LOWER_OMICRON              : 0x03BF
  LOWER_OMICRON_ACC          : 0x03CC
  LOWER_UPSILON              : 0x03C5
  LOWER_UPSILON_ACC          : 0x03CD
  LOWER_UPSILON_ACC_DIAERESIS: 0x03B0
  LOWER_OMEGA_ACC            : 0x03CE
  UPPER_ALPHA                : 0x0391
  UPPER_EPSILON              : 0x0395
  UPPER_ETA                  : 0x0397
  UPPER_IOTA                 : 0x0399
  UPPER_IOTA_DIAERESIS       : 0x03AA
  UPPER_OMICRON              : 0x039F
  UPPER_UPSILON              : 0x03A5
  UPPER_UPSILON_DIAERESIS    : 0x03AB
  UPPER_OMEGA                : 0x03A9
  UPPER_ALPHA_ACC            : 0x0386
  UPPER_EPSILON_ACC          : 0x0388
  UPPER_ETA_ACC              : 0x0389
  UPPER_IOTA_ACC             : 0x038A
  UPPER_OMICRON_ACC          : 0x038C
  UPPER_UPSILON_ACC          : 0x038E
  UPPER_OMEGA_ACC            : 0x038F
  COMBINING_ACUTE_ACCENT           : 0x0301
  COMBINING_DIAERESIS              : 0x0308
  COMBINING_ACUTE_TONE_MARK        : 0x0341
  COMBINING_GREEK_DIALYTIKA_TONOS  : 0x0344
}

String::toUpperCaseWithoutGreek = String::toUpperCase
String::toUpperCase = ->
  newStringCharCodes  = []
  insideTag           = false
  for char, idx in this
    insideTag = true if char == '<'
    insideTag = false if char == '>'
    charCode      = char.charCodeAt(0)

    if insideTag
      newStringCharCodes.push charCode
      continue

    prev          = if idx > 0 then newStringCharCodes[idx-1] else GREEK_CHARS.UPPER_ALPHA
    prevPrev      = if idx > 1 then newStringCharCodes[idx-2] else GREEK_CHARS.UPPER_ALPHA
    prevPrevPrev  = if idx > 2 then newStringCharCodes[idx-3] else GREEK_CHARS.UPPER_ALPHA

    switch charCode
      when GREEK_CHARS.LOWER_ALPHA_ACC, GREEK_CHARS.UPPER_ALPHA_ACC
        newStringCharCodes.push GREEK_CHARS.UPPER_ALPHA
      when GREEK_CHARS.LOWER_EPSILON_ACC, GREEK_CHARS.UPPER_EPSILON_ACC
        newStringCharCodes.push GREEK_CHARS.UPPER_EPSILON
      when GREEK_CHARS.LOWER_ETA_ACC, GREEK_CHARS.UPPER_ETA_ACC
        newStringCharCodes.push GREEK_CHARS.UPPER_ETA
      when GREEK_CHARS.LOWER_IOTA_ACC, GREEK_CHARS.UPPER_IOTA_ACC
        newStringCharCodes.push GREEK_CHARS.UPPER_IOTA
      when GREEK_CHARS.LOWER_IOTA_ACC_DIAERESIS
        newStringCharCodes.push GREEK_CHARS.UPPER_IOTA_DIAERESIS
      when GREEK_CHARS.LOWER_OMICRON_ACC, GREEK_CHARS.UPPER_OMICRON_ACC
        newStringCharCodes.push GREEK_CHARS.UPPER_OMICRON
      when GREEK_CHARS.LOWER_UPSILON_ACC, GREEK_CHARS.UPPER_UPSILON_ACC
        newStringCharCodes.push GREEK_CHARS.UPPER_UPSILON
      when GREEK_CHARS.LOWER_UPSILON_ACC_DIAERESIS
        newStringCharCodes.push GREEK_CHARS.UPPER_UPSILON_DIAERESIS
      when GREEK_CHARS.LOWER_OMEGA_ACC, GREEK_CHARS.UPPER_OMEGA_ACC
        newStringCharCodes.push GREEK_CHARS.UPPER_OMEGA

      when GREEK_CHARS.LOWER_IOTA
        switch prev
          when GREEK_CHARS.LOWER_ALPHA_ACC, GREEK_CHARS.LOWER_EPSILON_ACC, GREEK_CHARS.LOWER_OMICRON_ACC
            newStringCharCodes.push GREEK_CHARS.UPPER_IOTA_DIAERESIS
          when GREEK_CHARS.LOWER_UPSILON_ACC
            if prevPrev == GREEK_CHARS.LOWER_OMICRON
              newStringCharCodes.push GREEK_CHARS.UPPER_IOTA
            else
              newStringCharCodes.push GREEK_CHARS.UPPER_IOTA_DIAERESIS
          when GREEK_CHARS.COMBINING_ACUTE_ACCENT, GREEK_CHARS.COMBINING_ACUTE_TONE_MARK
            switch prevPrev
              when GREEK_CHARS.LOWER_ALPHA, GREEK_CHARS.LOWER_EPSILON, GREEK_CHARS.LOWER_OMICRON
                newStringCharCodes.push GREEK_CHARS.UPPER_IOTA_DIAERESIS
              when GREEK_CHARS.LOWER_UPSILON
                if prevPrevPrev == GREEK_CHARS.LOWER_OMICRON
                  newStringCharCodes.push GREEK_CHARS.UPPER_IOTA
                else
                  newStringCharCodes.push GREEK_CHARS.UPPER_IOTA_DIAERESIS
              else
                newStringCharCodes.push GREEK_CHARS.UPPER_IOTA
          else
            newStringCharCodes.push GREEK_CHARS.UPPER_IOTA

      when GREEK_CHARS.LOWER_UPSILON
        switch prev
          when GREEK_CHARS.LOWER_ALPHA_ACC, GREEK_CHARS.LOWER_EPSILON_ACC, GREEK_CHARS.LOWER_ETA_ACC, GREEK_CHARS.LOWER_OMICRON_ACC
            newStringCharCodes.push GREEK_CHARS.UPPER_UPSILON_DIAERESIS
          when GREEK_CHARS.COMBINING_ACUTE_ACCENT, GREEK_CHARS.COMBINING_ACUTE_TONE_MARK
            switch prevPrev
              when GREEK_CHARS.LOWER_ALPHA, GREEK_CHARS.LOWER_EPSILON, GREEK_CHARS.LOWER_ETA, GREEK_CHARS.LOWER_OMICRON
                newStringCharCodes.push GREEK_CHARS.UPPER_UPSILON_DIAERESIS
              else
                newStringCharCodes.push GREEK_CHARS.UPPER_UPSILON
          else
            newStringCharCodes.push GREEK_CHARS.UPPER_UPSILON

      when GREEK_CHARS.COMBINING_GREEK_DIALYTIKA_TONOS
        newStringCharCodes.push GREEK_CHARS.COMBINING_DIAERESIS
      when GREEK_CHARS.COMBINING_ACUTE_ACCENT, GREEK_CHARS.COMBINING_ACUTE_TONE_MARK
        if prev < GREEK_CHARS.LOWER_OMEGA_ACC && prev > GREEK_CHARS.UPPER_ALPHA_ACC
          newStringCharCodes.push null
      else
        newStringCharCodes.push(String.fromCharCode(charCode).toUpperCaseWithoutGreek().charCodeAt(0))

  String.fromCharCode.apply(null, newStringCharCodes)
从任何角度来看,这都不是很好,但它确实有效


有两件事我不应该在这里做,而且可能会改变:劫持
toUpperCase()
,并且有不解析标记的特定规则。仍然可以接受更好的建议

这对希腊字符没有帮助,但我很想找到所有具有给定css属性的元素。 我设置了这个:

您感兴趣的是:

$('*').each(function() {
            if ($(this).css('text-transform') == 'uppercase') {
                //Do Stuff to the element
            }
        });
不过,遍历所有元素可能是一件相当昂贵的事情。 希望能有帮助

干杯,
iso

我强烈建议不要为此使用jQuery。而是这样做:

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.
    }
}
var e=document.getElementsByTagName('*'),l=e.length,i;
if(getComputedStyle的类型==“未定义”)
getComputedStyle=函数(e){返回e.currentStyle;};

对于(i=0;i我可以向你保证,不仅希腊语受到影响,你肯定在德语和土耳其语方面有问题

我真的不知道使用这些转换的目的是什么,但请记住,许多语言使用的脚本都没有大写和小写字符的概念。如果您使用它来强调,我建议完全删除所有转换,只需使用适当的大小写部分文本。这译者可能会决定如何强调单词或句子


顺便说一句,允许在翻译中使用特定类的span元素也可能是一个好主意-这样可能会有人使用颜色来以不同的方式标记文本(尽管它不会真正帮助色盲的人)。

我正在使用这个PHP函数:

function toUpper($str){
        $search = array('Ά', 'Έ', 'Ί', 'Ή', 'Ύ', 'Ό', 'Ώ');
        $replace = array('Α', 'Ε', 'Ι', 'Η', 'Υ', 'Ο', 'Ω');
        $str = mb_strtoupper($str,  "UTF-8");
        return str_replace($search, $replace, $str);
    }

上述示例3描述了该问题的解决方案

这应该适用于任何浏览器(仅在Firefox25上测试)

HTML:

您还可以在更高级别上使用lang属性,例如在body标记处

HTML:


我喜欢Otovo的回答,因为它是最优雅、最快速的。我当然不建议扫描所有元素以进行
文本转换
。对于移动设备上的大页面,速度效率低下是显而易见的

因此,我建议只需记下CSS文件中带有
文本转换的所有选择器。这在大多数情况下都是可能的。然后,直接在这些选择器上使用jQuery

因此,为了扩展Otovo的答案,在
body
中的某个地方为每种语言添加一个独特的类,如
i18n el
(这是Drupal的默认值,但任何类似的都可以使用)。然后运行:

$('.i18n-el').find('.all-relevant-selectors').attr('lang', 'el');
显然,将
替换为所有相关的选择器
,替换为从CSS文件中记下的选择器,用逗号分隔

另外,值得一提的是,这只适用于
文本转换:大写
,而不适用于chrome39的
字体变体:小写


或者,有一个jQuery插件用于此问题,虽然我根本没有对它进行评估。

您的方法的问题是它没有那么简单。一些转换依赖于前一个、前两个或前三个字母。老实说,我不明白您的意思。我发布的函数都大写了没有压力标记的ters,其余部分使用stru替换。现在,作为一个希腊人,相信我,这是一种服务器端方法,自从你说你在使用PHP后,我就发布了它。现在,我已经在几个网站上使用过它,从来没有任何问题。以前的信件与此无关。因为这是我的母语,我知道它是否会被使用解释错了!:p.p.S.我从这里得到了我的解决方案的内部工作原理:我没有使用PHP(我在服务器端使用Ruby)这是一个表示规则,所以它适合Javascript。这个补丁错了吗?我应该用更简单的东西替换我的吗?我不知道Ruby,但如果我遇到任何有用的东西,我会发布它!你没有回答评论中的问题;-)我链接的补丁错了吗?在IE和Chrome中不工作,对于Chrome,如果您将lang=“el”添加到html标记中,它将起作用
<body>
  <p id="withlang" lang="el">κεφαλαία με μετατροπή σύμφωνα με την γλώσσα</p>
  <p id="withoutlang">κεφαλαία με μετατροπή σύμφωνα με αντιστοιχίσεις unicode</p>
  <p id="withlangsmall" lang="el">μικρά κεφαλαία με μετατροπή σύμφωνα με την γλώσσα</p>
  <p id="withoutlangsmall">μικρά κεφαλαία με μετατροπή σύμφωνα με αντιστοιχίσεις unicode</p>
</body>
#withlang, #withoutlang{
  text-transform: uppercase;
}

#withlangsmall, #withoutlangsmall{
  font-variant: small-caps;
}
<body lang="el">
  <p id="withlang">κεφαλαία με μετατροπή σύμφωνα με την γλώσσα</p>
  <p id="withlangsmall">μικρά κεφαλαία με μετατροπή σύμφωνα με την γλώσσα</p>
</body>
#withlang{
  text-transform: uppercase;
}

#withlangsmall{
  font-variant: small-caps;
}
$('.i18n-el').find('.all-relevant-selectors').attr('lang', 'el');