I would like to write my own little plugin for language switching. For that, the very first thing would be to get the rewrite rules running. I have been looking around the web for 2 hours, but I couldn't find an answer to my question yet.

I would like to have it like this: http://www.mysite.com/de/post-title/ or http://www.mysite.com/de/projects/project-title/

So basically, what I'm trying to do is to keep the current url and all it's parameters, just add the currently active language snippet between the site url and the path. Here is my code so far:

function rewrite_rule_de(){
    add_rewrite_rule('^de/(.+?)/?$', 'index.php?p=$matches[1]&lang=de', 'bottom');
    global $wp_rewrite;
add_action('init', 'rewrite_rule_de');
  • A small hint to this plugin , there does that job, including the rewrite for each language.
    – bueltge
    Apr 1 '13 at 22:12
  • @rassoh, i am quite interested in learning this kind of plugin development. can you help in this to clear some quick queries on chat SO? Jan 13 at 9:19

I got it now , After searched many resources :

function lang_support() {
    return array('en','fr'); // Add your support lang-code (1st place is a default)

function rewrite_lang(){
    $langs = lang_support();
    foreach($langs as $lang) {

function lang(){
    global $wp_query;
    $langs = lang_support();
    $lang_r = "";
    foreach($langs as $lang) {
        if(isset($wp_query->query_vars[$lang])) {
            $lang_r = $lang;
            $_SESSION['lang'] = $lang_r;
    if(in_array($lang_r,$langs)) {
        return $lang_r;
    } else {
        return $langs[0];

function init_session(){session_start();}

function lang_session() { // Redirect by JS if session is set
    $url_lang= basename($_SERVER['REQUEST_URI']);
    if(!in_array($url_lang,lang_support()) && isset($_SESSION['lang'])) {
        if(!is_404()) {

function output_buffer() {ob_start();}

function currentURL() {
        return $pageURL;

Add this code in functions.php. After added code go to wp-admin/options-permalink.php and press Save Changes

So now you can check/use lang code in your template like..

<?php echo lang();?>

or if( lang() === "en" )

Example work urls with my example code :

http://domain.com/ <-- "en"
http://domain.com/en/ <-- "en"
http://domain.com/fr/ <-- "fr"
http://domain.com/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypage/ <-- "en" (work with "page")
http://domain.com/mypage/fr/ <-- "fr"
http://domain.com/mypage/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypost/ <-- "en" (work with "post")
http://domain.com/mypost/fr/ <-- "fr"
http://domain.com/mypost/es/ <-- "en" (coz , "es" code not set)

Better idea / bug fixer / found error + bug ? https://gist.github.com/l2aelba/5244912

  • 1
    Well, the plain functions with such generic names will quickly bring up conflicts. Should be prefixed or wrapped up in a pseudo namespace (class). And for a more safe check for SSL check this gist.
    – kaiser
    Apr 2 '13 at 1:04
  • 2
    This is great, thanks a lot l2aelba! While I will try it out like this, the more „classic“ approach would be to have the language code always in front of the rest of the link, e.g. [home_url][lang][mypost] or „domain.com/en/mypage“. Any ideas on how to accomplish this?
    – rassoh
    Apr 28 '13 at 23:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.