WordPress.org

Make WordPress Core

Ticket #17268: native_gettext.patch

File native_gettext.patch, 7.9 KB (added by linushoppe, 3 years ago)

patch against WP 3.3.1, corrects the $Domain-Bug

  • new file wordpress-3.3.1.mod/wp-includes/pomo/native.php

    - +  
     1<?PHP 
     2 
     3  /** 
     4   * Native GetText-Support for WordPress 
     5   * ------------------------------------ 
     6   * The Patch enhanced WordPress with native support for gettext. 
     7   * Actually WP is shipped with an own implementation called "PoMo" 
     8   * that uses a lot of resources like CPU-Time and Memory. 
     9   * Using gettext turned out to be much faster and efficient. 
     10   *  
     11   * Copyright (C) 2012 Bernd Holzmueller <bernd@quarxconnect.de> 
     12   * 
     13   * This program is free software: you can redistribute it and/or modify 
     14   * it under the terms of the GNU General Public License as published by 
     15   * the Free Software Foundation, either version 3 of the License, or 
     16   * (at your option) any later version. 
     17   *  
     18   * This program is distributed in the hope that it will be useful, 
     19   * but WITHOUT ANY WARRANTY; without even the implied warranty of 
     20   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     21   * GNU General Public License for more details. 
     22   * 
     23   * You should have received a copy of the GNU General Public License 
     24   * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
     25   * 
     26   * @revision 02 
     27   * @author Bernd Holzmueller <bernd@tiggerswelt.net> 
     28   * @url http://oss.tiggerswelt.net/wordpress/3.3.1/ 
     29   **/ 
     30   
     31  // Check if gettext-support is available 
     32  if (!extension_loaded ('gettext')) 
     33    return; 
     34   
     35  class Translate_GetText_Native { 
     36    // Our default domain 
     37    private $Domain = null; 
     38     
     39    // Merged domains 
     40    private $pOthers = array (); 
     41    private $sOthers = array (); 
     42     
     43    // Some Dummy-Function just to be API-compatible 
     44    function add_entry ($entry) { return false; } 
     45    function add_entry_or_merge ($entry) { return false; } 
     46    function set_header ($header, $value) { return false; } 
     47    function set_headers (&$headers) { return false; } 
     48    function get_header ($header) { return false; } 
     49    function translate_entry (&$entry) { return false; } 
     50     
     51    // {{{ select_plural_form 
     52    /** 
     53     * Given the number of items, returns the 0-based index of the plural form to use 
     54     * 
     55     * Here, in the base Translations class, the common logic for English is implemented: 
     56     *      0 if there is one element, 1 otherwise 
     57     * 
     58     * This function should be overrided by the sub-classes. For example MO/PO can derive the logic 
     59     * from their headers. 
     60     * 
     61     * @param integer $count number of items 
     62     **/ 
     63    function select_plural_form ($count) { 
     64      return (1 == $count? 0 : 1); 
     65    } 
     66    // }}} 
     67     
     68    function get_plural_forms_count () { return 2; } 
     69     
     70    // {{{ merge_with 
     71    /** 
     72     * Merge this translation with another one, the other one takes precedence 
     73     *  
     74     * @param object $other 
     75     *  
     76     * @access public 
     77     * @return void 
     78     **/ 
     79    function merge_with (&$other) { 
     80      $this->pOthers [] = $other; 
     81    } 
     82    // }}} 
     83     
     84    // {{{ merge_originals_with 
     85    /** 
     86     * Merge this translation with another one, this one takes precedence 
     87     *  
     88     * @param object $other 
     89     *  
     90     * @access public 
     91     * @return void   
     92     **/ 
     93    function merge_originals_with (&$other) { 
     94      $this->sOthers [] = $Other; 
     95    } 
     96    // }}} 
     97     
     98    // {{{ translate 
     99    /** 
     100     * Try to translate a given string 
     101     *  
     102     * @param string $singular 
     103     * @param string $context (optional) 
     104     *  
     105     * @access public 
     106     * @return string 
     107     **/ 
     108    function translate ($singular, $context = null) { 
     109      // Check for an empty string 
     110      if (strlen ($singular) == 0) 
     111        return $singular; 
     112       
     113      // Check other domains that take precedence 
     114      foreach ($this->pOthers as $o) 
     115        if (($t = $o->translate ($singular, $context)) != $singular) 
     116          return $t; 
     117       
     118      // Make sure we have a domain assigned 
     119      if ($this->Domain === null) 
     120        return $singular; 
     121       
     122      // Translate without a context 
     123      if ($context === null) { 
     124        if (($t = dgettext ($this->Domain, $singular)) != $singular) 
     125          return $t; 
     126       
     127      // Translate with a given context 
     128      } else { 
     129        $T = $context . "\x04" . $singular; 
     130        $t = dgettext ($this->Domain, $T); 
     131         
     132        if ($T != $t) 
     133          return $t; 
     134      } 
     135       
     136      // Check for other domains 
     137      foreach ($this->sOthers as $o) 
     138        if (($t = $o->translate ($singular, $context)) != $singular) 
     139          return $t; 
     140       
     141      return $singular; 
     142    } 
     143    // }}} 
     144     
     145    // {{{ translate_plural 
     146    /** 
     147     * Try to translate a plural string 
     148     *  
     149     * @param string $singular Singular version 
     150     * @param string $plural Plural version 
     151     * @param int $count Number of "items" 
     152     * @param string $context (optional) 
     153     *  
     154     * @access public 
     155     * @return string 
     156     **/ 
     157    function translate_plural ($singular, $plural, $count, $context = null) { 
     158      // Check for an empty string 
     159      if (strlen ($singular) == 0) 
     160        return $singular; 
     161       
     162      // Get the "default" return-value 
     163      $default = ($count == 1 ? $singular : $plural); 
     164       
     165      // Check other domains that take precedence 
     166      foreach ($this->pOthers as $o) 
     167        if (($t = $o->translate_plural ($singular, $plural, $count, $context)) != $default) 
     168          return $t; 
     169       
     170      // Make sure we have a domain assigned 
     171      if ($this->Domain === null) 
     172        return $default; 
     173       
     174      // Translate without context 
     175      if ($context === null) { 
     176        $t = dngettext ($this->Domain, $singular, $plural, $count); 
     177         
     178        if (($t != $singular) && ($t != $plural)) 
     179          return $t; 
     180       
     181      // Translate using a given context 
     182      } else { 
     183        $T = $context . "\x04" . $singular; 
     184        $t = dngettext ($this->Domain, $T, $plural, $count); 
     185         
     186        if (($T != $t) && ($t != $plural)) 
     187          return $t; 
     188      } 
     189       
     190      // Check other domains 
     191      foreach ($this->sOthers as $o) 
     192        if (($t = $o->translate_plural ($singular, $plural, $count, $context)) != $default) 
     193          return $t; 
     194       
     195      return $default; 
     196    } 
     197    // }}} 
     198     
     199    // {{{ import_from_file 
     200    /** 
     201     * Fills up with the entries from MO file $filename 
     202     * 
     203     * @param string $filename MO file to load 
     204     **/ 
     205    function import_from_file ($filename) { 
     206      // Make sure that the locale is set correctly in environment 
     207      global $locale; 
     208       
     209      putenv ('LC_ALL=' . $locale); 
     210      setlocale (LC_ALL, $locale); 
     211       
     212      // Retrive MD5-hash of the file 
     213      # DIRTY! But there is no other way at the moment to make this work 
     214      if (!($Domain = md5_file ($filename))) 
     215        return false; 
     216       
     217      // Make sure that the language-directory exists 
     218      $Path = './wp-lang/' . $locale . '/LC_MESSAGES'; 
     219       
     220      if (!wp_mkdir_p ($Path)) 
     221        return false; 
     222       
     223      // Make sure that the MO-File is existant at the destination 
     224      $fn = $Path . '/' . $Domain . '.mo'; 
     225       
     226      if (!is_file ($fn) && !@copy ($filename, $fn)) 
     227        return false; 
     228       
     229      // Setup the "domain" for gettext 
     230      bindtextdomain ($Domain, './wp-lang/'); 
     231      bind_textdomain_codeset ($Domain, 'UTF-8'); 
     232       
     233      // Do the final stuff and return success 
     234      $this->Domain = $Domain; 
     235       
     236      return true; 
     237    } 
     238    // }}} 
     239  } 
     240   
     241  if (function_exists ('class_alias')) 
     242    class_alias ('Translate_GetText_Native', 'MO'); 
     243  else { 
     244    class MO extends Translate_GetText_Native { } 
     245  } 
     246 
     247?> 
     248 No newline at end of file 
  • wp-settings.php

    old new  
    8383 
    8484// Load early WordPress files. 
    8585require( ABSPATH . WPINC . '/default-filters.php' ); 
     86 
     87require( ABSPATH . WPINC . '/pomo/native.php'); 
    8688require( ABSPATH . WPINC . '/pomo/mo.php' ); 
    8789 
    8890// Initialize multisite if enabled.