define( WPLANG, de_DE );                    $wp_local_package = de_DE;                     Session:                     Wo...
Themes & Plugins   nicht übersetzbar...   nur halbgar übersetzbar...Ursachen:                     Fehlendes Wissen        ...
Selbst Hand anlegen   WordPress bringt alles mit!   via PHP Gettext   Gettext Funktionen   Textdomain laden:      allgemei...
Einpflegen?  Nützlich bei allen öffentlichen Repo-Projekten    GitHub.com - simpel & elegant!    WordPress.org: Entwickler...
Implementieren                                             Für Text-Strings:Textdomain laden:                             ...
dein-plugin.php Kopfbereich, Metadaten:Plugins:                                /**                                 * Text ...
style.css Kopfbereich, Metadaten:Themes:                                /*                                   Text Domain: ...
style.css Kopfbereich, Metadaten:Child                                /*                                   Text Domain: de...
Themes:Sprachdatei-Ordner filtern/** Set filter for parent themes languages directory */$parent_theme_lang_dir = get_templ...
Plugins vs. Themes:Dateinamen der SprachdateienThemes:                                 Plugins:de_DE.mo /.po              ...
Themes vs. Child Themes get_template_directory() vs. get_stylesheet_directory() load_textdomain() vs. load_child_theme_tex...
Syntaxbeispiele IKorrekt:Templates:<?php_e( Germany consists of 16 federal states,textdomain );?>In Funktionen:echo __( Ge...
Immer:                                                     Single Quotes!Syntaxbeispiele II                             EI...
Syntaxbeispiele IIIErweitert: $string = sprintf( __( Germany consists of %d federal states, textdomain ), $number );$strin...
Syntaxbeispiele IVKontext:$string = _x( Frankfurt, German city at the riverMain, textdomain );$string = _x( Frankfurt, Ger...
Syntaxbeispiele VFormatierungen:$string = sprintf( __( <h1>I want %d Hefeweizen</h1>,textdomain ), $number );$string = <h1...
Syntaxbeispiele VISicherheit:      Benutzereingaben:                      Ausgaben von Text in                            ...
Syntaxbeispiele - Spezial INumerical No-op:$string = sprintf( _n( I have %d bike., You have %dbikes., $number, textdomain ...
Syntaxbeispiele - Spezial IIZahlen & Daten:number_format_i18n()date_i18n()David Decker · deckerweb.de · WP Camp 2012
Häufige Fehler:  Gar keine Übersetzbarkeit  Übersetzbarkeit JA, aber kein „load_textdomain“  Mischen von Single & Double Q...
Best Practices I  ALLES Übersetzbar machen!  Laden der Sprachdateien via Hook!  Textdomain als String in Single Quotes set...
Best Practices II  Pfadangaben checken!  load_textdomain() fordert absoluten Pfad  load_plugin/theme/child_theme_textdomai...
Werkzeuge:  define( WP_DEBUG, true ); (wp-config.php)  define( WPLANG, de_DE ); (wp-config.php)  Plugin: „Codestyling Loca...
Codestyling LocalizationDavid Decker · deckerweb.de · WP Camp 2012
Codestyling LocalizationDavid Decker · deckerweb.de · WP Camp 2012
GlotPress InstallationDavid Decker · deckerweb.de · WP Camp 2012
GlotPress InstallationDavid Decker · deckerweb.de · WP Camp 2012
GlotPress InstallationDavid Decker · deckerweb.de · WP Camp 2012
PoEdit Editor (poedit.net)David Decker · deckerweb.de · WP Camp 2012
Verwendete Quellen: http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/ http://ottopress.com/201...
Danke! Fragen jetzt! Folien unter:           deckerweb.de/wpcamp2012                         plus: slideshare.net/deckerwe...
/** Call for break and add next session */add_action( wpcamp_berlin_2012, wpc_next_session_planning )function wpc_next_ses...
Upcoming SlideShare
Loading in …5
×

WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin

1,166
-1

Published on

WordPress Plugins und Themes übersetzbar machen - die Grundprinzipien, Grundfunktionen, hilfreiche Tipps, Tricks, Erfahrungen, häufige Fehler und Best Practices

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,166
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin

  1. 1. define( WPLANG, de_DE ); $wp_local_package = de_DE; Session: WordPress Plugins und Themes übersetzbar machenDavid Decker · deckerweb.de · WP Camp 2012
  2. 2. Themes & Plugins nicht übersetzbar... nur halbgar übersetzbar...Ursachen: Fehlendes Wissen Keine Lust, beratungsresistent... Nur Fokus auf USA... Keine Tests durchgeführt Eigene Implementationen jenseits der StandardsDavid Decker · deckerweb.de · WP Camp 2012
  3. 3. Selbst Hand anlegen WordPress bringt alles mit! via PHP Gettext Gettext Funktionen Textdomain laden: allgemein Plugins Themes Child ThemesDavid Decker · deckerweb.de · WP Camp 2012
  4. 4. Einpflegen? Nützlich bei allen öffentlichen Repo-Projekten GitHub.com - simpel & elegant! WordPress.org: Entwickler kontaktieren Ziel: Nutzen für alle!David Decker · deckerweb.de · WP Camp 2012
  5. 5. Implementieren Für Text-Strings:Textdomain laden: Regulär:load_textdomain() __()load_plugin_textdomain() _e()load_theme_textdomain() _x()load_child_theme_textdomain() _ex() _n() Spezial: Sicherheit: _n_noop() esc_html__() translate_nooped_plural() esc_html_e() _nx_noop() esc_html_x() number_format_i18n() esc_attr__() date_i18n() esc_attr_e() esc_attr_x()David Decker · deckerweb.de · WP Camp 2012
  6. 6. dein-plugin.php Kopfbereich, Metadaten:Plugins: /** * Text Domain: dein-plugin-name-slug * Domain Path: rel-sprachdatei-pfad */add_action( init, ddw_wpcamp_plugin );function ddw_wpcamp_plugin() { load_plugin_textdomain( deine-textdomain, false,dirname( plugin_basename( __FILE__ ) ) . /languages/ );} Hook „init“ am besten (WMPL!), „plugins_loaded“ ginge wohl auch evtl. Priorität ändern! (experimentieren!) Zusatz: dirname( plugin_basename( __FILE__ ) ) ./languages/ könnte gefiltert werden (bei Plugins relative Pfadebeachten!)David Decker · deckerweb.de · WP Camp 2012
  7. 7. style.css Kopfbereich, Metadaten:Themes: /* Text Domain: dein-theme-name-slug Domain Path: rel-sprachdatei-pfad */add_action( init, ddw_wpcamp_theme );function ddw_wpcamp_theme() { load_theme_textdomain( deine-textdomain,get_template_directory() . /languages/ );} Hook „init“ am besten (WMPL!), „after_setup_theme“ evtl. auch evtl. Priorität ändern! (experimentieren!) Zusatz: get_template_directory() . /languages/ solltegefiltert werdenDavid Decker · deckerweb.de · WP Camp 2012
  8. 8. style.css Kopfbereich, Metadaten:Child /* Text Domain: dein-child-theme-slug Domain Path: rel-sprachdatei-pfadThemes: */add_action( init, ddw_wpcamp_child_theme );function ddw_wpcamp_child_theme() { load_child_theme_textdomain( deine-child_textdomain,get_stylesheet_directory() . /languages/ );} Hook „init“ am besten (WMPL!), „after_setup_theme“ evtl. auch evtl. Priorität ändern! (experimentieren!) Zusatz: get_stylesheet_directory() . /languages/ könntegefiltert werdenDavid Decker · deckerweb.de · WP Camp 2012
  9. 9. Themes:Sprachdatei-Ordner filtern/** Set filter for parent themes languages directory */$parent_theme_lang_dir = get_template_directory() ./languages/;$parent_theme_lang_dir = apply_filters(parent_theme_lang_dir, $parent_theme_lang_dir );add_action( init, ddw_wpcamp_theme );function ddw_wpcamp_theme() { load_theme_textdomain( deine-textdomain,$parent_theme_lang_dir );}David Decker · deckerweb.de · WP Camp 2012
  10. 10. Plugins vs. Themes:Dateinamen der SprachdateienThemes: Plugins:de_DE.mo /.po deine-textdomain-de_DE.mo /.ponl_NL.mo /.po deine-textdomain-nl_NL.mo /.pofi.mo /.po deine-textdomain-fi.mo /.po Lokale ermitteln: schau bei WPLANG in der wp-config.php! Oder hier recherchieren: http://codex.wordpress.org/WordPress_in_Your_LanguageDavid Decker · deckerweb.de · WP Camp 2012
  11. 11. Themes vs. Child Themes get_template_directory() vs. get_stylesheet_directory() load_textdomain() vs. load_child_theme_textdomain() (Child) Themes funktionieren aber auch mit load_textdomain() Streitfrage: Eigene Textdomains für Child Themes JA oder NEIN? DECKERWEB: JA, bitte eigene Domain für Child Themes!= klare Trennung = klarere Organisation = einfachere Pflege(Kundenprojekte...!)plus bessere PerformanceDavid Decker · deckerweb.de · WP Camp 2012
  12. 12. Syntaxbeispiele IKorrekt:Templates:<?php_e( Germany consists of 16 federal states,textdomain );?>In Funktionen:echo __( Germany consists of 16 federal states,textdomain );$string = __( Germany consists of 16 federal states,textdomain );David Decker · deckerweb.de · WP Camp 2012
  13. 13. Immer: Single Quotes!Syntaxbeispiele II EINE (1) Textdomain: String in Single QuotesFalsch:$string = __( $string, textdomain );$string = __( "Germany consists of $number federalstates", textdomain );$string = __( Germany consists of 16 federal states,$text_domain );$string = __( Germany consists of 16 federal states,PLUGIN_DOMAIN );$string = __( Germany consists of , textdomain ) .$number . __( federal states, textdomain );David Decker · deckerweb.de · WP Camp 2012
  14. 14. Syntaxbeispiele IIIErweitert: $string = sprintf( __( Germany consists of %d federal states, textdomain ), $number );$string = sprintf( _n( Germany consists of %d federalstate, Germany consists of %d federal states,$number, textdomain ), $number );$string = sprintf( __( I have %d bikes and %d cars,textdomain ), $bike_count, $car_count );$string = sprintf( __( I have %1$d bikes and %2$dcars, textdomain ), $bike_count, $car_count ); Hinweis: "%1$s" macht Probleme (PHP: $s !!!), daher Single QuotesDavid Decker · deckerweb.de · WP Camp 2012
  15. 15. Syntaxbeispiele IVKontext:$string = _x( Frankfurt, German city at the riverMain, textdomain );$string = _x( Frankfurt, German city at the riverOder, textdomain );$string = _x( Frankfurt, an asteroid, textdomain);David Decker · deckerweb.de · WP Camp 2012
  16. 16. Syntaxbeispiele VFormatierungen:$string = sprintf( __( <h1>I want %d Hefeweizen</h1>,textdomain ), $number );$string = <h1> . sprintf( __( I want %d Hefeweizen,textdomain ), $number ) . </h1>;$string = sprintf( __( I want %s Hefeweizen,textdomain ), <strong> . $number . </strong> ); Grundregel: KEINE oder so WENIG HTML-Formatierungen wie irgend möglich in den Übersetzungs-Strings!David Decker · deckerweb.de · WP Camp 2012
  17. 17. Syntaxbeispiele VISicherheit: Benutzereingaben: Ausgaben von Text in HTML-Attributen: esc_html__() esc_html_e() esc_attr__() esc_html_x() esc_attr_e() esc_attr_x()David Decker · deckerweb.de · WP Camp 2012
  18. 18. Syntaxbeispiele - Spezial INumerical No-op:$string = sprintf( _n( I have %d bike., You have %dbikes., $number, textdomain ), $number );$bikes_plural = _n_noop( I have %d bike., You have%d bikes., textdomain );$string = sprintf( translate_nooped_plural($bikes_plural, $number ) , $number );David Decker · deckerweb.de · WP Camp 2012
  19. 19. Syntaxbeispiele - Spezial IIZahlen & Daten:number_format_i18n()date_i18n()David Decker · deckerweb.de · WP Camp 2012
  20. 20. Häufige Fehler: Gar keine Übersetzbarkeit Übersetzbarkeit JA, aber kein „load_textdomain“ Mischen von Single & Double Quotes HTML in den Übersetzungs-Strings Falscher Einsatz von Platzhaltern/ Variablen Zu spätes Laden/ Einhängen der Sprachdatei, bzw. vergessenbei Fehlermeldungen/ Aktivierungs-Hooks etc. Eigene „Erfindungen“ fürs Laden der Sprachdateien Keine Verwendung von Kontext, Datum, Plural etc.David Decker · deckerweb.de · WP Camp 2012
  21. 21. Best Practices I ALLES Übersetzbar machen! Laden der Sprachdateien via Hook! Textdomain als String in Single Quotes setzen Generell nur Single Quotes HTML-Formatierungen raus aus den Strings!!! Beliebige Anordnung der Platzhalter ermöglichen via %1$d,%2$d etc. Sicherheit: ESCAPEN bei Benutzereingaben und bei Ausgabenin Attributen!David Decker · deckerweb.de · WP Camp 2012
  22. 22. Best Practices II Pfadangaben checken! load_textdomain() fordert absoluten Pfad load_plugin/theme/child_theme_textdomain() fordernrelativen Pfad BONUS 1: Sprachdatei-Ordner filterbar machen bzw.Zusätzlichen Ort für Update-sichere Sprachdateienbereitstellen BONUS 2: Ein GlotPress aufsetzen, um der Community dasÜbersetzen zu erleichtern... ;-)David Decker · deckerweb.de · WP Camp 2012
  23. 23. Werkzeuge: define( WP_DEBUG, true ); (wp-config.php) define( WPLANG, de_DE ); (wp-config.php) Plugin: „Codestyling Localization“ (zum eigentlichen Übersetzen) Software/ Installation: GlotPress (übersetzen, Export/Import.mo/.po, Verwalten) Lokale Software: PoEdit Editor (übersetzen, validieren -- gut fürPlatzhalter-Tests!) Testen! Testen! Testen!David Decker · deckerweb.de · WP Camp 2012
  24. 24. Codestyling LocalizationDavid Decker · deckerweb.de · WP Camp 2012
  25. 25. Codestyling LocalizationDavid Decker · deckerweb.de · WP Camp 2012
  26. 26. GlotPress InstallationDavid Decker · deckerweb.de · WP Camp 2012
  27. 27. GlotPress InstallationDavid Decker · deckerweb.de · WP Camp 2012
  28. 28. GlotPress InstallationDavid Decker · deckerweb.de · WP Camp 2012
  29. 29. PoEdit Editor (poedit.net)David Decker · deckerweb.de · WP Camp 2012
  30. 30. Verwendete Quellen: http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/ http://ottopress.com/2012/more-internationalization-fun/ http://genesisthemes.de/en/2011-12/seven-cardinal-sins-localizing-wordpress-plugins-themes/ http://codex.wordpress.org/I18n_for_WordPress_Developers http://pippinsplugins.com/localizing-and-translating-wordpress-plugins/ http://remkusdevries.com/how-to-use-glotpress-for-your-translations/David Decker · deckerweb.de · WP Camp 2012
  31. 31. Danke! Fragen jetzt! Folien unter: deckerweb.de/wpcamp2012 plus: slideshare.net/deckerweb David Decker @deckerweb +David Decker deckerweb.de deckerweb.de/sprachdateien translate.wpautobahn.comDavid Decker · deckerweb.de · WP Camp 2012
  32. 32. /** Call for break and add next session */add_action( wpcamp_berlin_2012, wpc_next_session_planning )function wpc_next_session_planning() { if ( is_break( array( 10min, coffee, wc ) ) ) { wpcamp_do_next_session(); echo __( Enjoy the break, wpcamp ); } else { wpcamp_do_celebrate_community(); echo __( Enjoy the conversation, wpcamp ); }}David Decker · deckerweb.de · WP Camp 2012

×