WPML, multi-language support for WordPress
If you ever want to build a multi-language WordPress website there is IMHO just one working solution and that is to use the WPML plugin. With WPML is relatively easy to build complex multi-language websites with all kind of options for the translation of not only posts and pages but also for plugins and themes.

Screen Shot 2013-05-31 at 2.56.59 PM

The only thing what can be somewhat confusing for users/contributors is the back-end interface for creating posts and pages. When using the standard WordPress environment, a post will only be created in the default language and therefore its content will appear only on a part of the site. WPML does of course have extensive capabilities for posting in multiple languages but users will have to remember to tick a number of extra boxes to make this happen. In short some extra steps are required to make sure that post and pages appear in all the different languages the site supports.

Easy multi-language posts via a front-end form
To make it somewhat easier for users to add post to their sites I have set up a front-end form for them and with a little help from WPML support (these guys really know their stuff) I have created some PHP code which enhances the standard wp_insert_post() call. With this enhancement, content will be created in all the languages you want. In my case in just the two languages (english and french) I needed, but you can of course add as many languages you want. In effect you create a post per language, in my case with exact the same content, and then tie them together in the WPML tables based on the trid (translation id) from the original post that will connect the translation to the original. And if you want specific content per language you can just do that by changing the value of $my_content for the different versions of the post.

Enjoy…

The PHP snippet

$my_post_type = 'post';		// set post_type
$my_post_status = 'publish';	// 'draft' | 'publish' | 'pending'| 'future' | 'private' | 'custom_registered_status'  ==> set the status of the new post
$post = array( //our wp_insert_post args
		'post_title'	=> wp_strip_all_tags($title),
		'post_content'	=> $my_content,
		'post_status'	=> $my_post_status,
		'post_type' 	=> $my_post_type,
		'post_date' 	=> $date,
		'post_date_gmt' => $date);
$new_post = wp_insert_post($post); //send our post, save the resulting ID
$_POST['icl_post_language'] = $language_code = 'en'; // change the language code
wpml_update_translatable_content( 'post_'.$my_post_type, $new_post, $language_code ); 	// update language code
$trid = wpml_get_content_trid('post_'.$my_post_type, $new_post); 	// get trid 
$src_language_code = $_POST['icl_post_language'];
// round two for the french side of the site
$post['post_title'] = $title  . ' fr'; // add fr to post_title
$new_post = wp_insert_post($post); //send our post the second time, save the resulting ID
$_POST['icl_post_language'] = $language_code = 'fr'; // change the language code	
global $sitepress;
$language_code = 'fr'; // change the language code
$sitepress->set_element_language_details($new_post, 'post_'.$my_post_type, $trid, $language_code, $src_language_code);

Als je in WordPress via de XML-RPC interface post, bijvoorbeeld via Fargo, wordt de status van deze posts default op “publish” gezet. Ik vind dit niet erg wenselijk als was het maar dat ik een post minimaal in de juiste categorie wil kunnen plaatsen en van tags wil kunnen voorzien.

Om het default gedrag van WordPress te veranderen moet je – bij ontstentenis van een dashboard optie – de file class-wp-xmlrpc-server.php in de wp-includes directory in een tekst-editor openen en alle instanties van
$post_status = ($publish) ? 'publish' : 'draft';
veranderen in
$post_status = ($publish) ? 'draft' : 'publish';
en vervolgens moet je de file vanzelfsprekend nog even saven.

En waarschijnlijk mag je dit bij elke update van de WordPress core weer opnieuw doen.

© Hans Pronk / 2013

Een aantal maanden geleden zag Dave Winer1‘s Little Outliner applicatie het levenslicht.Het was het eerste resultaat van zijn samenwerking met Kyle Shank. Little Outliner is een eenvoudige, in HTML5 geschreven, applicatie die volledig in de browser draait. Files worden lokaal bewaard op basis van HTML5′s ‘local storage’ model. Voordeel is dat je geen accounts en inlogcodes nodig hebt maar het nadeel is wel de incompatibele wijze waarop de verschillende browsers de files als key-value pairs opslaan. Little Outliner is echter wel een interessante en laagdrempelige introductie in de wereld van outliners.

Little Outliner was slechts de eerste van een reeks producten van Small Picture, de nieuwe startup van IT-veteraan Winer en javascript-programmeur Shank. Half april introduceerde Small Picture het voorlopige vlaggenschip Fargo. Fargo is net als Little Outliner een HTML 5 gebaseerde outliner geschreven in javascript, die in elke HTML5 compatibele browser zoals Chrome, Safari, Firefox en Microsoft IE 10 werkt. Het heeft echter in verhouding met Little Outliner een veel uitgebreidere set features. Zo kun je meerdere files tegelijkertijd open hebben en worden files niet meer lokaal opgeslagen maar in Dropbox bewaard. Files zijn daardoor altijd toegankelijk zolang je Dropbox bereiken kan. Ook kan je hierdoor op simpele wijze files delen met andere gebruikers, of zelfs met de gehele wereld. Alle outlines worden in het standaard formaat OPML bewaard, geen verrassing gegeven Winer’s achtergrond.

Een zorg in de huidige wereld van online diensten is het business-model achter applicaties. De wijze waarop de Twitters en Googles van deze wereld hun online diensten in toenemende mate monopoliseren (no more “Don’t Be Evil”) of – bij gebrek aan verdiensten – van de ene op de andere dag de nek omdraaien maakt dat je bij (nieuwe) online diensten heel goed naar de verdienmodellen moet kijken voor je je er afhankelijk van maakt. Voorlopig is Fargo gratis en omdat het in je eigen browser draait en de data op Dropbox geplaatst wordt zou het relatief eenvoudig te exploiteren moeten zijn. Ook hebben Winer en Shank aangekondigd in de toekomst ook betaalde diensten aan te bieden.

Fargo ontwikkelt zich snel. Zo is in een van de laatste versies de mogelijkheid toegevoegd om Fargo ook als editor voor WordPress te gebruiken. Even gegeven dat dit inderdaad goed werkt – dat zal duidelijk worden als ik op save klik – lijkt het een ideale combinatie van outliner en blog-editor die nu ook nog markdown ondersteunt. Want zoals Paul Ford al opmerkte, zijn outliners voor ideeën wat Google Maps doet voor geografie. Mapping software stelt je in staat op elk niveau van detail in te zoomen en hetzelfde geldt voor outliners.

Meer informatie:
De Fargo website
De Little Outliner website
Een Outliner How-To
De site van Small Picture

NB: de test is bijna helmaal goed verlopen. Ik had in eerste instantie een headline één niveau te hoog in de outliner aangeklikt maar daarna verliep een en ander probleemloos. Nu nog een optie vinden in WordPress om posts via de XML-RPC interface default als ‘draft’ te bewaren en niet direct te publiceren…

© Hans Pronk / 2013


  1. Dave Winer is een IT-industrie veteraan en blogger, bekend onder meer van ThinkTank, MORE,  Frontier en Radio UserLand en de OPML editor. Hij is de (co-)auteur van onder meer XMP-RPC, RSS 2.0 en OPML. 

Als aftrap voor 2013 een quote van William Gibson1:

The past is past, the future unformed. There is only the moment, and that is where I prefer to be.

William Gibson on the past, future and the now