* pot generation in a function
[lhc/web/wiklou.git] / maintenance / lang2po.php
1 <?php
2 /**
3 * Convert Language files to .po files !
4 *
5 * Todo:
6 * - generate .po header
7 * - fix escaping of \
8 */
9
10 /** This is a command line script */
11 require_once('commandLine.inc');
12 require_once('languages.inc');
13
14 define('ALL_LANGUAGES', true);
15 define('XGETTEXT_BIN', 'xgettext');
16 define('MSGMERGE_BIN', 'msgmerge');
17
18 // used to generate the .pot
19 define('XGETTEXT_OPTIONS', '-n --keyword=wfMsg --keyword=wfMsgForContent ');
20
21 define('LOCALE_OUTPUT_DIR', $IP.'/locale');
22
23
24 if( isset($options['help']) ) { usage(); die(); }
25 // default output is WikiText
26 if( !isset($options['lang']) ) { $options['lang'] = ALL_LANGUAGES; }
27
28 function usage() {
29 print <<<END
30 Usage: php lang2po.php [--help] [--lang=<langcode>] [--stdout]
31 --help: this message.
32 --lang: a lang code you want to generate a .po for (default: all languages).
33
34 END;
35 }
36
37
38 /**
39 * Return a dummy header for later edition.
40 * @return string A dummy header
41 */
42 function poHeader() {
43 return
44 '# SOME DESCRIPTIVE TITLE.
45 # Copyright (C) 2005 MediaWiki
46 # This file is distributed under the same license as the MediaWiki package.
47 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
48 #
49 #, fuzzy
50 msgid ""
51 msgstr ""
52 "Project-Id-Version: PACKAGE VERSION\n"
53 "Report-Msgid-Bugs-To: bugzilllaaaaa\n"
54 "POT-Creation-Date: 2005-08-16 20:13+0200\n"
55 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
56 "Last-Translator: VARIOUS <nobody>\n"
57 "Language-Team: LANGUAGE <nobody>\n"
58 "MIME-Version: 1.0\n"
59 "Content-Type: text/plain; charset=UTF-8\n"
60 "Content-Transfer-Encoding: 8bit\n"
61 ';
62 }
63
64 /**
65 * generate and write a file in .po format.
66 *
67 * @param string $langcode Code of a language it will process.
68 * @param array &$messages Array containing the various messages.
69 * @return string Filename where stuff got saved or false.
70 */
71 function generatePo($langcode, &$messages) {
72 $data = poHeader();
73
74 // Generate .po entries
75 foreach($messages as $identifier => $content) {
76 $data .= "msgid \"$identifier\"\n";
77
78 // Escape backslashes
79 $tmp = str_replace('\\', '\\\\', $content);
80 // Escape doublelquotes
81 $tmp = preg_replace( "/(?<!\\\\)\"/", '\"', $tmp);
82 // Rewrite multilines to gettext format
83 $tmp = str_replace("\n", "\"\n\"", $tmp);
84
85 $data .= 'msgstr "'. $tmp . "\"\n\n";
86 }
87
88 // Write the content to a file in locale/XX/messages.po
89 $dir = LOCALE_OUTPUT_DIR.'/'.$langcode;
90 if( !is_dir($dir) ) { mkdir( $dir, 0770 ); }
91 $filename = $dir.'/fromlanguagefile.po';
92
93 $file = fopen( $filename , 'wb' );
94 if( fwrite( $file, $data ) ) {
95 fclose( $file );
96 return $filename;
97 } else {
98 fclose( $file );
99 return false;
100 }
101 }
102
103 function generatePot() {
104 global $IP;
105 $curdir = getcwd();
106 chdir($IP);
107 exec( XGETTEXT_BIN
108 .' '.XGETTEXT_OPTIONS
109 .' -o '.LOCALE_OUTPUT_DIR.'/wfMsg.pot'
110 .' includes/*php'
111 );
112 chdir($curdir);
113 }
114
115 function applyPot($langcode) {
116 $langdir = LOCALE_OUTPUT_DIR.'/'.$langcode;
117
118 $from = $langdir.'/fromlanguagefile.po';
119 $pot = LOCALE_OUTPUT_DIR.'/wfMsg.pot';
120 $dest = $langdir.'/messages.po';
121
122 // Merge template and generate file to get final .po
123 exec(MSGMERGE_BIN." $from $pot -o $dest ");
124 // delete no more needed file
125 unlink($from);
126 }
127
128 // Generate a template .pot based on source tree
129 echo "Getting 'gettext' default messages from sources:";
130 generatePot();
131 echo "done.\n";
132
133
134 $langTool = new languages();
135
136 // Do all languages
137 foreach ( $langTool->getList() as $langcode) {
138 echo "Loading messages for $langcode:\t";
139 require_once( 'languages/Language' . $langcode . '.php' );
140 $arr = 'wgAllMessages'.$langcode;
141 if(!@is_array($$arr)) {
142 echo "NONE FOUND\n";
143 } else {
144 echo "ok\n";
145 if( ! generatePo($langcode, $$arr) ) {
146 echo "ERROR: Failed to wrote file.\n";
147 } else {
148 echo "Applying template:";
149 applyPot($langcode);
150 }
151 }
152 }
153 ?>