--- /dev/null
+<?php\r
+\r
+namespace Friendica\Core\Console;\r
+\r
+/**\r
+ * Read a messages.po file and create strings.php in the same directory\r
+ *\r
+ * @author Hypolite Petovan <mrpetovan@gmail.com>\r
+ */\r
+class PoToPhp extends \Asika\SimpleConsole\Console\r
+{\r
+ protected $helpOptions = ['h', 'help', '?'];\r
+\r
+ const DQ_ESCAPE = "__DQ__";\r
+\r
+ protected function getHelp()\r
+ {\r
+ $help = <<<HELP\r
+console php2po - Generate a strings.php file from a messages.po file\r
+Usage\r
+ bin/console php2po <path/to/messages.po> [-h|--help|-?] [-v]\r
+\r
+Description\r
+ Read a messages.po file and create the according strings.php in the same directory\r
+\r
+Options\r
+ -h|--help|-? Show help information\r
+ -v Show more debug information.\r
+HELP;\r
+ return $help;\r
+ }\r
+\r
+ protected function doExecute()\r
+ {\r
+ if ($this->getOption('v')) {\r
+ $this->out('Class: ' . __CLASS__);\r
+ $this->out('Arguments: ' . var_export($this->args, true));\r
+ $this->out('Options: ' . var_export($this->options, true));\r
+ }\r
+\r
+ if (count($this->args) == 0) {\r
+ $this->out($this->getHelp());\r
+ return 0;\r
+ }\r
+\r
+ if (count($this->args) > 1) {\r
+ throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');\r
+ }\r
+\r
+ $a = get_app();\r
+\r
+ $pofile = realpath($this->getArgument(0));\r
+\r
+ if (!file_exists($pofile)) {\r
+ throw new \RuntimeException('Supplied file path doesn\'t exist.');\r
+ }\r
+\r
+ if (!is_writable(dirname($pofile))) {\r
+ throw new \RuntimeException('Supplied directory isn\'t writable.');\r
+ }\r
+\r
+ $outfile = dirname($pofile) . DIRECTORY_SEPARATOR . 'strings.php';\r
+\r
+ if (strstr($outfile, 'util')) {\r
+ $lang = 'en';\r
+ } else {\r
+ $lang = str_replace('-', '_', basename(dirname($pofile)));\r
+ }\r
+\r
+ $this->out('Out to ' . $outfile);\r
+\r
+ $out = "<?php\n\n";\r
+\r
+ $infile = file($pofile);\r
+ $k = '';\r
+ $v = '';\r
+ $arr = false;\r
+ $ink = false;\r
+ $inv = false;\r
+ $escape_s_exp = '|[^\\\\]\$[a-z]|';\r
+\r
+ foreach ($infile as $l) {\r
+ $l = str_replace('\"', self::DQ_ESCAPE, $l);\r
+ $len = strlen($l);\r
+ if ($l[0] == "#") {\r
+ $l = "";\r
+ }\r
+\r
+ if (substr($l, 0, 15) == '"Plural-Forms: ') {\r
+ $match = [];\r
+ preg_match("|nplurals=([0-9]*); *plural=(.*)[;\\\\]|", $l, $match);\r
+ $cond = str_replace('n', '$n', $match[2]);\r
+ // define plural select function if not already defined\r
+ $fnname = 'string_plural_select_' . $lang;\r
+ $out .= 'if(! function_exists("' . $fnname . '")) {' . "\n";\r
+ $out .= 'function ' . $fnname . '($n){' . "\n";\r
+ $out .= ' return ' . $cond . ';' . "\n";\r
+ $out .= '}}' . "\n";\r
+ }\r
+\r
+ if ($k != "" && substr($l, 0, 7) == 'msgstr ') {\r
+ if ($ink) {\r
+ $ink = false;\r
+ $out .= '$a->strings["' . $k . '"] = ';\r
+ }\r
+\r
+ if ($inv) {\r
+ $inv = false;\r
+ $out .= '"' . $v . '"';\r
+ }\r
+\r
+ $v = substr($l, 8, $len - 11);\r
+ $v = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $v);\r
+\r
+ $inv = true;\r
+ }\r
+ if ($k != "" && substr($l, 0, 7) == 'msgstr[') {\r
+ if ($ink) {\r
+ $ink = false;\r
+ $out .= '$a->strings["' . $k . '"] = ';\r
+ }\r
+ if ($inv) {\r
+ $inv = false;\r
+ $out .= '"' . $v . '"';\r
+ }\r
+\r
+ if (!$arr) {\r
+ $arr = True;\r
+ $out .= "[\n";\r
+ }\r
+ $match = [];\r
+ preg_match("|\[([0-9]*)\] (.*)|", $l, $match);\r
+ $out .= "\t"\r
+ . preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $match[1])\r
+ . ' => '\r
+ . preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $match[2])\r
+ . ",\n";\r
+ }\r
+\r
+ if (substr($l, 0, 6) == 'msgid_') {\r
+ $ink = false;\r
+ $out .= '$a->strings["' . $k . '"] = ';\r
+ }\r
+\r
+ if ($ink) {\r
+ $k .= trim($l, "\"\r\n");\r
+ $k = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $k);\r
+ }\r
+\r
+ if (substr($l, 0, 6) == 'msgid ') {\r
+ if ($inv) {\r
+ $inv = false;\r
+ $out .= '"' . $v . '"';\r
+ }\r
+ if ($k != "") {\r
+ $out .= ($arr) ? "];\n" : ";\n";\r
+ }\r
+ $arr = false;\r
+ $k = str_replace("msgid ", "", $l);\r
+ if ($k != '""') {\r
+ $k = trim($k, "\"\r\n");\r
+ } else {\r
+ $k = '';\r
+ }\r
+\r
+ $k = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $k);\r
+ $ink = true;\r
+ }\r
+\r
+ if ($inv && substr($l, 0, 6) != "msgstr") {\r
+ $v .= trim($l, "\"\r\n");\r
+ $v = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $v);\r
+ }\r
+ }\r
+\r
+ if ($inv) {\r
+ $inv = false;\r
+ $out .= '"' . $v . '"';\r
+ }\r
+\r
+ if ($k != '') {\r
+ $out .= ($arr ? "];\n" : ";\n");\r
+ }\r
+\r
+ $out = str_replace(self::DQ_ESCAPE, '\"', $out);\r
+ if (!file_put_contents($outfile, $out)) {\r
+ throw new \RuntimeException('Unable to write to ' . $outfile);\r
+ }\r
+\r
+ return 0;\r
+ }\r
+\r
+ private function escapeDollar($match)\r
+ {\r
+ return str_replace('$', '\$', $match[0]);\r
+ }\r
+}\r