如何根据活动语言将CSS类添加到<body>


8

我正在设计一个多语言站点,我希望在此基础上将某些样式建立在活动语言的基础上。

这样想:

body.en-uk li.artist:before {content:"Artist: "}
body.it-it li.artist:before {content:"Artista: "}
body.de-de li.artist:before {content:"Künstler"}

是否有人知道能够执行此操作的扩展(即,根据活动语言向标签添加类)?


1
仅一小点;在此示例中,您正在基于语言修改内容,而不是样式。当然,您已经可以在Joomla中非常轻松地完成此操作,根本不需要任何CSS。
塞斯·沃伯顿

Answers:


14

实际上,您的问题有一个更简单的解决方案。任何合理的模板(包括Joomla CMS随附的所有模板)都将lang在HTML元素上设置属性。这使您可以使用CSS :lang()伪选择器。

您的示例如下所示:

li.artist:lang(en):before {content:"Artist: "}
li.artist:lang(it):before {content:"Artista: "}
li.artist:lang(de):before {content:"Künstler"}

这有两个优点。对于初学者来说,无论模板如何,它都可以使用,甚至可以使用Joomla以外的解决方案,因为它们都是在浏览器中完成的。

只要lang属性设置正确,它也可以与其他语言的嵌入零件配合使用。例如:

<html lang="en">
  <head>
    <style>
     blockquote:lang(de) { color: red; }
     blockquote:lang(en) { color: red; }
    </style>
  </head>
  <body>
    <p>A famous German quote is:</p>
    <blockquote lang="de">
      <p>Den Wald vor lauter Bäumen nicht sehen</p>
    </blockquote>
    <p>A famous English quote is:</p>
    <blockquote>
      <p>Listen to many, speak to a few.</p>
    </blockquote>
  <body>
</html>

最后,Joomla不仅输出语言,还输出语言环境。因此,您的一个站点可能会使用en-GB,另一个站点可能会使用en-US,并且模板会反映出来。使用:lang(en)将匹配其中之一,但您也:lang(en-US)可以只将美国英语作为目标。


谢谢您的回答Rouven:非常有趣,我也会对此进行试验。
smz 2014年

好吧,鲁文,总而言之,我必须说采用了您的方法:非常优雅,甚至没有对模板做任何细微的修改,它让我看到了我现在尝试利用的更多可能性(多语言自定义HTML模块)和文章...)。再次感谢,当然也感谢@Bakual和Lodder!
smz 2014年

太棒了 格列德听到我可以提供一些启发。
鲁文·韦斯林2014年

这是一个绝妙的答案,我不知道!
codinghands

5

我只需要修改模板的index.php文件,然后直接在其中添加类即可。

<body class="<?php echo $this->language; ?>">

将当前语言作为类别分配给body标签。


很棒:甚至更简单!
smz 2014年

感谢Bakual:我将您的代码添加到了模板中,它可以正常工作。我“接受”了您的回答。
smz 2014年

我正在寻找做类似的事情以将别名添加到body类。但是我不想在更新的情况下覆盖模板。我当时正在考虑创建系统插件,但是有没有办法添加此类,还是应该只使用JavaScript?
Eoin

3

关于Rouven方法的一件小事;浏览器对属性选择器的支持比对语言伪选择器的支持要好,因此您可能需要考虑使用类似以下的方法来定位样式:

[lang="en-GB"] .artist {…}

谢谢,@ Seth!我将尝试您的定位解决方案。如何同时定位?这将使解决方案更加兼容吗?
smz 2014年

这将使您的选择器资格过高或增加不必要的膨胀。最短的选择器始终是最佳选择,因为它会降低特异性,使您可以在需要时轻松覆盖它。选择器越具体,覆盖的难度就越大,这就是为什么永远不要在CSS中使用ID的原因。两者都不会给您带来更多的浏览器兼容性。
塞斯·沃伯顿

你好,@ Seth!我尝试了您的解决方案,但它似乎无法正常工作,至少与我的Joomla一样!现场。据我了解,有关正在使用的语言的唯一指示在于<html>指令,该指令读取:<html xmlns =“ w3.org/1999/xhtml ” xml:lang =“ it-it” lang =“ it -it“>如果是意大利文,则<html xmlns =” w3.org/1999/xhtml “ xml:lang =” en-gb“ lang =” en-gb“>如果是英语。这是否足以满足您的定位解决方案?似乎并非如此……
smz 2014年

是的,此选择器基于属性定位html元素,在这种情况下为语言。但是,属性区分大小写,因此您需要使用:[lang =“ en-gb”]
塞斯·沃伯顿

1

在模板的index.php中,您可以将当前<body>标签替换为以下内容:

<?php $lang = JFactory::getLanguage(); ?>
<body class="<?php echo $lang->getTag(); ?>">

这将输出以下示例:

<body class="en-GB">

不幸的是,我因没有足够的声誉而无法投票给您... :-(
smz 2014年

1
实际上,@ Bakual的答案是更好的方法。它更快,更容易;)
Lodder 2014年

1
是的,不需要获取语言。它已经在模板中可用了:)
Bakual,2014年

您无法投票,但是您可以选择一个帖子作为答案:)只要您愿意就可以选择(如果没有帖子可以回答您的问题,请直接回答)。最好的答案最终将获得最多的投票。
TryHarder 2014年

@Bakual-我的愚蠢错误。原因是我刚刚回答了一个与语言相关的问题,所以不涉及模板大声笑
Lodder 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.