web-dev-qa-db-fra.com

Comment développer un thème multilingue?

Je n'ai pas encore trouvé de description succincte de la création d'un thème multilingue WordPress.

Je suis un développeur assez compétent et j'ai créé quelques thèmes personnalisés à mon époque. Pour un projet sur lequel je travaille, je commence tout juste le processus de conversion de ma structure filaire en WordPress. Je sais déjà que ce site n'utilisera que ce thème personnalisé que je crée et je sais que le site sera disponible dans environ 5 langues différentes.

Il y aura un sélecteur de langue en haut de la page où l'utilisateur pourra simplement cliquer sur le drapeau de son pays et actualisera certains paramètres internes qui modifieront la langue de l'ensemble du site. D'après ce que j'ai compris, vous pouvez utiliser des fichiers po/mo pour traduire des sites, mais je n'arrive malheureusement pas à comprendre.

Le scénario idéal serait que je développe le thème en anglais et que toute chaîne ayant plusieurs traductions utilise une fonction de localisation (__ () & _e ()?). Une fois le développement terminé, je dois pouvoir ajouter une traduction à chacune des chaînes traduisibles de chaque langue. Je suis à peu près sûr que la solution consiste à utiliser POEdit, mais je ne comprends pas comment tout cela est lié.

Pour plus de précision, je ne cherche pas de plug-in dans lequel vous avez différentes traductions pour différentes pages/publications. Je recherche une solution qui me permet de traduire des chaînes individuelles dans mon thème personnalisé.

Merci d'avance pour tout conseil que vous pouvez donner.

2
Ollie

La réponse de Daniel était très similaire, mais s'appliquait aux plugins plutôt qu'aux thèmes. Pour cette raison, j'expliquerai comment je l'ai fait spécifiquement pour les thèmes de quiconque rencontre ce problème.

  1. Créez un dossier à la racine de votre thème appelé "langues"
  2. Allez à https://wpcentral.io/internationalization/ , recherchez votre langue et copiez le code "WordPress Locale" (par exemple, cs_CZ pour le tchèque).
  3. Poedit ouvert
  4. Fichier -> Nouveau
  5. Collez le code que vous avez copié de wpcentral dans la zone qui apparaît
  6. Appuyez sur Enregistrer, puis enregistrez dans le dossier "Langues" créé à l'étape 1.
  7. Appuyez sur "Extraire des sources" (ou Catalogue-> Propriétés)
  8. Sous "Sources Paths", appuyez sur le signe + de la zone Chemins.
  9. Sélectionnez votre dossier de thèmes (par exemple, wp-content/themes/my-theme).
  10. Dans l'onglet "Sources Keywords", cliquez sur "New Item"
  11. Tapez "__" (trait de soulignement, sans guillemets) et appuyez sur Entrée.
  12. Tapez "_e" (sans guillemets) et appuyez sur Entrée.
  13. Appuyer sur OK
  14. Appuyez sur Enregistrer
  15. Catalogue de presse-> Mise à jour à partir de sources
  16. Vous devriez voir apparaître toutes les chaînes traduisibles de votre thème (essentiellement chaque fois que vous utilisez "__ ('Hello world', 'mydomain')", la traduction apparaîtra)
  17. Une fois que vous avez terminé vos traductions, appuyez sur Fichier-> Compiler en MO (enregistrez dans le même dossier de langues à l’étape 1).
  18. Ajoutez le code suivant en haut du fichier de fonctions de votre thème:

    function mytheme_localisation(){
    
        function mytheme_localised( $locale ) {
            if ( isset( $_GET['l'] ) ) {
                return sanitize_key( $_GET['l'] );
            }
            return $locale;
        }
        add_filter( 'locale', 'mytheme_localised' );
    
        load_theme_textdomain( 'mytheme', get_template_directory() . '/languages' );
    }
    add_action( 'after_setup_theme', 'mytheme_localisation' );
    
  19. Maintenant, pour traduire dynamiquement votre site, vous pouvez simplement ajouter le paramètre URL l = {code de langue} (par exemple, mysite.com/?l=cs_CZ - cela chargera le fichier cs_CZ.mo que nous avons traduit avec poedit).

Pour résumer: pour traduire des chaînes dans votre thème, utilisez le code suivant:

__( 'Hello, World!', 'mytheme' )

Où "mytheme" est le domaine de texte que vous avez défini dans la fonction de l'étape 18. Si vous combinez cela avec la création des fichiers PO/MO à l'aide de Poedit, vous pourrez rendre votre thème multilingue. Dans mon cas, c’était la solution idéale, car je pouvais changer de langue de façon dynamique en utilisant un sélecteur d’indicateurs sur mon site, et je pouvais enregistrer les préférences de l’utilisateur dans un cookie, puis les rediriger à leur retour.

J'espère que cela aidera quelqu'un d'autre qui a un problème similaire, car cela m'a pris ages à résoudre.

3
Ollie

Moi-même, je l'ai fait plusieurs fois ces dernières années, mais seulement pour les plug-ins que j'ai fabriqués. Mais je pense que cela fonctionnera en quelque sorte ou moins identique. Vous devez en effet utiliser la fonction __ () ou une fonction similaire, mais vous devrez toujours au préalable charger le domaine de texte. Je charge le domaine de texte immédiatement après la construction de la classe supérieure et est lancé explicitement par les descendants des contrôleurs front-end et back-end afin de le générer, de sorte que les constantes, etc.

/*
* Init localization text domain
*/
public static function plugin_load_textdomain(){
    load_plugin_textdomain( PLUGIN_TEXTDOMAIN, false, dirname(      
    plugin_basename( __FILE__ ) ) . '/languages' ); 
}

// This action hooks to WordPress init event and triggers it on init event
add_action( 'init', array($plugin->model, 'plugin_load_textdomain'), 10 ); 

Cela devrait fonctionner de la même façon avec les fonctions de modèle, je pense. Puis utilisez-le avec une chaîne pour traduire dans la couche de vue, c’est-à-dire

<?php echo __( 'Translate me!', PLUGIN_TEXTDOMAIN ); ?>

Pour que cela fonctionne, le dossier plugin_basename (FICHIER)). '/ languages' doit contenir les fichiers PO avec les chaînes traduites. J'utilise Poedit pour créer les fichiers. Les fichiers créés avec Poedit sont conformes à la manière native de WordPress de traduire et au fonctionnement de MO avec WordPress. Https://codex.wordpress.org/I18n_for_WordPress_Developers }.

J'espère que cela aide et je conviens que de bonnes informations ne sont pas très disponibles à ce sujet. N'hésitez pas à demander plus si nécessaire! Gr

1
Daniel Mulder