SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
define( 'WPLANG', 'de_DE' );
                    $wp_local_package = 'de_DE';




                     Session:

                     WordPress Plugins
                     und Themes
                     übersetzbar machen

David Decker · deckerweb.de · WP Camp 2012
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 Standards

David Decker · deckerweb.de · WP Camp 2012
Selbst Hand anlegen
   WordPress bringt alles mit!
   via PHP Gettext
   Gettext Funktionen
   Textdomain laden:
      allgemein
      Plugins
      Themes
      Child Themes



David Decker · deckerweb.de · WP Camp 2012
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
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
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 Pfade

beachten!)
David Decker · deckerweb.de · WP Camp 2012
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/' sollte
gefiltert werden


David Decker · deckerweb.de · WP Camp 2012
style.css Kopfbereich, Metadaten:

Child
                                /*
                                   Text Domain: dein-child-theme-slug
                                   Domain Path: rel-sprachdatei-pfad

Themes:                          */


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önnte
gefiltert werden


David Decker · deckerweb.de · WP Camp 2012
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
Plugins vs. Themes:
Dateinamen der Sprachdateien
Themes:                                 Plugins:

de_DE.mo /.po                           deine-textdomain-de_DE.mo /.po

nl_NL.mo /.po                           deine-textdomain-nl_NL.mo   /.po

fi.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_Language

David Decker · deckerweb.de · WP Camp 2012
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 Performance




David Decker · deckerweb.de · WP Camp 2012
Syntaxbeispiele I
Korrekt:
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
Immer:
                                                     Single Quotes!
Syntaxbeispiele II                             EINE (1) Textdomain:
                                             String in Single Quotes
Falsch:
$string = __( $string, 'textdomain' );

