Subject:
Translation effort workflow
From:
Alex Nordstrom ####@####.####
Date:
9 Oct 2005 17:41:47 -0000
Message-Id: <200510100141.39673.lx@se.linux.org>
I am the maintainer of the Documentation Workgroup of the Linux Society
of Sweden, a nonprofit organisation with over 2,500 members from all
over Sweden with an interest in Free and open source software. We are
currently in the process of reviving an effort to translate LDP Howto
documents into Swedish.
For now, the work is in its infancy, and our processes are rather
informal and manual. The need for more automation and a formalised,
structured workflow, however, is already apparent.
I know we are not the only translation effort underway. Hence, I looked
around for recommendations or notes on how best to do this sort of
thing, but failed to find much to go on.
Following is a translation of a first draft outlining my proposal for a
step-by-step submission process. My motivation for posting this is
twofold.
First, I am hoping that others that are further ahead of us can point
out obvious flaws in the below, or otherwise share their experiences.
Second, if this is not just a result of my ineptitude at information
searching, and if there really is no document collecting the
experiences of translation efforts, then it is about damn time one be
created. Perhaps this can be a starting point. To this end, you may
consider the contents of this message to be in the public domain.
Again, this is a draft, and it is written with the current state of the
Swedish translation effort in mind. The project is currently pretty
small, which makes centralisation of power possible and necessary. I
expect this to change as the project grows. I also plan to introduce
version control using SVN into the workflow. This also raises the issue
of how to conduct maintenance of the translations. The below procedure
currently glosses over this, mostly because I have yet to figure out
how to incorporate this.
Your comments would be much appreciated. Ultimately, the active members
of the Workgroup will have their say, but I want to hear from those
with prior experience first.
This is the procedure for translating a document from the Linux
Documentation Project (LDP) for the Linux Society of Sweden.
Choose A Document
Choose a document which you wish to translate. You may choose a document
from the wishlist on the homepage of the Documentation Workgroup[1].
These are prioritised because they are up to date and useful to many.
You may also choose another document. LDP has a list of the most
recently updated documents[2]. The important thing is that you enjoy
the translation work, so choose something that interests you, but do
keep in mind that preferring reasonably up to date documents is
advantageous.
[1] http://se.linux.org/arbetsgrupper/dokumentation
[2] http://tldp.org/sorted_howtos.html
Read the document (at least superficially) and assess whether you want
to translate it. Read the document's licence and ensure that
translation is permitted. All documents from LDP may be distributed,
but some may only be distributed unaltered.
Announce Your Interest
Send a message to the maintainer of the Documentation Workgroup[3] and
state the name of the document and your willingness to translate it.
[3] ####@####.####
Translators are often encouraged to contact the original author of the
original. Sometimes, this is even phrased as a licence requirement for
publishing a translation. If contacting the original author is a
licence requirement, the maintainer of the Documentation Workgroup will
handle this.
If no one else is working on the document, you will most likely be told
to go ahead with the translation. If the original author has demanded
to be contacted, you will also be notified of what they replied.
If contacting the original author is only a request, you should heed it
once you have been told to go ahead by the Documentation Workgroup. The
author can often tell you about ongoing work which may affect
translations. Such information can save you a lot of unnecessary work.
Therefore, it may be good to contact the author, even if there is no
such demand or request.
Start Translating
If possible, perform the translation in source code format. This is not
as scary as it sounds. LDP uses two document formats as a basis for
automatically generating standardised documents in several different
formats. These two formats are Linuxdoc and Docbook.
Linuxdoc and Docbook are two XML variants for adding tags to a text
which describe its structure. The differences between the formats are
not that major, and they are also pretty similar to, for example, HTML,
which is used to describe Web pages. One does not need to master
Linuxdoc or Docbook fully to carry out a translation. As a translator,
one rarely needs to make many changes to the document's structure, and
one can therefore largely rely on the original document's markup.
Which format one should use depends on what the original document uses.
The source code of the LDP Howto documents is in their version control
system[4]. The catalogues linuxdoc and docbook contain documents
written in the respective formats.
[4] http://cvsview.tldp.org/index.cgi/LDP/howto/
If you find Linuxdoc or Docbook too difficult, it is not the end of the
world. Simply translate the text of the original document, and other
volunteers in the Documentation Workgroup will add markup to the
document. Do note, however, that this may mean that your document does
not get to benefit the general public quite as quickly.
Submit the Document for Review
Send in the result of your work as an attachment to the maintainer of
the Documentation Workgroup[5] for review. The language of your
translation will be reviewed. This process will be faster if you have
read through the document yourself and used automatic spellchecking.
The translation will also be read alongside the original to verify the
integrity of its factual content.
[5] ####@####.####
If the review gives rise to any comments, you will be encouraged to edit
your translation with the comments in mind and send the revised
translation for a new review. Do not be let down by this. It is not at
all uncommon that one person notices something that another has missed.
The changes are usually quick to implement, and the result is a
document of which one can be even prouder.
When no more issues to comment on exist, the document will be marked up
in Linuxdoc or Docbook format if this is not already done, after which
it will be published.
--
Alex Nordstrom
http://lx.n3.net/
Please do not CC me in followups;
I am subscribed to the tldp discussion list.
--> -->
<type 'exceptions.IOError'> | Python 2.5.2: /usr/bin/python Wed Jul 3 09:37:19 2024 |
A problem occurred in a Python script. Here is the sequence of
function calls leading up to the error, in the order they occurred.
/opt/ezmlm-browse-0.20/main.py in main() |
424
|
425 if path is not None:
|
426 main_path(path)
|
427 else:
|
428 main_form()
|
global main_form = <function main_form at 0x92d0c6c> |
/opt/ezmlm-browse-0.20/main.py in main_form() |
378 except ImportError:
|
379 die(ctxt, "Invalid command")
|
380 module.do(ctxt)
|
381
|
382 def main():
|
module = <module 'commands.showmsg' from '/opt/ezmlm-browse-0.20/commands/showmsg.pyc'>, module.do = <function do at 0x92d295c>, global ctxt = {'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'} |
/opt/ezmlm-browse-0.20/commands/showmsg.py in do(ctxt={'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}) |
18 write(html('msg-pager') % ctxt)
|
19 write('<hr>')
|
20 sub_showmsg(ctxt, ctxt[MSGNUM])
|
21 write('<hr>')
|
22 write(html('msg-pager') % ctxt)
|
global sub_showmsg = <function sub_showmsg at 0x92d01ec>, ctxt = {'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, global MSGNUM = 'msgnum' |
/opt/ezmlm-browse-0.20/globalfns.py in sub_showmsg(ctxt={'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, msgnum=9700) |
229 format_timestamp(ctxt, ctxt)
|
230 write(html('msg-header') % ctxt)
|
231 rec_showpart(ctxt, msg, 0)
|
232 write(html('msg-footer') % ctxt)
|
233 ctxt.pop()
|
global rec_showpart = <function rec_showpart at 0x92d01b4>, ctxt = {'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, msg = <email.message.Message instance at 0x932ef8c> |
/opt/ezmlm-browse-0.20/globalfns.py in rec_showpart(ctxt={'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, part=<email.message.Message instance at 0x932ef8c>, partnum=1) |
205 else:
|
206 for p in part.get_payload():
|
207 partnum = rec_showpart(ctxt, p, partnum+1)
|
208 else:
|
209 write(html('msg-sep') % ctxt)
|
partnum = 1, global rec_showpart = <function rec_showpart at 0x92d01b4>, ctxt = {'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, p = <email.message.Message instance at 0x934006c> |
/opt/ezmlm-browse-0.20/globalfns.py in rec_showpart(ctxt={'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, part=<email.message.Message instance at 0x934006c>, partnum=2) |
208 else:
|
209 write(html('msg-sep') % ctxt)
|
210 sub_showpart(ctxt, part)
|
211 return partnum
|
212
|
global sub_showpart = <function sub_showpart at 0x92d0144>, ctxt = {'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, part = <email.message.Message instance at 0x934006c> |
/opt/ezmlm-browse-0.20/globalfns.py in sub_showpart(ctxt={'cmd': 'showmsg', 'threadidx': 0, 'HTTP_X_FORWA...HTTP_ACCEPT_ENCODING': 'gzip, br, zstd, deflate'}, part=<email.message.Message instance at 0x934006c>) |
164 type = ctxt[TYPE] = part.get_content_type()
|
165 ctxt[FILENAME] = part.get_filename()
|
166 template = html('msg-' + type.replace('/', '-'))
|
167 if not template:
|
168 template = html('msg-' + type[:type.find('/')])
|
global template = <function template at 0x92c8e9c>, global html = <function html at 0x92c8ed4>, type = 'application/pgp-signature', type.replace = <built-in method replace of str object at 0x933b6e8> |
/opt/ezmlm-browse-0.20/globalfns.py in html(name='msg-application-pgp-signature') |
40
|
41 def html(name):
|
42 return template(name + '.html')
|
43
|
44 def xml(name):
|
global template = <function template at 0x92c8e9c>, name = 'msg-application-pgp-signature' |
/opt/ezmlm-browse-0.20/globalfns.py in template(filename='msg-application-pgp-signature.html') |
31 except IOError:
|
32 if not _template_zipfile:
|
33 _template_zipfile = zipfile.ZipFile(sys.argv[0])
|
34 try:
|
35 f = _template_zipfile.open(n).read()
|
global _template_zipfile = None, global zipfile = <module 'zipfile' from '/usr/lib/python2.5/zipfile.pyc'>, zipfile.ZipFile = <class zipfile.ZipFile at 0x9261a7c>, global sys = <module 'sys' (built-in)>, sys.argv = ['-c', '/opt/ezmlm-browse-0.20'] |
/usr/lib/python2.5/zipfile.py in __init__(self=<zipfile.ZipFile instance at 0x9327c8c>, file='-c', mode='r', compression=0, allowZip64=False) |
337 self.filename = file
|
338 modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
|
339 self.fp = open(file, modeDict[mode])
|
340 else:
|
341 self._filePassed = 1
|
self = <zipfile.ZipFile instance at 0x9327c8c>, self.fp = None, builtin open = <built-in function open>, file = '-c', modeDict = {'a': 'r+b', 'r': 'rb', 'w': 'wb'}, mode = 'r' |
<type 'exceptions.IOError'>: [Errno 2] No such file or directory: '-c'
args =
(2, 'No such file or directory')
errno =
2
filename =
'-c'
message =
''
strerror =
'No such file or directory'