discuss: Translation effort workflow


Previous by date: 9 Oct 2005 17:41:47 -0000 Your Account with PayPal, Paypal
Next by date: 9 Oct 2005 17:41:47 -0000 Re: August summary, ldp.fergusontechgroup.com
Previous in thread:
Next in thread: 9 Oct 2005 17:41:47 -0000 Re: [discuss] Translation effort workflow, Jean-PhilippeGuérard

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/<string> in ()
 /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'