$string = __( "Germany consists of $number federal
states", '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
Syntaxbeispiele III
Erweitert:
 $string = sprintf( __( 'Germany consists of %d federal
 states', 'textdomain' ), $number );

$string = sprintf( _n( 'Germany consists of %d federal
state', '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$d
cars', 'textdomain' ), $bike_count, $car_count );

  Hinweis: "%1$s" macht Probleme (PHP: $s !!!), daher Single Quotes

David Decker · deckerweb.de · WP Camp 2012
Syntaxbeispiele IV
Kontext:
$string = _x( 'Frankfurt', 'German city at the river
Main', 'textdomain' );

$string = _x( 'Frankfurt', 'German city at the river
Oder', 'textdomain' );

$string = _x( 'Frankfurt', 'an asteroid', 'textdomain'
);




David Decker · deckerweb.de · WP Camp 2012
Syntaxbeispiele V
Formatierungen:
$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
Syntaxbeispiele VI
Sicherheit:

      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
Syntaxbeispiele - Spezial I
Numerical No-op:
$string = sprintf( _n( 'I have %d bike.', 'You have %d
bikes.', $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
Syntaxbeispiele - Spezial II
Zahlen & 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 Quotes
  HTML in den Übersetzungs-Strings
  Falscher Einsatz von Platzhaltern/ Variablen
  Zu spätes Laden/ Einhängen der Sprachdatei, bzw. vergessen
bei 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
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 Ausgaben
in Attributen!


David Decker · deckerweb.de · WP Camp 2012
Best Practices II
  Pfadangaben checken!
  load_textdomain() fordert absoluten Pfad
  load_plugin/theme/child_theme_textdomain() fordern
relativen Pfad
  BONUS 1: Sprachdatei-Ordner filterbar machen bzw.
Zusätzlichen Ort für Update-sichere Sprachdateien
bereitstellen
  BONUS 2: Ein GlotPress aufsetzen, um der Community das
Übersetzen zu erleichtern... ;-)


David Decker · deckerweb.de · WP Camp 2012
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ür
Platzhalter-Tests!)
  Testen! Testen! Testen!




David Decker · deckerweb.de · WP Camp 2012
Codestyling Localization




David Decker · deckerweb.de · WP Camp 2012
Codestyling Localization




David Decker · deckerweb.de · WP Camp 2012
GlotPress Installation




David Decker · deckerweb.de · WP Camp 2012
GlotPress Installation




David Decker · deckerweb.de · WP Camp 2012
GlotPress Installation




David 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/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
Danke! Fragen jetzt!
 Folien unter:           deckerweb.de/wpcamp2012
                         plus: slideshare.net/deckerweb

                    David Decker
                    @deckerweb
                    +David Decker
                    deckerweb.de
                    deckerweb.de/sprachdateien
                    translate.wpautobahn.com

David Decker · deckerweb.de · WP Camp 2012
/** 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

Contenu connexe

En vedette

Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificialyuriel98
 
Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?
Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?
Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?LexisNexis GmbH
 
Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011
Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011
Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011Secretaria Nacional de la Juventud
 
Mini relato. Camilo valor
Mini relato. Camilo valorMini relato. Camilo valor
Mini relato. Camilo valorcvalorarte
 
La construcción de la propia imagen.
La construcción de la propia imagen.La construcción de la propia imagen.
La construcción de la propia imagen.Maria Sancho Gómez
 
Autofahren mit dem Taschenrechner
Autofahren mit dem TaschenrechnerAutofahren mit dem Taschenrechner
Autofahren mit dem Taschenrechnercleverunterwegs
 
Portfolio Architektur
Portfolio ArchitekturPortfolio Architektur
Portfolio ArchitekturPeter Wolf
 
2007 Dritter Platz Im Wettbewerb Die Protagonisten Fertige H U G ...
2007  Dritter  Platz Im  Wettbewerb    Die  Protagonisten    Fertige  H U G  ...2007  Dritter  Platz Im  Wettbewerb    Die  Protagonisten    Fertige  H U G  ...
2007 Dritter Platz Im Wettbewerb Die Protagonisten Fertige H U G ...schnobias
 
01 schmidt eröffnung cib 2013
01 schmidt eröffnung cib 201301 schmidt eröffnung cib 2013
01 schmidt eröffnung cib 2013ICV_eV
 
Fotografos favoritos
Fotografos  favoritosFotografos  favoritos
Fotografos favoritosdianaarqui
 
INVESTIGACIÓN-ACCIÓN.
INVESTIGACIÓN-ACCIÓN.INVESTIGACIÓN-ACCIÓN.
INVESTIGACIÓN-ACCIÓN.lyliblnk
 
Incomodidades de la colación
Incomodidades de la colaciónIncomodidades de la colación
Incomodidades de la colacióntoxiclifford
 
GESTION DE PROCESOS DE NEGOCIOS
GESTION DE PROCESOS DE NEGOCIOSGESTION DE PROCESOS DE NEGOCIOS
GESTION DE PROCESOS DE NEGOCIOSruby garcia
 
Ab zur Conversion - campixx 2013
Ab zur Conversion - campixx 2013Ab zur Conversion - campixx 2013
Ab zur Conversion - campixx 2013Andreas Nickel
 

En vedette (20)

Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?
Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?
Wie kann ich mit Nexis® Wettbewerbsanalysen durchführen?
 
Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011
Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011
Resultados Finales de la Primera Encuesta Nacional de la Juventud 2011
 
Mini relato. Camilo valor
Mini relato. Camilo valorMini relato. Camilo valor
Mini relato. Camilo valor
 
El Plagio
El PlagioEl Plagio
El Plagio
 
La construcción de la propia imagen.
La construcción de la propia imagen.La construcción de la propia imagen.
La construcción de la propia imagen.
 
Autofahren mit dem Taschenrechner
Autofahren mit dem TaschenrechnerAutofahren mit dem Taschenrechner
Autofahren mit dem Taschenrechner
 
Portfolio Architektur
Portfolio ArchitekturPortfolio Architektur
Portfolio Architektur
 
Capitulo vi
Capitulo viCapitulo vi
Capitulo vi
 
2007 Dritter Platz Im Wettbewerb Die Protagonisten Fertige H U G ...
2007  Dritter  Platz Im  Wettbewerb    Die  Protagonisten    Fertige  H U G  ...2007  Dritter  Platz Im  Wettbewerb    Die  Protagonisten    Fertige  H U G  ...
2007 Dritter Platz Im Wettbewerb Die Protagonisten Fertige H U G ...
 
01 schmidt eröffnung cib 2013
01 schmidt eröffnung cib 201301 schmidt eröffnung cib 2013
01 schmidt eröffnung cib 2013
 
Fotografos favoritos
Fotografos  favoritosFotografos  favoritos
Fotografos favoritos
 
IT Lösungen für kleine und mittelstaendische Unternehmen
IT Lösungen für kleine und mittelstaendische UnternehmenIT Lösungen für kleine und mittelstaendische Unternehmen
IT Lösungen für kleine und mittelstaendische Unternehmen
 
1 semana
1 semana1 semana
1 semana
 
INVESTIGACIÓN-ACCIÓN.
INVESTIGACIÓN-ACCIÓN.INVESTIGACIÓN-ACCIÓN.
INVESTIGACIÓN-ACCIÓN.
 
Incomodidades de la colación
Incomodidades de la colaciónIncomodidades de la colación
Incomodidades de la colación
 
GESTION DE PROCESOS DE NEGOCIOS
GESTION DE PROCESOS DE NEGOCIOSGESTION DE PROCESOS DE NEGOCIOS
GESTION DE PROCESOS DE NEGOCIOS
 
Robotica
RoboticaRobotica
Robotica
 
Planificador de proyectos
Planificador de proyectosPlanificador de proyectos
Planificador de proyectos
 
Ab zur Conversion - campixx 2013
Ab zur Conversion - campixx 2013Ab zur Conversion - campixx 2013
Ab zur Conversion - campixx 2013
 

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

Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 BerlinMeine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 BerlinDavid Decker
 
DDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungDDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungFrank Schmittlein
 
Drupal Multisite und Subversion
Drupal Multisite und SubversionDrupal Multisite und Subversion
Drupal Multisite und SubversionDrupalist
 
WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...
WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...
WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...David Decker
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...NETWAYS
 
Entwickeln mit Wordpress
Entwickeln mit WordpressEntwickeln mit Wordpress
Entwickeln mit WordpressBlogwerk AG
 
IPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedIPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedRalf Eggert
 
Versionskontrolle in Machine-Learning-Projekten
Versionskontrolle in Machine-Learning-ProjektenVersionskontrolle in Machine-Learning-Projekten
Versionskontrolle in Machine-Learning-Projektencusy GmbH
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1Manfred Steyer
 
Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?MT AG
 
WPDB - das unbekannte Objekt
WPDB -  das unbekannte ObjektWPDB -  das unbekannte Objekt
WPDB - das unbekannte Objektfrankstaude
 
Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...
Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...
Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...David Decker
 
Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Sebastian Adler
 
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific LanguagesAgiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific LanguagesDominik Hirt
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 

Similaire à WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin (20)

Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 BerlinMeine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
 
DDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungDDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale Entwicklungsumgebung
 
Das Child-Theme-Dilemma
Das Child-Theme-DilemmaDas Child-Theme-Dilemma
Das Child-Theme-Dilemma
 
Drupal Multisite und Subversion
Drupal Multisite und SubversionDrupal Multisite und Subversion
Drupal Multisite und Subversion
 
Ruby on Rails SS09 06
Ruby on Rails SS09 06Ruby on Rails SS09 06
Ruby on Rails SS09 06
 
WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...
WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...
WordPress sprachfähig machen - Lokalisierung Kür oder Krampf? - WordCamp Deut...
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
Entwickeln mit Wordpress
Entwickeln mit WordpressEntwickeln mit Wordpress
Entwickeln mit Wordpress
 
Drupal inside out
Drupal inside outDrupal inside out
Drupal inside out
 
IPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedIPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 Reloaded
 
Versionskontrolle in Machine-Learning-Projekten
Versionskontrolle in Machine-Learning-ProjektenVersionskontrolle in Machine-Learning-Projekten
Versionskontrolle in Machine-Learning-Projekten
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1
 
Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?
 
WPDB - das unbekannte Objekt
WPDB -  das unbekannte ObjektWPDB -  das unbekannte Objekt
WPDB - das unbekannte Objekt
 
Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...
Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...
Sags auf meine Weise - Plugin-Texte vs. Kundenwünsche (WordCamp Hamburg 2014,...
 
Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)
 
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific LanguagesAgiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 

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

  • 1. define( 'WPLANG', 'de_DE' ); $wp_local_package = 'de_DE'; Session: WordPress Plugins und Themes übersetzbar machen David Decker · deckerweb.de · WP Camp 2012
  • 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 Standards David Decker · deckerweb.de · WP Camp 2012
  • 3. Selbst Hand anlegen WordPress bringt alles mit! via PHP Gettext Gettext Funktionen Textdomain laden: allgemein Plugins Themes Child Themes David Decker · deckerweb.de · WP Camp 2012
  • 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. 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. 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 Pfade beachten!) David Decker · deckerweb.de · WP Camp 2012
  • 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/' sollte gefiltert werden David Decker · deckerweb.de · WP Camp 2012
  • 8. style.css Kopfbereich, Metadaten: Child /* Text Domain: dein-child-theme-slug Domain Path: rel-sprachdatei-pfad Themes: */ 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önnte gefiltert werden David Decker · deckerweb.de · WP Camp 2012
  • 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. Plugins vs. Themes: Dateinamen der Sprachdateien Themes: Plugins: de_DE.mo /.po deine-textdomain-de_DE.mo /.po nl_NL.mo /.po deine-textdomain-nl_NL.mo /.po fi.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_Language David Decker · deckerweb.de · WP Camp 2012
  • 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 Performance David Decker · deckerweb.de · WP Camp 2012
  • 12. Syntaxbeispiele I Korrekt: 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. Immer: Single Quotes! Syntaxbeispiele II EINE (1) Textdomain: String in Single Quotes Falsch: $string = __( $string, 'textdomain' ); $string = __( "Germany consists of $number federal states", '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. Syntaxbeispiele III Erweitert: $string = sprintf( __( 'Germany consists of %d federal states', 'textdomain' ), $number ); $string = sprintf( _n( 'Germany consists of %d federal state', '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$d cars', 'textdomain' ), $bike_count, $car_count ); Hinweis: "%1$s" macht Probleme (PHP: $s !!!), daher Single Quotes David Decker · deckerweb.de · WP Camp 2012
  • 15. Syntaxbeispiele IV Kontext: $string = _x( 'Frankfurt', 'German city at the river Main', 'textdomain' ); $string = _x( 'Frankfurt', 'German city at the river Oder', 'textdomain' ); $string = _x( 'Frankfurt', 'an asteroid', 'textdomain' ); David Decker · deckerweb.de · WP Camp 2012
  • 16. Syntaxbeispiele V Formatierungen: $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. Syntaxbeispiele VI Sicherheit: 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. Syntaxbeispiele - Spezial I Numerical No-op: $string = sprintf( _n( 'I have %d bike.', 'You have %d bikes.', $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. Syntaxbeispiele - Spezial II Zahlen & Daten: number_format_i18n() date_i18n() David Decker · deckerweb.de · WP Camp 2012
  • 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. vergessen bei 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. 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 Ausgaben in Attributen! David Decker · deckerweb.de · WP Camp 2012
  • 22. Best Practices II Pfadangaben checken! load_textdomain() fordert absoluten Pfad load_plugin/theme/child_theme_textdomain() fordern relativen Pfad BONUS 1: Sprachdatei-Ordner filterbar machen bzw. Zusätzlichen Ort für Update-sichere Sprachdateien bereitstellen BONUS 2: Ein GlotPress aufsetzen, um der Community das Übersetzen zu erleichtern... ;-) David Decker · deckerweb.de · WP Camp 2012
  • 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ür Platzhalter-Tests!) Testen! Testen! Testen! David Decker · deckerweb.de · WP Camp 2012
  • 24. Codestyling Localization David Decker · deckerweb.de · WP Camp 2012
  • 25. Codestyling Localization David Decker · deckerweb.de · WP Camp 2012
  • 26. GlotPress Installation David Decker · deckerweb.de · WP Camp 2012
  • 27. GlotPress Installation David Decker · deckerweb.de · WP Camp 2012
  • 28. GlotPress Installation David Decker · deckerweb.de · WP Camp 2012
  • 29. PoEdit Editor (poedit.net) David Decker · deckerweb.de · WP Camp 2012
  • 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. Danke! Fragen jetzt! Folien unter: deckerweb.de/wpcamp2012 plus: slideshare.net/deckerweb David Decker @deckerweb +David Decker deckerweb.de deckerweb.de/sprachdateien translate.wpautobahn.com David Decker · deckerweb.de · WP Camp 2012
  • 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