I'm having a peculiar issue where not all of the languages inside of my language model are being translated by Django automatically. Based on the current user locale, I want the language names to be translated into their language.
For example, if a French user was browsing the languages, the language Japanese
would be translated to Japonais
instead of 日本語
.
My language model is the following:
class Language(models.Model):
name = models.CharField(
max_length=20,
)
short_name = models.CharField(
max_length=20,
)
def __str__(self):
return self.name
class Meta:
ordering = ['name']
Now it seems to me that Django should already have all the languages translated into all of the different languages? If this is the case, how can I accomplish this? It would save so much time for my volunteer translators to not have to translate every single language.
I use Rosetta
as the translation interface, so when I set this up, I had to manually add the supported languages to the base settings like this:
LANGUAGES = [
("af", _("Afrikaans")),
("ar", _("Arabic")),
...
("he", _("עברית")),
]
The languages added above are the languages that the volunteers are interested in and want to translate. Not all of the languages are listed there, and I'd say there are roughly 30 or so different languages.
I really don't want to waste their time, so is there a way, I can get Django to automatically translate all of the languages, so that the translator would not have to?
Edit:
Outside of SO, Nick suggested that this can be accomplished by making the following changes:
from django.utils.translation import gettext as _
return _(self.name)
I have edited by models.py with these two lines in mind, but still not all of the languages are being translated:
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext as _g
from django.core.exceptions import ValidationError
from notifications.models import Notification
class Language(models.Model):
name = models.CharField(
max_length=20,
)
short_name = models.CharField(
max_length=20,
)
def __str__(self):
return _g(self.name)
class Meta:
ordering = ['name']
Please note the following line in my models.py:
from django.utils.translation import gettext as _g
I imported it as _g
because I did not know if it would interfere with the other gettext import statement.
It's rather difficult to understand the problem, so I have taken a screenshot of the problem: Image of the problem
If it helps, I have manually added all the languages in my language model based on the following: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
Create file utils/translation.py
and then in your model.py
Be sure that self.short_name is the same as rosetta short name
And you also need to translate the Languages in the rosetta.
en.po
he.po