Say it, Baby

Wie ich ja letztens bereits erwähnt hatte, ist es nun möglich, sich WeizenSpr.eu in verschiedenen Sprachen anzusehen - nunja, zur Zeit ist die Auswahl leider erstmal auf die Sprachen Deutsch und Englisch geschrumpft. Aber dazu gleich mehr.

Es war nun die Idee aufgekommen, die Übersetzungsfunktion des Global Translator und die Vorlesefunktion des WebReader zu kombinieren - sprich: die übersetzten Artikel auch übersetzt vorlesen zu lassen. Bisher war es nämlich so, dass die Artikel zwar übersetzt angezeigt wurden, jedoch die deutsche Fassung vorgelesen wurde. Dem habe ich nun Abhilfe verschafft 😀 !

Leider kam es durch das ganze Geteste dazu, dass ich nun (hoffentlich nur vorübergehend) vom Google Translator Service gebloggckt wurde. Aus diesem Grund bin ich vorerst zum Service des Free Translator gewechselt - damit einher geht, dass nur noch die Übersetzung ins Englische unterstützt wird und zudem die Merkwürdigkeit, dass die Seite immer doppelt angezeigt wird.
Ich hoffe, dass Google mich bald wieder für ihren Service zulässt, bis dahin muss ich leider mit dieser Unschönheit Vorlieb nehmen.

Nun habe ich mir aber gedacht, dass es eventuell auch noch andere Leute, die sowohl den Global Translator, als auch den WebReader im Einsatz haben und sich ebenfalls denken, dass es lustig wäre, die übersetzten Artikel vorlesen zu lassen. Diejenigen seien an dieser Stelle gleich darauf hingewiesen, dass das ganze eher in der Kategorie "nicht schön, aber selten" anzusiedeln ist 😀 !

Um es vorweg zu sagen: das hier ist noch nicht die perfekte Lösung! Das Vorlesen der übersetzten Artikel funktioniert zwar, wenn man sich direkt eine Seite oder einen Artikel ansieht, jedoch funktioniert es nicht, wenn man im Archiv stöbert, oder man sich auf der Indexseite befindet.

Ich werde euch einfach mal zeigen, welche Ansätze ich verfolgt habe und warum diese schief-gegangen sind...

Angefangen habe ich beim Bearbeiten des WebReader-Plugins. Dort wird nämlich die URL generiert, über der WebReader-Service weiß, welche Seite übersetzt werden muss. Das wäre die eleganteste Variante gewesen, scheiterte aber daran, dass die Artikel garnicht mitkriegen, dass sie übersetzt werden. Mitgekriegt habe ich das über diesen Quelltext:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  function rspeak_is_SSL() {
    return (($_SERVER["HTTPS"] == 1) ||
            ($_SERVER['HTTPS'] == 'on') ||
            ($_SERVER['SERVER_PORT'] == 443));
  }

  function rspeak_current_URL() {
    $protocol = "http";
    if (rspeak_is_SSL()) {
      $protocol = $protocol . "s";
    }
    $protocol = $protocol . "://";

    $port = "";
    if (!rspeak_is_SSL() && ($_SERVER['SERVER_PORT'] != 80)) {
      $port = "" . $_SERVER['SERVER_PORT'] . "";
    }

    $serverName = $_SERVER["SERVER_NAME"];
    $requestURI = $_SERVER["REQUEST_URI"];

    return $protocol . $serverName . $port . $requestURI;
  }

  // checks whether we need the translation permalink
  function rspeak_lang_permalink($postid) {
    // presume Global Translator is not available
    $languages = false;
    // default result is default permalink
    $permalink = get_permalink($postid);

    // Global Translator is available
    if (class_exists("gltr_translation_engine")) {
      if (!defined("LANGS_PATTERN_WITHOUT_FINAL_SLASH")) {
        $languages = split("\|", LANGS_PATTERN_WITHOUT_FINAL_SLASH);
      }
      else {
        if (!defined("LANGS_PATTERN_WITH_SLASHES")) {
          $languages = split("/\|", LANGS_PATTERN_WITH_SLASHES);
        }
        else {
          if (defined("LANGS_PATTERN")) {
            $languages = split("\|", LANGS_PATTERN);

            // &$value works since PHP 5
            foreach ($languages as &$element) {
              $element = "/" . $element;
            }
          }
        }
      }
    }

    // if Global Translator is available:
    // check for language specific permalink
    if ($languages !== false) {
      $blogURL = get_bloginfo("url");
      $pageURL = rspeak_current_URL();
      $pageURI = str_replace($blogURL, "", $pageURL);

      // search for second slash in URI
      $slashPos = strpos($pageURI, "/", 1);
      if ($slashPos !== false) {
        // could be non-default language
        $langName = substr($pageURI, 0, $slashPos);

        $item = array_search($langName, $languages);
        if ($item !== false) {
          // we have found a language identifier
          $postURL = get_permalink($postid);
          $postURI = str_replace($blogURL, "", $postURL);

          $permalink = $blogURL . $languages[$item] . $postURI;
        }
        else {
          // is not a language identifier
        }
      }
      else {
        // must be default language
      }
    }

    return $permalink;
  }

