Web based localization tool with tight version control integration.

Overview
Weblate

Weblate is a copylefted libre software web-based continuous localization system, used by over 1150 libre projects and companies in more than 115 countries.

Install it, or use the Hosted Weblate service at weblate.org.

Website Translation status CII Best Practices https://readthedocs.org/projects/weblate/badge/ License

Support

Weblate is a libre software with optional professional support and cloud hosting offerings. Check out https://weblate.org/hosting/ for more information.

Documentation

To be found in the docs directory of the source code, or viewed online on https://docs.weblate.org/

Installation

Setup instructions:

https://docs.weblate.org/en/latest/admin/install.html

Bugs

Please report feature requests and problems to:

https://github.com/WeblateOrg/weblate/issues

License

Copyright © 2012–2021 Michal Čihař [email protected]

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.

Comments
  • support Google Play upload tools: Fastlane and Triple-T Gradle Play Publisher

    support Google Play upload tools: Fastlane and Triple-T Gradle Play Publisher

    There are two major tools for managing the localized files for Google Play: Fastlane Supply and Triple-T Gradle Play Publisher. F-Droid also supports the same file/dir structure. If Weblate would directly support those files, then there would be a clean, simple, automated way to translate Android apps using Weblate. Here's the ideal workflow:

    1. Weblate pulls source from git
    2. translators work in Weblate
    3. translations get pulled into app's source directly where Fastlane or Triple-T expect them
    4. F-Droid automatically uses those translations from git
    5. those translations are directly published to Google Play via the respective tool (Fastlane Supply or Gradle)

    Both Fastlane and Triple-T use plain text for the source and translation file format. title and short_description would be easy to support directly as plain text, changelog and full_description much less so:

    • title: 30 char limit, one line, plain text
    • short_description: 80 char limit, one line, plain text
    • full_description: 4000 char limit, multiple lines, can contain basic HTML
    • changelog: 500 char limit, multiple lines, plain text

    But perhaps this setup is just too different from standard translation workflows that assume strings are in a single source file. I've also opened issues on those tools to get feedback there:

    • https://github.com/Triple-T/gradle-play-publisher/issues/227
    • https://github.com/fastlane/fastlane/issues/9520

    I really want to find a way to get this workflow working really smoothly. Translations are really important, and something that really should be as automated as possible.

    enhancement translate-toolkit 
    opened by eighthave 44
  • ValueError: The field accounts.VerifiedEmail.social was declared with a lazy reference to 'social_django.usersocialauth', but app 'social_django' isn't installed.

    ValueError: The field accounts.VerifiedEmail.social was declared with a lazy reference to 'social_django.usersocialauth', but app 'social_django' isn't installed.

    Steps to reproduce

    1. Upgrade from Weblate 2.10 to 2.11
    2. Adapt configuration changes from settings_example.py
    3. Run migration

    Actual behaviour

    python ./manage.py migrate
    Operations to perform:
      Apply all migrations: accounts, admin, auth, authtoken, contenttypes, lang, sessions, sites, social_django, trans
    Traceback (most recent call last):
      File "../manage.py", line 31, in <module>
        execute_from_command_line(sys.argv)
      File "/var/www/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
        utility.execute()
      File "/var/www/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 359, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/var/www/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 294, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/var/www/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 345, in execute
        output = self.handle(*args, **options)
      File "/var/www/venv/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 164, in handle
        pre_migrate_apps = pre_migrate_state.apps
      File "/var/www/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
        res = instance.__dict__[self.name] = self.func(instance)
      File "/var/www/venv/local/lib/python2.7/site-packages/django/db/migrations/state.py", line 176, in apps
        return StateApps(self.real_apps, self.models)
      File "/var/www/venv/local/lib/python2.7/site-packages/django/db/migrations/state.py", line 249, in __init__
        raise ValueError("\n".join(error.msg for error in errors))
    ValueError: The field accounts.VerifiedEmail.social was declared with a lazy reference to 'social_django.usersocialauth', but app 'social_django' isn't installed.
    

    Server configuration

     * Weblate 2.11
     * Python 2.7.9
     * Django 1.10.5
     * six 1.10.0
     * social-auth-core 1.1.0
     * social-auth-app-django 1.0.1
     * Translate Toolkit 2.0.0b5
     * Whoosh 2.7.4
     * defusedxml 0.4.1
     * Git 2.1.4
     * Pillow (PIL) 1.1.7
     * dateutil 2.5.3
     * lxml 3.6.0
     * django-crispy-forms 1.6.0
     * compressor 1.6
     * djangorestframework 3.4.6
     * Database backends: django.db.backends.postgresql_psycopg2
    
    question documentation 
    opened by nblock 44
  • After updating the GIT repository, the following steps in Weblate are not performed

    After updating the GIT repository, the following steps in Weblate are not performed

    Describe the bug I run my own Weblate instance linked to repositories managed by Gitea. In Gitea, a webhook is set to update components in Weblate when commit to Gitea. The add-on gettext.msgmerge is used in Weblate to update PO files after commit with update of POT files. Usually everything works perfectly smoothly and excellently.

    Sometimes, however, after commit to Gitea, a rebase repository is executed in Weblate, but then no other steps are taken at all – no component updates, no msgmerge for updated POT files, therefore no updates to PO files, no error message in the logs.

    To Reproduce What I saw as common in such situations, here were translations waiting for commit in some of components linked to the same git repository.

    Expected behavior I expect the repository update to be performed whenever an update is invoked in Weblate and new commits are fetched from git.

    Server configuration and status

     * Weblate 3.6.1
     * Python 3.5.3
     * Django 1.11.20
     * Celery 4.2.2
     * celery-batches 0.2
     * six 1.10.0
     * social-auth-core 3.1.0
     * social-auth-app-django 3.1.0
     * django-appconf 1.0.1
     * translate-toolkit 2.3.1
     * translation-finder 1.1
     * Whoosh 2.7.0
     * defusedxml 0.5.0
     * Git 2.11.0
     * Pillow 4.0.0
     * python-dateutil 2.5.3
     * lxml 4.2.5
     * django-crispy-forms 1.6.1
     * django_compressor 2.2
     * djangorestframework 3.9.2
     * user-agents 1.1.0
     * jellyfish 0.7.1
     * diff-match-patch 20121119
     * pytz 2016.7
     * pyuca 1.1.2
     * PyYAML 3.12
     * Database backends: django.db.backends.mysql
     * Cache backends: default:RedisCache, avatar:FileBasedCache
     * Celery: redis://localhost:6379, redis://localhost:6379, regular
     * Platform: Linux 3.16.6-042stab134.46 (x86_64)
    
    System check identified some issues:
    
    INFOS:
    ?: (weblate.I021) Error collection is not configured, it is highly recommended for production use
            HINT: https://docs.weblate.org/en/weblate-3.6.1/admin/install.html#collecting-errors
    
    System check identified 1 issue (0 silenced).
    

    Additional context In the log "committing pending changes" is mentioned, but nothing else follows:

    [2019-06-12 21:11:46,537: INFO/ForkPoolWorker-5] Lock 140331270848920 acquired on /var/lib/weblate/data/vcs/tde/tde-i18n.lock
    [2019-06-12 21:11:46,538: INFO/ForkPoolWorker-5] Lock 140331270848920 acquired on /var/lib/weblate/data/vcs/tde/tde-i18n.lock
    [2019-06-12 21:11:46,762: INFO/ForkPoolWorker-5] tde/tde-i18n: updating repository
    [2019-06-12 21:11:46,762: INFO/ForkPoolWorker-5] Lock 140331270848920 acquired on /var/lib/weblate/data/vcs/tde/tde-i18n.lock
    [2019-06-12 21:11:49,898: INFO/ForkPoolWorker-5] tde/tde-i18n: update took 3.14 seconds
    [2019-06-12 21:11:51,097: INFO/ForkPoolWorker-5] Lock 140331270848920 acquired on /var/lib/weblate/data/vcs/tde/tde-i18n.lock
    [2019-06-12 21:11:55,217: INFO/ForkPoolWorker-5] Lock 140331270848920 acquired on /var/lib/weblate/data/vcs/tde/tde-i18n.lock
    [2019-06-12 21:11:56,419: INFO/ForkPoolWorker-5] tde/tde-i18n: rebase remote into repo
    [2019-06-12 21:12:02,472: INFO/ForkPoolWorker-5] tdeutils/ktimer/tr: committing pending changes (addon)
    [2019-06-12 21:14:02,526: INFO/ForkPoolWorker-5] Lock 140331270848920 released on /var/lib/weblate/data/vcs/tde/tde-i18n.lock
    
    bug 
    opened by SlavekB 42
  • Add support for OpenShift 3

    Add support for OpenShift 3

    Steps to reproduce

    1. Set up new python 2.7 project in OpenShift following docs
    2. Allocate 1 GB in OpenShift
    3. Build from source https://github.com/WeblateOrg/weblate.git

    Actual behaviour

    Build 'lxml.etree' extension failed. See https://gist.github.com/maxruby/6ce93a1a1a4b94927102d9ecbc66a684

    Expected behaviour

    Build should not fail.

    Server configuration

    Please paste the output of command ./manage.py list_versions over here

    enhancement good first issue 
    opened by maxruby 42
  • Translation-time context management

    Translation-time context management

    Edit: see comment for clarification.

    Hi. Is it possible to add a option for translators to manage msgctxts, including adding new ones?

    I'm not sure if that's something needed or even viable, so let me describe the situation first:

    • There's a translation going from a gender unspecific language (English) to a gender specific one (Spanish). Most strings are common, but some, maybe 10-15% will differ.
    • The translation will result in 2 separate packages, male and female
    • I could create a common project and two separate components. But I'll have to disable translation propagation, because otherwise they'll mess up each other strings.
    • And without propagation, looks like the only way to share the effort is to copy the strings manually. (Or maybe "copy and save" from machine translation tab, will it appear there? Still, that would be a lot of clicking and manual coordination between components)
    • The key problem is that in the source, it's not known beforehand whether the string is gender specific or not. That is decided by the translator at the time of translation, on a case by case basis. (and may vary for different languages, too)

    So... that looks like a long shot, but I was thinking of a feature that would allow the translator to "split" the source string into several contexted ones and translate them individually? That will require adding newly created entries into po and pot, though.

    Or maybe I'm missing an obvious way to handle such a situation? Please advise.

    enhancement undecided 
    opened by burner1024 42
  • reviewing translations: ability to lock a single string [$200 awarded]

    reviewing translations: ability to lock a single string [$200 awarded]

    There currently is no convenient review workflow in weblate allowing reviewers to verify the quality of translated strings. There are suggested workflow that mostly rely on discipline on behalf of the reviewer and the translator. They are error prone and inconvenient.

    A reviewer proposed that the ability for a reviewer to lock a translated string (not the whole set of strings, just one) would be an easy way for a reviewer to express the fact that the translation is good and final. If the translated string is locked, the Save button is disabled and translators can no longer change the translation. The checkbox allowing the reviewer to lock/unlock a string could be next to the Need review checkbox. The search box could be extended to look for all strings that are not in the Locked state so the reviewer can focus on them.

    Was this idea discussed before ? Does it sound like a convenient review workflow ?

    enhancement 
    opened by ghost 39
  • Cannot commit pending changes

    Cannot commit pending changes

    Describe the issue

    We're running a weblate instance on https://l10n.xwiki.org on which we have a project with 87 linked components. Recently a new language has been added to the root component which is also the biggest in term of number of keys (3609 keys). Since then is seems that we cannot commit the pending changes on this project: at first we had "only" 2Gb of RAM on the server, and we kept getting the process killed by OOM, so we started to increase the memory, we now have 5Gb of RAM and 5Gb of swap on the server. Now the process is not killed anymore apparently, but whenever I try to commit the pending changes nothing happens and/or I obtain the following error:

    Timeout at /js/git/xwiki-platform/
    The file lock '/var/weblate/data/vcs/xwiki-platform/xwiki-core-resources.lock' could not be acquired.
    

    I already tried

    As explained I already tried to put more memory on the server, without much success. I also try to disable celery to only trigger the commit changes synchronously, but without much success. I did not find any errors in the logs, except the one concerning the lock. Note that I checked the repository manually I rebased it already without any issue, and nothing is committed besides what's in https://github.com/xwiki/xwiki-platform/pull/1621 which I cannot really merge right now. Anyway I don't think that's an issue here. Also I noticed that the repository contained uncommitted files such as: ApplicationResources_id.propertiesfor1d8o6, where my filemask is ApplicationResources_*.properties and the new language is indeed indonesian. I tried several times to delete those files (which are empty), but apparently it doesn't change anything.

    So far the only move I can think of, would be to add more memory, but I don't know how much memory I'd need and usually we manage to run our Weblate server with only 2Gb so that's a bit worrying to need that much memory for adding a new language.

    • [x] I've read and searched the docs and did not find the answer there. If you didn’t try already, try to search there what you wrote above.

    Exception traceback

    Here's the full trace I obtain in case of lock error:

    Internal Server Error: /js/git/xwiki-platform/
    
    Timeout at /js/git/xwiki-platform/
    The file lock '/var/weblate/data/vcs/xwiki-platform/xwiki-core-resources.lock' could not be acquired.
    
    Request Method: GET
    Request URL: https://l10n.xwiki.org/js/git/xwiki-platform/
    Django Version: 3.1.5
    Python Executable: /usr/bin/uwsgi-core
    Python Version: 3.7.3
    Python Path: ['/home/weblate/weblate-env/lib/python3.7/site-packages/git/ext/gitdb', '/', '.', '', '/home/weblate/weblate-env/lib/python37.zip', '/home/weblate/weblate-env/lib/python3.7', '/home/weblate/weblate-env/lib/python3.7/lib-dynload', '/usr/lib/python3.7', '/home/weblate/weblate-env/lib/python3.7/site-packages', '/home/weblate/weblate-env/lib/python3.7/site-packages/gitdb/ext/smmap']
    Server time: Wed, 19 May 2021 08:09:11 +0000
    Installed Applications:
    ['weblate.addons',
     'weblate.auth',
     'weblate.checks',
     'weblate.configuration',
     'weblate.formats',
     'weblate.glossary',
     'weblate.machinery',
     'weblate.trans',
     'weblate.lang',
     'weblate_language_data',
     'weblate.memory',
     'weblate.screenshots',
     'weblate.fonts',
     'weblate.accounts',
     'weblate.utils',
     'weblate.vcs',
     'weblate.wladmin',
     'weblate',
     'weblate.gitexport',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.admin.apps.SimpleAdminConfig',
     'django.contrib.admindocs',
     'django.contrib.sitemaps',
     'django.contrib.humanize',
     'social_django',
     'crispy_forms',
     'compressor',
     'rest_framework',
     'rest_framework.authtoken',
     'django_filters']
    Installed Middleware:
    ['weblate.middleware.RedirectMiddleware',
     'weblate.middleware.ProxyMiddleware',
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'weblate.accounts.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'social_django.middleware.SocialAuthExceptionMiddleware',
     'weblate.accounts.middleware.RequireLoginMiddleware',
     'weblate.api.middleware.ThrottlingMiddleware',
     'weblate.middleware.SecurityMiddleware']
    
    
    Traceback (most recent call last):
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
        response = get_response(request)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
        return view_func(request, *args, **kwargs)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/js.py", line 177, in git_status_project
        return git_status_shared(request, obj, obj.all_repo_components)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/js.py", line 168, in git_status_shared
        "missing_commits": sum(repo.count_repo_missing for repo in repositories),
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/shortcuts.py", line 19, in render
        content = loader.render_to_string(template_name, context, request, using=using)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/loader.py", line 62, in render_to_string
        return template.render(context, request)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
        return self.template.render(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 170, in render
        return self._render(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 162, in _render
        return self.nodelist.render(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 938, in render
        bit = node.render_annotated(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
        return self.render(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/defaulttags.py", line 516, in render
        return self.nodelist.render(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 938, in render
        bit = node.render_annotated(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
        return self.render(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/defaulttags.py", line 211, in render
        nodelist.append(node.render_annotated(context))
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
        return self.render(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 988, in render
        output = self.filter_expression.resolve(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 671, in resolve
        obj = self.var.resolve(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 796, in resolve
        value = self._resolve_lookup(context)
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 858, in _resolve_lookup
        current = current()
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/vcs/base.py", line 276, in status
        with self.lock:
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/filelock.py", line 323, in __enter__
        self.acquire()
      File "/home/weblate/weblate-env/lib/python3.7/site-packages/filelock.py", line 278, in acquire
        raise Timeout(self._lock_file)
    
    Exception Type: Timeout at /js/git/xwiki-platform/
    Exception Value: The file lock '/var/weblate/data/vcs/xwiki-platform/xwiki-core-resources.lock' could not be acquired.
    Request information:
    USER: Simon Urli
    
    GET: No GET data
    
    POST: No POST data
    
    FILES: No FILES data
    
    COOKIES:[COOKIE INFO]
    
    META:
    CONTENT_LENGTH = ''
    CONTENT_TYPE = ''
    CSRF_COOKIE = 'DCP9uKKJxpmzjz9k0etf8EyinNQ61b0vsxxMM7U7cJzo2WHu6HaoCK9bI2ws7KBa'
    CSRF_COOKIE_USED = True
    DOCUMENT_ROOT = '/var/www/html'
    HTTPS = 'on'
    HTTP_ACCEPT = 'text/html, */*; q=0.01'
    HTTP_ACCEPT_ENCODING = 'gzip, deflate, br'
    HTTP_ACCEPT_LANGUAGE = 'fr,en-US;q=0.7,en;q=0.3'
    HTTP_CONNECTION = 'keep-alive'
    HTTP_COOKIE = '[COOKIE INFO]'
    HTTP_DNT = '1'
    HTTP_HOST = 'l10n.xwiki.org'
    HTTP_REFERER = 'https://l10n.xwiki.org/'
    HTTP_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0'
    HTTP_X_REQUESTED_WITH = 'XMLHttpRequest'
    PATH_INFO = '/js/git/xwiki-platform/'
    QUERY_STRING = ''
    REMOTE_ADDR = '212.198.27.104'
    REMOTE_PORT = '51150'
    REQUEST_METHOD = 'GET'
    REQUEST_SCHEME = 'https'
    REQUEST_URI = '/js/git/xwiki-platform/'
    SCRIPT_NAME = ''
    SERVER_NAME = 'l10n.xwiki.org'
    SERVER_PORT = '443'
    SERVER_PROTOCOL = 'HTTP/1.1'
    WEBLATE_LANGUAGE = ''
    WEBLATE_USER = "'surli'"
    WEBLATE_VERSION:Cython = '0.29.21'
    WEBLATE_VERSION:Django = '3.1.5'
    WEBLATE_VERSION:Git = '2.20.1'
    WEBLATE_VERSION:GitPython = '3.1.8'
    WEBLATE_VERSION:Pillow = '7.1.2'
    WEBLATE_VERSION:PostgreSQL server = '11.11'
    WEBLATE_VERSION:Python = '3.7.3'
    WEBLATE_VERSION:Redis server = '5.0.3'
    WEBLATE_VERSION:Weblate = '4.4.2'
    WEBLATE_VERSION:Whoosh = '2.7.4'
    WEBLATE_VERSION:bleach = '3.1.5'
    WEBLATE_VERSION:borgbackup = '1.1.13'
    WEBLATE_VERSION:celery = '4.4.7'
    WEBLATE_VERSION:chardet = '3.0.4'
    WEBLATE_VERSION:diff-match-patch = '20200713'
    WEBLATE_VERSION:django-appconf = '1.0.4'
    WEBLATE_VERSION:django-compressor = '2.4'
    WEBLATE_VERSION:django-crispy-forms = '1.9.2'
    WEBLATE_VERSION:django-filter = '2.4.0'
    WEBLATE_VERSION:django-redis = '4.12.1'
    WEBLATE_VERSION:djangorestframework = '3.11.1'
    WEBLATE_VERSION:filelock = '3.0.12'
    WEBLATE_VERSION:hiredis = '1.0.1'
    WEBLATE_VERSION:html2text = '2020.1.16'
    WEBLATE_VERSION:jellyfish = '0.8.2'
    WEBLATE_VERSION:kombu = '4.6.11'
    WEBLATE_VERSION:lxml = '4.5.2'
    WEBLATE_VERSION:misaka = '2.1.1'
    WEBLATE_VERSION:oauthlib = '3.1.0'
    WEBLATE_VERSION:openpyxl = '3.0.5'
    WEBLATE_VERSION:psycopg2-binary = '2.8.6'
    WEBLATE_VERSION:pycairo = '1.19.1'
    WEBLATE_VERSION:pygobject = '3.38.0'
    WEBLATE_VERSION:pyparsing = '2.4.7'
    WEBLATE_VERSION:python-dateutil = '2.8.1'
    WEBLATE_VERSION:requests = '2.24.0'
    WEBLATE_VERSION:ruamel.yaml = '0.16.12'
    WEBLATE_VERSION:sentry_sdk = '0.15.1'
    WEBLATE_VERSION:setuptools = '50.3.0'
    WEBLATE_VERSION:siphashc = '1.3'
    WEBLATE_VERSION:social-auth-app-django = '4.0.0'
    WEBLATE_VERSION:social-auth-core = '4.0.3'
    WEBLATE_VERSION:translate-toolkit = '3.3.0'
    WEBLATE_VERSION:translation-finder = '2.7'
    WEBLATE_VERSION:user-agents = '2.1'
    WEBLATE_VERSION:weblate-language-data = '2020.13'
    uwsgi.node = b'l10n-prod'
    uwsgi.version = b'2.0.18-debian'
    wsgi.errors = <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'>
    wsgi.file_wrapper = <built-in function uwsgi_sendfile>
    wsgi.input = <uwsgi._Input object at 0x7fa2ac98ffd8>
    wsgi.multiprocess = True
    wsgi.multithread = False
    wsgi.run_once = False
    wsgi.url_scheme = 'https'
    wsgi.version = '(1, 0)'
    
    Settings:
    Using settings module weblate.settings
    ABSOLUTE_URL_OVERRIDES = {}
    ADMINS = "(('XWiki.org Infra', '[email protected]'),)"
    ADMINS_BILLING = []
    ADMINS_CONTACT = []
    ADMINS_HOSTING = []
    AKISMET_API_KEY = '********************'
    ALLOWED_HOSTS = ['l10n.xwiki.org', 'l10n-new.xwiki.org', '[IP]', '*']
    ANONYMOUS_USER_NAME = 'anonymous'
    APPEND_SLASH = True
    AUDITLOG_EXPIRY = 180
    AUTHENTICATION_BACKENDS = "('social_core.backends.email.EmailAuth', 'social_core.backends.github.GithubOAuth2', 'social_core.backends.suse.OpenSUSEOpenId', 'social_core.backends.ubuntu.UbuntuOpenId', 'social_core.backends.fedora.FedoraOpenId', 'weblate.accounts.auth.WeblateUserBackend', 'weblate.auth.xwiki.XWikiOAuth2')"
    AUTH_LOCK_ATTEMPTS = 10
    AUTH_PASSWORD_DAYS = '********************'
    AUTH_PASSWORD_VALIDATORS = '********************'
    AUTH_RESTRICT_ADMINS = {}
    AUTH_TOKEN_VALID = '********************'
    AUTH_USER_MODEL = 'weblate_auth.User'
    AUTH_VALIDATE_PERMS = False
    AUTOFIX_LIST = "('weblate.trans.autofixes.whitespace.SameBookendingWhitespace', 'weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis', 'weblate.trans.autofixes.chars.RemoveZeroSpace', 'weblate.trans.autofixes.chars.RemoveControlChars', 'weblate.trans.autofixes.html.BleachHTML')"
    AUTO_UPDATE = True
    AVATAR_DEFAULT_IMAGE = 'identicon'
    AVATAR_URL_PREFIX = 'https://www.gravatar.com/'
    BASE_DIR = '/home/weblate/weblate-env/lib/python3.7/site-packages'
    BASIC_LANGUAGES = None
    CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PARSER_CLASS': 'redis.connection.HiredisParser', 'PASSWORD': '********************', 'CONNECTION_POOL_KWARGS': {}}, 'KEY_PREFIX': '********************'}, 'avatar': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/weblate/data/avatar-cache', 'TIMEOUT': 86400, 'OPTIONS': {'MAX_ENTRIES': 1000}}}
    CACHE_MIDDLEWARE_ALIAS = 'default'
    CACHE_MIDDLEWARE_KEY_PREFIX = '********************'
    CACHE_MIDDLEWARE_SECONDS = 600
    CELERY_BEAT_SCHEDULE_FILENAME = '/var/weblate/data/celery/beat-schedule'
    CELERY_BROKER_URL = 'redis://localhost:6379'
    CELERY_RESULT_BACKEND = 'redis://localhost:6379'
    CELERY_TASK_ALWAYS_EAGER = False
    CELERY_TASK_ROUTES = {'weblate.trans.tasks.auto_translate': {'queue': 'translate'}, 'weblate.accounts.tasks.notify_*': {'queue': 'notify'}, 'weblate.accounts.tasks.send_mails': {'queue': 'notify'}, 'weblate.utils.tasks.settings_backup': {'queue': 'backup'}, 'weblate.utils.tasks.database_backup': {'queue': 'backup'}, 'weblate.wladmin.tasks.backup': {'queue': 'backup'}, 'weblate.wladmin.tasks.backup_service': {'queue': 'backup'}, 'weblate.memory.tasks.*': {'queue': 'memory'}}
    CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200000
    CHECK_LIST = "('weblate.checks.same.SameCheck', 'weblate.checks.chars.BeginNewlineCheck', 'weblate.checks.chars.EndNewlineCheck', 'weblate.checks.chars.BeginSpaceCheck', 'weblate.checks.chars.EndSpaceCheck', 'weblate.checks.chars.DoubleSpaceCheck', 'weblate.checks.chars.EndStopCheck', 'weblate.checks.chars.EndColonCheck', 'weblate.checks.chars.EndQuestionCheck', 'weblate.checks.chars.EndExclamationCheck', 'weblate.checks.chars.EndEllipsisCheck', 'weblate.checks.chars.EndSemicolonCheck', 'weblate.checks.chars.MaxLengthCheck', 'weblate.checks.chars.KashidaCheck', 'weblate.checks.chars.PunctuationSpacingCheck', 'weblate.checks.format.PythonFormatCheck', 'weblate.checks.format.PythonBraceFormatCheck', 'weblate.checks.format.PHPFormatCheck', 'weblate.checks.format.CFormatCheck', 'weblate.checks.format.PerlFormatCheck', 'weblate.checks.format.JavaScriptFormatCheck', 'weblate.checks.format.CSharpFormatCheck', 'weblate.checks.format.JavaFormatCheck', 'weblate.checks.format.JavaMessageFormatCheck', 'weblate.checks.format.PercentPlaceholdersCheck', 'weblate.checks.format.VueFormattingCheck', 'weblate.checks.format.I18NextInterpolationCheck', 'weblate.checks.format.ESTemplateLiteralsCheck', 'weblate.checks.angularjs.AngularJSInterpolationCheck', 'weblate.checks.qt.QtFormatCheck', 'weblate.checks.qt.QtPluralCheck', 'weblate.checks.ruby.RubyFormatCheck', 'weblate.checks.consistency.PluralsCheck', 'weblate.checks.consistency.SamePluralsCheck', 'weblate.checks.consistency.ConsistencyCheck', 'weblate.checks.consistency.TranslatedCheck', 'weblate.checks.chars.EscapedNewlineCountingCheck', 'weblate.checks.chars.NewLineCountCheck', 'weblate.checks.markup.BBCodeCheck', 'weblate.checks.chars.ZeroWidthSpaceCheck', 'weblate.checks.render.MaxSizeCheck', 'weblate.checks.markup.XMLValidityCheck', 'weblate.checks.markup.XMLTagsCheck', 'weblate.checks.markup.MarkdownRefLinkCheck', 'weblate.checks.markup.MarkdownLinkCheck', 'weblate.checks.markup.MarkdownSyntaxCheck', 'weblate.checks.markup.URLCheck', 'weblate.checks.markup.SafeHTMLCheck', 'weblate.checks.placeholders.PlaceholderCheck', 'weblate.checks.placeholders.RegexCheck', 'weblate.checks.duplicate.DuplicateCheck', 'weblate.checks.source.OptionalPluralCheck', 'weblate.checks.source.EllipsisCheck', 'weblate.checks.source.MultipleFailingCheck', 'weblate.checks.source.LongUntranslatedCheck', 'weblate.checks.format.MultipleUnnamedFormatsCheck')"
    COMMENT_CLEANUP_DAYS = None
    COMMIT_PENDING_HOURS = 1
    COMPRESSORS = {'css': 'compressor.css.CssCompressor', 'js': 'compressor.js.JsCompressor'}
    COMPRESS_CACHEABLE_PRECOMPILERS = '()'
    COMPRESS_CACHE_BACKEND = 'default'
    COMPRESS_CACHE_KEY_FUNCTION = '********************'
    COMPRESS_CLEAN_CSS_ARGUMENTS = ''
    COMPRESS_CLEAN_CSS_BINARY = 'cleancss'
    COMPRESS_CLOSURE_COMPILER_ARGUMENTS = ''
    COMPRESS_CLOSURE_COMPILER_BINARY = 'java -jar compiler.jar'
    COMPRESS_CSS_HASHING_METHOD = 'mtime'
    COMPRESS_DATA_URI_MAX_SIZE = 1024
    COMPRESS_DEBUG_TOGGLE = None
    COMPRESS_ENABLED = True
    COMPRESS_FILTERS = {'css': ['compressor.filters.css_default.CssAbsoluteFilter'], 'js': ['compressor.filters.jsmin.JSMinFilter']}
    COMPRESS_JINJA2_GET_ENVIRONMENT = <function CompressorConf.JINJA2_GET_ENVIRONMENT at 0x7fa2aef0f9d8>
    COMPRESS_MINT_DELAY = 30
    COMPRESS_MTIME_DELAY = 10
    COMPRESS_OFFLINE = True
    COMPRESS_OFFLINE_CONTEXT = [{'fonts_cdn_url': None, 'STATIC_URL': '/static/', 'LANGUAGE_BIDI': True}, {'fonts_cdn_url': None, 'STATIC_URL': '/static/', 'LANGUAGE_BIDI': False}]
    COMPRESS_OFFLINE_MANIFEST = 'manifest.json'
    COMPRESS_OFFLINE_TIMEOUT = 31536000
    COMPRESS_OUTPUT_DIR = 'CACHE'
    COMPRESS_PARSER = 'compressor.parser.AutoSelectParser'
    COMPRESS_PRECOMPILERS = '()'
    COMPRESS_REBUILD_TIMEOUT = 2592000
    COMPRESS_ROOT = '/var/weblate/data/static'
    COMPRESS_STORAGE = 'compressor.storage.CompressorFileStorage'
    COMPRESS_TEMPLATE_FILTER_CONTEXT = {'STATIC_URL': '/static/'}
    COMPRESS_URL = '/static/'
    COMPRESS_URL_PLACEHOLDER = '/__compressor_url_placeholder__/'
    COMPRESS_VERBOSE = False
    COMPRESS_YUGLIFY_BINARY = 'yuglify'
    COMPRESS_YUGLIFY_CSS_ARGUMENTS = '--terminal'
    COMPRESS_YUGLIFY_JS_ARGUMENTS = '--terminal'
    COMPRESS_YUI_BINARY = 'java -jar yuicompressor.jar'
    COMPRESS_YUI_CSS_ARGUMENTS = ''
    COMPRESS_YUI_JS_ARGUMENTS = ''
    CRISPY_TEMPLATE_PACK = 'bootstrap3'
    CSP_CONNECT_SRC = []
    CSP_FONT_SRC = []
    CSP_IMG_SRC = []
    CSP_SCRIPT_SRC = []
    CSP_STYLE_SRC = []
    CSRF_COOKIE_AGE = 31449600
    CSRF_COOKIE_DOMAIN = None
    CSRF_COOKIE_HTTPONLY = True
    CSRF_COOKIE_NAME = 'csrftoken'
    CSRF_COOKIE_PATH = '/'
    CSRF_COOKIE_SAMESITE = 'Lax'
    CSRF_COOKIE_SECURE = True
    CSRF_FAILURE_VIEW = 'weblate.trans.views.error.csrf_failure'
    CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
    CSRF_TRUSTED_ORIGINS = []
    CSRF_USE_SESSIONS = True
    DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql', 'NAME': 'weblate', 'USER': 'weblate', 'PASSWORD': '********************', 'HOST': '127.0.0.1', 'PORT': '', 'OPTIONS': {}, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}}
    DATABASE_BACKUP = 'plain'
    DATABASE_ROUTERS = []
    DATA_DIR = '/var/weblate/data'
    DATA_UPLOAD_MAX_MEMORY_SIZE = 50000000
    DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
    DATETIME_FORMAT = 'N j, Y, P'
    DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M']
    DATE_FORMAT = 'N j, Y'
    DATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']
    DEBUG = False
    DEBUG_PROPAGATE_EXCEPTIONS = False
    DECIMAL_SEPARATOR = '.'
    DEFAULT_ACCESS_CONTROL = 0
    DEFAULT_ADDONS = {}
    DEFAULT_ADDON_MESSAGE = 'Update translation files\n\nUpdated by "{{ addon_name }}" hook in Weblate.\n\nTranslation: {{ project_name }}/{{ component_name }}\nTranslate-URL: {{ url }}'
    DEFAULT_ADD_MESSAGE = 'Added translation using Weblate ({{ language_name }})\n\n'
    DEFAULT_AUTO_LOCK_ERROR = True
    DEFAULT_CHARSET = 'utf-8'
    DEFAULT_COMMITER_EMAIL = '[email protected]'
    DEFAULT_COMMITER_NAME = 'Weblate'
    DEFAULT_COMMIT_MESSAGE = 'Translated using Weblate ({{ language_name }})\n\nCurrently translated at {{ stats.translated_percent }}% ({{ stats.translated }} of {{ stats.all }} strings)\n\nTranslation: {{ project_name }}/{{ component_name }}\nTranslate-URL: {{ url }}'
    DEFAULT_DELETE_MESSAGE = 'Deleted translation using Weblate ({{ language_name }})\n\n'
    DEFAULT_EXCEPTION_REPORTER = 'django.views.debug.ExceptionReporter'
    DEFAULT_EXCEPTION_REPORTER_FILTER = 'weblate.trans.debug.WeblateExceptionReporterFilter'
    DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
    DEFAULT_FROM_EMAIL = '[email protected]'
    DEFAULT_HASHING_ALGORITHM = 'sha256'
    DEFAULT_INDEX_TABLESPACE = ''
    DEFAULT_LANGUAGE = 'en'
    DEFAULT_LOG = 'syslog'
    DEFAULT_LOGLEVEL = 'INFO'
    DEFAULT_MERGE_MESSAGE = "Merge branch '{{ component_remote_branch }}' into Weblate.\n\n"
    DEFAULT_MERGE_STYLE = 'rebase'
    DEFAULT_PULL_MESSAGE = 'Translations update from Weblate\n\nTranslations update from [Weblate]({{url}}) for {{ project_name }}/{{ component_name }}.\n\n{% if component.linked_childs %}\nIt also includes following components:\n{% for linked in component.linked_child %}\n{{ component.project.name }}/{{ component.name }}\n{% endfor %}\n{% endif %}\n\nCurrent translation status:\n\n![Weblate translation status]({{widget_url}})\n\nIf a new locale is introduced by this pull request make sure to follow https://dev.xwiki.org/xwiki/bin/view/Community/L10N/SupportedLocales/#HNewlocalechecklist before applying it.\n'
    DEFAULT_PUSH_ON_COMMIT = True
    DEFAULT_RESTRICTED_COMPONENT = False
    DEFAULT_SHARED_TM = True
    DEFAULT_TABLESPACE = ''
    DEFAULT_TRANSLATION_PROPAGATION = True
    DEFAULT_VCS = 'git'
    DISALLOWED_USER_AGENTS = []
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'localhost'
    EMAIL_HOST_PASSWORD = '********************'
    EMAIL_HOST_USER = ''
    EMAIL_PORT = 25
    EMAIL_SEND_HTML = True
    EMAIL_SSL_CERTFILE = None
    EMAIL_SSL_KEYFILE = '********************'
    EMAIL_SUBJECT_PREFIX = '[Weblate XWiki.org] '
    EMAIL_TIMEOUT = None
    EMAIL_USE_LOCALTIME = False
    EMAIL_USE_SSL = False
    EMAIL_USE_TLS = False
    ENABLE_AVATARS = True
    ENABLE_HOOKS = True
    ENABLE_HTTPS = True
    ENABLE_SHARING = True
    FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
    FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
    FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
    FILE_UPLOAD_PERMISSIONS = 420
    FILE_UPLOAD_TEMP_DIR = None
    FIRST_DAY_OF_WEEK = 0
    FIXTURE_DIRS = []
    FONTS_CDN_URL = None
    FORCE_SCRIPT_NAME = None
    FORMAT_MODULE_PATH = None
    FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
    GITHUB_CREDENTIALS = {}
    GITHUB_TOKEN = '********************'
    GITHUB_USERNAME = 'xwikiorgci'
    GITLAB_CREDENTIALS = {}
    GITLAB_TOKEN = '********************'
    GITLAB_USERNAME = None
    GOOGLE_ANALYTICS_ID = None
    HAVE_SYSLOG = True
    HIDE_REPO_CREDENTIALS = True
    HIDE_VERSION = False
    IGNORABLE_404_URLS = []
    INSTALLED_APPS = ['weblate.addons', 'weblate.auth', 'weblate.checks', 'weblate.configuration', 'weblate.formats', 'weblate.glossary', 'weblate.machinery', 'weblate.trans', 'weblate.lang', 'weblate_language_data', 'weblate.memory', 'weblate.screenshots', 'weblate.fonts', 'weblate.accounts', 'weblate.utils', 'weblate.vcs', 'weblate.wladmin', 'weblate', 'weblate.gitexport', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin.apps.SimpleAdminConfig', 'django.contrib.admindocs', 'django.contrib.sitemaps', 'django.contrib.humanize', 'social_django', 'crispy_forms', 'compressor', 'rest_framework', 'rest_framework.authtoken', 'django_filters']
    INTERNAL_IPS = []
    INVOICE_PATH = ''
    IP_BEHIND_REVERSE_PROXY = False
    IP_PROXY_HEADER = 'HTTP_X_FORWARDED_FOR'
    IP_PROXY_OFFSET = 0
    LANGUAGES = "(('ar', 'العربية'), ('az', 'Azərbaycan'), ('be', 'Беларуская'), ('[email protected]', 'Biełaruskaja'), ('bg', 'Български'), ('br', 'Brezhoneg'), ('ca', 'Català'), ('cs', 'Čeština'), ('da', 'Dansk'), ('de', 'Deutsch'), ('en', 'English'), ('el', 'Ελληνικά'), ('en-gb', 'English (United Kingdom)'), ('es', 'Español'), ('fi', 'Suomi'), ('fr', 'Français'), ('gl', 'Galego'), ('he', 'עברית'), ('hu', 'Magyar'), ('hr', 'Hrvatski'), ('id', 'Indonesia'), ('is', 'Íslenska'), ('it', 'Italiano'), ('ja', '日本語'), ('kab', 'Taqbaylit'), ('kk', 'Қазақ тілі'), ('ko', '한국어'), ('nb', 'Norsk bokmål'), ('nl', 'Nederlands'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português brasileiro'), ('ru', 'Русский'), ('sk', 'Slovenčina'), ('sl', 'Slovenščina'), ('sq', 'Shqip'), ('sr', 'Српски'), ('sv', 'Svenska'), ('tr', 'Türkçe'), ('uk', 'Українська'), ('zh-hans', '简体字'), ('zh-hant', '正體字'))"
    LANGUAGES_BIDI = ['he', 'ar', 'ar-dz', 'fa', 'ur']
    LANGUAGE_CODE = 'en-us'
    LANGUAGE_COOKIE_AGE = 12096000
    LANGUAGE_COOKIE_DOMAIN = None
    LANGUAGE_COOKIE_HTTPONLY = True
    LANGUAGE_COOKIE_NAME = 'django_language'
    LANGUAGE_COOKIE_PATH = '/'
    LANGUAGE_COOKIE_SAMESITE = None
    LANGUAGE_COOKIE_SECURE = True
    LEGAL_URL = None
    LICENSE_EXTRA = []
    LICENSE_FILTER = None
    LICENSE_REQUIRED = False
    LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH = True
    LOCALE_PATHS = []
    LOCALIZE_CDN_PATH = None
    LOCALIZE_CDN_URL = None
    LOGGING = {'version': 1, 'disable_existing_loggers': True, 'filters': {'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}}, 'formatters': {'syslog': {'format': 'weblate[%(process)d]: %(levelname)s %(message)s'}, 'simple': {'format': '[%(asctime)s: %(levelname)s/%(process)s] %(message)s'}, 'logfile': {'format': '%(asctime)s %(levelname)s %(message)s'}, 'django.server': {'()': 'django.utils.log.ServerFormatter', 'format': '[%(server_time)s] %(message)s'}}, 'handlers': {'mail_admins': {'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True}, 'console': {'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'simple'}, 'django.server': {'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'django.server'}, 'syslog': {'level': 'DEBUG', 'class': 'logging.handlers.SysLogHandler', 'formatter': 'syslog', 'address': '/dev/log', 'facility': 18}}, 'loggers': {'django.request': {'handlers': ['mail_admins', 'syslog'], 'level': 'ERROR', 'propagate': True}, 'django.server': {'handlers': ['django.server'], 'level': 'INFO', 'propagate': False}, 'weblate': {'handlers': ['syslog'], 'level': 'INFO'}, 'weblate.vcs': {'handlers': ['syslog'], 'level': 'INFO'}, 'social': {'handlers': ['syslog'], 'level': 'INFO'}, 'django_auth_ldap': {'handlers': ['syslog'], 'level': 'INFO'}, 'djangosaml2idp': {'handlers': ['syslog'], 'level': 'INFO'}}}
    LOGGING_CONFIG = 'logging.config.dictConfig'
    LOGIN_REDIRECT_URL = '/'
    LOGIN_REQUIRED_URLS = []
    LOGIN_REQUIRED_URLS_EXCEPTIONS = "('{URL_PREFIX}/accounts/(.*)$', '{URL_PREFIX}/admin/login/(.*)$', '{URL_PREFIX}/static/(.*)$', '{URL_PREFIX}/widgets/(.*)$', '{URL_PREFIX}/data/(.*)$', '{URL_PREFIX}/hooks/(.*)$', '{URL_PREFIX}/healthz/$', '{URL_PREFIX}/api/(.*)$', '{URL_PREFIX}/js/i18n/$', '{URL_PREFIX}/contact/$', '{URL_PREFIX}/legal/(.*)$')"
    LOGIN_URL = '/accounts/login/'
    LOGOUT_REDIRECT_URL = None
    LOGOUT_URL = '/accounts/logout/'
    MANAGERS = "(('XWiki.org Infra', '[email protected]'),)"
    MATOMO_SITE_ID = None
    MATOMO_URL = None
    MEDIA_ROOT = '/var/weblate/data/media'
    MEDIA_URL = '/media/'
    MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
    MIDDLEWARE = ['weblate.middleware.RedirectMiddleware', 'weblate.middleware.ProxyMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'weblate.accounts.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware', 'weblate.accounts.middleware.RequireLoginMiddleware', 'weblate.api.middleware.ThrottlingMiddleware', 'weblate.middleware.SecurityMiddleware']
    MIGRATION_MODULES = {}
    MONTH_DAY_FORMAT = 'F j'
    MT_APERTIUM_APY = None
    MT_AWS_ACCESS_KEY_ID = '********************'
    MT_AWS_REGION = None
    MT_AWS_SECRET_ACCESS_KEY = '********************'
    MT_BAIDU_ID = None
    MT_BAIDU_SECRET = '********************'
    MT_DEEPL_API_VERSION = '********************'
    MT_DEEPL_KEY = '********************'
    MT_GOOGLE_CREDENTIALS = None
    MT_GOOGLE_KEY = '********************'
    MT_GOOGLE_LOCATION = 'global'
    MT_GOOGLE_PROJECT = None
    MT_MICROSOFT_BASE_URL = 'api.cognitive.microsofttranslator.com'
    MT_MICROSOFT_COGNITIVE_KEY = '********************'
    MT_MICROSOFT_ENDPOINT_URL = 'api.cognitive.microsoft.com'
    MT_MICROSOFT_REGION = None
    MT_MODERNMT_KEY = '********************'
    MT_MODERNMT_URL = 'https://api.modernmt.com/'
    MT_MYMEMORY_EMAIL = None
    MT_MYMEMORY_KEY = '********************'
    MT_MYMEMORY_USER = None
    MT_NETEASE_KEY = '********************'
    MT_NETEASE_SECRET = '********************'
    MT_SAP_BASE_URL = None
    MT_SAP_PASSWORD = '********************'
    MT_SAP_SANDBOX_APIKEY = '********************'
    MT_SAP_USERNAME = None
    MT_SAP_USE_MT = True
    MT_SERVICES = "('weblate.machinery.weblatetm.WeblateTranslation', 'weblate.memory.machine.WeblateMemory')"
    MT_TMSERVER = None
    MT_YANDEX_KEY = '********************'
    MT_YOUDAO_ID = None
    MT_YOUDAO_SECRET = '********************'
    NEARBY_MESSAGES = 15
    NUMBER_GROUPING = 0
    OFFER_HOSTING = False
    PAGURE_CREDENTIALS = {}
    PAGURE_TOKEN = '********************'
    PAGURE_USERNAME = None
    PASSWORD_HASHERS = '********************'
    PASSWORD_RESET_TIMEOUT = '********************'
    PASSWORD_RESET_TIMEOUT_DAYS = '********************'
    PREPEND_WWW = False
    RATELIMIT_ATTEMPTS = 5
    RATELIMIT_COMMENT_ATTEMPTS = 30
    RATELIMIT_COMMENT_WINDOW = 60
    RATELIMIT_GLOSSARY_ATTEMPTS = 30
    RATELIMIT_GLOSSARY_WINDOW = 60
    RATELIMIT_LOCKOUT = 600
    RATELIMIT_SEARCH_ATTEMPTS = 30
    RATELIMIT_SEARCH_LOCKOUT = 60
    RATELIMIT_SEARCH_WINDOW = 60
    RATELIMIT_TRANSLATE_ATTEMPTS = 30
    RATELIMIT_TRANSLATE_WINDOW = 60
    RATELIMIT_WINDOW = 300
    REGISTRATION_ALLOW_BACKENDS = []
    REGISTRATION_CAPTCHA = True
    REGISTRATION_EMAIL_MATCH = '.*'
    REGISTRATION_OPEN = True
    REPOSITORY_ALERT_THRESHOLD = 25
    REQUIRE_LOGIN = False
    REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticatedOrReadOnly'], 'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication', 'weblate.api.authentication.BearerAuthentication', 'rest_framework.authentication.SessionAuthentication'), 'DEFAULT_THROTTLE_CLASSES': ('weblate.api.throttling.UserRateThrottle', 'weblate.api.throttling.AnonRateThrottle'), 'DEFAULT_THROTTLE_RATES': {'anon': '100/day', 'user': '5000/hour'}, 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 20, 'VIEW_DESCRIPTION_FUNCTION': 'weblate.api.views.get_view_description', 'UNAUTHENTICATED_USER': 'weblate.auth.models.get_anonymous'}
    ROOT_URLCONF = 'weblate.urls'
    SECRET_KEY = '********************'
    SECURE_BROWSER_XSS_FILTER = True
    SECURE_CONTENT_TYPE_NOSNIFF = True
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    SECURE_HSTS_PRELOAD = True
    SECURE_HSTS_SECONDS = 31536000
    SECURE_PROXY_SSL_HEADER = None
    SECURE_REDIRECT_EXEMPT = "('healthz/$',)"
    SECURE_REFERRER_POLICY = 'same-origin'
    SECURE_SSL_HOST = None
    SECURE_SSL_REDIRECT = True
    SENTRY_DSN = None
    SENTRY_ENVIRONMENT = 'devel'
    SENTRY_EXTRA_ARGS = {}
    SENTRY_ORGANIZATION = 'weblate'
    SENTRY_PROJECTS = ['weblate']
    SENTRY_SECURITY = None
    SENTRY_TOKEN = '********************'
    SERVER_EMAIL = '[email protected]'
    SESSION_CACHE_ALIAS = 'default'
    SESSION_COOKIE_AGE = 1000
    SESSION_COOKIE_AGE_AUTHENTICATED = 1209600
    SESSION_COOKIE_DOMAIN = None
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_NAME = 'sessionid'
    SESSION_COOKIE_PATH = '/'
    SESSION_COOKIE_SAMESITE = 'Lax'
    SESSION_COOKIE_SECURE = True
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False
    SESSION_FILE_PATH = None
    SESSION_SAVE_EVERY_REQUEST = False
    SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
    SETTINGS_MODULE = 'weblate.settings'
    SHORT_DATETIME_FORMAT = 'm/d/Y P'
    SHORT_DATE_FORMAT = 'm/d/Y'
    SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
    SILENCED_SYSTEM_CHECKS = ['admin.E408']
    SIMILAR_MESSAGES = 5
    SIMPLIFY_LANGUAGES = True
    SINGLE_PROJECT = False
    SITE_DOMAIN = 'l10n.xwiki.org'
    SITE_ID = 1
    SITE_TITLE = 'Weblate XWiki.org'
    SOCIAL_AUTH_AUTH0_IMAGE = 'auth0.svg'
    SOCIAL_AUTH_AUTH0_TITLE = 'Auth0'
    SOCIAL_AUTH_BITBUCKET_KEY = '********************'
    SOCIAL_AUTH_BITBUCKET_SECRET = '********************'
    SOCIAL_AUTH_BITBUCKET_VERIFIED_EMAILS_ONLY = True
    SOCIAL_AUTH_DISCONNECT_PIPELINE = "('social_core.pipeline.disconnect.allowed_to_disconnect', 'social_core.pipeline.disconnect.get_entries', 'social_core.pipeline.disconnect.revoke_tokens', 'weblate.accounts.pipeline.cycle_session', 'weblate.accounts.pipeline.adjust_primary_mail', 'weblate.accounts.pipeline.notify_disconnect', 'social_core.pipeline.disconnect.disconnect', 'weblate.accounts.pipeline.cleanup_next')"
    SOCIAL_AUTH_EMAIL_FORM_URL = '/accounts/email/'
    SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = 'weblate.accounts.pipeline.send_validation'
    SOCIAL_AUTH_EMAIL_VALIDATION_URL = '/accounts/email-sent/'
    SOCIAL_AUTH_FACEBOOK_KEY = '********************'
    SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {'fields': 'id,name,email'}
    SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'public_profile']
    SOCIAL_AUTH_FACEBOOK_SECRET = '********************'
    SOCIAL_AUTH_GITHUB_KEY = '********************'
    SOCIAL_AUTH_GITHUB_SCOPE = ['user:email']
    SOCIAL_AUTH_GITHUB_SECRET = '********************'
    SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '********************'
    SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '********************'
    SOCIAL_AUTH_LOGIN_ERROR_URL = '/accounts/login/'
    SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/accounts/profile/#account'
    SOCIAL_AUTH_PIPELINE = "('social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', 'social_core.pipeline.social_auth.auth_allowed', 'social_core.pipeline.social_auth.social_user', 'weblate.accounts.pipeline.store_params', 'weblate.accounts.pipeline.verify_open', 'social_core.pipeline.user.get_username', 'weblate.accounts.pipeline.require_email', 'social_core.pipeline.mail.mail_validation', 'weblate.accounts.pipeline.revoke_mail_code', 'weblate.accounts.pipeline.ensure_valid', 'weblate.accounts.pipeline.remove_account', 'social_core.pipeline.social_auth.associate_by_email', 'weblate.accounts.pipeline.reauthenticate', 'weblate.accounts.pipeline.verify_username', 'social_core.pipeline.user.create_user', 'social_core.pipeline.social_auth.associate_user', 'social_core.pipeline.social_auth.load_extra_data', 'weblate.accounts.pipeline.cleanup_next', 'weblate.accounts.pipeline.user_full_name', 'weblate.accounts.pipeline.store_email', 'weblate.accounts.pipeline.notify_connect', 'weblate.accounts.pipeline.password_reset')"
    SOCIAL_AUTH_PROTECTED_USER_FIELDS = "('email',)"
    SOCIAL_AUTH_RAISE_EXCEPTIONS = True
    SOCIAL_AUTH_REDIRECT_IS_HTTPS = True
    SOCIAL_AUTH_SAML_IMAGE = 'saml.svg'
    SOCIAL_AUTH_SAML_TITLE = 'SAML'
    SOCIAL_AUTH_SLUGIFY_FUNCTION = 'weblate.accounts.pipeline.slugify_username'
    SOCIAL_AUTH_SLUGIFY_USERNAMES = True
    SOCIAL_AUTH_STRATEGY = 'weblate.accounts.strategy.WeblateStrategy'
    SOCIAL_AUTH_XWIKI_KEY = '********************'
    SPECIAL_CHARS = "('\\t', '\\n', '\\xa0', '…')"
    STATICFILES_DIRS = '()'
    STATICFILES_FINDERS = "('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'compressor.finders.CompressorFinder')"
    STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
    STATIC_ROOT = '/var/weblate/data/static'
    STATIC_URL = '/static/'
    STATUS_URL = None
    SUGGESTION_CLEANUP_DAYS = None
    SUPPORT_API_URL = '********************'
    TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': {'context_processors': ['django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.request', 'django.template.context_processors.csrf', 'django.contrib.messages.context_processors.messages', 'weblate.trans.context_processors.weblate_context'], 'loaders': [('django.template.loaders.cached.Loader', ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader'])]}}]
    TEST_NON_SERIALIZED_APPS = []
    TEST_RUNNER = 'django.test.runner.DiscoverRunner'
    THOUSAND_SEPARATOR = ','
    TIME_FORMAT = 'P'
    TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
    TIME_ZONE = 'UTC'
    UPDATE_LANGUAGES = True
    URL_PREFIX = ''
    USE_I18N = True
    USE_L10N = True
    USE_THOUSAND_SEPARATOR = False
    USE_TZ = True
    USE_X_FORWARDED_HOST = False
    USE_X_FORWARDED_PORT = False
    VAT_RATE = 1.21
    VCS_BACKENDS = "('weblate.vcs.git.GitRepository', 'weblate.vcs.git.GitWithGerritRepository', 'weblate.vcs.git.SubversionRepository', 'weblate.vcs.git.GithubRepository', 'weblate.vcs.git.GitLabRepository', 'weblate.vcs.git.PagureRepository', 'weblate.vcs.git.LocalRepository', 'weblate.vcs.git.GitForcePushRepository', 'weblate.vcs.mercurial.HgRepository')"
    VCS_CLONE_DEPTH = 1
    WEBLATE_ADDONS = "('weblate.addons.gettext.GenerateMoAddon', 'weblate.addons.gettext.UpdateLinguasAddon', 'weblate.addons.gettext.UpdateConfigureAddon', 'weblate.addons.gettext.MsgmergeAddon', 'weblate.addons.gettext.GettextCustomizeAddon', 'weblate.addons.gettext.GettextAuthorComments', 'weblate.addons.cleanup.CleanupAddon', 'weblate.addons.cleanup.RemoveBlankAddon', 'weblate.addons.consistency.LangaugeConsistencyAddon', 'weblate.addons.discovery.DiscoveryAddon', 'weblate.addons.autotranslate.AutoTranslateAddon', 'weblate.addons.flags.SourceEditAddon', 'weblate.addons.flags.TargetEditAddon', 'weblate.addons.flags.SameEditAddon', 'weblate.addons.flags.BulkEditAddon', 'weblate.addons.generate.GenerateFileAddon', 'weblate.addons.json.JSONCustomizeAddon', 'weblate.addons.properties.PropertiesSortAddon', 'weblate.addons.git.GitSquashAddon', 'weblate.addons.removal.RemoveComments', 'weblate.addons.removal.RemoveSuggestions', 'weblate.addons.resx.ResxUpdateAddon', 'weblate.addons.yaml.YAMLCustomizeAddon', 'weblate.addons.cdn.CDNJSAddon')"
    WEBLATE_EXPORTERS = "('weblate.formats.exporters.PoExporter', 'weblate.formats.exporters.PoXliffExporter', 'weblate.formats.exporters.XliffExporter', 'weblate.formats.exporters.TBXExporter', 'weblate.formats.exporters.TMXExporter', 'weblate.formats.exporters.MoExporter', 'weblate.formats.exporters.CSVExporter', 'weblate.formats.exporters.XlsxExporter', 'weblate.formats.exporters.JSONExporter', 'weblate.formats.exporters.AndroidResourceExporter', 'weblate.formats.exporters.StringsExporter')"
    WEBLATE_FORMATS = "('weblate.formats.ttkit.PoFormat', 'weblate.formats.ttkit.PoMonoFormat', 'weblate.formats.ttkit.TSFormat', 'weblate.formats.ttkit.XliffFormat', 'weblate.formats.ttkit.PoXliffFormat', 'weblate.formats.ttkit.StringsFormat', 'weblate.formats.ttkit.StringsUtf8Format', 'weblate.formats.ttkit.PropertiesUtf8Format', 'weblate.formats.ttkit.PropertiesUtf16Format', 'weblate.formats.ttkit.PropertiesFormat', 'weblate.formats.ttkit.JoomlaFormat', 'weblate.formats.ttkit.GWTFormat', 'weblate.formats.ttkit.PhpFormat', 'weblate.formats.ttkit.LaravelPhpFormat', 'weblate.formats.ttkit.RESXFormat', 'weblate.formats.ttkit.AndroidFormat', 'weblate.formats.ttkit.JSONFormat', 'weblate.formats.ttkit.JSONNestedFormat', 'weblate.formats.ttkit.WebExtensionJSONFormat', 'weblate.formats.ttkit.I18NextFormat', 'weblate.formats.ttkit.GoI18JSONFormat', 'weblate.formats.ttkit.ARBFormat', 'weblate.formats.ttkit.CSVFormat', 'weblate.formats.ttkit.CSVSimpleFormat', 'weblate.formats.ttkit.CSVSimpleFormatISO', 'weblate.formats.ttkit.YAMLFormat', 'weblate.formats.ttkit.RubyYAMLFormat', 'weblate.formats.ttkit.SubRipFormat', 'weblate.formats.ttkit.MicroDVDFormat', 'weblate.formats.ttkit.AdvSubStationAlphaFormat', 'weblate.formats.ttkit.SubStationAlphaFormat', 'weblate.formats.ttkit.DTDFormat', 'weblate.formats.ttkit.FlatXMLFormat', 'weblate.formats.ttkit.INIFormat', 'weblate.formats.ttkit.InnoSetupINIFormat', 'weblate.formats.external.XlsxFormat', 'weblate.formats.txt.AppStoreFormat', 'weblate.formats.convert.HTMLFormat', 'weblate.formats.convert.IDMLFormat', 'weblate.formats.convert.OpenDocumentFormat', 'weblate.formats.convert.WindowsRCFormat', 'weblate.formats.ttkit.XWikiPropertiesFormat', 'weblate.formats.ttkit.XWikiPagePropertiesFormat', 'weblate.formats.ttkit.XWikiFullPageFormat')"
    WEBLATE_GPG_ALGO = 'default'
    WEBLATE_GPG_IDENTITY = None
    WSGI_APPLICATION = None
    X_FRAME_OPTIONS = 'DENY'
    YEAR_MONTH_FORMAT = 'F Y'
    _TEMPLATE_LOADERS = [('django.template.loaders.cached.Loader', ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader'])]
    

    Server configuration and status

    Weblate installation: PyPI

     * Weblate: 4.4.2
     * Django: 3.1.5
     * siphashc: 1.3
     * Whoosh: 2.7.4
     * translate-toolkit: 3.3.0
     * lxml: 4.5.2
     * Pillow: 7.1.2
     * bleach: 3.1.5
     * python-dateutil: 2.8.1
     * social-auth-core: 4.0.3
     * social-auth-app-django: 4.0.0
     * django-crispy-forms: 1.9.2
     * oauthlib: 3.1.0
     * django-compressor: 2.4
     * djangorestframework: 3.11.1
     * django-filter: 2.4.0
     * django-appconf: 1.0.4
     * user-agents: 2.1
     * filelock: 3.0.12
     * setuptools: 50.3.0
     * jellyfish: 0.8.2
     * openpyxl: 3.0.5
     * celery: 4.4.7
     * kombu: 4.6.11
     * translation-finder: 2.7
     * weblate-language-data: 2020.13
     * html2text: 2020.1.16
     * pycairo: 1.19.1
     * pygobject: 3.38.0
     * diff-match-patch: 20200713
     * requests: 2.24.0
     * django-redis: 4.12.1
     * hiredis: 1.0.1
     * sentry_sdk: 0.15.1
     * Cython: 0.29.21
     * misaka: 2.1.1
     * GitPython: 3.1.8
     * borgbackup: 1.1.13
     * pyparsing: 2.4.7
     * Python: 3.7.3
     * Git: 2.20.1
     * psycopg2-binary: 2.8.6
     * chardet: 3.0.4
     * ruamel.yaml: 0.16.12
     * Redis server: 5.0.3
     * PostgreSQL server: 11.11
     * Database backends: django.db.backends.postgresql
     * Cache backends: default:RedisCache, avatar:FileBasedCache
     * Email setup: django.core.mail.backends.smtp.EmailBackend: localhost
     * OS encoding: filesystem=utf-8, default=utf-8
     * Celery: redis://localhost:6379, redis://localhost:6379, regular
     * Platform: Linux 4.19.0-16-amd64 (x86_64)
    

    Additional context

    [email protected]:~$ free -m
                  total        used        free      shared  buff/cache   available
    Mem:           5951        5688         103           5         159          55
    Swap:          6047        4418        1629
    (weblate-env) [email protected]:~$ lscpu
    Architecture:        x86_64
    CPU op-mode(s):      32-bit, 64-bit
    Byte Order:          Little Endian
    Address sizes:       40 bits physical, 48 bits virtual
    CPU(s):              4
    On-line CPU(s) list: 0-3
    Thread(s) per core:  1
    Core(s) per socket:  1
    Socket(s):           4
    NUMA node(s):        1
    Vendor ID:           AuthenticAMD
    CPU family:          21
    Model:               16
    Model name:          AMD Opteron(tm) Processor 6386 SE
    Stepping:            0
    CPU MHz:             2800.000
    
    enhancement 
    opened by surli 37
  • Importing large translation files

    Importing large translation files

    Describe the bug I have a large collection of translations, currently 22 files (each file representing one language) in .PO format. Each language has around 9000 - 64000 keys, where only one language (set as master language) has all translated keys. When I start the import, it will fail with 504 Gateway Time-out error page after a long time (more then half an hour).

    To Reproduce Steps to reproduce the behavior:

    1. Create project and component
    2. Set source code repository & repository push url to accessible git repo
    3. Set File mask to "locale/*.po"
    4. Set Monolingual base language file to "locale/en.po"
    5. Set Base file for new translations to "locale/en.po"
    6. Leave all other setting as default.
    7. Wait a long time for error to happen :)

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Server configuration and status

    * Weblate 3.2.2
     * Python 3.5.3
     * Django 2.1.2
     * Celery 4.2.1
     * celery-batches 0.2
     * six 1.10.0
     * social-auth-core 1.7.0
     * social-auth-app-django 2.1.0
     * django-appconf 1.0.2
     * translate-toolkit 2.3.1
     * Whoosh 2.7.4
     * defusedxml 0.5.0
     * Git 2.11.0
     * Pillow 4.0.0
     * python-dateutil 2.5.3
     * lxml 3.7.1
     * django-crispy-forms 1.7.2
     * django_compressor 2.2
     * djangorestframework 3.9.0
     * user-agents 1.1.0
     * jellyfish 0.6.1
     * pytz 2018.5
     * pyuca 1.2
     * PyYAML 3.12
     * tesserocr 2.3.1
     * Mercurial 4.0
     * git-svn 2.11.0
     * Database backends: django.db.backends.postgresql
     * Cache backends: avatar:FileBasedCache, default:RedisCache
     * Platform: Linux 4.15.0-36-generic (x86_64)
    
    SystemCheckError: System check identified some issues:
    
    CRITICALS:
    ?: (weblate.E003) Can not send email ([Errno -2] Name or service not known), please check EMAIL_* settings.
    	HINT: https://docs.weblate.org/en/weblate-3.2.2/admin/install.html#out-mail
    
    WARNINGS:
    ?: (security.W004) You have not set a value for the SECURE_HSTS_SECONDS setting. If your entire site is served only over SSL, you may want to consider setting a value and enabling HTTP Strict Transport Security. Be sure to read the documentation first; enabling HSTS carelessly can cause serious, irreversible problems.
    ?: (security.W008) Your SECURE_SSL_REDIRECT setting is not set to True. Unless your site should be available over both SSL and non-SSL connections, you may want to either set this setting True or configure a load balancer or reverse-proxy server to redirect all connections to HTTPS.
    ?: (security.W012) SESSION_COOKIE_SECURE is not set to True. Using a secure-only session cookie makes it more difficult for network traffic sniffers to hijack user sessions.
    ?: (security.W018) You should not have DEBUG set to True in deployment.
    
    System check identified 5 issues (0 silenced).
    

    Additional context Running from docker container.

    enhancement 
    opened by alesrosina 35
  • ZIP export for projects, component lists and language selection in project. [WIP]

    ZIP export for projects, component lists and language selection in project. [WIP]

    https://github.com/WeblateOrg/weblate/pull/2165#issuecomment-415305958:

    Finalizing:

    • [x] I don't see reason for weblate/templates/translation-download-link.html as all it does is calls function, it can be done directly
    • [x] The download URL no longer works for a translation
    • [x] I think that there is no need to construct the zip files on disk, it can be directly written to the HttpRequest
    • [x] messed up html markup in weblate/templates/language-project.html
    • [x] The link_text function doesn't localize "Original" string
    • [x] Another level of templates used in translation_download_link just to get download_translation_url which can be used directly [1]
    • [x] There is no reason to use templates in download_translation_url, when all you need to do there is reverse URL lookup [1]
    • [x] link_text method in downloads tag definition file can be done without the usage of Template
    • [x] I don't think that introduced Project.component_format_names is a good idea, it will really look horrible on projects with more components (eg. https://hosted.weblate.org/projects/debian-handbook/) Agreed to not show format name information at all when there could more than one.
    • [ ] Extract zipping of folder to class zipper.py
    • [ ] Extract collecting files for selected subject (component, project, etc.) to TranslationFileCollector
    • [ ] Tests - the new feature should be covered by tests and those should pass
      • [x] templatetags/downloads.py
      • [ ] zipper.py
      • [ ] TranslationFileCollector
    • [x] codacy issues
    • [x] changed unrelated files (.gitignore, docker-compose.dev.yml, requirements.txt, rundev.sh, weblate/accounts/notifications.py)
      • .gitignore [x]
      • docker-compose.dev.yml [ ]
      • requirements.txt [ ]
      • rundev.sh [ ]

    General PR checklist:

    • [ ] Every commit has message which describes it
    • [ ] Every commit is needed on it's own, if you have just minor fixes to previous commits, you can squash them
    • [ ] Any code changes come with testcase
    • [ ] Any new functionality is covered by user documentation

    ~

    1. By doing the reverse URL lookup without the template-hack, both issues are resolved. Before submitting pull request, please ensure that:
    opened by ghost 33
  • Add rebase and squash merge style

    Add rebase and squash merge style

    Currently there are merge and rebase merge styles in Weblate. It might be useful to have additional one which would rebase commit and squash them. It would squash commits from same author and same file, using commit message from last one. This would be useful for projects who want to minimize amount of translation commits.

    It might be either supported natively in Weblate VCS layer or as an addon. Having it as addon seems more reasonable to me as this is probably going to be supported only for Git.

    enhancement 
    opened by nijel 32
  • Allow personal email addresses to be ommitted in commits

    Allow personal email addresses to be ommitted in commits

    Is your feature request related to a problem? If so, please describe.

    Email addresses used by translators are included in the commit files, with no option to opt out/turn off. This leads to leaks of personal information publically, by including addresses in public code. This is not respectful towards translators who contribute, and potentially illegal in some jurisdictions (Especially considering that there's no specific consent given. Everyone is opted-in by default, with no option to opt out).

    Describe the solution you'd like

    Add an option allowing translators's email to not be included in commits.

    Describe alternatives you've considered Using a fake email is not an option, as a valid email is required for other features of weblate. Using an throwaway/single use email is also not very viable, as it is very cumbersome for users, and not a clear option for people who don't want their personal information leaked.

    Screenshots

    Additional context

    Relevant issue: https://github.com/WeblateOrg/weblate/issues/4988

    enhancement hacktoberfest help wanted good first issue backlog 
    opened by pappasadrian 31
  • chore(deps): update dependency importlib-metadata to v6

    chore(deps): update dependency importlib-metadata to v6

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | importlib-metadata | >=4.12,<5 -> >=4.12,<7 | age | adoption | passing | confidence |


    Release Notes

    python/importlib_metadata

    v6.0.0

    Compare Source

    ======

    • #​419: Declared Distribution as an abstract class, enforcing definition of abstract methods in instantiated subclasses. It's no longer possible to instantiate a Distribution or any subclasses unless they define the abstract methods.

      Please comment in the issue if this change breaks any projects. This change will likely be rolled back if it causes significant disruption.

    v5.2.0

    Compare Source

    ======

    • #​371: Deprecated expectation that PackageMetadata.__getitem__ will return None for missing keys. In the future, it will raise a KeyError.

    v5.1.0

    Compare Source

    ======

    • #​415: Instrument SimplePath with generic support.

    v5.0.0

    Compare Source

    ======


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 0
  • chore(deps): update scripts/spdx-license-list digest to 466fa0a

    chore(deps): update scripts/spdx-license-list digest to 466fa0a

    Mend Renovate

    This PR contains the following updates:

    | Package | Update | Change | |---|---|---| | scripts/spdx-license-list | digest | 43bc816 -> 466fa0a |


    Configuration

    📅 Schedule: Branch creation - "on the first day of the month" (UTC), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Renovate will not automatically rebase this PR, because other commits have been found.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 2
  • chore(deps): update dependency sphinx to v6

    chore(deps): update dependency sphinx to v6

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | Sphinx (changelog) | ==5.3.0 -> ==6.0.0 | age | adoption | passing | confidence |


    Release Notes

    sphinx-doc/sphinx

    v6.0.0

    Compare Source

    =====================================

    Dependencies

    • #​10468: Drop Python 3.6 support
    • #​10470: Drop Python 3.7, Docutils 0.14, Docutils 0.15, Docutils 0.16, and Docutils 0.17 support. Patch by Adam Turner

    Incompatible changes

    • #​7405: Removed the jQuery and underscore.js JavaScript frameworks.

      These frameworks are no longer be automatically injected into themes from Sphinx 6.0. If you develop a theme or extension that uses the jQuery, $, or $u global objects, you need to update your JavaScript to modern standards, or use the mitigation below.

      The first option is to use the sphinxcontrib.jquery_ extension, which has been developed by the Sphinx team and contributors. To use this, add sphinxcontrib.jquery to the extensions list in conf.py, or call app.setup_extension("sphinxcontrib.jquery") if you develop a Sphinx theme or extension.

      The second option is to manually ensure that the frameworks are present. To re-add jQuery and underscore.js, you will need to copy jquery.js and underscore.js from the Sphinx repository_ to your static directory, and add the following to your layout.html:

      .. code-block:: html+jinja

      {%- block scripts %} {{ super() }} {%- endblock %}

      .. _sphinxcontrib.jquery: https://github.com/sphinx-contrib/jquery/

      Patch by Adam Turner.

    • #​10471, #​10565: Removed deprecated APIs scheduled for removal in Sphinx 6.0. See :ref:dev-deprecated-apis for details. Patch by Adam Turner.

    • #​10901: C Domain: Remove support for parsing pre-v3 style type directives and roles. Also remove associated configuration variables c_allow_pre_v3 and c_warn_on_allowed_pre_v3. Patch by Adam Turner.

    Features added

    • #​10924: LaTeX: adopt better looking defaults for tables and code-blocks. See :confval:latex_table_style and the pre_border-radius and pre_background-TeXcolor :ref:additionalcss for the former defaults and how to re-enact them if desired.

    Bugs fixed

    • #​10984: LaTeX: Document :confval:latex_additional_files behavior for files with .tex extension.

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 1
  • Pop-up button text suggestions

    Pop-up button text suggestions

    Describe the issue

    It is recommended to distinguish "connecte" and "connected" in the pop-up panel, otherwise people will mistakenly think that the button is disabled

    I already tried

    • [X] I've read and searched the documentation.
    • [X] I've searched for similar issues in this repository.

    Steps to reproduce the behavior

    1. Go to '...'
    2. Scroll down to '...'
    3. Click on '...'
    4. See error

    Expected behavior

    No response

    Screenshots

    No response

    Exception traceback

    No response

    How do you run Weblate?

    weblate.org service

    Weblate versions

    No response

    Weblate deploy checks

    No response

    Additional context

    No response

    opened by 13663316223 1
  • Add Toml support

    Add Toml support

    Describe the problem

    We use toml as a translation format that we use in JavaScript and Go but toml is not in the list of supported translation file formats.

    Describe the solution you'd like

    Official support for toml file format.

    Describe alternatives you've considered

    Currently we have a workaround in our project by using the "INI format" which is similar but not identical to toml. Our main issues with this workarounds are:

    • String termination: In toml strings are quoted ("), in ini it's possible but not mantedory. That's why our translators have to be careful to always start and end with a quote. Otherwise it will produce broken toml files.
    • Escaping: We notices strange issues where Weblate hat problems with special characters and removed/double escaped them. Example: "Lorem ... ;)". see here

    Screenshots

    Our issues with ini format workaround

    ini workarond

    Additional context

    No response

    opened by naltatis 0
  • Cleanup translation files addon doesn't cleanup everything in one go

    Cleanup translation files addon doesn't cleanup everything in one go

    Describe the issue

    Our 'Cleanup translation files' addon recently cleaned the other language files to remove obsolete strings and I saw that it doesn't clean everything in one go. Instead I had to push to GitHub, merge and then the addon would continue

    I already tried

    • [X] I've read and searched the documentation.
    • [X] I've searched for similar issues in this repository.

    Steps to reproduce the behavior

    1. Let the addon clean the language files
    2. Merge and the addon will continue

    Expected behavior

    Addon would remove everything in one go.

    Screenshots

    https://github.com/mailcow/mailcow-dockerized/commit/55d57c552df09b63095138c6bb7f894070a935f3 https://github.com/mailcow/mailcow-dockerized/commit/24acd4258945fcc5412d372275a886aaba1119b8

    Exception traceback

    No response

    How do you run Weblate?

    Docker container

    Weblate versions

    • Weblate: 4.15
    • Django: 4.1.4
    • siphashc: 2.1
    • translate-toolkit: 3.8.0
    • lxml: 4.9.2
    • Pillow: 9.3.0
    • bleach: 5.0.1
    • python-dateutil: 2.8.2
    • social-auth-core: 4.3.0
    • social-auth-app-django: 5.0.0
    • django-crispy-forms: 1.14.0
    • oauthlib: 3.2.2
    • django-compressor: 4.1
    • djangorestframework: 3.14.0
    • django-filter: 22.1
    • django-appconf: 1.0.5
    • user-agents: 2.2.0
    • filelock: 3.8.2
    • rapidfuzz: 2.13.6
    • openpyxl: 3.0.10
    • celery: 5.2.7
    • kombu: 5.2.4
    • translation-finder: 2.14
    • weblate-language-data: 2022.9
    • html2text: 2020.1.16
    • pycairo: 1.23.0
    • pygobject: 3.42.2
    • diff-match-patch: 20200713
    • requests: 2.28.1
    • django-redis: 5.2.0
    • hiredis: 2.1.0
    • sentry_sdk: 1.12.0
    • Cython: 0.29.32
    • misaka: 2.1.1
    • GitPython: 3.1.29
    • borgbackup: 1.2.2
    • pyparsing: 3.0.9
    • pyahocorasick: 1.4.4
    • python-redis-lock: 4.0.0
    • charset-normalizer: 2.1.1
    • Python: 3.11.1
    • Git: 2.30.2
    • psycopg2: 2.9.5
    • psycopg2-binary: 2.9.5
    • phply: 1.2.5
    • ruamel.yaml: 0.17.21
    • tesserocr: 2.5.2
    • boto3: 1.26.31
    • zeep: 4.2.1
    • aeidon: 1.11
    • iniparse: 0.5
    • mysqlclient: 2.1.1
    • Mercurial: 6.3.1
    • git-svn: 2.30.2
    • git-review: 2.3.1
    • Redis server: 6.2.8
    • PostgreSQL server: 13.9
    • Database backends: django.db.backends.postgresql
    • Cache backends: default:RedisCache, avatar:FileBasedCache
    • Email setup: django.core.mail.backends.smtp.EmailBackend: hosted.mailcow.de
    • OS encoding: filesystem=utf-8, default=utf-8
    • Celery: redis://cache:6379/1, redis://cache:6379/1, regular
    • Platform: Linux 5.15.0-56-generic (x86_64)

    Weblate deploy checks

    System check identified some issues:
    
    WARNINGS:
    ?: (security.W018) You should not have DEBUG set to True in deployment.
    ?: (weblate.W040.github) github uses deprecated configuration, please switch to GITHUB_CREDENTIALS
            HINT: https://docs.weblate.org/en/weblate-4.15/vcs.html
    
    INFOS:
    ?: (weblate.I021) Error collection is not set up, it is highly recommended for production use
            HINT: https://docs.weblate.org/en/weblate-4.15/admin/install.html#collecting-errors
    ?: (weblate.I028) Backups are not configured, it is highly recommended for production use
            HINT: https://docs.weblate.org/en/weblate-4.15/admin/backup.html
    
    System check identified 4 issues (1 silenced).
    

    Additional context

    No response

    opened by MAGICCC 0
Releases(weblate-4.15)
Owner
Weblate
Weblate, the web-based continuous localization system.
Weblate
Zulip server and webapp - powerful open source team chat

Zulip overview Zulip is a powerful, open source group chat application that combines the immediacy of real-time chat with the productivity benefits of

Zulip 17k Jan 07, 2023
Generate links that users can use to submit messages encrypted with your public key.

Hawkpost Hawkpost lets you create unique links that you can share with the person that desires to send you important information but doesn't know how

Whitesmith 901 Dec 27, 2022
MoinMoin Wiki Development (2.0+), unstable, for production please use 1.9.x.

MoinMoin - a wiki engine in Python MoinMoin is an easy to use, full-featured and extensible wiki software package written in Python. It can fulfill a

MoinMoin Wiki Engine 240 Dec 22, 2022
Online translation tool

Pootle Docs | Changes | Issues | Community Support | Contributing | Development Channel Pootle is an online translation and localization tool. It work

Translate 1.4k Jan 06, 2023
Askbot is a Django/Python Q&A forum. **Contributors README**: https://github.com/ASKBOT/askbot-devel#how-to-contribute. Commercial hosting of Askbot and support are available at https://askbot.com

ATTENTION: master branch is experimental, please read below Askbot - a Django Q&A forum platform This is Askbot project - open source Q&A system, like

ASKBOT 1.5k Dec 28, 2022
Conference planning tool: CfP, scheduling, speaker management

pretalx is a conference planning tool focused on providing the best experience for organisers, speakers, reviewers, and attendees alike. It handles th

496 Dec 31, 2022
PyZMQ: Python bindings for zeromq

PyZMQ: Python bindings for ØMQ This package contains Python bindings for ØMQ. ØMQ is a lightweight and fast messaging implementation. PyZMQ should wor

The ZeroMQ project 3.2k Jan 02, 2023
Easy-to-use and powerful offline translation tool

Introduction Virtaal is a graphical program for doing translation. It is meant to be easy to use and powerful at the same time. Although the initial f

Translate 271 Nov 22, 2022
Build SMS applications with Python

RapidSMS RapidSMS is a free and open source framework for building interactive SMS applications, which integrates tightly with Django to provide a ric

RapidSMS 622 Dec 31, 2022
ProPublica's collaborative tip-gathering framework. Import and manage CSV, Google Sheets and Screendoor data with ease.

Collaborate This is a web application for managing and building stories based on tips solicited from the public. This project is meant to be easy to s

ProPublica 86 Oct 18, 2022
Insular email distribution - mail server as Docker images

Mailu is a simple yet full-featured mail server as a set of Docker images. It is free software (both as in free beer and as in free speech), open to s

Mailu 4.2k Jan 04, 2023
Securely and anonymously share files, host websites, and chat with friends using the Tor network

OnionShare OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor ne

Micah Lee 5.4k Jan 02, 2023
Easy HTML form without PHP or JavaScript

This repository is no longer active. If you're looking for a simple and powerful hosted form API, please check out https://formspree.io. If you are in

Formspree 2.8k Dec 22, 2022
Web based localization tool with tight version control integration.

Weblate is a copylefted libre software web-based continuous localization system, used by over 1150 libre projects and companies in more than 115 count

Weblate 3.3k Jan 02, 2023
Indico - A feature-rich event management system, made @ CERN, the place where the Web was born.

Indico Indico is: 🗓 a general-purpose event management tool; 🌍 fully web-based; 🧩 feature-rich but also extensible through the use of plugins; ⚖️ O

Indico 1.4k Dec 31, 2022
get things from one computer to another, safely

Magic Wormhole Get things from one computer to another, safely. This package provides a library and a command-line tool named wormhole, which makes it

15.4k Jan 01, 2023
Abilian Social Business Engine - an enterprise social networking / collaboration platform.

About Abilian SBE (Social Business Engine) is a platform for social business applications, and more specifically collaborative / enterprise 2.0 busine

Abilian open source projects 63 Dec 29, 2022
Reference client for Bitmessage: a P2P encrypted decentralised communication protocol:

PyBitmessage Bitmessage is a P2P communication protocol used to send encrypted messages to another person or to many subscribers. It is decentralized

Bitmessage 2.7k Dec 30, 2022
A wiki system with complex functionality for simple integration and a superb interface. Store your knowledge with style: Use django models.

django-wiki Django support The below table explains which Django versions are supported. Release Django Upgrade from 0.7.x 2.2, 3.0, 3.1 0.5 or 0.6 0.

django-wiki 1.6k Dec 28, 2022
A free & open modern, fast email client with user-friendly encryption and privacy features

Welcome to Mailpile! Introduction Mailpile (https://www.mailpile.is/) is a modern, fast web-mail client with user-friendly encryption and privacy feat

mailpile 8.7k Jan 04, 2023