CSS:“text-transform:capitalize”和意大利语,西班牙语,葡萄牙语,法语等

时间:2014-01-10 17:16:15

标签: html css localization internationalization

CSS规则text-transform:capitalize的效果应该是什么? HTML标记中包含的文本是意大利语,西班牙语,葡萄牙语, 法语等...(这些语言AFAIK没有利用第一个大写 每个单词的字母,因为这是特定于英语而不是这些语言环境)。 我想的是你有一个多语言网站的情况 选择要从数据库中提取的内容的语言 从右上角的下拉菜单显示在页面上。 在这种情况下,因为CSS应该可能是相同的并且是独立的 语言,当开始标记是,

时,效果应该是什么
  

< html lang =“fr”>,< html lang =“pt”>,< html lang =“es”>,< html lang =“it”>等...

而不是

  

< html lang =“en”>

恕我直言这应该关闭“text-transform:capitalize”的行为, 如果我错了,请纠正我,或者是否应该在某些方面实现 另一方面,也许只能通过用另一个覆盖基本CSS文件 每种支持语言的CSS文件。

感谢您对CSS的I18N问题的回复。

3 个答案:

答案 0 :(得分:4)

根据CSS 2.1 definitiontext-transform: capitalize“将每个单词的第一个字符设为大写;其他字符不受影响“。

如果没有严格的“单词”定义,这是模糊的,但对于“大写”,唯一可行的解​​释是它是Unicode标准的字符大写映射。

规范补充说:“每种情况下的实际转换都是依赖于语言的。”合理的解释是,这是指一些依赖于语言的案例映射异常;例如,用土耳其语,“i”映射到“İ”(上面带有点的大写字母I),而不是普通的“我”。

对于用拉丁字母书写的文本,“单词”通常是字母字符的最大序列,但可以说是像“免税”这样的带连字符的单词是两个单词还是一个单词。无论如何,原则显然是每个字都是大写的。这使得设置相当无用,因为几乎没有任何语言具有这样的规则。在英语中,当作品的标题大写时,对文章和介词都有例外;但CSS属性不知道这样的规则。

CSS文本模块级别3(最后调用工作草案)中的definition更明确一些:“用于'大写'的”单词“的定义是UA依赖的;建议(但不要求)[UAX29]来确定这样的字边界。作者不应期望“大写”遵循特定语言的标准惯例(例如跳过英文文章)。“

这也意味着它不打算遵守有关问题的特定语言规则,一般来说,作品和类似表达的标题是否应该有大写字母。大多数语言没有这样的原则。

如果指定text-transform: capitalize,则无论语言是什么,无论语言是什么,都要求所有单词都大写,无论语言是什么。如果你认为这使得设置相当无用,那么你得出了正确的结论。

正确的本地化会在需要时将实际上下文中的单词大写。

答案 1 :(得分:3)

我同意你的观点,许多CSS指令的行为应该取决于 lang 属性的值。但问题是它没有。

出于这个原因,使用任何 text-transform 指令会向页面引入I18n错误。至少有(至少)原因:

  • 文本转换规则严格依赖于语言
  • 在某些语言中,首字母的情况会带来更多信息

在先前的案例中,人们通常会给出这三个例子:

  • 土耳其语两个“i”字符:点缀 i (大写版本:İ)和无点ı(大写版本: I )。如您所见,没有上下文无法正确转换
  • 德语字母s:ß根据语法规则应大写为两个字母 SS 。我有一段时间没有测试过它,但几个月前唯一能够正确使用的网络浏览器是Chrome ...
  • 希腊字母sigma有一个大写形式Σ,但有两个小写形式:σ(常规)和ς(最终)。使用两者中的任何一个取决于它们在单词中的位置。

还有更多具体案例转换的例子(特别是希腊语),我只想指出你真的需要语言信息才能正确转换案例。

在后一种情况下(附加含义),我只想指出,德语名词应该以大写字母开头,但其他的话不应该。它实际上可能会改变句子的含义,如果你只是将句子中的所有单词都大写(“标题为”它们)。

这个故事的寓意很简单:不使用文本转换指令。留给译员,他们会知道使用什么案例 哦,顺便说一句,相同的单词可能会根据上下文以不同的方式翻译,所以重新使用翻译并“纠正”案例实际上是 坏主意

答案 2 :(得分:0)

但是,您要在HTML标记中设置语言,还可以将类附加到给定语言的HTML标记中。

<html lang="fr" class="lang-fr">

然后在你的css中,你可以使用语言选择器来定位元素。

EG:

.lang-fr p {
  text-transform: none;
}