Life and Trials of a Multilingual Weblog

[fr] J'explique ici quelles sont les modifications que j'ai faites à WordPress pour gérer le bilinguisme de mon weblog -- code php et css à l'appui. Je mentionne également quelques innovations que j'ai en tête pour rendre ce weblog plus sympathique à mes lecteurs monolingues (ce résumé en est une!) Un canal pour le weblogging multilingue a été ouvert sur TopicExchange, et vous y trouverez peut-être d'autres écrits sur le même sujet. Utilisez-le (en envoyant un trackback) si vous écrivez des billets sur le multinguisme dans les weblogs!

My weblog is bilingual, and has been since November 2000. Already then, I knew that I wouldn’t be capable of producing a site which duplicates every entry in two languages.

I think this would defeat the whole idea of weblogging: lowering the “publication barrier”. I feel like writing something, I quickly type it out, press “Publish”, and there we are. Imposing upon myself to translate everything just pushes it back up again. I have seen people try this, but I have never seen somebody keep it up for anything nearing four years (this weblog is turning four on July 13).

This weblog is therefore happily bilingual, as I am — sometimes in English, sometimes in French. This post is about how I have adapted the blogging tools I use to my bilingualism, and more importantly, how I can accommodate my monolingual readers so that they also feel comfortable here.

First thing to note: although weblogging tools are now ready to be used by people speaking a variety of languages (thanks to a process named “localization”), they remain monolingual. Language is determined at weblog-level.

With Movable Type, I used categories to emulate post-level language awareness. This wasn’t satisfying at all: I ended up with to monstrous categories, Français and English, which didn’t help keep rebuild times down.

With WordPress, the solution is far more satisfying: I store the language information as Post Meta, or “custom field”. No more category exploitation for something they shouldn’t be used for.

Before I really got started doing the exciting stuff, I made a quick change to the WordPress admin interface. If I was going to be adding a “language” custom field to each and every post of mine, I didn’t want to be doing it with the (imho) rather clumsy “Custom Fields” form.

In edit.php, just after the categorydiv fieldset, I inserted the following:

<fieldset id="languagediv">
      <legend>< ?php _e('Language') ?></legend>
      <div><input type="text" name="language" size="7"
                     tabindex="2" value="en" id="language" /></div>
</fieldset>

(You’ll probably have to move around your tabindex values so that the tabbing order makes sense to you.)

I also tweaked the wp-admin.css file a bit to keep it looking reasonably pretty, adding the rule below:

#languagediv {
    height: 3.5em;
    width: 5em;
}

and adding #languagediv everywhere I could see #poststatusdiv, so that they obeyed the same rules.

In this way, I have a small text field to edit to set the language. I pre-set it to “en”, and have just to change it to “fr” if I am writing in French.

We just need to add a little piece of code in the form processing script, post.php, just after the line that says add_meta($post_ID):

 // add language
    if(isset($_POST['language']))
    {
    $_POST['metakeyselect'] = 'language';
        $_POST['metavalue'] = $_POST['language'];
        add_meta($post_ID);
        }

The first thing I do with this language information is styling posts differently depending on the language. I do this by adding a lang attribute to my post <div>:

<div class="post" lang="<?php $post_language=get_post_custom_values("language"); $the_language=$post_language['0']; print($the_language); ?>">

In the CSS, I add these rules:

div.post:lang(fr) h2.post-title:before {
  content: " [fr] ";
  font-weight: normal;
}
div.post:lang(en) h2.post-title:before {
  content: " [en] ";
  font-weight: normal;
}
div.post:lang(fr)
{
background-color: #FAECE7;
}

I also make sure the language of the date matches the language of the post. For this, I added a new function, the_time_lg(), to my-hacks.php. I then use the following code to print the date: <?php the_time_lg($the_language); ?>.

Can more be done? Yes! I know I have readers who are not bilingual in the two languages I use. I know that at times I write a lot in one language and less in another, and my “monolingual” readers can get frustrated about this. During a between-session conversation at BlogTalk, I suddenly had an idea: I would provide an “other language” excerpt for each of my posts.

I’ve been writing excerpts for each of my posts for the last six months now, and it’s not something that raises the publishing barrier for me. Quickly writing a sentence or two about my post in the “other language” is something I can easily do, and it will at least give my readers an indication about what is said in the posts they can’t understand. This is the first post I’m trying this with.

