Работа с многоязычными данными (переводы) в базе данных с использованием моделей django

Я использую Python 3.9 с Django 4.1 и хочу хранить данные в моей базе данных на 3 языках, английском, французском и иврите.

В настоящее время я работаю с адресами, поэтому для страны, города и улицы у меня есть колонки name_en, name_fr и name_he.

У меня есть таблицы country, city и street, а также таблицы отношений CountryCity, содержащие id страны и id города, и CountryCityStreet, содержащие countryCityId и streetId.

я могу получить текущий используемый язык, используя translation.get_language(), и я могу взять только первые 2 символа, чтобы получить желаемый результат (en, fr или he).

поэтому я создал сервисную функцию для получения первых символов:

def get_2l_lang():
    lang = translation.get_language()
    return lang[0:lang.find("-")]

и я создал модели для этого:

class Country(models.Model):
    class Meta:
        verbose_name_plural = "Countries"
    name_en = models.CharField(unique=True, verbose_name="English Country Name", max_length=100)
    name_fr = models.CharField(unique=True, verbose_name="French Country Name", max_length=100)
    name_he = models.CharField(unique=True, verbose_name="Hebrew Country Name", max_length=100)

    def __str__(self):
        return getattr(self, 'name_' + get_2l_lang())


class City(models.Model):
    class Meta:
        verbose_name_plural = "Cities"
    name_en = models.CharField(unique=True, verbose_name="English City Name", max_length=100)
    name_fr = models.CharField(unique=True, verbose_name="French City Name", max_length=100)
    name_he = models.CharField(unique=True, verbose_name="Hebrew City Name", max_length=100)

    def __str__(self):
        return getattr(self, 'name_' + get_2l_lang())


class Street(models.Model):
    name_en = models.CharField(unique=True, verbose_name="English Street Name", max_length=100)
    name_fr = models.CharField(unique=True, verbose_name="French Street Name", max_length=100)
    name_he = models.CharField(unique=True, verbose_name="Hebrew Street Name", max_length=100)

    def __str__(self):
        return getattr(self, 'name_' + get_2l_lang())


class CountryCity(models.Model):
    class Meta:
        unique_together = ('country', 'city',)

    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name='Country')
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name='City')

    def __str__(self):
        return getattr(self.country, 'name_' + get_2l_lang()) + ', ' + \
               getattr(self.city, 'name_' + get_2l_lang())


class CountryCityStreet(models.Model):
    class Meta:
        unique_together = ('countryCity', 'street',)
    countryCity = models.ForeignKey(CountryCity, on_delete=models.CASCADE, verbose_name='Country & City')
    street = models.ForeignKey(Street, on_delete=models.CASCADE, verbose_name='Street')

    def __str__(self):
        return getattr(self.countryCity.country, 'name_' + get_2l_lang()) + ', ' + \
               getattr(self.countryCity.city, 'name_' + get_2l_lang()) + ', ' + \
               getattr(self.street, 'name_' + get_2l_lang())

пока все хорошо.

У меня возникают проблемы, когда я хочу отобразить его на основе языка на странице администратора, Во-первых... я не смог найти способ переключать языки в админке, но все же допустим мы используем настроенную локаль системы.

Я зарегистрировался в админке, чтобы показать модель CountryCityStreet, у нее есть внешний ключ для страны и города, и еще один для улицы. чтобы правильно отобразить ее, я создал эту модель админки:

class CountryCityStreetAdmin(admin.ModelAdmin):
    list_display = ('get_country', 'get_city', 'street')

    @admin.display(description='Country', ordering='countryCity__country__name_en')
    def get_country(self, obj):
        return getattr(obj.countryCity.country, 'name_' + get_2l_lang())

    @admin.display(description='City', ordering='countryCity__city__name_en')
    def get_city(self, obj):
        return getattr(obj.countryCity.city, 'name_' + get_2l_lang())

теперь здесь в ordering я не могу сделать его динамическим на основе функции get_2l_lang(). Когда я читал документацию django о переводе на https://docs.djangoproject.com/en/4.1/topics/i18n/translation/, но я не смог найти ничего о хранении данных на разных языках.

Я пытался найти в Google другие пакеты и нашел django-hvad, который выглядит потрясающе и точно соответствует моим потребностям, но он очень старый и тестировался на django 1.9.2, поэтому я не могу его использовать.

Итак, как я могу решить эту проблему? Как я могу сделать так, чтобы модели django знали о разных языках в БД?

Спасибо

Вернуться на верх