Mark all motion state names as translatable in JS. (Fixes #1864)
Updated README for how to update translations.
This commit is contained in:
parent
48781b95ba
commit
a8544f016d
@ -1,27 +1,35 @@
|
|||||||
Instruction to update translation for OpenSlides:
|
Instruction to update translations for OpenSlides (JavaScipt and Django):
|
||||||
-------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
|
|
||||||
1. Go to the openslides directory (which contains the 'locale' directory):
|
1. Update English resource files:
|
||||||
|
|
||||||
|
a) for JavaScript run:
|
||||||
|
$ ./node_modules/.bin/gulp pot
|
||||||
|
-> updates 'openslides/locale/angular-gettext/template-en.pot'
|
||||||
|
|
||||||
|
b) for Django:
|
||||||
|
$ cd openslides
|
||||||
|
$ django-admin.py makemessages -l en
|
||||||
|
-> updates 'openslides/locale/en/LC_MESSAGES/django.po'
|
||||||
|
|
||||||
|
2. Commit and merge the following files into OpenSlides master repo:
|
||||||
|
a) openslides/locale/angular-gettext/template-en.pot
|
||||||
|
b) openslides/locale/en/LC_MESSAGES/django.po
|
||||||
|
|
||||||
|
Transifex will update both resource files once a day by pulling from GitHub.
|
||||||
|
|
||||||
|
3. Translate both files in transifex into desired languages.
|
||||||
|
https://www.transifex.com/openslides/
|
||||||
|
|
||||||
|
4. Download translated po files for each language and override it:
|
||||||
|
a) openslides/locale/angular-gettext/{LANG-CODE}.po
|
||||||
|
b) openslides/locale/{LANG-CODE}/LC_MESSAGES/django.po
|
||||||
|
|
||||||
|
5. Create mo file for each language (only for django po files required)
|
||||||
$ cd openslides
|
$ cd openslides
|
||||||
|
|
||||||
2. Update the German po file (locale/de/LC_MESSAGES/django.po):
|
|
||||||
$ django-admin.py makemessages -l de
|
|
||||||
$ django-admin.py makemessages -l de -d djangojs
|
|
||||||
|
|
||||||
3. Edit the German po file: locale/de/LC_MESSAGES/django.po
|
|
||||||
Don't forget the js-file: locale/de/LC_MESSAGES/djangojs.po
|
|
||||||
(Search for "fuzzy" and empty msgstr entries.)
|
|
||||||
|
|
||||||
4. Update the German mo file (locale/de/LC_MESSAGES/django.mo):
|
|
||||||
$ django-admin.py compilemessages
|
$ django-admin.py compilemessages
|
||||||
|
|
||||||
5. Restart server:
|
6. Commit and merge for each language the following files:
|
||||||
$ python manage.py runserver
|
a) openslides/locale/angular-gettext/{LANG-CODE}.po
|
||||||
|
b) openslides/locale/{LANG-CODE}/LC_MESSAGES/django.po
|
||||||
--
|
openslides/locale/{LANG-CODE}/LC_MESSAGES/django.mo
|
||||||
Additional hints for internationalization (i18n) in Django:
|
|
||||||
https://docs.djangoproject.com/en/dev/topics/i18n/
|
|
||||||
|
|
||||||
Note: gettext is required to extract message IDs or compile message files.
|
|
||||||
For gettext on Windows read:
|
|
||||||
https://docs.djangoproject.com/en/dev/topics/i18n/translation/#gettext-on-windows
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from django.core.validators import MinValueValidator
|
from django.core.validators import MinValueValidator
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.utils.translation import pgettext, ugettext_lazy, ugettext_noop
|
from django.utils.translation import pgettext, ugettext_lazy
|
||||||
|
|
||||||
from openslides.core.config import ConfigVariable
|
from openslides.core.config import ConfigVariable
|
||||||
from openslides.poll.models import PERCENT_BASE_CHOICES
|
from openslides.poll.models import PERCENT_BASE_CHOICES
|
||||||
@ -181,79 +181,79 @@ def create_builtin_workflows(sender, **kwargs):
|
|||||||
# If there is at least one workflow, then do nothing.
|
# If there is at least one workflow, then do nothing.
|
||||||
return
|
return
|
||||||
|
|
||||||
workflow_1 = Workflow.objects.create(name=ugettext_noop('Simple Workflow'))
|
workflow_1 = Workflow.objects.create(name='Simple Workflow')
|
||||||
state_1_1 = State.objects.create(name=ugettext_noop('submitted'),
|
state_1_1 = State.objects.create(name='submitted',
|
||||||
workflow=workflow_1,
|
workflow=workflow_1,
|
||||||
allow_create_poll=True,
|
allow_create_poll=True,
|
||||||
allow_support=True,
|
allow_support=True,
|
||||||
allow_submitter_edit=True)
|
allow_submitter_edit=True)
|
||||||
state_1_2 = State.objects.create(name=ugettext_noop('accepted'),
|
state_1_2 = State.objects.create(name='accepted',
|
||||||
workflow=workflow_1,
|
workflow=workflow_1,
|
||||||
action_word=ugettext_noop('Accept'),
|
action_word='Accept',
|
||||||
css_class='success')
|
css_class='success')
|
||||||
state_1_3 = State.objects.create(name=ugettext_noop('rejected'),
|
state_1_3 = State.objects.create(name='rejected',
|
||||||
workflow=workflow_1,
|
workflow=workflow_1,
|
||||||
action_word=ugettext_noop('Reject'),
|
action_word='Reject',
|
||||||
css_class='danger')
|
css_class='danger')
|
||||||
state_1_4 = State.objects.create(name=ugettext_noop('not decided'),
|
state_1_4 = State.objects.create(name='not decided',
|
||||||
workflow=workflow_1,
|
workflow=workflow_1,
|
||||||
action_word=ugettext_noop('Do not decide'),
|
action_word='Do not decide',
|
||||||
css_class='default')
|
css_class='default')
|
||||||
state_1_1.next_states.add(state_1_2, state_1_3, state_1_4)
|
state_1_1.next_states.add(state_1_2, state_1_3, state_1_4)
|
||||||
workflow_1.first_state = state_1_1
|
workflow_1.first_state = state_1_1
|
||||||
workflow_1.save()
|
workflow_1.save()
|
||||||
|
|
||||||
workflow_2 = Workflow.objects.create(name=ugettext_noop('Complex Workflow'))
|
workflow_2 = Workflow.objects.create(name='Complex Workflow')
|
||||||
state_2_1 = State.objects.create(name=ugettext_noop('published'),
|
state_2_1 = State.objects.create(name='published',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
allow_support=True,
|
allow_support=True,
|
||||||
allow_submitter_edit=True,
|
allow_submitter_edit=True,
|
||||||
dont_set_identifier=True)
|
dont_set_identifier=True)
|
||||||
state_2_2 = State.objects.create(name=ugettext_noop('permitted'),
|
state_2_2 = State.objects.create(name='permitted',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Permit'),
|
action_word='Permit',
|
||||||
allow_create_poll=True,
|
allow_create_poll=True,
|
||||||
allow_submitter_edit=True,
|
allow_submitter_edit=True,
|
||||||
versioning=True,
|
versioning=True,
|
||||||
leave_old_version_active=True)
|
leave_old_version_active=True)
|
||||||
state_2_3 = State.objects.create(name=ugettext_noop('accepted'),
|
state_2_3 = State.objects.create(name='accepted',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Accept'),
|
action_word='Accept',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='success')
|
css_class='success')
|
||||||
state_2_4 = State.objects.create(name=ugettext_noop('rejected'),
|
state_2_4 = State.objects.create(name='rejected',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Reject'),
|
action_word='Reject',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='danger')
|
css_class='danger')
|
||||||
state_2_5 = State.objects.create(name=ugettext_noop('withdrawed'),
|
state_2_5 = State.objects.create(name='withdrawed',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Withdraw'),
|
action_word='Withdraw',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='default')
|
css_class='default')
|
||||||
state_2_6 = State.objects.create(name=ugettext_noop('adjourned'),
|
state_2_6 = State.objects.create(name='adjourned',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Adjourn'),
|
action_word='Adjourn',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='default')
|
css_class='default')
|
||||||
state_2_7 = State.objects.create(name=ugettext_noop('not concerned'),
|
state_2_7 = State.objects.create(name='not concerned',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Do not concern'),
|
action_word='Do not concern',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='default')
|
css_class='default')
|
||||||
state_2_8 = State.objects.create(name=ugettext_noop('commited a bill'),
|
state_2_8 = State.objects.create(name='commited a bill',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Commit a bill'),
|
action_word='Commit a bill',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='default')
|
css_class='default')
|
||||||
state_2_9 = State.objects.create(name=ugettext_noop('needs review'),
|
state_2_9 = State.objects.create(name='needs review',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Needs review'),
|
action_word='Needs review',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='default')
|
css_class='default')
|
||||||
state_2_10 = State.objects.create(name=ugettext_noop('rejected (not authorized)'),
|
state_2_10 = State.objects.create(name='rejected (not authorized)',
|
||||||
workflow=workflow_2,
|
workflow=workflow_2,
|
||||||
action_word=ugettext_noop('Reject (not authorized)'),
|
action_word='Reject (not authorized)',
|
||||||
versioning=True,
|
versioning=True,
|
||||||
css_class='default')
|
css_class='default')
|
||||||
state_2_1.next_states.add(state_2_2, state_2_5, state_2_10)
|
state_2_1.next_states.add(state_2_2, state_2_5, state_2_10)
|
||||||
|
@ -312,5 +312,45 @@ angular.module('OpenSlidesApp.motions', ['OpenSlidesApp.users'])
|
|||||||
'Motion',
|
'Motion',
|
||||||
'Category',
|
'Category',
|
||||||
function(Motion, Category) {}
|
function(Motion, Category) {}
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
// Mark all motion workflow state strings for translation in JavaScript.
|
||||||
|
// (see motions/signals.py)
|
||||||
|
.config([
|
||||||
|
'gettext',
|
||||||
|
function (gettext) {
|
||||||
|
// workflow 1
|
||||||
|
gettext('Simple Workflow')
|
||||||
|
gettext('submitted')
|
||||||
|
gettext('accepted')
|
||||||
|
gettext('Accept')
|
||||||
|
gettext('rejected')
|
||||||
|
gettext('Reject')
|
||||||
|
gettext('not decided')
|
||||||
|
gettext('Do not decide')
|
||||||
|
// workflow 2
|
||||||
|
gettext('Complex Workflow')
|
||||||
|
gettext('published')
|
||||||
|
gettext('permitted')
|
||||||
|
gettext('Permit')
|
||||||
|
gettext('accepted')
|
||||||
|
gettext('Accept')
|
||||||
|
gettext('rejected')
|
||||||
|
gettext('Reject')
|
||||||
|
gettext('withdrawed')
|
||||||
|
gettext('Withdraw')
|
||||||
|
gettext('adjourned')
|
||||||
|
gettext('Adjourn')
|
||||||
|
gettext('not concerned')
|
||||||
|
gettext('Do not concern')
|
||||||
|
gettext('commited a bill')
|
||||||
|
gettext('Commit a bill')
|
||||||
|
gettext('needs review')
|
||||||
|
gettext('Needs review')
|
||||||
|
gettext('rejected (not authorized)')
|
||||||
|
gettext('Reject (not authorized)')
|
||||||
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<div id="sidebox">
|
<div id="sidebox">
|
||||||
<!-- State -->
|
<!-- State -->
|
||||||
<h3 translate>State</h3>
|
<h3 translate>State</h3>
|
||||||
{{ motion.state.name }}
|
{{ motion.state.name | translate }}
|
||||||
|
|
||||||
<!-- Submitters -->
|
<!-- Submitters -->
|
||||||
<h3 ng-if="motion.submitters.length > 0" translate>Submitters</h3>
|
<h3 ng-if="motion.submitters.length > 0" translate>Submitters</h3>
|
||||||
|
Loading…
Reference in New Issue
Block a user