mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 11:16:47 +00:00
feat(locale): the panel offers only the languages it is translated into
The language choice on the Settings page listed every language Django knows, 99 of them. Six catalogs (Czech under the wrong code, German, Spanish, French, Russian, Ukrainian) translated none of the panel's messages, so choosing one of them, like most of the others, showed English. The Turkish catalog lacked the four newest messages. The panel now offers English and Turkish (LANGUAGES). The empty catalogs and the English one, which has nothing to translate, are removed. Turkish translates every message again. CI checks that the offered catalogs translate every message and that their compiled files are up to date; the README says how to update them.
This commit is contained in:
parent
2d47f87dcb
commit
9f2cd664e6
20 changed files with 791 additions and 28791 deletions
16
.github/workflows/test.yml
vendored
16
.github/workflows/test.yml
vendored
|
|
@ -71,7 +71,8 @@ jobs:
|
|||
libldap2-dev \
|
||||
libsasl2-dev \
|
||||
pkg-config \
|
||||
gcc
|
||||
gcc \
|
||||
gettext
|
||||
|
||||
- name: Install Python Dependencies
|
||||
run: |
|
||||
|
|
@ -90,6 +91,19 @@ jobs:
|
|||
- name: Run Django Migrations
|
||||
run: python manage.py migrate --noinput
|
||||
|
||||
# Each catalog of LANGUAGES translates every message, and its compiled
|
||||
# .mo is the .po's: a changed text needs its translations
|
||||
- name: Check Translation Catalogs
|
||||
if: matrix.python-version == '3.12' && matrix.database == 'sqlite'
|
||||
run: |
|
||||
python manage.py makemessages -l tr --no-obsolete --ignore=staticfiles -v0
|
||||
for dir in locale/tr/LC_MESSAGES; do
|
||||
msgfmt --check -o /tmp/django.mo "$dir/django.po"
|
||||
missing=$(msgattrib --untranslated "$dir/django.po"; msgattrib --only-fuzzy "$dir/django.po")
|
||||
if [ -n "$missing" ]; then echo "$missing"; echo "::error file=$dir/django.po::untranslated or fuzzy messages"; exit 1; fi
|
||||
cmp <(msgunfmt "$dir/django.mo") <(msgunfmt /tmp/django.mo) || { echo "::error file=$dir/django.mo::not compiled from django.po (compilemessages)"; exit 1; }
|
||||
done
|
||||
|
||||
# Includes the vrtManager tests; fails below the coverage floor in pyproject.toml
|
||||
- name: Run Test Suite
|
||||
run: |
|
||||
|
|
|
|||
10
README.md
10
README.md
|
|
@ -736,6 +736,16 @@ python3 dev/console_layout.py us "English (US)" --model pc104 # a keyboard with
|
|||
|
||||
It lists the dead keys it leaves out: a character only a dead key types cannot be typed. Type a sample with every character group of the layout into a VM set to that layout before committing the file.
|
||||
|
||||
### Translations
|
||||
|
||||
The panel is translated into the languages of `LANGUAGES` in `settings.py`, each with a full catalog in `locale/`. A new or changed text needs its translation in each before CI passes (needs `gettext`):
|
||||
|
||||
```bash
|
||||
python manage.py makemessages -l tr --no-obsolete --ignore=staticfiles --ignore=.venv
|
||||
# translate the new and fuzzy entries of locale/tr/LC_MESSAGES/django.po
|
||||
python manage.py compilemessages -l tr
|
||||
```
|
||||
|
||||
### Running tests
|
||||
|
||||
```bash
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import re
|
||||
|
||||
from django.contrib.messages import get_messages
|
||||
from django.test import RequestFactory, TestCase
|
||||
from django.urls import reverse
|
||||
|
|
@ -22,6 +24,12 @@ class AppSettingsTestCase(TestCase):
|
|||
response = self.client.get(reverse("appsettings"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_the_language_choice_offers_the_translated_languages(self):
|
||||
page = self.client.get(reverse("appsettings")).content.decode()
|
||||
choice = page[page.index('<select id="language"'):]
|
||||
choice = choice[:choice.index("</select>")]
|
||||
self.assertEqual(re.findall(r'<option value="([^"]+)"', choice), ["en", "tr"])
|
||||
|
||||
def test_appsettings_update_setting(self):
|
||||
setting = AppSettings.objects.get(key="SHOW_ACCESS_ROOT_PASSWORD")
|
||||
original_value = setting.value
|
||||
|
|
|
|||
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
|
@ -201,6 +201,11 @@ LOGOUT_REDIRECT_URL = "/accounts/login/"
|
|||
LOGIN_REDIRECT_URL="/instances/"
|
||||
|
||||
LANGUAGE_CODE = "en-us"
|
||||
# the languages the panel is translated into, each with a full catalog in locale/
|
||||
LANGUAGES = [
|
||||
("en", "English"),
|
||||
("tr", "Türkçe"),
|
||||
]
|
||||
|
||||
TIME_ZONE = "UTC"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue