parent
f6fcda2781
commit
2b2c676eca
10
util/README
10
util/README
|
@ -72,7 +72,7 @@ $a->string["%d message sent"] = Array(
|
|||
The function string_plural_select($n) defined in strings.php, return the string
|
||||
index to use, related to the numbers of item (value of $n).
|
||||
|
||||
This is modelled after ngettext function of GNU gettext.
|
||||
This is modeled after ngettext function of GNU gettext.
|
||||
More info at http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html
|
||||
|
||||
|
||||
|
@ -117,10 +117,4 @@ When strings are added or modified in source, you could run
|
|||
|
||||
If you already translated Friendica using strings.php, you could import your old
|
||||
translation to messages.po. Run:
|
||||
$ php util/php2po.php view/lang/<language>/strings.php
|
||||
|
||||
|
||||
You may also use the util/string_translator.php web interface to translate the string file, but it is disabled for website security reasons. The web server will need write permission to your language directories and the "Deny ..." line in util/.htaccess will need to be modified or commented to use the utility.
|
||||
|
||||
|
||||
|
||||
$ php bin/console php2po view/lang/<language>/strings.php
|
||||
|
|
204
util/php2po.php
204
util/php2po.php
|
@ -1,204 +0,0 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* Read strings.php file and create messages.po
|
||||
*
|
||||
* php utils/php2po.php <path/to/strings.php>
|
||||
*
|
||||
* Output to <path/to/messages.po>
|
||||
*/
|
||||
|
||||
DEFINE("NORM_REGEXP", "|[\\\]|");
|
||||
|
||||
$a = new stdClass();
|
||||
|
||||
if ($argc<2 || in_array('-h', $argv) || in_array('--h', $argv)) {
|
||||
print "Usage: ".$argv[0]." [-p <n>] <strings.php>\n\n";
|
||||
print "Options:\n";
|
||||
print "p\tNumber of plural forms. Default: 2\n";
|
||||
print "\n";
|
||||
return;
|
||||
}
|
||||
|
||||
$phpfile = $argv[1];
|
||||
$pofile = dirname($phpfile)."/messages.po";
|
||||
|
||||
if (!file_exists($phpfile)){
|
||||
print "Unable to find '$phpfile'\n";
|
||||
return;
|
||||
}
|
||||
|
||||
// utility functions
|
||||
function startsWith($haystack, $needle) {
|
||||
// search backwards starting from haystack length characters from the end
|
||||
return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
|
||||
}
|
||||
|
||||
|
||||
// start !
|
||||
include_once($phpfile);
|
||||
|
||||
$out = '';
|
||||
$out .= "# FRIENDICA Distributed Social Network\n";
|
||||
$out .= "# Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project\n";
|
||||
$out .= "# This file is distributed under the same license as the Friendica package.\n";
|
||||
$out .= "# \n";
|
||||
$out .= 'msgid ""' ."\n";
|
||||
$out .= 'msgstr ""' ."\n";
|
||||
$out .= '"Project-Id-Version: friendica\n"' ."\n";
|
||||
$out .= '"Report-Msgid-Bugs-To: \n"' ."\n";
|
||||
$out .= '"POT-Creation-Date: '. date("Y-m-d H:i:sO").'\n"' ."\n";
|
||||
$out .= '"MIME-Version: 1.0\n"' ."\n";
|
||||
$out .= '"Content-Type: text/plain; charset=UTF-8\n"' ."\n";
|
||||
$out .= '"Content-Transfer-Encoding: 8bit\n"' ."\n";
|
||||
|
||||
// search for plural info
|
||||
$lang = "";
|
||||
$lang_logic = "";
|
||||
$lang_pnum = 2;
|
||||
|
||||
$_idx = array_search('-p', $argv);
|
||||
if ($_idx !== false) {
|
||||
$lang_pnum = $argv[$_idx+1];
|
||||
}
|
||||
|
||||
$infile = file($phpfile);
|
||||
foreach($infile as $l) {
|
||||
$l = trim($l);
|
||||
if (startsWith($l, 'function string_plural_select_')) {
|
||||
$lang = str_replace( 'function string_plural_select_' , '', str_replace( '($n){','', $l) );
|
||||
}
|
||||
if (startsWith($l, 'return')) {
|
||||
$lang_logic = str_replace( '$', '', trim( str_replace( 'return ' , '', $l) , ';') );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
echo "Language: $lang\n";
|
||||
echo "Plural forms: $lang_pnum\n";
|
||||
echo "Plural logic: $lang_logic;\n";
|
||||
|
||||
$out .= sprintf('"Language: %s\n"', $lang) ."\n";
|
||||
$out .= sprintf('"Plural-Forms: nplurals=%s; plural=%s;\n"', $lang_pnum, $lang_logic) ."\n";
|
||||
$out .= "\n";
|
||||
|
||||
print "\nLoading base message.po...";
|
||||
|
||||
// load base messages.po and extract msgids
|
||||
$base_msgids = [];
|
||||
$norm_base_msgids = [];
|
||||
$base_f = file("util/messages.po");
|
||||
if (!$base_f) {
|
||||
die("No base messages.po\n");
|
||||
}
|
||||
|
||||
$_f = 0;
|
||||
$_mid = "";
|
||||
$_mids = [];
|
||||
foreach( $base_f as $l) {
|
||||
$l = trim($l);
|
||||
//~ print $l."\n";
|
||||
|
||||
if (startsWith($l, 'msgstr')) {
|
||||
if ($_mid != '""') {
|
||||
$base_msgids[$_mid] = $_mids;
|
||||
$norm_base_msgids[preg_replace(NORM_REGEXP, "", $_mid)] = $_mid;
|
||||
//~ print "\t\t\t".$_mid. print_r($base_msgids[$_mid], true);
|
||||
}
|
||||
|
||||
$_f = 0;
|
||||
$_mid = "";
|
||||
$_mids = [];
|
||||
|
||||
}
|
||||
|
||||
if (startsWith($l, '"') && $_f==2) {
|
||||
$_mids[count($_mids)-1] .= "\n".$l;
|
||||
//~ print "\t\t+mids: ".print_t($_mids, true);
|
||||
}
|
||||
if (startsWith($l, 'msgid_plural ')) {
|
||||
$_f = 2;
|
||||
$_mids[] = str_replace('msgid_plural ', '' , $l);
|
||||
//~ print "\t\t mids: ".print_r($_mids, true);
|
||||
}
|
||||
|
||||
if (startsWith($l, '"') && $_f==1) {
|
||||
$_mid .= "\n".$l;
|
||||
$_mids[count($_mids)-1] .= "\n".$l;
|
||||
//~ print "\t+mid: $_mid \n";
|
||||
}
|
||||
if (startsWith($l, 'msgid ')) {
|
||||
$_f = 1;
|
||||
$_mid = str_replace('msgid ', '' , $l);
|
||||
$_mids = [$_mid];
|
||||
//~ print "\t mid: $_mid \n";
|
||||
}
|
||||
//~ print "\t\t\t\t$_f\n\n";
|
||||
}
|
||||
|
||||
print " done\n";
|
||||
print "Creating '$pofile'...";
|
||||
// create msgid and msgstr
|
||||
|
||||
/**
|
||||
* Get a string and retun a message.po ready text
|
||||
* - replace " with \"
|
||||
* - replace tab char with \t
|
||||
* - manage multiline strings
|
||||
*/
|
||||
function massage_string($str) {
|
||||
$str = str_replace('\\','\\\\',$str);
|
||||
$str = str_replace('"','\"',$str);
|
||||
$str = str_replace("\t",'\t',$str);
|
||||
$str = str_replace("\n",'\n"'."\n".'"',$str);
|
||||
if (strpos($str, "\n")!==false && $str[0]!=='"') $str = '"'."\n".$str;
|
||||
$str = preg_replace("|\n([^\"])|", "\n\"$1", $str);
|
||||
return sprintf('"%s"', $str);
|
||||
}
|
||||
|
||||
function find_original_msgid($str) {
|
||||
global $norm_base_msgids;
|
||||
$norm_str = preg_replace(NORM_REGEXP, "", $str);
|
||||
if (array_key_exists($norm_str, $norm_base_msgids)) {
|
||||
return $norm_base_msgids[$norm_str];
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
$warnings = "";
|
||||
foreach($a->strings as $key=>$str) {
|
||||
$msgid = massage_string($key);
|
||||
|
||||
if (preg_match("|%[sd0-9](\$[sn])*|", $msgid)) {
|
||||
$out .= "#, php-format\n";
|
||||
}
|
||||
$msgid = find_original_msgid($msgid);
|
||||
$out .= 'msgid '. $msgid . "\n";
|
||||
|
||||
if (is_array($str)) {
|
||||
if (array_key_exists($msgid, $base_msgids) && isset($base_msgids[$msgid][1])) {
|
||||
$out .= 'msgid_plural '. $base_msgids[$msgid][1] . "\n";
|
||||
} else {
|
||||
$out .= 'msgid_plural '. $msgid . "\n";
|
||||
$warnings .= "[W] No source plural form for msgid:\n". str_replace("\n","\n\t", $msgid) . "\n\n";
|
||||
}
|
||||
foreach ( $str as $n => $msgstr) {
|
||||
$out .= 'msgstr['.$n.'] '. massage_string($msgstr) . "\n";
|
||||
}
|
||||
} else {
|
||||
$out .= 'msgstr '. massage_string($str) . "\n";
|
||||
}
|
||||
|
||||
$out .= "\n";
|
||||
|
||||
}
|
||||
|
||||
file_put_contents($pofile, $out);
|
||||
|
||||
print " done\n";
|
||||
|
||||
if ($warnings=="") {
|
||||
print "No warnings.\n";
|
||||
} else {
|
||||
print $warnings;
|
||||
}
|
Loading…
Reference in New Issue
Block a user