Features: 1) Added new language options to User model's language field in vibes_auth; 2) Introduced localized title and content fields to Post model in blog; 3) Implemented multilingual support for various fields in Attribute, AttributeGroup, AttributeValue, Brand, Category, CategoryTag, and Product models in core;

Fixes: None;

Extra: None;
This commit is contained in:
Egor Pavlovich Gorbunov 2025-09-19 17:02:11 +03:00
parent 700b55a9b6
commit 6f4e952b9b
227 changed files with 43699 additions and 6013 deletions

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

Binary file not shown.

View file

@ -0,0 +1,70 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: blog/apps.py:8
msgid "blog"
msgstr ""
#: blog/models.py:36
msgid "post title"
msgstr ""
#: blog/models.py:36
msgid "title"
msgstr ""
#: blog/models.py:83
msgid "post"
msgstr ""
#: blog/models.py:84
msgid "posts"
msgstr ""
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr ""
#: blog/models.py:123
msgid "tag name"
msgstr ""
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr ""
#: blog/models.py:128
msgid "tag display name"
msgstr ""
#: blog/models.py:136
msgid "post tag"
msgstr ""
#: blog/models.py:137
msgid "post tags"
msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

Binary file not shown.

View file

@ -0,0 +1,67 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: he-il\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "בלוג"
#: blog/models.py:36
msgid "post title"
msgstr "כותרת הפוסט"
#: blog/models.py:36
msgid "title"
msgstr "כותרת"
#: blog/models.py:83
msgid "post"
msgstr "פוסט"
#: blog/models.py:84
msgid "posts"
msgstr "פוסטים"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "קובצי Markdown אינם נתמכים עדיין - השתמש בתוכן Markdown במקום!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr "יש לספק קובץ markdown או תוכן markdown - באופן בלעדי"
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "מזהה תגיות פנימי עבור תגיות הפוסט"
#: blog/models.py:123
msgid "tag name"
msgstr "שם היום"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "שם ידידותי למשתמש עבור תגיות הפוסט"
#: blog/models.py:128
msgid "tag display name"
msgstr "שם תצוגה של התג"
#: blog/models.py:136
msgid "post tag"
msgstr "תגית פוסט"
#: blog/models.py:137
msgid "post tags"
msgstr "תגיות פוסט"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

Binary file not shown.

View file

@ -0,0 +1,70 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: blog/apps.py:8
msgid "blog"
msgstr ""
#: blog/models.py:36
msgid "post title"
msgstr ""
#: blog/models.py:36
msgid "title"
msgstr ""
#: blog/models.py:83
msgid "post"
msgstr ""
#: blog/models.py:84
msgid "posts"
msgstr ""
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr ""
#: blog/models.py:123
msgid "tag name"
msgstr ""
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr ""
#: blog/models.py:128
msgid "tag display name"
msgstr ""
#: blog/models.py:136
msgid "post tag"
msgstr ""
#: blog/models.py:137
msgid "post tags"
msgstr ""

Binary file not shown.

View file

@ -0,0 +1,71 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: id-id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "Blog"
#: blog/models.py:36
msgid "post title"
msgstr "Judul postingan"
#: blog/models.py:36
msgid "title"
msgstr "Judul"
#: blog/models.py:83
msgid "post"
msgstr "Pos"
#: blog/models.py:84
msgid "posts"
msgstr "Posting"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"File penurunan harga tidak didukung - gunakan konten penurunan harga sebagai"
" gantinya!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"file penurunan harga atau konten penurunan harga harus disediakan - tidak "
"boleh ada yang sama"
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "pengidentifikasi tag internal untuk tag pos"
#: blog/models.py:123
msgid "tag name"
msgstr "Nama tag"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "Nama yang mudah digunakan untuk tag postingan"
#: blog/models.py:128
msgid "tag display name"
msgstr "Nama tampilan tag"
#: blog/models.py:136
msgid "post tag"
msgstr "Tag pos"
#: blog/models.py:137
msgid "post tags"
msgstr "Tag pos"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

