internationalization: preparing your wordpress theme for the rest of the world
DESCRIPTION
Internationalization and localization of WordPress themesTRANSCRIPT
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Preparing Your Theme For The WorldInternationalization
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Lisa Sabin-Wilson
WordPress since 2003
Making a living on WP since 2005
Author: WordPress For Dummies
@LisaSabinWilson
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Remember, no matter where you go ... there you are.
~ Confucius
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
WordPress is InternationalMake sure your themes are too!
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Imagine an internet like this.If you speak Chinese - it’s great! Not so great if you don’t.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Internationalization (I18n)The practice of making your theme translation ready.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Localization (l10n)The practice of translating an internationalized theme into a different language.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Internationalization (I18n)YOU ARE NOT ACTUALLY TRANSLATING IT.(Unless you really want to.)
You are developing your theme to make it possible for someone else to translate it.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Text Domain<?php _e(‘Plugin Name’, ‘text-domain’); ?>
Defines which theme owns the translation-ready text and tells the GetText utility to return the translations only from the dictionary supplied with that name.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Text Domain*MOST* theme authors use the name of their theme as the text domain to make it easy to identify which language files belong to what theme.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Text Domain<?php _e(‘Plugin Name’, ‘startbox’); ?>
Use a unique name here so you don’t conflict with other language libraries in your WordPress installation.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Theme FunctionsDefine the textdomain in your Theme Functions file. This tells WordPress where your theme stores the language files and what the textdomain for your theme is.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Theme Functions1st Parameter: texdomainThis is the textdomain for the theme: lswtheme
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Theme Functions2nd Parameter: location of language files
get_template_directory() . ‘/languages’
wp-content/themes/lswtheme/lanugages/
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Two Basic GetText functions
_e (underscore + small case e)
&__ (two underscores)
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
_eUse this to wrap HTML text
strings within a GetText function call.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Example of _e in use:<h2>Plugin Name</h2>
becomes
<?php _e(‘Plugin Name’, ‘text-domain’); ?>
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
__Use this to wrap PHP text
strings within a GetText function call.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Unlike _e ...__ is used when you need to add a string of text to an EXISTING function call
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Example of __ in use:<?php the_content( ‘Read More’ ); ?>
becomes:
<?php the_content( __(‘Read More’, ‘text-domain’) ); ?>
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Use of _e or __ identifies which strings of text are available for translation.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Other functions_n , _nx, _x, _ex, esc_attr_e(), esc_attr__(), esc_html__(), esc_html_e()Some resources to read:http://ottopress.com/2012/internationalization-youre-probably-doing-it-wronghttp://wp.smashingmagazine.com/2011/12/29/internationalizing-localizing-wordpress-themehttp://codex.wordpress.org/I18n_for_WordPress_Developers
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Without these functions, the GetText localization utility will ignore the text and those text strings will not be translatable on the fly.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Is Translatable even a word?
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
YES!
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
You want your themes to beeminently translatable.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsDo not put HTML markup inside your GetText functions. Translators should not have the ability to change your markup.Not this:<?php _e(‘<h2>Title</h2>’, ‘text-domain’); ?>
Do this:<h2><?php _e(‘Title’,‘text-domain’); ?></h2>
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsAcknowledge international date formats by allowing users to set their own formats in Settings-->General in their Dashboard.Not this:the_time(‘F j, Y’);
Do this:the_time( get_option('date_format') )
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsGoogle Fonts and other font packsNot all font packs are made equal. Some do not support cyrillic languages (Russian, Japanese, etc) or languages with western european characters (Polish, etc).
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsRTL (Right to Left) Support
Some languages read/write right to left (RTL): Arabic, Hebrew, Urdu
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsRTL (Right to Left) Support
Create a stylesheet for RTL: style-rtl.css
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsRTL (Right to Left) Supportis_rtl();Checks if current locale is RTL.if ( is_rtl() ) {
wp_enqueue_style('rtl', get_stylesheet_directory_uri().'/css/rtl.css’);
}
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsRTL (Right to Left) Support - CSS
Start by adding this to your body selector in your style-rtl.css:
body {
direction: rtl; unicode-bidi: embed;
}
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsRTL (Right to Left) Support - CSS
Go through your CSS line by line to create RTL support for each selector.
Some hints: http://codex.wordpress.org/Right-to-Left_Language_Support
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
i18n TipsRTL (Right to Left) Support - TestingRTL TesterThis plugin adds a button to the admin bar that allow super admins to switch the text direction of the site. It can be used to test WordPress themes and plugins with Right To Left (RTL) text direction.http://wordpress.org/plugins/rtl-tester/
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Language FilesOnce your theme is fully internationalized...
Create a .pot file and include it in your /languages folder
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Language Files.pot stands for Portable Object Template.
Contains a list of all translatable messages in your theme.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Language Files.po stands for Portable Object.
Created when you translate a .pot file to a specific language - contains Human Readable text.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Language Files.mo stands for Machine Object.
A binary file created automatically by translation software - - is NOT human readable.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Example default .po fileFrom StartBox: http://wpstartbox.com
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Example .po filemsgid = text string available for translationmsgstr = translated text
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Example .po fileNotice: the msgstr string is blank in the default file.
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Example fr_FR.po fileNotice: the msgstr string is filled in with the French translation of the msgid
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
.pot | .po | .moHow do you create these files?
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Translation ToolsPoedit: http://poedit.com
GlotPress: http://glotpress.org
GNU GetText: http://gnu.org/software/gettext
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
Translation Plugins for WordPress
WPML: http://wpml.org/
WP Native Dashboard: http://wordpress.org/plugins/wp-native-dashboard/
Codestyling Localization:http://wordpress.org/plugins/codestyling-localization/
Monday, September 23, 13
@LisaSabinWilson - webdevstudios.com | September 19, 2013
The End.
Thank you for listening.
Monday, September 23, 13