Django - 翻译Permission模型的名称

3

我试图翻译权限的名称,但是这段代码没有起作用。我没有收到任何错误消息,权限仍然是英文的,我希望它们能够使用设置中设定的语言。你有什么想法吗?

# forms.py
from django.utils.translation import gettext as _
class PermissionModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
    return '%s' % _(obj.name)

# settings.py
LANGUAGE_CODE = 'pt-br'
USE_I18N = True
USE_L10N = True

你好,这个回答能帮到你吗?这里是链接。 - mh-firouzjah
3个回答

0

我能够手动翻译权限的名称。一些像"Can"这样的单词无法通过gettext_lazy进行翻译,所以我使用了"replace"方法来保留我想要的语言。其他像"group"或"user"这样的单词可以通过gettext_lazy进行翻译。

# forms.py
from django import forms
from django.utils.translation import gettext_lazy as _

class PermissionModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
    permissions_translated = [_(w).replace('Can', 'Pode').replace('add', 'adicionar').replace('change', 'alterar').replace('delete', 'excluir').replace('view', 'visualizar') for w in (obj.name).split()]
    return ' '.join(permissions_translated)

嗨,你能不能看一下这个答案 - mh-firouzjah

0

这段代码片段可以帮助你。

class RoleCreateForm(forms.ModelForm):
    permissions = forms.ModelMultipleChoiceField(
        queryset=Permission.objects.none(),
        widget=forms.SelectMultiple(attrs={
            'class':'selectpicker widget border border-2 border-warning rounded bg-transparent'
        })
    )

    class Meta:
        model = Group
        fields = "__all__"

        widgets={
            'name':forms.TextInput(attrs={
                'class':'form-control widget border-warning rounded'
            })
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Filter permissions for tracking, traccar, and accounts apps
        tracking_permissions = Permission.objects.filter(content_type__app_label='tracking').exclude(content_type__model='geoeventsetting')
        traccar_permissions = Permission.objects.filter(content_type__app_label='traccar', content_type__model__in=['tcdevices', 'tcreports'])
        accounts_permissions = Permission.objects.filter(content_type__app_label='accounts',content_type__model__in=['useraccount'])
        auth_permissions = Permission.objects.filter(content_type__app_label='auth',content_type__model__in=['group'])

        # Concatenate the filtered permissions and set them as the choices for the permissions field
        self.fields['permissions'].queryset = tracking_permissions | traccar_permissions | accounts_permissions |auth_permissions

        # Translate the permission names
        self.fields['permissions'].label_from_instance = self.label_permission_instance

    def label_permission_instance(self, obj):
        permission_name = obj.name


        permissions_translated =[w.replace('Can', 'Peut').replace('add', 'ajouter').replace('change', 'modifier').replace('delete', 'supprimer').replace('view', 'voir').replace('user', 'utilisateur').replace('tc', '').replace('devices', 'boitiers').replace('reports', 'rapports').replace('group', 'profil')   for w in permission_name.split()]
        return ' '.join(permissions_translated)

0
你可以为Permission模型重写__str__方法。
from django.contrib.auth.models import Permission

def permission_string_method(self):
    names = self.name.split()
    operation_translated = ' '.join([
        _(w).replace('Can', str(_('Can')))
        .replace('add', str(_('add')))
        .replace('change', str(_('change')))
        .replace('delete', str(_('delete')))
        .replace('view', str(_('view')))
        .replace('log', '').replace('content', '').strip()
        for w in names[:-1]  # Exclude the last word (model name)
    ])
    return f"{operation_translated} | {self.content_type.name}"

Permission.__str__ = permission_string_method

将您的翻译放入django.po文件中。
msgid "Can"
msgstr "Pode"
msgid "view"
msgstr "visualizar"
msgid "add"
msgstr "adicionar"
msgid "change"
msgstr "alterar"
msgid "delete"
msgstr "excluir"

不要忘记运行 python manage.py compilemessages

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接