]> git.mxchange.org Git - friendica.git/commitdiff
Add po2php console
authorHypolite Petovan <mrpetovan@gmail.com>
Sun, 18 Mar 2018 23:26:43 +0000 (19:26 -0400)
committerHypolite Petovan <mrpetovan@gmail.com>
Sun, 18 Mar 2018 23:28:21 +0000 (19:28 -0400)
src/Core/Console.php
src/Core/Console/PoToPhp.php [new file with mode: 0644]

index d315c10a25ea08d54e32dd599307a8db7065dd9a..ebaa33f95065554c6e51f82a5479662b2fe0806e 100644 (file)
@@ -30,6 +30,7 @@ Commands:
        help                   Show help about a command, e.g (bin/console help config)\r
        maintenance            Set maintenance mode for this node\r
        php2po                 Generate a messages.po file from a strings.php file\r
+       po2php                 Generate a strings.php file from a messages.po file\r
 \r
 Options:\r
        -h|--help|-? Show help information\r
@@ -109,6 +110,8 @@ HELP;
                                break;\r
                        case 'php2po': $subconsole = new Console\PhpToPo($subargs);\r
                                break;\r
+                       case 'po2php': $subconsole = new Console\PoToPhp($subargs);\r
+                               break;\r
                        default:\r
                                throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist');\r
                }\r
diff --git a/src/Core/Console/PoToPhp.php b/src/Core/Console/PoToPhp.php
new file mode 100644 (file)
index 0000000..3a58d9f
--- /dev/null
@@ -0,0 +1,197 @@
+<?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