"Lustigerweise" liefert rspeak_current_URL() nämlich auch in übersetzten Artikeln die URL des nicht-übersetzten Artikels zurück. Eigentlich hatte ich nämlich vor, aus der derzeitigen URL das Kürzel der verwendeten Sprache herauszulesen und dieses in die URL für den WebReader-Server hineinzukopieren.

Nachdem ich mitbekommen hatte, dass es so nicht funktioniert, war meine nächste Idee, das Einfügen des Sprach-Kürzels in den Global Translator auszulagern. Deshalb änderte ich die Funktion rspeak_lang_permalink() wie folgt an:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  // checks whether we need the translation permalink
  function rspeak_lang_permalink($postid) {
    // presume Global Translator is not available
    $languages = false;
    // default result is default permalink
    $permalink = get_permalink($postid);
    <strong>
    // Global Translator is available
    if (defined("GLOB_TRANS_WEBREADER")) {
      $blogURL = get_bloginfo("url");
      $postURL = get_permalink($postid);
      $postURI = str_replace($blogURL, "", $postURL);

      $permalink = $blogURL .
                   GLOB_TRANS_WEBREADER_LANG_REPLACE .
                   $postURI;
    }
    </strong>
    return $permalink;
  }

Damit das ganze funktioniert, definierte ich beim Global Translator noch zwei Konstanten und änderte die Funktion gltr_clean_translated_page() wie folgt ab:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  define("GLOB_TRANS_WEBREADER", true);
  define("GLOB_TRANS_WEBREADER_LANG_REPLACE", "%!%language%!%");

  // [...]

  function gltr_clean_translated_page($buf, $lang) {

    // [...]

    $buf = str_replace(GLOB_TRANS_WEBREADER_LANG_REPLACE, "/" . $lang, $buf);

    // [...]

  }

Das wäre wohl eine ideale Lösung gewesen 😀 ! Wenn... ja, wenn denn auch die Seite der Ursprungssprache weiterhin funktioniert hätte. Denn da die Seite in der Ursprungssprache (Deutsch) die Funktion gltr_clean_translated_page() garnicht durchläuft, waren dort alle Vorlese-Links kaputt.

Also hieß es wieder: weiterarbeiten!
Bis mir schlussendlich die entscheidende Idee kam 😀 ! Und zwar: bei einer Seite in Originalsprache kann der Vorlese-Link so bleiben, wie er ist. Alle Seiten, die übersetzt werden, durchlaufen die Funktion gltr_clean_translated_page() - die obendrein auch noch dafür zuständig ist, Links zu korrigieren! Warum also nicht den falschen Link erstmal generieren lassen und dann hier an dieser Stelle reparieren lassen? Gesagt getan - also erstmal alle Änderungen rückgängig gemacht und nur noch Änderungen in der translator.php vorgenommen.
Praktischerweise wird die Funktion nur ein einziges Mal aufgerufen - und zwar in der Funktion gltr_translate(). Diesen Aufruf habe ich umgeändert in:

1
$page = gltr_clean_translated_page($buf, $lang, $url_to_translate);

Anschließend habe ich die Funktion gltr_clean_translated_page() wie folgt geändert:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  function gltr_clean_translated_page($buf, $lang, $replaceURL = "") {

    // [...]

    // added str_replace for $replaceURL
    if ($replaceURL != "") {
      if ($lang != BASE_LANG) {
        $blogURL = get_bloginfo("url");
        if ($replaceURL != $blogURL) {
          $postURI = str_replace($blogURL, "", $replaceURL);
          if (substr($postURI, 1, strlen($lang)) != $lang) {
            $postURL = $blogURL . "/" . $lang . $postURI;

            $buf = str_replace($replaceURL, $postURL, $buf);
          }
        }
      }
    }

    // [...]

  }

Wie bereits erwähnt, ist das noch nicht die perfekte Lösung, aber sie funkioniert erst einmal beim direkten Betrachten eines Artikels oder einer Seite. Ich werde trotzdem dran bleiben und sehen, ob mir noch was all-umfassenderes einfällt 🙂 .

Bevor ich es vergesse: das ganze funktioniert bisher leider auch nur, wenn Pretty Permalinks verwendet werden!

Und nicht vergessen: Ich hafte nicht für Schäden an Software, Hardware oder für Vermögensschäden, die durch Anwendung dieser Änderungen entstanden sind oder entstehen könnten. 😉
Update:
Inzwischen habe ich übrigens eine perfekte Lösung gefunden!
Talking to you, Kenny

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.