aboutsummaryrefslogtreecommitdiffstats
path: root/langs/php-mo.php
diff options
context:
space:
mode:
Diffstat (limited to 'langs/php-mo.php')
-rw-r--r--langs/php-mo.php154
1 files changed, 154 insertions, 0 deletions
diff --git a/langs/php-mo.php b/langs/php-mo.php
new file mode 100644
index 000000000..470ce80e8
--- /dev/null
+++ b/langs/php-mo.php
@@ -0,0 +1,154 @@
+<?php
+/**
+ * based on php.mo 0.1 by Joss Crowcroft (http://www.josscrowcroft.com)
+ * added case for commented unused string
+ * fixed "fuzzy flag first line" bug which didn't saved previous proper string at all
+ * removed unedeed phpmo_convert and phpmo_write_mo_file
+ *
+ * Converts gettext translation '.po' files to binary '.mo' files in PHP.
+ *
+ * Usage:
+ * <?php require('php-mo.php'); phpmo_convert( 'input.po', [ 'output.mo' ] ); ?>
+ *
+ * NB:
+ * - If no $output_file specified, output filename is same as $input_file (but .mo)
+ * - Returns true/false for success/failure
+ * - No warranty, but if it breaks, please let me know
+ *
+ * More info:
+ * https://github.com/josscrowcroft/php.mo
+ *
+ * Based on php-msgfmt by Matthias Bauer (Copyright © 2007), a command-line PHP tool
+ * for converting .po files to .mo.
+ * (http://wordpress-soc-2007.googlecode.com/svn/trunk/moeffju/php-msgfmt/msgfmt.php)
+ *
+ * License: GPL v3 http://www.opensource.org/licenses/gpl-3.0.html
+ */
+
+function phpmo_clean_helper($x) {
+ if (is_array($x)) {
+ foreach ($x as $k => $v) {
+ $x[$k] = phpmo_clean_helper($v);
+ }
+ } else {
+ if ($x[0] == '"')
+ $x = substr($x, 1, -1);
+ $x = str_replace("\"\n\"", '', $x);
+ $x = str_replace('$', '\\$', $x);
+ }
+ return $x;
+}
+
+/* Parse gettext .po files. */
+/* @link http://www.gnu.org/software/gettext/manual/gettext.html#PO-Files */
+function phpmo_parse_po_file($in) {
+ // read .po file
+ $fh = @fopen($in, 'r');
+ if ($fh === false) {
+ // Could not open file resource
+ return false;
+ }
+
+ // results array
+ $hash = array ();
+ // temporary array
+ $temp = array ();
+ // state
+ $state = null;
+ $fuzzy = false;
+
+ // iterate over lines
+ while(($line = fgets($fh, 65536)) !== false) {
+ $line = trim($line);
+ if ($line === '') {
+ // save stored entry on empty line
+ // block moved to fix "fuzzy flag first line" bug which didn't saved previous proper string at all
+ if (sizeof($temp) && array_key_exists('msgid', $temp) && array_key_exists('msgstr', $temp)) {
+ if (!$fuzzy)
+ $hash[] = $temp;
+ $temp = array ();
+ $state = null;
+ $fuzzy = false;
+ }
+ continue;
+ }
+ $array_of_splited_string = preg_split('/\s/', $line, 2);
+ $key = $array_of_splited_string[0];
+ $data = (isset($array_of_splited_string[1]) ? $array_of_splited_string[1] : '');
+
+ switch ($key) {
+ case '#,' : // flag...
+ $fuzzy = in_array('fuzzy', preg_split('/,\s*/', $data));
+ case '#' : // translator-comments
+ case '#.' : // extracted-comments
+ case '#:' : // reference...
+ case '#|' : // msgid previous-untranslated-string
+ break;
+ case '#~' : // commented-unused-string
+ $temp = array ();
+ $state = null;
+ $fuzzy = false;
+ break;
+ case 'msgctxt' :
+ // context
+ case 'msgid' :
+ // untranslated-string
+ case 'msgid_plural' :
+ // untranslated-string-plural
+ $state = $key;
+ $temp[$state] = $data;
+ break;
+ case 'msgstr' :
+ // translated-string
+ $state = 'msgstr';
+ $temp[$state][] = $data;
+ break;
+ default :
+ if (strpos($key, 'msgstr[') !== FALSE) {
+ // translated-string-case-n
+ $state = 'msgstr';
+ $temp[$state][] = $data;
+ } else {
+ // continued lines
+ switch ($state) {
+ case 'msgctxt' :
+ case 'msgid' :
+ case 'msgid_plural' :
+ $temp[$state] .= "\n" . $line;
+ break;
+ case 'msgstr' :
+ $temp[$state][sizeof($temp[$state]) - 1] .= "\n" . $line;
+ break;
+ default :
+ // parse error
+ fclose($fh);
+ return FALSE;
+ }
+ }
+ break;
+ }
+ }
+ fclose($fh);
+
+ // add final entry
+ if ($state == 'msgstr')
+ $hash[] = $temp;
+
+ // Cleanup data, merge multiline entries, reindex hash for ksort
+ $temp = $hash;
+ $hash = array ();
+ foreach ($temp as $entry) {
+ foreach ($entry as & $v) {
+ $v = phpmo_clean_helper($v);
+ if ($v === FALSE) {
+ // parse error
+ return FALSE;
+ }
+ }
+ $hash[$entry['msgid']] = $entry;
+ }
+
+ return $hash;
+}
+
+?> \ No newline at end of file