So, as I did for language above, I added another “custom field” to my admin interface (in edit-form.php). Actually, I didn’t stop there. I also added the field for the excerpt to the “simple controls” posting page that I use (set that in Options > Writing), and another field for keywords, which I also store for each post as meta data. Use at your convenience:

<!-- BEGIN BUNNY HACK -->
<fieldset style="clear:both">
<legend><a href="http://wordpress.org/docs/reference/post/#excerpt"
title="<?php _e('Help with excerpts') ?>"><?php _e('Excerpt') ?></a></legend>
<div><textarea rows="1" cols="40" name="excerpt" tabindex="5" id="excerpt">
<?php echo $excerpt ?></textarea></div>
</fieldset>
<fieldset style="clear:both">
<legend><?php _e('Other Language Excerpt') ?></legend>
<div><textarea rows="1" cols="40" name="other-excerpt"
tabindex="6" id="other-excerpt"></textarea></div>
</fieldset>
<fieldset style="clear:both">
<legend><?php _e('Keywords') ?></legend>
<div><textarea rows="1" cols="40" name="keywords" tabindex="7" id="keywords">
<?php echo $keywords ?></textarea></div>
</fieldset>
<!-- I moved around some tabindex values too -->
<!-- END BUNNY HACK -->

I inserted these fields just below the “content” fieldset, and styled the #keywords and #other-excerpt textarea fields in exactly the same way as #excerpt. Practical translation: open wp-admin.css, search for “excerpt”, and modify the rules so that they look like this:

excerpt, #keywords, #other-excerpt {

height: 1.8em;
width: 98%;

}

instead of simply this:

excerpt {

height: 1.8em;
width: 98%;

}

I’m sure by now you’re curious about what my posting screen looks like!

To make sure the data in these fields is processed, we need to add the following code to post.php (as we did for the “language” field above):

// add keywords
    if(isset($_POST['keywords']))
    {
    $_POST['metakeyselect'] = 'keywords';
        $_POST['metavalue'] = $_POST['keywords'];
        add_meta($post_ID);
        }
   // add other excerpt
    if(isset($_POST['other-excerpt']))
    {
    $_POST['metakeyselect'] = 'other-excerpt';
        $_POST['metavalue'] = $_POST['other-excerpt'];
        add_meta($post_ID);
        }

Displaying the “other language excerpt” is done in this simple-but-not-too-elegant way:

<?php
$post_other_excerpt=get_post_custom_values("other-excerpt");
$the_other_excerpt=$post_other_excerpt['0'];
if($the_other_excerpt!="")
{
    if($the_language=="fr")
    {
    $the_other_language="en";
    }

if($the_language=="en")
{
$the_other_language="fr";
}

?>

    <div class="other-excerpt" lang="<?php print($the_other_language); ?>">
    <?php print($the_other_excerpt); ?>
    </div>
  <?php
  }
  ?>

accompanied by the following CSS:

div.other-excerpt:lang(fr)
{
background-color: #FAECE7;
}
div.other-excerpt:lang(en)
{
background-color: #FFF;
}
div.other-excerpt:before {
  content: " [" attr(lang) "] ";
  font-weight: normal;
}

Now that we’ve got the basics covered, what else can be done? Well, I’ve got some ideas. Mainly, I’d like visitors to be able to add “en” or “fr” at the end of any url to my weblog, and that would automatically filter out all the content which is not in that language — maybe using the trick Daniel describes? In addition to that, it would also change the language of what I call the “page furniture” — titles, footer, and even (let’s by ambitious) category names. Adding language sensitivity to trackbacks and comments could also be interesting.

A last thing I’ll mention in the multilingual department for this weblog is my styling of outgoing links if they are written in a language which is not my post language, using the hreflang attribute. It’s easy, and you should do it too!

Suw (who has just resumed blogging in Welsh) and I have just set up a “Multilingual blogging” channel on TopicExchange — please trackback it if you write about blogging in more than one language!

Similar Posts:

This entry was posted in Language Geekiness, Wordpress and tagged admin, administration, attribute, bilingual, blog, blogging, blogtalk, category, change, code, css, custom, data, differenciate, excerpt, exchange, field, hacks, hreflang, interface, keywords, lang, language, Languages / Linguistics, link, Meta, modify, monolingual, movable type, multilingual, outgoing, php, post, printscreen, reader, Real Live Code, screenshot, style, suw, topic, topicexchange, Weblog Technology, welsh, Wordpress. Bookmark the permalink.

