WordPress.org

Make WordPress Core

Ticket #17268: native.php

File native.php, 6.6 KB (added by linushoppe, 2 years ago)

native gettext-support php-file

Line 
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   * @revision 02
12   * @author Bernd Holzmueller <bernd@tiggerswelt.net>
13   * @url http://oss.tiggerswelt.net/wordpress/3.3.0/
14   * @license http://creativecommons.org/licenses/by-sa/3.0/de/ Creative Commons Attribution-Share Alike 3.0 Germany
15   **/
16 
17  // Check if gettext-support is available
18  if (!extension_loaded ('gettext'))
19    return;
20 
21  class Translate_GetText_Native {
22    // Our default domain
23    private $Domain = null;
24   
25    // Merged domains
26    private $pOthers = array ();
27    private $sOthers = array ();
28   
29    // Some Dummy-Function just to be API-compatible
30    function add_entry ($entry) { return false; }
31    function add_entry_or_merge ($entry) { return false; }
32    function set_header ($header, $value) { return false; }
33    function set_headers (&$headers) { return false; }
34    function get_header ($header) { return false; }
35    function translate_entry (&$entry) { return false; }
36   
37    // {{{ select_plural_form
38    /**
39     * Given the number of items, returns the 0-based index of the plural form to use
40     *
41     * Here, in the base Translations class, the common logic for English is implemented:
42     *      0 if there is one element, 1 otherwise
43     *
44     * This function should be overrided by the sub-classes. For example MO/PO can derive the logic
45     * from their headers.
46     *
47     * @param integer $count number of items
48     **/
49    function select_plural_form ($count) {
50      return (1 == $count? 0 : 1);
51    }
52    // }}}
53   
54    function get_plural_forms_count () { return 2; }
55   
56    // {{{ merge_with
57    /**
58     * Merge this translation with another one, the other one takes precedence
59     *
60     * @param object $other
61     *
62     * @access public
63     * @return void
64     **/
65    function merge_with (&$other) {
66      $this->pOthers [] = $other;
67    }
68    // }}}
69   
70    // {{{ merge_originals_with
71    /**
72     * Merge this translation with another one, this one takes precedence
73     *
74     * @param object $other
75     *
76     * @access public
77     * @return void 
78     **/
79    function merge_originals_with (&$other) {
80      $this->sOthers [] = $Other;
81    }
82    // }}}
83   
84    // {{{ translate
85    /**
86     * Try to translate a given string
87     *
88     * @param string $singular
89     * @param string $context (optional)
90     *
91     * @access public
92     * @return string
93     **/
94    function translate ($singular, $context = null) {
95      // Check for an empty string
96      if (strlen ($singular) == 0)
97        return $singular;
98     
99      // Check other domains that take precedence
100      foreach ($this->pOthers as $o)
101        if (($t = $o->translate ($singular, $context)) != $singular)
102          return $t;
103     
104      // Make sure we have a domain assigned
105      if ($this->Domain === null)
106        return $singular;
107     
108      // Translate without a context
109      if ($context === null) {
110        if (($t = dgettext ($this->Domain, $singular)) != $singular)
111          return $t;
112     
113      // Translate with a given context
114      } else {
115        $T = $context . "\x04" . $singular;
116        $t = dgettext ($this->Domain, $T);
117       
118        if ($T != $t)
119          return $t;
120      }
121     
122      // Check for other domains
123      foreach ($this->sOthers as $o)
124        if (($t = $o->translate ($singular, $context)) != $singular)
125          return $t;
126     
127      return $singular;
128    }
129    // }}}
130   
131    // {{{ translate_plural
132    /**
133     * Try to translate a plural string
134     *
135     * @param string $singular Singular version
136     * @param string $plural Plural version
137     * @param int $count Number of "items"
138     * @param string $context (optional)
139     *
140     * @access public
141     * @return string
142     **/
143    function translate_plural ($singular, $plural, $count, $context = null) {
144      // Check for an empty string
145      if (strlen ($singular) == 0)
146        return $singular;
147     
148      // Get the "default" return-value
149      $default = ($count == 1 ? $singular : $plural);
150     
151      // Check other domains that take precedence
152      foreach ($this->pOthers as $o)
153        if (($t = $o->translate_plural ($singular, $plural, $count, $context)) != $default)
154          return $t;
155     
156      // Make sure we have a domain assigned
157      if ($this->Domain === null)
158        return $default;
159     
160      // Translate without context
161      if ($context === null) {
162        $t = dngettext ($this->Domain, $singular, $plural, $count);
163       
164        if (($t != $singular) && ($t != $plural))
165          return $t;
166     
167      // Translate using a given context
168      } else {
169        $T = $context . "\x04" . $singular;
170        $t = dngettext ($this->Domain, $T, $plural, $count);
171       
172        if (($T != $t) && ($t != $plural))
173          return $t;
174      }
175     
176      // Check other domains
177      foreach ($this->sOthers as $o)
178        if (($t = $o->translate_plural ($singular, $plural, $count, $context)) != $default)
179          return $t;
180     
181      return $default;
182    }
183    // }}}
184   
185    // {{{ import_from_file
186    /**
187     * Fills up with the entries from MO file $filename
188     *
189     * @param string $filename MO file to load
190     **/
191    function import_from_file ($filename) {
192      // Make sure that the locale is set correctly in environment
193      global $locale;
194     
195      putenv ('LC_ALL=' . $locale);
196      setlocale (LC_ALL, $locale);
197     
198      // Retrive MD5-hash of the file
199      # DIRTY! But there is no other way at the moment to make this work
200      if (!($Domain = md5_file ($filename)))
201        return false;
202     
203      // Make sure that the language-directory exists
204      $Path = './wp-lang/' . $locale . '/LC_MESSAGES';
205     
206      if (!wp_mkdir_p ($Path))
207        return false;
208     
209      // Make sure that the MO-File is existant at the destination
210      $fn = $Path . '/' . $Domain . '.mo';
211     
212      if (!is_file ($fn) && !@copy ($filename, $fn))
213        return false;
214     
215      // Setup the "domain" for gettext
216      bindtextdomain ($Domain, './wp-lang/');
217      bind_textdomain_codeset ($domain, 'UTF-8');
218     
219      // Do the final stuff and return success
220      $this->Domain = $Domain;
221     
222      return true;
223    }
224    // }}}
225  }
226 
227  if (function_exists ('class_alias'))
228    class_alias ('Translate_GetText_Native', 'MO');
229  else {
230    class MO extends Translate_GetText_Native { }
231  }
232
233?>