[development] Proposal to make drupal support RTL languages out of the box

Munzir Taha munzirtaha at gmail.com
Sat Mar 11 18:43:23 UTC 2006

No doubt drupal is a great piece of work and the people behind it have done a 
great job and we are all thankful to them. However, being the first time to 
deal with it, I faced many problems regarding Arabic support. I, and another 
friend, Mugtaba, decided to lend a hand as a reward. We began with the 
translation of 4.7beta branch and almost finished it. Then we turned to the 
problem of RTL/BiDi and found the work of Ayman who has thankfully made his 
own bidi-theme. We thought about it carefully and found that Drupal has the 
flexibility to support RTL for all the themes out of the box with a trivial 
modifications to drupal files. So, instead of having themes for RTL which is 
different than the themes for LTR, we would patch all the themes to support 
both RTL and LTR.

The problem:
In RTL languages the direction should be set to be from right to left and 
hence everything on the page should be mirrored horizontally. Graphical 
arrows that point to the right, should now point to the left. Things that 
float right, should now float left. padding-left values, should go to 
padding-right values and vice versa. Other rules which are not direction 
oriented would remain the same.

The solution is to have a drupal_RTL.css file. I will shortly show an example 
of that file. This file should be loaded from common.inc in addition to 
drupal.css in case of RTL languages to override a few rules of the defaults.

This way drupal would support RTL language and mambo and zope/plone won't have 
an advantage on this issue ;).

// $Id: drupal_RTL.css, v 0.01 $
/* Override styles from drupal.css */

** HTML elements
table {
  direction: rtl;
th {
  text-align: right;
  padding-right: 0em;
  padding-left: 1em;

** Menu styles
ul.menu {
ul.menu li {
  margin: 0 0.5em 0 0;

//This rule uses a copy of the original image flipped horizontally.
li.collapsed {
  list-style-image: url('images/menu-collapsed-rtl.png');

I will attach a complete file.

For now, temporary I put the logic into my own template.php like this

// $Id: template.php, v 0.01 $
 * Catch and override the theme_stylesheet_import function from theme.inc

function phptemplate_stylesheet_import($path, $media = 'all') {
  $rtl = array("ar", "fa", "he", "ur", "yi");
  if (in_array(locale_initialize(), $rtl)) {
    if (file_exists(path_to_theme() . '/drupal_RTL.css')) {
      theme_add_style(path_to_theme() . '/drupal_RTL.css', $media);
    if (file_exists(path_to_theme() . '/RTL.css')) {
      theme_add_style(path_to_theme() . '/RTL.css', $media);
  return theme_stylesheet_import($path, $media);

Which would work but would require an unnecessary step of duplicating this 
same file in all the themes directories.

When we make this clear in the documentation, the developers of the themes 
could make their design in a more or less symmetric way that doesn't even 
require a separate RTL.css file but when the need arises, the theme author or 
any one interested could very easily make that file available and official 
part of the theme. As an example, I quickly tested the theme fancy and here 
is a minimal file that works.

// $Id: RTL.css, v 0.01 $
/* Override styles from style.css */
#logo img {
  float: right;
#menu {
  text-align: left;
#primary-tabs {
  float: left;
.bleft {
  width: 10px;
.bleft-img {
  background: #ce5003 url(images/cr.png) no-repeat top right;
.bright-img {
  background: #ce5003 url(images/cl.png) no-repeat top right;

Hope this would help solve the problem in a neat way.

Munzir Taha
Telecommunications and Electronics Engineer
Maintainer of Fedora Arabic Translation Project
Maintainer of the OpenBugs project page at
Master CIW Designer, ICDL, MOUS, Linux+, LPI 101
Riyadh, SA

More information about the development mailing list