Я создал несколько классов Badge в Django, каждый из которых содержал своего рода описание в строковой переменной:
"You get this badge because you've runned %d meters in %d minutes"
"You get this badge because you've killed %d monsters of the type %s"
и т. Д.И у классов также есть функция get_description(badge_level_requirements)
, поэтому в шаблонах она будет вызываться вместе со списком для сборки строки для конкретного пользователя:
class RunnerBadge(Badge):
des=ugettext_lazy("You get this badge because you've runned %d meters in %d minutes")
def get_description(cls,badge_level_requirements):
return cls.des%badge_level_requirements
И я сохранил списки требований вбаза данных уже без имен аргументов :( Как показано в примерах, разные классы имеют разное количество значений для заполнения строки, значения также означают разные вещи. Поэтому я не могу назвать имена аргументов.
Однако, если я захочу интернационализировать эти строки, будут ошибки: 'msgid' format string with unnamed arguments cannot be properly localized
И языковой файл не может быть сгенерирован для этого.
Есть ли способ обойти эту ошибку?
Обновление
Я сталкивался с этим методом обхода ошибки без изменения базы данных. В базе данных требования к уровню хранятся в текстовом поле в формате dict:
#Requirment of Runner's badge
"{'gold':(100,10),'silver':(50,5),'bronze':(25,2)}"
И в определении класса вручную добавить имена аргументов как 'arg_0', 'arg_1' ... к описаниям. Метод get_description - это изменениеd для предварительной обработки данных перед их использованием для заполнения строк описания.
class RunnersBadge(Badge):
requirements=#get the previous dict from database
description="You get this badge because you've runned %(arg_0)d meters in %(arg_1)d minutes"
@classmethod
def get_description(cls,level):
'''
This is actually a method of parent class Badge
level is either 'gold','silver' or 'bronze'
'''
dic={}
try:
for (num,val) in enumerate(cls.requirements[level]):
dic['arg_'+str(num)]=val
except TypeError:
dic['arg_0']=cls.requirements[level]
return cls.description%dic
Этот метод сохраняет большую часть текущей структуры (логика и база данных).А переводчику просто нужно позаботиться о размещении слов.