Binary file not shown.

View file

@ -0,0 +1,67 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: ko-kr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "블로그"
#: blog/models.py:36
msgid "post title"
msgstr "게시물 제목"
#: blog/models.py:36
msgid "title"
msgstr "제목"
#: blog/models.py:83
msgid "post"
msgstr "게시물"
#: blog/models.py:84
msgid "posts"
msgstr "게시물"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "마크다운 파일은 지원되지 않습니다 예 - 대신 마크다운 콘텐츠를 사용하세요!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr "마크다운 파일 또는 마크다운 콘텐츠가 제공되어야 합니다."
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "게시물 태그의 내부 태그 식별자"
#: blog/models.py:123
msgid "tag name"
msgstr "태그 이름"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "게시물 태그의 사용자 친화적인 이름"
#: blog/models.py:128
msgid "tag display name"
msgstr "태그 표시 이름"
#: blog/models.py:136
msgid "post tag"
msgstr "게시물 태그"
#: blog/models.py:137
msgid "post tags"
msgstr "게시물 태그"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

Binary file not shown.

View file

@ -0,0 +1,68 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: no-no\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "Blogg"
#: blog/models.py:36
msgid "post title"
msgstr "Innleggets tittel"
#: blog/models.py:36
msgid "title"
msgstr "Title"
#: blog/models.py:83
msgid "post"
msgstr "Post"
#: blog/models.py:84
msgid "posts"
msgstr "Innlegg"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer støttes ikke - bruk markdown-innhold i stedet!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"en markdown-fil eller markdown-innhold må oppgis - gjensidig utelukkende"
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "intern tagg-identifikator for innleggstaggen"
#: blog/models.py:123
msgid "tag name"
msgstr "Tagg navn"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "Brukervennlig navn for innleggstaggen"
#: blog/models.py:128
msgid "tag display name"
msgstr "Visningsnavn for taggen"
#: blog/models.py:136
msgid "post tag"
msgstr "Post tag"
#: blog/models.py:137
msgid "post tags"
msgstr "Tagger for innlegg"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

Binary file not shown.

View file

@ -0,0 +1,69 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: sv-se\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "Blogg"
#: blog/models.py:36
msgid "post title"
msgstr "Inläggets titel"
#: blog/models.py:36
msgid "title"
msgstr "Titel"
#: blog/models.py:83
msgid "post"
msgstr "Post"
#: blog/models.py:84
msgid "posts"
msgstr "Inlägg"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer stöds inte - använd markdown-innehåll istället!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"en markdown-fil eller markdown-innehåll måste tillhandahållas - ömsesidigt "
"uteslutande"
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "intern taggidentifierare för inläggstaggen"
#: blog/models.py:123
msgid "tag name"
msgstr "Tagg namn"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "Användarvänligt namn för inläggstaggen"
#: blog/models.py:128
msgid "tag display name"
msgstr "Taggens visningsnamn"
#: blog/models.py:136
msgid "post tag"
msgstr "Post tagg"
#: blog/models.py:137
msgid "post tags"
msgstr "Taggar för inlägg"

Binary file not shown.

View file

@ -0,0 +1,69 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: th-th\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "บล็อก"
#: blog/models.py:36
msgid "post title"
msgstr "ชื่อโพสต์"
#: blog/models.py:36
msgid "title"
msgstr "ชื่อเรื่อง"
#: blog/models.py:83
msgid "post"
msgstr "โพสต์"
#: blog/models.py:84
msgid "posts"
msgstr "โพสต์"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "ไฟล์มาร์กดาวน์ยังไม่รองรับในตอนนี้ - กรุณาใช้เนื้อหาแบบมาร์กดาวน์แทน!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"ไฟล์มาร์กดาวน์หรือเนื้อหาแบบมาร์กดาวน์ต้องได้รับการจัดเตรียมไว้ - "
"ไม่สามารถใช้ร่วมกันได้"
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "ตัวระบุแท็กภายในสำหรับแท็กโพสต์"
#: blog/models.py:123
msgid "tag name"
msgstr "ชื่อวัน"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "ชื่อที่ใช้งานได้ง่ายสำหรับแท็กโพสต์"
#: blog/models.py:128
msgid "tag display name"
msgstr "แสดงชื่อแท็ก"
#: blog/models.py:136
msgid "post tag"
msgstr "โพสต์แท็ก"
#: blog/models.py:137
msgid "post tags"
msgstr "ป้ายกำกับโพสต์"

