Support » Plugins » Polylang Programmierung Verständnisfrage

  • Hallo (nochmals),

    ich bin nun um einiges weiter mit meinem Projekt.
    Mehrsprachigkeit klappt alles wie es soll – danke nochmals dafür falls derjenige das liest 🙂

    Nun geht es aber um Polylang.

    Was ich herausgefunden habe ist folgenden.

    Man muss die Strings anscheinend registrieren sodass Polylang diese String erkennt.
    Das ist nicht das Problem – das Problem ist die Ausgabe.

    Nicht direkt die Ausgabe sondern eher die Ausgabe wenn Polylang nicht aktiv ist.

    Denn dann funktioniert pll__ nicht bzw. verursacht einen 500er Fehler.

    Hier der betreffende Code:

    function my_setup() {
    	
    	if(function_exists('icl_register_string')) {
    		$string = "Ein String der ubersetzt werden muss.";
    		icl_register_string('test', 'dsgvoaio_comments_checkbox_info', "Ein String der ubersetzt werden muss.");
    		echo pll__("Ein String der ubersetzt werden muss.", 'test'); 
    	}
    }

    Der Code macht im Grunde was er machen soll.
    Ich kann den Text via Polylang String Translation übersetzen/bearbeiten.
    Der String wird auch je nach gewählter Sprache via Polylang Switcher dann in der korrekten Sprache ausgegeben.

    Der Code verursacht aktuell keinen Fehler 500 da ich ja prüfe ob die Funktion icl_register_string existiert.

    Das Problem ist aber da kann ich ja nicht überall im Plugincode machen (ca. 20.000 Zeilen Code) also __ mit pll__ ersetzen…
    Sogar wenn ich das so ersetze habe ich immer noch das Problem das wenn Polylang nicht aktiv ist ein Fehler Auftritt.

    Bevor ich nun ewig rumcode und es dann trotzdem falsch ist:

    Muss ich echt bei jedem pll__ eine if Abfrage einbauen die checkt ob Polylang aktiv ist und wenn nicht wird statt pll__ – __ gesetzt/ausgegeben?

    Das wäre blöd und viel Arbeit.

    Hoffe es ist jemand da der sich damit wirklich auskennt.

    Grüße und Danke im voraus,
    Michael

    • Dieses Thema wurde geändert vor 4 Jahre, 3 Monaten von mlfactory.
Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Hallo,
    freut mich, dass das mit der Mehrsprachigkeit und Deinem Plugin jetzt funktioniert.
    Am besten antwortest Du dann immer in dem entsprechenden Thema und markierst das dann als gelöst, um das Thema damit abzuschließen.
    Mit Polylang kenne ich mich nur ansatzweise aus.
    Trotzdem scheint da wohl ein Denkfehler vorzuliegen:
    Mit Polylang kannst Du dafür sorgen, dass Seiten und Beiträge in der übersetzten Form jeweils gezeigt werden. Wenn Du also z. B. eine Seite in Englisch und in Deutsch anbieten willst, dann müssen die jeweiligen Webseiten entsprechend übersetzt werden und damit ist der Inhalt dann quasi zwei mal da: einmal die englische und ein mal die deutsche Seite. Das hat mit der Programmierung erst mal gar nichts zu tun.

    Bei einem Plugin, das mehrsprachig angeboten werden soll, müssen die jeweiligen Sprachdateien (PO und MO) vorliegen.
    Evtl. hilft es, wenn Du Dir mal eine entsprechende Anleitung zu Polylang ansiehst. Hier habe ich was gefunden, was da vielleicht helfen kann.

    Viele Grüße
    Hans-Gerd

    Thread-Starter mlfactory

    (@mlfactory)

    Hallo,

    ich hätte natürlich auf das alte Thema geantwortet – dieses wurde aber geschlossen daher konnte ich nicht mehr antworten.

    Gut habe verstanden das Polylang nichts mit der Grundsätzlichen Spracheinstellung von WordPress zu tun hat.

    Es ist eben so das bei meinen Plugin der Admin Texte festlegen/verändern kann.

    Als Beispiel: Dies ist ein Text

    Das kann der über die Plugin Einstellungen machen via Textarea.

    Mein Problem ist nun, durch das dass der Benutzer diese Texte verändern kann – kann ich diese ja nicht in den mo bzw. po files definieren/übersetzen.

    Wie gesagt die Texte die „statisch“ per __(’string‘, ‚textdomain‘); definiert sind werden korrekt übersetzt – auch wenn ich bei Polylang die Sprache ändere.

    Aber die Texte die der Benutzers selbst festlegen kann – wie übersetze ich diese?

    Ich muss sagen das diese Texte bei der Plugin Installation gesetzt werden sozusagen Standard Texte.
    Diese würde ich gerne übersetzen.

    Dazu jemand einen Tipp?

    Grüße und schönen Sonntag,
    Michael

    Hallo,

    ich hätte natürlich auf das alte Thema geantwortet – dieses wurde aber geschlossen daher konnte ich nicht mehr antworten.

    … ja sorry, ich hatte das Thema fälschlicherweise geschlossen – das ist aber jetzt wieder geöffnet.

    Es ist eben so das bei meinen Plugin der Admin Texte festlegen/verändern kann.

    diese Texte könnten in den Einstellungen für das Plugin stehen und da vom Admin geändert werden. Ich habe z. B. die Beschriftung bei Buttons in einem Plugin von mir in die Einstellungen des Plugins gelegt. Dann werden zwar über die Sprachdateien Vorschläge für die Übersetzung gemacht, diese können aber individuell geändert werden.
    Beispiel:
    Englische Beschreibung des Buttons: Read more
    Übersetzung in der Sprachdatei deutsch (default): Lies mehr
    Übersetzung in der Sprachdatei deutsch (formal): Lesen Sie mehr
    Ich wollte aber für eine Seite, auf der ich das Plugin einsetze gerne den folgenden Text nutzen: Lies mehr auf der Veranstalterseite
    Diesen Text habe ich dann in den Einstellungen entsprechend geändert.
    Viele Grüße und ebenfalls einen schönen Sonntag
    Hans-Gerd

    Thread-Starter mlfactory

    (@mlfactory)

    OK alles klar aber ich glaube du verstehst mich falsch – oder aber du sagtest ja du hast dich mit Polylang nicht wirklich beschäftigt – du weist es auch nicht 🙂

    https://imgur.com/ySsFW7W

    Hier mal ein Bild aus den Settings eines anderes Plugins.

    Hier muss man für beide Sprachen die Texte extra definieren.

    Diese sind im Quellcode festgelegt:

    function wf_cookieconsent_get_options($language = null) {
    
      $options = get_option('wf_cookieconsent_options');
      if (!$language) $language = wf_get_language();
    
      $data = array(
        'wf_cookietext' => empty($options[$language]['wf_cookietext']) ? null : $options[$language]['wf_cookietext'],
        'wf_dismisstext' => empty($options[$language]['wf_dismisstext']) ? null : $options[$language]['wf_dismisstext'],
        'wf_linktext' => empty($options[$language]['wf_linktext']) ? null : $options[$language]['wf_linktext'],
        'wf_linkhref' => empty($options[$language]['wf_linkhref']) ? null : $options[$language]['wf_linkhref'],
        'wf_position' => empty($options['wf_position']) ? 'bottom' : $options['wf_position'],
        'language' => $language
      );
    
      switch ($data['language']) {
    
        case 'de':
          if (empty($data['wf_cookietext'])) $data['wf_cookietext'] = "Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden. ";
          if (empty($data['wf_dismisstext'])) $data['wf_dismisstext'] = "OK";
          if (empty($data['wf_linktext'])) $data['wf_linktext'] = "Weitere Informationen";
          break;
    
        case 'it':
          if (empty($data['wf_cookietext'])) $data['wf_cookietext'] = "I cookie ci aiutano ad erogare servizi di qualità. Utilizzando i nostri servizi, l'utente accetta le nostre modalità d'uso dei cookie.";
          if (empty($data['wf_dismisstext'])) $data['wf_dismisstext'] = "OK";
          if (empty($data['wf_linktext'])) $data['wf_linktext'] = "Ulteriori informazioni";
          break;
    
        case 'fr':
            if (empty($data['wf_cookietext'])) $data['wf_cookietext'] = "Les cookies nous permettent de vous proposer nos services plus facilement. En utilisant nos services, vous nous donnez expressément votre accord pour exploiter ces cookies.";
            if (empty($data['wf_dismisstext'])) $data['wf_dismisstext'] = "OK";
            if (empty($data['wf_linktext'])) $data['wf_linktext'] = "En savoir plus";
            break;
    
        case 'nl':
            if (empty($data['wf_cookietext'])) $data['wf_cookietext'] = "Cookies helpen ons bij het leveren van onze diensten. Door gebruik te maken van onze diensten, gaat u akkoord met ons gebruik van cookies.";
            if (empty($data['wf_dismisstext'])) $data['wf_dismisstext'] = "OK";
            if (empty($data['wf_linktext'])) $data['wf_linktext'] = "Meer informatie";
            break;
    
        case 'fi':
            if (empty($data['wf_cookietext'])) $data['wf_cookietext'] = "Evästeet auttavat meitä palvelujemme toimituksessa. Käyttämällä palvelujamme hyväksyt evästeiden käytön.";
            if (empty($data['wf_dismisstext'])) $data['wf_dismisstext'] = "Selvä";
            if (empty($data['wf_linktext'])) $data['wf_linktext'] = "Lisätietoja";
            break;
    
    		case 'hu':
            if (empty($data['wf_cookietext'])) $data['wf_cookietext'] = "A weboldalon cookie-kat használunk, amik segítenek minket a lehető legjobb szolgáltatások nyújtásában. Weboldalunk további használatával jóváhagyja, hogy cookie-kat használjunk.";
            if (empty($data['wf_dismisstext'])) $data['wf_dismisstext'] = "OK";
            if (empty($data['wf_linktext'])) $data['wf_linktext'] = "További információk";
            break;
    
        default:
            if (empty($data['wf_cookietext'])) $data['wf_cookietext'] = "Cookies help us deliver our services. By using our services, you agree to our use of cookies.";
            if (empty($data['wf_dismisstext'])) $data['wf_dismisstext'] = "Got it";
            if (empty($data['wf_linktext'])) $data['wf_linktext'] = "Learn more";
            break;
      }
      return $data;
    }

    Dann wären da noch Funktionen wie:

    if (!function_exists('wf_get_languages')) {
    
    	function wf_get_languages() {
    		$languages = array();
    		//get all languages from polylang plugin https://wordpress.org/plugins/polylang/
    		global $polylang;
    		if (function_exists('PLL')) {
    			// for polylang versions > 1.8
    			$pl_languages = PLL()->model->get_languages_list();
    		} else if (isset($polylang)) {
    			// for older polylang version
    			$pl_languages = $polylang->model->get_languages_list();
    		}
    		if (isset($pl_languages)) {
    			// iterate through polylang language list
    			foreach ($pl_languages as $pl_language) {
    				$languages[] = $pl_language->slug;
    			}
    		} else if(function_exists('icl_get_languages')) {
    			//get all languages with icl_get_languages for wpml
    			$wpml_languages = icl_get_languages('skip_missing=0');
    			foreach ($wpml_languages as $wpml_language) {
    				$languages[] = !empty($wpml_language['language_code']) ? $wpml_language['language_code'] : $wpml_language['code'];
    			}
    		}
    		else {
    			//return wp get_locale() - first 2 chars (en, it, de ...)
    			$languages[] = substr(get_locale(),0,2);
    		}
    		return $languages;
    	}
    
    }

    Diese Strings des Plugins erscheinen zwar auch nicht in den String Translations aber naja besser als nix.

    Hier noch ein Link Codeseitig https://wpml.org/documentation/support/translation-for-texts-by-other-plugins-and-themes/

    Wir haben ein Projekt mit Polylang umgesetzt. Also insofern weiß ich schon was Polylang ist 🙂
    Hier ein screenshot, um deutlich zu machen, dass es durchaus über die Einstellungen in einem von mir erstellten Plugin möglich ist, den Text anzupassen.
    Hier der entsprechende Teil des Quellcodes für die Vorbelegung der Variablen (Array):

    		if (empty( $ait_options['fs_bezeichnung_externer_link'])) {
    			 $ait_options['fs_bezeichnung_externer_link'] = 'Read More';
    		}
    		if (empty( $ait_options['fs_bezeichnung_events_link'])) {
    			 $ait_options['fs_bezeichnung_events_link'] = 'More Events';
    		}
    		if (empty( $ait_options['fs_bezeichnung_interner_link'])) {
    			 $ait_options['fs_bezeichnung_interner_link'] = 'Read More on this website ';
    		}
    

    Und hier der entsprechende Teil des Quellcodes für die Einstellungen des Plugins:

    					<tr valign="top">
    	        <th scope="row"><?php echo __( 'Description for external link:', 'add-infos-to-the-events-calendar' ); ?></th>
    					<td><input type="text" name="add_infos_to_tec_settings[fs_bezeichnung_externer_link]" size=30 value="<?php echo esc_attr( $add_infos_to_tec_options['fs_bezeichnung_externer_link']); ?>" /></td>
    	        </tr>
    
    					<tr valign="top">
    	        <th scope="row"><?php echo __( 'Description for events:', 'add-infos-to-the-events-calendar' ); ?></th>
    					<td><input type="text" name="add_infos_to_tec_settings[fs_bezeichnung_events_link]" size=30 value="<?php echo esc_attr( $add_infos_to_tec_options['fs_bezeichnung_events_link']); ?>" /></td>
    	        </tr>
    
    					<tr valign="top">
    	        <th scope="row"><?php echo __( 'Description for internal link:', 'add-infos-to-the-events-calendar' ); ?></th>
    					<td><input type="text" name="add_infos_to_tec_settings[fs_bezeichnung_interner_link]" size=30 value="<?php echo esc_attr( $add_infos_to_tec_options['fs_bezeichnung_interner_link']); ?>" /></td>
    	        </tr>
    

    Aber Du hast schon recht: Mir ist überhaupt nicht klar, was Du da überhaupt planst. Außerdem hast Du einen Link gesendet (

    Hier noch ein Link Codeseitig

    ), der jetzt auf einmal WPML und nicht Polylang betrifft.

    Ich könnte mir – ohne jetzt in die Tiefe zu gehen – vorstellen, dass die function wf_cookieconsent_get_options dazu dient, grundsätzlich die Variablen mit Text vorzubelegen, der dann später im Admin – Bereich geändert werden kann – ähnlich wie die oben dargestellten Code-Schnipsel von mir.

    Thread-Starter mlfactory

    (@mlfactory)

    Ok im Code sehe ich aber nichts bzgl. Polylang, das geht nicht in meine Kopf das bei dir die Eingaben auch Mehrsprachig sind.

    Zum Verständnis:

    add_infos_to_tec_settings[fs_bezeichnung_events_link] wäre ohne das der Admin was ändert Standard More Events.

    More Events hast du wohl in den mo – po Files definiert / übersetzt, korrekt?

    Wenn der Nutzer im Frontend nun die Sprache im Frontend ändert wird der String in der richtigen Sprache ausgegeben, korrekt?

    Soweit so klar.

    Was passiert wenn der Admin bei den Plugin Einstellungen add_infos_to_tec_settings[fs_bezeichnung_events_link] den Wert davon ändert – als Beispiel?

    Was ist dann mit der Übersetzung des Wertes?

    Warum WPML – gute Frage aber Polylang unterstützt ja die selben Funktionen quasi oder?
    Also viele was ich so gelesen hab…

    Grüße, Michael

    Ok im Code sehe ich aber nichts bzgl. Polylang

    nein, das wird hier nicht benötigt.

    add_infos_to_tec_settings[fs_bezeichnung_events_link] wäre ohne das der Admin was ändert Standard More Events.

    ja

    More Events hast du wohl in den mo – po Files definiert / übersetzt, korrekt?

    ja

    Was passiert wenn der Admin bei den Plugin Einstellungen add_infos_to_tec_settings[fs_bezeichnung_events_link] den Wert davon ändert

    dann wird der geänderte Wert übernommen.
    Beispiel: Wenn Deutsch als Sprache eingestellt ist und Du – warum auch immer – das in niederländisch als Text für die Bezeichnung schreiben willst, dann würde das in Niederländisch da stehen.
    Weiteres Beispiel: In der deutschen Übersetzung (default) steht „Lies mehr“ und ich schreibe in den Admin-Einstellungen „List mehr auf der Webseite des Veranstalters“ (das Beispiel hatte ich ja oben schon genannt).

    Thread-Starter mlfactory

    (@mlfactory)

    Komisch das dass bei mir dann nicht klappt wenn ich im Frontend die Sprache via Polylang ändere….

    Beispiel: Wenn Deutsch als Sprache eingestellt ist und Du – warum auch immer – das in niederländisch als Text für die Bezeichnung schreiben willst

    Ja der Nutzer des Plugins will halt die Texte selbst ändern können – und zwar in beiden Sprachen DE und EN im Bezug auf Polylang /WPML.

    Grüße Michael

    Komisch das dass bei mir dann nicht klappt wenn ich im Frontend die Sprache via Polylang ändere….

    sorry, ich kann Dir da leider nicht (mehr) weiterhelfen
    Viele Grüße
    Hans-Gerd

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Das Thema „Polylang Programmierung Verständnisfrage“ ist für neue Antworten geschlossen.