= Pootle =
[[TOC]]
[http://pootle.translatehouse.org Pootle] is used to allow translators to collaborate on both doing the initial translation & refining it once 'completed'.
== Installation ==
http://docs.translatehouse.org/projects/pootle/en/stable-2.5.0/server/installation.html
Assuming a base Debian stable (6.x):
{{{
apt-get update
apt-get upgrade -y
apt-get install -y bzip2 less lrzsz unzip
apt-get install -y libapache2-mod-wsgi
apt-get install -y mysql-server python-mysqldb phpmyadmin mytop
apt-get install -y isocodes python-setuptools python-dev gcc
apt-get install -y exim4-config exim4-daemon-light
dpkg-reconfigure exim4-config
wget http://downloads.sourceforge.net/project/translate/python-Levenshtein/0.10.1/python-Levenshtein-0.10.1.tar.bz2
tar jxvf python-Levenshtein-0.10.1.tar.bz2
cd python-Levenshtein-0.10.1
python setup.py install
cd ..
apt-get install -y memcached
wget ftp://ftp.tummy.com/pub/python-memcached/python-memcached-1.51.tar.gz
tar zxvf python-memcached-1.51.tar.gz
cd python-memcached-1.51
python setup.py install
cd ..
wget http://downloads.sourceforge.net/project/translate/Translate%20Toolkit/1.10.0/translate-toolkit-1.10.0.tar.bz2
tar jxvf translate-toolkit-1.10.0.tar.bz2
cd translate-toolkit-1.10.0
python setup.py install
cd ..
wget --no-check-certificate -O Django-1.4.5.tar.gz https://www.djangoproject.com/download/1.4.5/tarball/
tar zxvf Django-1.4.5.tar.gz
cd Django-1.4.5
python setup.py install
cd ..
# @ToDo: https://lucene.apache.org/pylucene/
wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz
tar zxvf pip-1.3.1.tar.gz
cd pip-1.3.1
python setup.py install
cd ..
apt-get install -y libxslt1-dev
pip install virtualenv
#virtualenv /var/www/pootle/env/
#source /var/www/pootle/env/bin/activate
pip install pootle
# Reduce MaxClients
sed -i 's|150|20|' /etc/apache2/apache2.conf
cd /var/www
ln -s /usr/local/lib/python2.6/dist-packages/pootle
adduser --system --disabled-password --home /var/www/pootle pootle
addgroup pootle
chown www-data /var/www/pootle/po
mysql -u root -p
> CREATE DATABASE pootle CHARACTER SET = 'utf8';
> GRANT ALL PRIVILEGES ON pootle.* TO pootle@localhost IDENTIFIED BY 'pootlepassword';
> FLUSH PRIVILEGES;
#sed -i "s|'localhost'|'pootle.sahanafoundation.org'|" /var/www/pootle/settings/90-local.conf.sample
sed -i 's|django.db.backends.sqlite3|django.db.backends.mysql|' /var/www/pootle/settings/20-backends.conf
sed -i "s|working_path('dbs/pootle.db')|'pootle'|" /var/www/pootle/settings/20-backends.conf
sed -i "s|'USER': ''|'USER': 'pootle'|" /var/www/pootle/settings/20-backends.conf
sed -i "s|'PASSWORD': ''|'PASSWORD': 'pootlepassword'|" /var/www/pootle/settings/20-backends.conf
sed -i "s|'BACKEND': 'django.core.cache.backends.db.DatabaseCache'|'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache'|" /var/www/pootle/settings/20-backends.conf
sed -i "s|'LOCATION': 'pootlecache'|'LOCATION': '127.0.0.1:11211'|" /var/www/pootle/settings/20-backends.conf
sed -i "s|# ('Your Name', 'your_email@domain.com')| ('Fran Boon', 'fran@sahanafoundation.org')|" /var/www/pootle/settings/30-site.conf
sed -i "s|info@YOUR_DOMAIN.com|pootle@sahanafoundation.org|" /var/www/pootle/settings/30-site.conf
pootle --config=/var/www/pootle/settings/20-backends.conf syncdb --noinput
pootle --config=/var/www/pootle/settings/20-backends.conf initdb
cat << EOF > "/var/www/pootle/wsgi.py"
import os, site
site.addsitedir('/var/www/pootle/apps')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pootle.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
EOF
cat << EOF > "/etc/apache2/sites-available/pootle"
WSGIScriptAlias / /var/www/pootle/wsgi.py
WSGIDaemonProcess pootle processes=2 threads=3 stack-size=1048576 maximum-requests=5000 inactivity-timeout=900 display-name=%{GROUP}
WSGIProcessGroup pootle
Alias /assets /var/www/pootle/assets
Order deny,allow
Allow from all
Alias /export /var/www/pootle/po
Order deny,allow
Allow from all
EOF
a2ensite pootle
/etc/init.d/apache2 restart
}}}
== Usage ==
See UserGuidelines/Localisation#A.UsingPootle
== Maintenance ==
When adding languages, use this resource to configure them properly:
* http://translate.sourceforge.net/wiki/l10n/pluralforms
The script that Fran used to use to update files between Bzr & Pootle is:
* [http://eden.sahanafoundation.org/attachment/wiki/UserGuidelines/Localisation/translate.cmd translate.cmd]
If the script fails, check for the presence of a ` in a T("") - this causes the languages.py to reset the languages/* to default &/or stop web2py2po from working!
=== Backups ===
{{{
cat << EOF > "/usr/local/bin/backup"
#!/bin/sh
NOW=\$(date +"%Y-%m-%d")
tar cvf /root/po-\$NOW.tar /var/www/pootle/po
gzip -9 /root/po-\$NOW.tar
mysqldump pootle> /root/backup-\$NOW.sql
gzip -9 /root/backup-\$NOW.sql
OLD=\$(date --date='7 day ago' +"%Y-%m-%d")
rm -f /root/backup-\$OLD.sql.gz
rm -f /root/po-\$OLD.tar.gz
EOF
chmod +x /usr/local/bin/backup
# Schedule backups for 02:01 daily
echo "1 2 * * * * root /usr/local/bin/backup" >> "/etc/crontab"
}}}
== !ToDo ==
* Link to the s3translate module within Sahana
* Unfortunately it doesn't seem that we can easily automate the upload back to Pootle:
* http://www.mail-archive.com/translate-pootle@lists.sourceforge.net/msg01187.html