1. Wordpress Themes und
Plugins übersetzbar
machen
WPMeetup Hannover, 24.07.2013
Frank Staude <frank@staude.net>
Donnerstag, 25. Juli 13
2. Warum sollte es
übersetzbar sein?
• Kunde braucht es in einer anderen Sprache
• Projext x braucht andere Formulierungen
• Theme/Plugin soll weltweit nutzbar sein
• Übersetzung gefällt einem nicht
• Keinen Anwender ausschliessen nur weil sie
kein deutsch/englisch können
Donnerstag, 25. Juli 13
3. Warum sind viele nicht
übersetzbar?
• Programmierer weiß nicht wie es geht
• Nur für eigenen Bedarf gebaut
• Keine Lust
• Eigene Lösung
• Ignoranz/Arroganz - „Rest der Welt“
ausgeblendet.
Donnerstag, 25. Juli 13
4. Wie ist das in
Wordpress realisiert?
• Setzt auf PHP Gettext auf
• Wordpress Core verwendet gleiche Technik
wie sie Theme/Pluginentwicklern zur
Verfügung steht
• Eine „Handvoll“ PHP Funktionen die man
nutzen muss.
Donnerstag, 25. Juli 13
5. Wie erstelle/bearbeite
ich eine Übersetzung?
• WP Plugin: codestyling-localisation
• Desktop: POedit
• Web: PO Editor
• diverse andere Tools für GetText
Donnerstag, 25. Juli 13
6. Wie mach ich mein
Plugin übersetzbar?
<?php
/*
Plugin Name: Beispiel-Dummy
Plugin URI: http://wpmeetup-hannover.de
Description: Beispiel Plugin für Übersetzung
Version: 0.1
Author: Frank Staude
Author URI: http://www.staude.net
License: GPLv2 or later
*/
add_filter( 'option_blogdescription', 'headertext');
function headertext( $text ) {
return ( 'Hello, World!' );
}
Donnerstag, 25. Juli 13
7. Wie mach ich mein
Plugin übersetzbar?<?php
/*
Plugin Name: Beispiel-Dummy
Plugin URI: http://wpmeetup-hannover.de
Description: Beispiel Plugin für Übersetzung
Version: 0.1
Author: Frank Staude
Author URI: http://www.staude.net
Text Domain: dummy-plugin
Domain Path: /languages
License: GPLv2 or later
*/
add_filter( 'option_blogdescription', 'headertext');
add_action( 'plugins_loaded', 'load_text' );
function load_text() {
load_plugin_textdomain( 'dummy-plugin', false,
dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
function headertext( $text ) {
return ( __( 'Hello, World!', 'dummy-plugin' ) );
}
Donnerstag, 25. Juli 13
8. Wie mach ich mein
Theme übersetzbar?
• load_theme_textdomain statt
load_plugin_textdomain
• Aufruf via add_action in die functions.php
Donnerstag, 25. Juli 13
9. Wie mach ich mein
Theme übersetzbar?
Geschrieben am <?php the_time('j. F Y'); ?> um <?php the_time() ?>, von <?php the_author() ?>
<p><?php _e( 'Geschrieben am' );?> <?php the_time( 'j. F Y' ); ?> <?php _e( 'um' );?> <?php
the_time() ?><?php _e( ', von' );?> <?php the_author() ?></p>
Donnerstag, 25. Juli 13
10. Wie mach ich mein
Theme übersetzbar?
Geschrieben am <?php the_time('j. F Y'); ?> um <?php the_time() ?>, von <?php the_author() ?>
<p><?php _e( 'Geschrieben am' );?> <?php the_time( 'j. F Y' ); ?> <?php _e( 'um' );?> <?php
the_time() ?><?php _e( ', von' );?> <?php the_author() ?></p> GEHT ÜBERHAUPT NICHT
<p><?php printf( __( 'Geschrieben am %s um %s, von %s','cleanpress' ), get_the_time( 'j. F Y'),
get_the_time(), get_the_author() ); ?></p>
Donnerstag, 25. Juli 13
11. Wie mach ich mein
Theme übersetzbar?
Geschrieben am <?php the_time('j. F Y'); ?> um <?php the_time() ?>, von <?php the_author() ?>
<p><?php _e( 'Geschrieben am' );?> <?php the_time( 'j. F Y' ); ?> <?php _e( 'um' );?> <?php
the_time() ?><?php _e( ', von' );?> <?php the_author() ?></p> GEHT ÜBERHAUPT NICHT
<p><?php printf( __( 'Geschrieben am %s um %s, von %s','cleanpress' ), get_the_time( 'j. F Y'),
get_the_time(), get_the_author() ); ?></p> BESSER, ABER!
<p><?php printf( __( 'Geschrieben am %1$s um %2$s, von %3$s','cleanpress' ), get_the_time( 'j. F
Y'), get_the_time(), get_the_author() ); ?></p>
Donnerstag, 25. Juli 13
12. Wie mach ich mein
Theme übersetzbar?
Geschrieben am <?php the_time('j. F Y'); ?> um <?php the_time() ?>, von <?php the_author() ?>
<p><?php _e( 'Geschrieben am' );?> <?php the_time( 'j. F Y' ); ?> <?php _e( 'um' );?> <?php
the_time() ?><?php _e( ', von' );?> <?php the_author() ?></p> GEHT ÜBERHAUPT NICHT
<p><?php printf( __( 'Geschrieben am %s um %s, von %s','cleanpress' ), get_the_time( 'j. F Y'),
get_the_time(), get_the_author() ); ?></p> BESSER, ABER!
<p><?php printf( __( 'Geschrieben am %1$s um %2$s, von %3$s','cleanpress' ), get_the_time( 'j. F
Y'), get_the_time(), get_the_author() ); ?></p> GEHT NOCH BESSER
<p><?php printf( __( 'Geschrieben am %1$s um %2$s, von %3$s' ,'cleanpress'),
get_the_time( __('j. F Y', 'cleanpress' ) ), get_the_time(), get_the_author() ); ?></p>
Donnerstag, 25. Juli 13
13. Wie mach ich mein
Theme übersetzbar?Geschrieben am <?php the_time('j. F Y'); ?> um <?php the_time() ?>, von <?php the_author() ?>
<p><?php _e( 'Geschrieben am' );?> <?php the_time( 'j. F Y' ); ?> <?php _e( 'um' );?> <?php
the_time() ?><?php _e( ', von' );?> <?php the_author() ?></p> GEHT ÜBERHAUPT NICHT
<p><?php printf( __( 'Geschrieben am %s um %s, von %s','cleanpress' ), get_the_time( 'j. F Y'),
get_the_time(), get_the_author() ); ?></p> BESSER, ABER!
<p><?php printf( __( 'Geschrieben am %1$s um %2$s, von %3$s','cleanpress' ), get_the_time( 'j. F
Y'), get_the_time(), get_the_author() ); ?></p> GEHT NOCH BESSER
<p><?php printf( __( 'Geschrieben am %1$s um %2$s, von %3$s' ,'cleanpress'),
get_the_time( __('j. F Y', 'cleanpress' ) ), get_the_time(), get_the_author() ); ?></p> FAST
<p><?php printf( __( 'Geschrieben am %1$s um %2$s, von %3$s' ,'cleanpress'),
date_i18n( get_option( ‘date_format‘), get_the_time( 'U')), get_the_time(), get_the_author() ); ?></
p>
Donnerstag, 25. Juli 13
15. Mit Texten arbeiten
• __() - gibt Text zurück
• _e() - gibt Text aus (e wie echo)
• _x() - gibt Text zurück (Kontext übergabe)
• _ex() - gibt Text aus (Kontext übergabe)
• _n() - gibt Text zurück (Plural)
• _nx() - gibt Text zurück (Plural und Kontext)
Donnerstag, 25. Juli 13
16. Mit Texten arbeiten
• esc_html__()
• esc_html_e()
• esc_html_x()
• esc_attr__()
• esc_attr_e()
• esc_attr_x()
Donnerstag, 25. Juli 13
17. Tipps
• Datum via date_i18n()
• Zahlen via number_format_i18n()
• Parameter in printf immer nummerieren
%1$s damit der Übersetzer die Reihenfolge
ändern kann
• HTML Formatierung nicht in
Übersetzungsstrings.
Donnerstag, 25. Juli 13
18. Tipps
• Pfad zu Textdateien via filter änderbar
machen.
• Escapen bei Benutzereingaben und
Attributausgaben. Sicherheit!
• Testen,Testen,Testen
Donnerstag, 25. Juli 13