writing multilingual plugins and themes - wcmia 2016

37
How to Make Multilingual Plugins and Themes John P Bloch ● 2016-02-20 ● WordCamp Miami

Upload: johnpbloch

Post on 09-Feb-2017

750 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Writing Multilingual Plugins and Themes - WCMIA 2016

How to Make Multilingual Plugins and Themes

John P Bloch ● 2016-02-20 ● WordCamp Miami

Page 2: Writing Multilingual Plugins and Themes - WCMIA 2016

About MeJohn P Bloch

Lead Web Engineer at 10up10up is hiringTell them I sent youSeriously, we’re always hiring

@[email protected]

Page 3: Writing Multilingual Plugins and Themes - WCMIA 2016

Assumptions& Definitions

Page 4: Writing Multilingual Plugins and Themes - WCMIA 2016

Assumptions

• You can write PHP• You are writing plugins or themes for distribution on the

wordpress.org repositories

Page 5: Writing Multilingual Plugins and Themes - WCMIA 2016

Definitions

Internationalization

The process of making your code translatable at all.

Abbreviated as i18n

Localization

The process of using translated text in internationalized code.

Abbreviated as l10n

Page 6: Writing Multilingual Plugins and Themes - WCMIA 2016

Definitions

Internationalization

The process of making your code translatable at all.

Abbreviated as i18n

Localization

The process of using translated text in internationalized code.

Abbreviated as l10n

Page 7: Writing Multilingual Plugins and Themes - WCMIA 2016

Why should you care?

Page 8: Writing Multilingual Plugins and Themes - WCMIA 2016

Why should you care?

• Empathy• More than half of all new WordPress installations are in languages

other than English

Page 9: Writing Multilingual Plugins and Themes - WCMIA 2016
Page 10: Writing Multilingual Plugins and Themes - WCMIA 2016
Page 11: Writing Multilingual Plugins and Themes - WCMIA 2016

Why should you care?

• Empathy• Grow your potential user-base• Potentially make more money• Make more of an impact in the world

Page 12: Writing Multilingual Plugins and Themes - WCMIA 2016

How to Internationalize Code

Page 13: Writing Multilingual Plugins and Themes - WCMIA 2016

Text Domains

A text domain is a namespace for your code’s translations

Text domains need to be unique within plugins or themes

Use your plugin or theme slug

Page 14: Writing Multilingual Plugins and Themes - WCMIA 2016

Text Domains – Loading Themes

load_theme_textdomain( $textdomain, $path // where your translations are)

Run on after_setup_theme action$path needs to be an absolute path

Page 15: Writing Multilingual Plugins and Themes - WCMIA 2016

load_plugin_textdomain( $textdomain, false, // deprecated $path // where translation files are)

Run on plugins_loaded action$path is relative to wp-content/plugins

Text Domains – Loading Plugins

Page 16: Writing Multilingual Plugins and Themes - WCMIA 2016

Plugin and Theme Headers

Plugins and themes have two special headers:

Text DomainDomain Path

Page 17: Writing Multilingual Plugins and Themes - WCMIA 2016

Basic Translation Functions

__( $text, $textdomain )_e( $text, $textdomain )_n( $singular, $plural, $count, $textdomain)

Page 18: Writing Multilingual Plugins and Themes - WCMIA 2016

Basic Translation Functions

$draft_count = get_my_drafts_count();printf( _n( 'I have one draft.', 'I have %s drafts.', $draft_count, 'my-textdomain'), $draft_count );

Page 19: Writing Multilingual Plugins and Themes - WCMIA 2016

Basic Translation Functions

$draft_count = get_my_drafts_count();if( 1 === $draft_count ) { _e( 'I have one post.', 'my-textdomain' );} else { printf( __( 'I have %s drafts.', 'my-textdomain' ), $draft_count );}

Page 20: Writing Multilingual Plugins and Themes - WCMIA 2016

Basic Translation Functions

_x( $text, $context, $textdomain )_ex( $text, $context, $textdomain )_nx( $singular, $plural, $count, $context, $textdomain)

Page 21: Writing Multilingual Plugins and Themes - WCMIA 2016

Basic Translation Functions

You can also leave longer comments for the translators

printf( /* translators: The placeholder is the current user’s first name */ __( 'Hello, %s!', 'my-textdomain' ), $current_user->first_name);

Page 22: Writing Multilingual Plugins and Themes - WCMIA 2016

Advanced Translation Functions

number_format_i18n( $number, $decimals = 0)

1234567.891,234,567.891.234.567,89

Page 23: Writing Multilingual Plugins and Themes - WCMIA 2016

Advanced Translation Functions

date_i18n( $format, $timestamp = false, $gmt = false)

'F j Y''February 20 2016''Febbraio 20 2016'

Page 24: Writing Multilingual Plugins and Themes - WCMIA 2016

Advanced Translation FunctionsHomework

Look up these translation functions:

wp_localize_script()esc_html__()esc_html_e()esc_html_x()

esc_attr__()esc_attr_e()esc_attr_x()

Page 25: Writing Multilingual Plugins and Themes - WCMIA 2016

Final Steps

Page 26: Writing Multilingual Plugins and Themes - WCMIA 2016

Final Steps

• Generate .pot file• Official repositories provide web tools

• Publish .pot file• Usually packaged with plugin or theme in the languages directory

• Add translation files to your plugin or theme• Or don’t. Plugins have language packs now.

Page 27: Writing Multilingual Plugins and Themes - WCMIA 2016

Gotchas

Page 28: Writing Multilingual Plugins and Themes - WCMIA 2016

Gotchas

• Line breaks• Empty strings• Formatted strings vs. interpolation

Page 29: Writing Multilingual Plugins and Themes - WCMIA 2016

_e( "You live in $state", 'my-plugin' );

#: my-plugin.php:23msgid "You live in $state"msgstr ""

$state = 'Florida';// Lookup is "You live in Florida"

Page 30: Writing Multilingual Plugins and Themes - WCMIA 2016

printf( __( 'You live in %s', 'my-plugin' ), $state);

Page 31: Writing Multilingual Plugins and Themes - WCMIA 2016

Gotchas

• Line breaks• Empty strings• Formatted strings vs. interpolation• Word order and position

Page 32: Writing Multilingual Plugins and Themes - WCMIA 2016

printf( __( 'Hi %s, you live in %s', 'my-plugin' ), $user_name, $state);

Page 33: Writing Multilingual Plugins and Themes - WCMIA 2016

printf( __( 'Hi %1$s, you live in %2$s', 'my-plugin‘ ), $user_name, $state);

Page 34: Writing Multilingual Plugins and Themes - WCMIA 2016

Best Practices

Page 35: Writing Multilingual Plugins and Themes - WCMIA 2016

Best Practices

• Use decent English style• Avoid slang and abbreviations

• Keep text together• Break at paragraphs• Use formatted strings instead of

concatenation• Translate phrases not words

• No unnecessary HTML

• Make no assumptions about the translated text

• Length• Word order• Direction• Punctuation

• Avoid translating URLs that don’t have alternate languages available

Page 36: Writing Multilingual Plugins and Themes - WCMIA 2016

Tools

• Pig Latin (http://w.org/plugins/piglatin/)• WP i18n Tools (develop.svn.wordpress.org/trunk/tools/i18n/)• PoEdit (https://poedit.net/)• GlotPress (http://blog.glotpress.org/)• Translate WordPress (https://translate.wordpress.org)