Binary file not shown.

View file

@ -0,0 +1,71 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: tr-tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "Blog"
#: blog/models.py:36
msgid "post title"
msgstr "Gönderinin başlığı"
#: blog/models.py:36
msgid "title"
msgstr "Başlık"
#: blog/models.py:83
msgid "post"
msgstr "Posta"
#: blog/models.py:84
msgid "posts"
msgstr "Mesajlar"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Markdown dosyaları desteklenmiyor yer - bunun yerine markdown içeriği "
"kullanın!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"bir markdown dosyası veya markdown içeriği sağlanmalıdır - birbirini "
"dışlayan"
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "gönderi etiketi için dahili etiket tanımlayıcısı"
#: blog/models.py:123
msgid "tag name"
msgstr "Etiket adı"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "Gönderi etiketi için kullanıcı dostu ad"
#: blog/models.py:128
msgid "tag display name"
msgstr "Etiket görünen adı"
#: blog/models.py:136
msgid "post tag"
msgstr "Mesaj etiketi"
#: blog/models.py:137
msgid "post tags"
msgstr "Gönderi etiketleri"

Binary file not shown.

View file

@ -0,0 +1,70 @@
#
msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
"Language: vi-vn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: blog/apps.py:8
msgid "blog"
msgstr "Blog"
#: blog/models.py:36
msgid "post title"
msgstr "Tiêu đề bài đăng"
#: blog/models.py:36
msgid "title"
msgstr "Tiêu đề"
#: blog/models.py:83
msgid "post"
msgstr "Bài đăng"
#: blog/models.py:84
msgid "posts"
msgstr "Bài đăng"
#: blog/models.py:88
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Tệp Markdown hiện chưa được hỗ trợ - hãy sử dụng nội dung Markdown thay thế!"
#: blog/models.py:90
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"Phải cung cấp tệp Markdown hoặc nội dung Markdown - hai tùy chọn này là "
"tương phản nhau."
#: blog/models.py:122
msgid "internal tag identifier for the post tag"
msgstr "Mã định danh thẻ nội bộ cho thẻ bài viết"
#: blog/models.py:123
msgid "tag name"
msgstr "Tên ngày"
#: blog/models.py:127
msgid "user-friendly name for the post tag"
msgstr "Tên thân thiện với người dùng cho thẻ bài viết"
#: blog/models.py:128
msgid "tag display name"
msgstr "Hiển thị tên thẻ"
#: blog/models.py:136
msgid "post tag"
msgstr "Thẻ bài viết"
#: blog/models.py:137
msgid "post tags"
msgstr "Thẻ bài viết"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n" "Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-13 15:25+0300\n" "POT-Creation-Date: 2025-09-19 15:04+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"

View file

