1PO4A-GETTEXTIZE.1P(1) User Contributed Perl DocumentationPO4A-GETTEXTIZE.1P(1)
2
3
4
6 po4a-gettextize - convert an original file (and its translation) to a
7 PO file
8
10 po4a-gettextize -f fmt -m master.doc -l XX.doc -p XX.po
11
12 (XX.po is the output, all others are inputs)
13
15 po4a (PO for anything) eases the maintenance of documentation
16 translation using the classical gettext tools. The main feature of po4a
17 is that it decouples the translation of content from its document
18 structure. Please refer to the page po4a(7) for a gentle introduction
19 to this project.
20
21 The po4a-gettextize script helps you converting your previously
22 existing translations into a po4a-based workflow. This is only to be
23 done once to salvage an existing translation while converting to po4a,
24 not on a regular basis after the conversion of your project. This
25 tedious process is explained in details in Section 'Converting a manual
26 translation to po4a' below.
27
28 You must provide both a master file (e.g., the source in English) and
29 an existing translated file (e.g., a previous translation attempt
30 without po4a). If you provide more than one master or translation
31 files, they will be used in sequence, but it may be easier to
32 gettextize each page or chapter separately and then use msgmerge to
33 merge all produced PO files. As you wish.
34
35 If the master document has non-ASCII characters, the new generated PO
36 file will be in UTF-8. If the master document is completely in ASCII,
37 the generated PO will use the encoding of the translated input
38 document.
39
41 -f, --format
42 Format of the documentation you want to handle. Use the
43 --help-format option to see the list of available formats.
44
45 -m, --master
46 File containing the master document to translate. You can use this
47 option multiple times if you want to gettextize multiple documents.
48
49 -M, --master-charset
50 Charset of the file containing the document to translate.
51
52 -l, --localized
53 File containing the localized (translated) document. If you
54 provided multiple master files, you may wish to provide multiple
55 localized file by using this option more than once.
56
57 -L, --localized-charset
58 Charset of the file containing the localized document.
59
60 -p, --po
61 File where the message catalog should be written. If not given, the
62 message catalog will be written to the standard output.
63
64 -o, --option
65 Extra option(s) to pass to the format plugin. See the documentation
66 of each plugin for more information about the valid options and
67 their meanings. For example, you could pass '-o tablecells' to the
68 AsciiDoc parser, while the text parser would accept '-o
69 tabs=split'.
70
71 -h, --help
72 Show a short help message.
73
74 --help-format
75 List the documentation formats understood by po4a.
76
77 -k --keep-temps
78 Keep the temporary master and localized POT files built before
79 merging. This can be useful to understand why these files get
80 desynchronized, leading to gettextization problems
81
82 -V, --version
83 Display the version of the script and exit.
84
85 -v, --verbose
86 Increase the verbosity of the program.
87
88 -d, --debug
89 Output some debugging information.
90
91 --msgid-bugs-address email@address
92 Set the report address for msgid bugs. By default, the created POT
93 files have no Report-Msgid-Bugs-To fields.
94
95 --copyright-holder string
96 Set the copyright holder in the POT header. The default value is
97 "Free Software Foundation, Inc."
98
99 --package-name string
100 Set the package name for the POT header. The default is "PACKAGE".
101
102 --package-version string
103 Set the package version for the POT header. The default is
104 "VERSION".
105
106 Converting a manual translation to po4a
107 po4a-gettextize synchronizes the master and localized files to extract
108 their content into a PO file. The content of the master file gives the
109 msgid while the content of the localized file gives the msgstr. This
110 process is somewhat fragile: the Nth string of the translated file is
111 supposed to be the translation of the Nth string in the original.
112
113 Gettextization works best if you manage to retrieve the exact version
114 of the original document that was used for translation. Even so, you
115 may need to fiddle with both master and localized files to align their
116 structure if it was changed by the original translator, so working on
117 files' copies is advised.
118
119 Internally, each po4a parser reports the syntactical type of each
120 extracted strings. This is how desynchronization are detected during
121 the gettextization. In the example depicted below, it is very unlikely
122 that the 4th string in translation (of type 'chapter') is the
123 translation of the 4th string in original (of type 'paragraph'). It is
124 more likely that a new paragraph was added to the original, or that two
125 original paragraphs were merged together in the translation.
126
127 Original Translation
128
129 chapter chapter
130 paragraph paragraph
131 paragraph paragraph
132 paragraph chapter
133 chapter paragraph
134 paragraph paragraph
135
136 po4a-gettextize will verbosely diagnose any structure
137 desynchronization. When this happens, you should manually edit the
138 files to add fake paragraphs or remove some content here and there
139 until the structure of both files actually match. Some tricks are given
140 below to salvage the most of the existing translation while doing so.
141
142 If you are lucky enough to have a perfect match in the file structures
143 out of the box, building a correct PO file is a matter of seconds.
144 Otherwise, you will soon understand why this process has such an ugly
145 name :) Even so, gettextization often remains faster than translating
146 everything again. I gettextized the French translation of the whole
147 Perl documentation in one day despite the many synchronization issues.
148 Given the amount of text (2Mb of original text), restarting the
149 translation without first salvaging the old translations would have
150 required several months of work. In addition, this grunt work is the
151 price to pay to get the comfort of po4a. Once converted, the
152 synchronization between master documents and translations will always
153 be fully automatic.
154
155 After a successful gettextization, the produced documents should be
156 manually checked for undetected disparities and silent errors, as
157 explained below.
158
159 Hints and tricks for the gettextization process
160
161 The gettextization stops as soon as a desynchronization is detected.
162 When this happens, you need to edit the files as much as needed to re-
163 align the files' structures. po4a-gettextize is rather verbose when
164 things go wrong. It reports the strings that don't match, their
165 positions in the text, and the type of each of them. Moreover, the PO
166 file generated so far is dumped as gettextization.failed.po for further
167 inspection.
168
169 Here are some tricks to help you in this tedious process and ensure
170 that you salvage the most of the previous translation:
171
172 • Remove all extra content of the translations, such as the section
173 giving credits to the translators. They should be added separately
174 to po4a as addendas (see po4a(7)).
175
176 • When editing the files to align their structures, prefer editing
177 the translation if possible. Indeed, if the changes to the original
178 are too intrusive, the old and new versions will not be matched
179 during the first po4a run after gettextization (see below). Any
180 unmatched translation will be dumped anyway. That being said, you
181 still want to edit the original document if it's too hard to get
182 the gettextization to proceed otherwise, even if it means that one
183 paragraph of the translation is dumped. The important thing is to
184 get a first PO file to start with.
185
186 • Do not hesitate to kill any original content that would not exist
187 in the translated version. This content will be automatically
188 reintroduced afterward, when synchronizing the PO file with the
189 document.
190
191 • You should probably inform the original author of any structural
192 change in the translation that seems justified. Issues in the
193 original document should reported to the author. Fixing them in
194 your translation only fixes them for a part of the community. Plus,
195 it is impossible to do so when using po4a ;) But you probably want
196 to wait until the end of the conversion to po4a before changing the
197 original files.
198
199 • Sometimes, the paragraph content does match, but not their types.
200 Fixing it is rather format-dependent. In POD and man, it often
201 comes from the fact that one of them contains a line beginning with
202 a white space while the other does not. In those formats, such
203 paragraph cannot be wrapped and thus become a different type. Just
204 remove the space and you are fine. It may also be a typo in the tag
205 name in XML.
206
207 Likewise, two paragraphs may get merged together in POD when the
208 separating line contains some spaces, or when there is no empty
209 line between the =item line and the content of the item.
210
211 • Sometimes, the desynchronization message seems odd because the
212 translation is attached to the wrong original paragraph. It is the
213 sign of an undetected issue earlier in the process. Search for the
214 actual desynchronization point by inspecting the file
215 gettextization.failed.po that was produced, and fix the problem
216 where it really is.
217
218 • Other issues may come from duplicated strings in either the
219 original or translation. Duplicated strings are merged in PO files,
220 with two references. This constitutes a difficulty for the
221 gettextization algorithm, that is a simple one to one pairing
222 between the msgids of both the master and the localized files. It
223 is however believed that recent versions of po4a deal properly with
224 duplicated strings, so you should report any remaining issue that
225 you may encounter.
226
227 Reviewing files produced by po4a-gettextize
228 Any file produced by po4a-gettextize should be manually reviewed, even
229 when the script terminates successfully. You should skim over the PO
230 file, ensuring that the msgid and msgstr actually match. It is not
231 necessary to ensure that the translation is perfectly correct yet, as
232 all entries are marked as fuzzy translations anyway. You only need to
233 check for obvious matching issues because badly matched translations
234 will be dumped in subsequent steps while you want to salvage them.
235
236 Fortunately, this step does not require to master the target languages
237 as you only want to recognize similar elements in each msgid and its
238 corresponding msgstr. As a speaker of French, English, and some German
239 myself, I can do this for all European languages at least, even if I
240 cannot say one word of most of these languages. I sometimes manage to
241 detect matching issues in non-Latin languages by looking at string
242 length, phrase structures (does the amount of interrogation marks
243 match?) and other clues, but I prefer when someone else can review
244 those languages.
245
246 If you detect a mismatch, edit the original and translation files as if
247 po4a-gettextize reported an error, and try again. Once you have a
248 decent PO file for your previous translation, backup it until you get
249 po4a working correctly.
250
251 Running po4a for the first time
252 The easiest way to setup po4a is to write a po4a.conf configuration
253 file, and use the integrated po4a program (po4a-updatepo and
254 po4a-translate are deprecated). Please check the "CONFIGURATION FILE"
255 Section in po4a(1) documentation for more details.
256
257 When po4a runs for the first time, the current version of the master
258 documents will be used to update the PO files containing the old
259 translations that you salvaged through gettextization. This can take
260 quite a long time, because many of the msgids of from the
261 gettextization do not exactly match the elements of the POT file built
262 from the recent master files. This forces gettext to search for the
263 closest one using a costly string proximity algorithm. For example,
264 the first run over the Perl documentation's French translation (5.5 MB
265 PO file) took about 48 hours (yes, two days) while the subsequent ones
266 only take seconds.
267
268 Moving your translations to production
269 After this first run, the PO files are ready to be reviewed by
270 translators. All entries were marked as fuzzy in the PO file by
271 po4a-gettextization, forcing their careful review before use.
272 Translators should take each entry to verify that the salvaged
273 translation actually match the current original text, update the
274 translation on need, and remove the fuzzy markers.
275
276 Once enough fuzzy markers are removed, po4a will start generating the
277 translation files on disk, and you're ready to move your translation
278 workflow to production. Some projects find it useful to rely on weblate
279 to coordinate between translators and maintainers, but that's beyond
280 po4a' scope.
281
283 po4a(1), po4a-normalize(1), po4a-translate(1), po4a-updatepo(1),
284 po4a(7).
285
287 Denis Barbier <barbier@linuxfr.org>
288 Nicolas François <nicolas.francois@centraliens.net>
289 Martin Quinson (mquinson#debian.org)
290
292 Copyright 2002-2022 by SPI, inc.
293
294 This program is free software; you may redistribute it and/or modify it
295 under the terms of GPL (see the COPYING file).
296
297
298
299perl v5.38.0 2023-10-12 PO4A-GETTEXTIZE.1P(1)