38 Responses to Life and Trials of a Multilingual Weblog

  1. Pingback: Sidney's Blog » Give respect where it’s due

  2. Steph says:

    I’m still tweaking the display of the “other-excerpt” text. If you have any comments about that, I’d love to hear them.

  3. Steph says:

    I'm still tweaking the display of the “other-excerpt” text. If you have any comments about that, I'd love to hear them.

  4. Pingback: Chocolate and Vodka

  5. Pingback: Mathemagenic

  6. Pingback: Fragments

  7. Pingback: Al Hoang's Weblog

  8. Pingback: Res Retica &raquo; Actualizando a WordPress 1.2.1

  9. Steph says:

    Seems like my code bits have been messed up. Major slashes issue. Don’t copy-paste blindly.

  10. Pingback: Climb to the Stars (Stephanie Booth)

  11. Basic Bilingual Plugin

    This is a simple plugin which wraps together my bilingual hacks to make day-to-day posting less of a hassle….

  12. Pingback: bitsenbloc » Stephanie Booth

  13. Pingback: E-diosyncratic » Blog Archive » Bilingual blog (1)

  14. Pingback: E-diosyncratic » Blog Archive » Bilingual Blog(2)

  15. Riad says:

    Stephanie, ca marche super pour les posts. Par contre, pour les pages, ca ne s affiche pas en haut de la page d edition et je n arrive pas a entrer la langue ou l excerpt en bas de page, ca ne se met pas ajour. A part ca, felicitations

  16. Pingback: CyberThoughts 2.0 » Archive du blog » Déjà  ?

  17. Pingback: CyberThoughts 2.0 » Archive du blog » News éclairs !

  18. Pingback: Climb to the Stars (Stephanie Booth) » Requirements for a Multilingual Wordpress Plugin

  19. Pingback: Multilingual Proposals (Reboot, BlogCamp) at Climb to the Stars (Stephanie Booth)

  20. Pingback: Climb to the Stars (Stephanie Booth)

  21. krokodilo says:

    Bonjour, je viens d’écouter votre conférence sur fishBabel et le plurilinguisme. A moins que j’aie mal compris un passage, je suis très étonné que, dans les solutions, vous ne fassiez aucune mention de l’espéranto, qui est tout de même le meilleur des ponts entre cultures dont vous parlez, bien qu’il soit boycotté par les médias nationaux français et allemands, c’est-à-dire par les langues de grande diffusion qui raisonnent comme d’anciennes pussances coloniales surtout désireuses de garder leur influence linguistique, sans se soucier de vaincre la barière des langues qui isole les gens, et les blogs comme vous l’avez bien expliqué. L’espéranto est la solution la plus simple, la plus efficace, la plus équitable aussi, celle qui respecte le mieux toutes les langues, car en étant au moins dix fois plus facile que les autres langues, son usage plus large en tant que langue auxiliaire libérerait du temps pour l’apprentissage des autres langues étrangères, choisies cette fois selon le métier, le pays où l’on va travailler, loin de l’absurdité d’une hégémonie de l’anglais qui oblige tous les petits Italiens et presque tous les enfants français à l’apprendre de plus en plus tôt, pour un résultat médiocre. De plus, c’est pour l’Union européenne une solution de splus injustes, de même qu’en Suisse vous ne osuhaitez pas privilégier une de vos quatre langues.

  22. krokodilo says:

    Je rajoute simplement que le récent forum européen lancé par le commissaire Orban et le service du plurilinguisme, sur le thème “Pourquoi apprendre les langues ?”, est un bel exemple du vrai plurilinguisme que peut apporter l’espéranto, car de nombreux espérantophones de différentes langues y sont intervenus : or, presque tous les messages sont rédigés en au moins deux langues. Il n’existe pas de blog aussi diversifé où le dialogue et l’intercompréhension soient une réalité. http://forums.ec.europa.eu/multilingualism/fr/

  23. Basic Bilingual 0.3 for Multilingual Blogging…


    Long overdue, an upgrade of my plugin Basic Bilingual. Grab the tgz archive or check out the code.


    Some explanations. First, you all know of my long-standing interest in all things multilingual and in multilingual blogging in particular.


    Years ago, I…

  24. Pingback: Bilingual Blog(2) | Idiosyncrasy

  25. Pingback: Bilingual blog (1) | Idiosyncrasy

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>