@ -0,0 +1,173 @@
# Generated by Django 5.2 on 2025-09-19 11:59
import markdown_field.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("blog", "0004_post_content_ar_ar_post_content_cs_cz_and_more"),
]
operations = [
migrations.AddField(
model_name="post",
name="content_fa_ir",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_he_il",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_hr_hr",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_id_id",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_ko_kr",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_no_no",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_sv_se",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_th_th",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_tr_tr",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="content_vi_vn",
field=markdown_field.fields.MarkdownField(blank=True, null=True, verbose_name="content"),
),
migrations.AddField(
model_name="post",
name="title_fa_ir",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_he_il",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_hr_hr",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_id_id",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_ko_kr",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_no_no",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_sv_se",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_th_th",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_tr_tr",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
migrations.AddField(
model_name="post",
name="title_vi_vn",
field=models.CharField(
help_text="post title",
max_length=128,
null=True,
unique=True,
verbose_name="title",
),
),
]

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

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

File diff suppressed because it is too large Load diff

View file

@ -5,3 +5,38 @@ class RootDirectory:
def __init__(self): def __init__(self):
self.label = "root" self.label = "root"
self.path = settings.BASE_DIR / "evibes" self.path = settings.BASE_DIR / "evibes"
# Mapping from Django locale codes to DeepL API codes
DEEPL_TARGET_LANGUAGES_MAPPING = {
"ar-ar": "AR",
"cs-cz": "CS",
"da-dk": "DA",
"de-de": "DE",
"en-gb": "EN-GB",
"en-us": "EN-US",
"es-es": "ES",
"fa-ir": "unsupported",
"fr-fr": "FR",
"he-il": "HE",
"hi-in": "unsupported",
"hr-hr": "unsupported",
"id-id": "ID",
"it-it": "IT",
"ja-jp": "JA",
"kk-kz": "unsupported",
"ko-kr": "KO",
"nl-nl": "NL",
"no-no": "NB",
"pl-pl": "PL",
"pt-br": "PT-BR",
"ro-ro": "RO",
"ru-ru": "RU",
"sv-se": "SV",
"th-th": "TH",
"tr-tr": "TR",
"vi-vn": "VI",
"zh-hans": "ZH-HANS",
}
TRANSLATABLE_APPS = ["core", "vibes_auth", "blog", "payments", "root"]

View file

@ -5,9 +5,10 @@ from tempfile import NamedTemporaryFile
import polib import polib
from django.apps import apps from django.apps import apps
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from core.management.commands import RootDirectory from core.management.commands import RootDirectory, TRANSLATABLE_APPS
# Patterns to identify placeholders # Patterns to identify placeholders
PLACEHOLDER_REGEXES = [ PLACEHOLDER_REGEXES = [
@ -93,13 +94,19 @@ class Command(BaseCommand):
def handle(self, *args, **options) -> None: def handle(self, *args, **options) -> None:
langs: list[str] = options["target_languages"] langs: list[str] = options["target_languages"]
if "ALL" in langs:
langs = list(dict(settings.LANGUAGES).keys())
apps_to_scan: set[str] = set(options["target_apps"]) apps_to_scan: set[str] = set(options["target_apps"])
if "ALL" in apps_to_scan:
apps_to_scan = set(TRANSLATABLE_APPS)
root_path: str = options.get("root_path") or "/app/" root_path: str = options.get("root_path") or "/app/"
configs = list(apps.get_app_configs()) configs = list(apps.get_app_configs())
# noinspection PyTypeChecker # noinspection PyTypeChecker
configs.append(RootDirectory()) # type: ignore [arg-type] configs.append(RootDirectory()) # type: ignore [arg-type]
errors = 0
for app_conf in configs: for app_conf in configs:
if app_conf.label not in apps_to_scan: if app_conf.label not in apps_to_scan:
continue continue
@ -143,6 +150,7 @@ class Command(BaseCommand):
if app_issues: if app_issues:
self.stdout.write(f"→ App: {app_conf.label}") self.stdout.write(f"→ App: {app_conf.label}")
for line in app_issues: for line in app_issues:
errors += 1
self.stdout.write(line) self.stdout.write(line)
self.stdout.write("") self.stdout.write("")
else: else:
@ -151,3 +159,5 @@ class Command(BaseCommand):
self.stdout.write("") self.stdout.write("")
self.stdout.write(self.style.SUCCESS("Done scanning.")) self.stdout.write(self.style.SUCCESS("Done scanning."))
if errors:
exit(1)

View file

@ -7,29 +7,7 @@ import requests
from django.apps import apps from django.apps import apps
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from core.management.commands import RootDirectory from core.management.commands import RootDirectory, DEEPL_TARGET_LANGUAGES_MAPPING, TRANSLATABLE_APPS
# Mapping from Django locale codes to DeepL API codes
DEEPL_TARGET_LANGUAGES_MAPPING = {
"en-gb": "EN-GB",
"ar-ar": "AR",
"cs-cz": "CS",
"da-dk": "DA",
"de-de": "DE",
"en-us": "EN-US",
"es-es": "ES",
"fr-fr": "FR",
"hi-in": "unsupported",
"it-it": "IT",
"ja-jp": "JA",
"kk-kz": "unsupported",
"nl-nl": "NL",
"pl-pl": "PL",
"pt-br": "PT-BR",
"ro-ro": "RO",
"ru-ru": "RU",
"zh-hans": "ZH-HANS",
}
# Patterns to identify placeholders # Patterns to identify placeholders
PLACEHOLDER_REGEXES = [ PLACEHOLDER_REGEXES = [
@ -107,7 +85,7 @@ class Command(BaseCommand):
action="append", action="append",
required=True, required=True,
metavar="LANG", metavar="LANG",
help="Locale code for translation, e.g. de-DE, fr-FR.", help="Locale code for translation, e.g. de-DE, fr-FR. Use ALL to translate all languages.",
) )
parser.add_argument( parser.add_argument(
"-a", "-a",
@ -116,12 +94,20 @@ class Command(BaseCommand):
action="append", action="append",
required=True, required=True,
metavar="APP", metavar="APP",
help="App label for translation, e.g. core, payments.", help="App label for translation, e.g. core, payments. Use ALL to translate all apps.",
) )
def handle(self, *args, **options) -> None: def handle(self, *args, **options) -> None:
target_langs = options["target_languages"] target_langs = options["target_languages"]
if "ALL" in target_langs:
target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys()
target_apps = set(options["target_apps"]) target_apps = set(options["target_apps"])
if "ALL" in target_apps:
target_apps = {
app_conf.label
for app_conf in list(apps.get_app_configs()) + [RootDirectory()]
if app_conf.label in TRANSLATABLE_APPS
}
auth_key = os.environ.get("DEEPL_AUTH_KEY") auth_key = os.environ.get("DEEPL_AUTH_KEY")
if not auth_key: if not auth_key:
raise CommandError("DEEPL_AUTH_KEY not set") raise CommandError("DEEPL_AUTH_KEY not set")

View file

@ -5,28 +5,9 @@ import requests
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.db import transaction from django.db import transaction
DEEPL_API_URL = "https://api.deepl.com/v2/translate" from core.management.commands import DEEPL_TARGET_LANGUAGES_MAPPING
DEEPL_TARGET_LANGUAGES_MAPPING = { DEEPL_API_URL = "https://api.deepl.com/v2/translate"
"en-gb": "EN-GB",
"ar-ar": "AR",
"cs-cz": "CS",
"da-dk": "DA",
"de-de": "DE",
"en-us": "EN-US",
"es-es": "ES",
"fr-fr": "FR",
"hi-in": "unsupported",
"it-it": "IT",
"ja-jp": "JA",
"kk-kz": "unsupported",
"nl-nl": "NL",
"pl-pl": "PL",
"pt-br": "PT-BR",
"ro-ro": "RO",
"ru-ru": "RU",
"zh-hans": "ZH-HANS",
}
class Command(BaseCommand): class Command(BaseCommand):

File diff suppressed because it is too large Load diff

View file

@ -66,29 +66,12 @@ logger = logging.getLogger("django")
class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing] class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents a group of attributes, which can be hierarchical. "Represents a group of attributes, which can be hierarchical."
" This class is used to manage and organize attribute groups."
This class is used to manage and organize attribute groups. An attribute " An attribute group can have a parent group, forming a hierarchical structure."
group can have a parent group, forming a hierarchical structure. This can " This can be useful for categorizing and managing attributes more effectively in acomplex system."
be useful for categorizing and managing attributes more effectively in a )
complex system.
Attributes:
parent (Self): A foreign key referencing the parent of this group. It
can be null or blank if the group does not have a parent. The parent
group organizes the hierarchical structure.
name (str): The unique name of the attribute group. It is limited to a
maximum of 255 characters.
is_publicly_visible (bool): Indicates if the attribute group is visible
publicly.
Meta:
verbose_name: A human-readable name for the class, set to 'attribute
group'.
verbose_name_plural: A human-readable plural name for the class, set to
'attribute groups'.
"""
is_publicly_visible = True is_publicly_visible = True
attributes: QuerySet["Attribute"] attributes: QuerySet["Attribute"]
@ -119,33 +102,14 @@ class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel):
class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc, django-manager-missing] class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents a vendor entity capable of storing information about external vendors and "Represents a vendor entity capable of storing information about external vendors and their interaction requirements."
their interaction requirements. " The Vendor class is used to define and manage information related to an external vendor."
" It stores the vendor's name, authentication details required for communication,"
The Vendor class is used to define and manage information related to an external vendor. " and the percentage markup applied to products retrieved from the vendor."
It stores the vendor's name, authentication details required for communication, " This model also maintains additional metadata and constraints,"
and the percentage markup applied to products retrieved from the vendor. This model also " making it suitable for use in systems that interact with third-party vendors."
maintains additional metadata and constraints, making it suitable for use in systems )
that interact with third-party vendors.
Attributes:
authentication (dict): Credentials and endpoint information required for vendor
communication, stored in a JSON field.
markup_percent (int): The markup percentage applied to products sent by this
vendor. Must be an integer between 0 and 100 inclusive.
name (str): The unique name of the vendor, with a maximum length of 255
characters.
Meta:
verbose_name (str): Singular name of the vendor entity ("vendor").
verbose_name_plural (str): Plural name of the vendor entities ("vendors").
indexes (list): List of database indexes applied to this model, including a
GIN index on the 'authentication' field.
Returns:
str: The vendor's name when the instance is represented as a string.
"""
is_publicly_visible = False is_publicly_visible = False
@ -195,21 +159,12 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [
class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc, django-manager-missing] class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents a product tag used for classifying or identifying products. "Represents a product tag used for classifying or identifying products."
" The ProductTag class is designed to uniquely identify and classify products through a combination"
The ProductTag class is designed to uniquely identify and classify products " of an internal tag identifier and a user-friendly display name."
through a combination of an internal tag identifier and a user-friendly " It supports operations exported through mixins and provides metadata customization for administrative purposes."
display name. It supports operations exported through mixins and provides )
metadata customization for administrative purposes.
Attributes:
is_publicly_visible: A boolean indicating whether the tag is publicly
visible.
tag_name: Internal tag identifier for the product tag.
name: User-friendly name for the product tag.
"""
is_publicly_visible = True is_publicly_visible = True
@ -236,18 +191,11 @@ class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type:
class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc, django-manager-missing] class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents a category tag used for products. "Represents a category tag used for products."
" This class models a category tag that can be used to associate and classify products."
This class models a category tag that can be used to associate and classify products. " It includes attributes for an internal tag identifier and a user-friendly display name."
It includes attributes for an internal tag identifier and a user-friendly display name. )
Attributes:
is_publicly_visible (bool): Indicates if the category tag is publicly visible.
tag_name (str): Internal tag identifier for the product tag.
name (str): User-friendly name for the product tag.
"""
is_publicly_visible = True is_publicly_visible = True
@ -274,72 +222,15 @@ class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # typ
class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): # type: ignore [misc, django-manager-missing] class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents a category entity to organize and group related items in a hierarchical "Represents a category entity to organize and group related items in a hierarchical structure."
structure. Categories may have hierarchical relationships with other categories, " Categories may have hierarchical relationships with other categories, supporting parent-child relationships."
supporting parent-child relationships. The class includes fields for metadata and " The class includes fields for metadata and visual representation,"
visual representation, which serve as a foundation for category-related features. " which serve as a foundation for category-related features."
" This class is typically used to define and manage product categories or other similar groupings within an application,"
This class is typically used to define and manage product categories or other similar " allowing users or administrators to specify the name, description, and hierarchy of categories,"
groupings within an application, allowing users or administrators to specify the " as well as assign attributes like images, tags, or priority."
name, description, and hierarchy of categories, as well as assign attributes like )
images, tags, or priority.
Attributes
----------
is_publicly_visible
A flag indicating whether the category is visible to the public.
image : ImageField
Represents an optional image associated with the category. The image is used
to visually represent the category.
markup_percent
Specifies the markup percentage for products in this category. It is validated
to ensure values fall between 0 and 100.
parent
Represents the parent category in a hierarchical structure. This forms category
relationships to enable nesting.
name
The name of the category, which also must be unique. This serves as the primary
identifier for the category.
description
An optional detailed description explaining the purpose or details of the category.
slug
A unique, auto-generated field created from the category's name and parent name,
suitable for use in URLs and identifying the category.
tags
Optional tags used to group or describe the category better.
priority
Represents the priority of the category, which could be used for sorting or
rendering purposes.
Methods
-------
__str__()
Returns the name of the category as its string representation.
get_tree_depth()
Computes the depth of the category in the hierarchical structure. It determines
the maximum depth of its descendants or returns zero if the category is a leaf.
------------
verbose_name
Specifies the singular human-readable name for the category model.
verbose_name_plural
Specifies the plural human-readable name for the category model.
ordering : list
Defines the default ordering for category instances, based on their hierarchical
structure.
"""
is_publicly_visible = True is_publicly_visible = True
@ -505,25 +396,13 @@ class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [mi
class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc, django-manager-missing] class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents the stock of a product managed in the system. "Represents the stock of a product managed in the system."
" This class provides details about the relationship between vendors, products, and their stock information, "
This class provides details about the relationship between vendors, products, "as well as inventory-related properties like price, purchase price, quantity, SKU, and digital assets."
and their stock information, as well as inventory-related properties like price, " It is part of the inventory management system to allow tracking and evaluation of products available"
purchase price, quantity, SKU, and digital assets. It is part of the inventory " from various vendors."
management system to allow tracking and evaluation of products available from )
various vendors.
Attributes:
is_publicly_visible (bool): Indicates if the stock is publicly visible. Defaults to False.
vendor (ForeignKey): The vendor supplying this product stock.
price (float): The final price to the customer after markups.
product (ForeignKey): The product associated with this stock entry.
purchase_price (float): The price paid to the vendor for this product.
quantity (int): Available quantity of the product in stock.
sku (str): Vendor-assigned SKU for identifying the product.
digital_asset (FileField): Digital file associated with this stock if applicable.
"""
is_publicly_visible = False is_publicly_visible = False
@ -580,40 +459,14 @@ class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [mi
class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc, django-manager-missing] class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents a product with attributes such as category, brand, tags, digital status, name, "Represents a product with attributes such as category, brand, tags, digital status, name, description, part number, and slug."
description, part number, and slug. Provides related utility properties to retrieve " Provides related utility properties to retrieve ratings, feedback counts, price, quantity, and total orders."
ratings, feedback counts, price, quantity, and total orders. Designed for use in a " Designed for use in a system that handles e-commerce or inventory management."
system that handles e-commerce or inventory management. " This class interacts with related models (such as Category, Brand, and ProductTag) and manages caching"
" for frequently accessed properties to improve performance. It is used to define and manipulate product data and"
This class interacts with related models (such as Category, Brand, and ProductTag) and " its associated information within an application."
manages caching for frequently accessed properties to improve performance. It is used )
to define and manipulate product data and its associated information within
an application.
Attributes:
is_publicly_visible (bool): Indicates whether the product is visible to the public.
category (Category): The category this product belongs to.
brand (Brand, optional): Optionally associates this product with a brand.
tags (ProductTag): Tags that help describe or group this product.
is_digital (bool): Indicates whether this product is digitally delivered.
name (str): The identifying name for the product.
description (str, optional): A detailed description of the product.
partnumber (str): The unique part number for this product.
slug (str, optional): Auto-generated unique slug for the product.
Meta:
verbose_name (str): The singular name of the product model.
verbose_name_plural (str): The plural name of the product model.
Properties:
rating (float): The average rating of the product, rounded to 2 decimal places.
feedbacks_count (int): The total number of feedback entries associated with the product.
price (float): The highest price of the product based on its stock, rounded to 2 decimal
places.
quantity (int): The total available quantity of the product across all its stocks.
total_orders (int): Counts the total orders made for the product in relevant statuses.
"""
is_publicly_visible = True is_publicly_visible = True
@ -750,32 +603,14 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore
class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc, django-manager-missing] class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents an attribute in the system. "Represents an attribute in the system."
" This class is used to define and manage attributes,"
This class is used to define and manage attributes, which are customizable " which are customizable pieces of data that can be associated with other entities."
pieces of data that can be associated with other entities. Attributes " Attributes have associated categories, groups, value types, and names."
have associated categories, groups, value types, and names. The model " The model supports multiple types of values, including string, integer, float, boolean, array, and object."
supports multiple types of values, including string, integer, float, " This allows for dynamic and flexible data structuring."
boolean, array, and object. This allows for dynamic and flexible data )
structuring.
Attributes:
is_publicly_visible (bool): Denotes whether the attribute is publicly
visible. Defaults to True.
categories (ManyToManyField): Categories to which this attribute
belongs. It is a many-to-many relationship with the `Category` model.
group (ForeignKey): The group to which this attribute belongs. It is
a ForeignKey relation to the `AttributeGroup` model.
value_type (CharField): The type of the attribute's value. Options
include string, integer, float, boolean, array, or object.
name (CharField): The unique name of the attribute.
"""
is_publicly_visible = True is_publicly_visible = True
categories = ManyToManyField( categories = ManyToManyField(
@ -813,10 +648,20 @@ class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ig
unique=True, unique=True,
) )
is_filterable = BooleanField(
default=True,
verbose_name=_("is filterable"),
help_text=_("designates whether this attribute can be used for filtering or not"),
)
def __str__(self): def __str__(self):
return self.name return self.name
class Meta: class Meta:
unique_together = (
"name",
"group",
)
verbose_name = _("attribute") verbose_name = _("attribute")
verbose_name_plural = _("attributes") verbose_name_plural = _("attributes")
@ -1331,25 +1176,15 @@ class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ig
class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc, django-manager-missing] class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc, django-manager-missing]
""" __doc__ = _(
Represents an order placed by a user. "Represents an order placed by a user."
" This class models an order within the application,"
This class models an order within the application, including its various attributes such as billing " including its various attributes such as billing and shipping information,"
and shipping information, status, associated user, notifications, and related operations. " status, associated user, notifications, and related operations."
Orders can have associated products, promotions can be applied, addresses set, and shipping or billing " Orders can have associated products, promotions can be applied, addresses set,"
details updated. Equally, functionality supports managing the products in the order lifecycle. " and shipping or billing details updated."
" Equally, functionality supports managing the products in the order lifecycle."
Attributes: )
billing_address (Address): The billing address used for the order.
promo_code (PromoCode): An optional promo code applied to the order.
shipping_address (Address): The shipping address used for the order.
status (str): The current status of the order (e.g., PENDING, COMPLETED).
notifications (dict): JSON structure dictating notifications for the user.
attributes (dict): JSON representation of additional order-specific attributes.
user (User): The user who placed the order.
buy_time (datetime): Timestamp when the order was finalized.
human_readable_id (str): A unique human-readable identifier for the order.
"""
is_publicly_visible = False is_publicly_visible = False

BIN
core/static/flags/fa-ir.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

Some files were not shown because too many files have changed in this diff Show more