【问题标题】:keep_lazy for translation messages sent through Django APIkeep_lazy 用于通过 Django API 发送的翻译消息
【发布时间】:2021-03-30 12:06:51
【问题描述】:

我正在翻译我的应用通过 Django Api 发送的一些消息(法语到德语)。我的问题是只有当我输入 LANGUAGE_CODE="de-de" 时翻译才有效。 所以我认为是懒惰翻译的问题。 我找到了 keep_lazy() 装饰器,但是,作为一个真正的 Web 开发人员,我找不到将 keep_lazy() 合并到现有装饰器中的方法。这是我通过 api 请求发送消息的 py 文件(在此处创建文档):

    @method_decorator(
    reponse_toast_decorator(Toast(message=gettext("Votre nouveau document a été créé.")),
    data_field_name="document"),
    name="create",
)

这是我的 utils 函数:

def reponse_toast_decorator(toast=None, data_field_name=""):

    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            response = func(*args, **kwargs)

            if not isinstance(toast, Toast):
                raise ValueError("L'argument 'toast' doit être une instance de la classe Toast")

            if isinstance(response, Response):

                if response.status_code == status.HTTP_204_NO_CONTENT:
                    response.status_code = status.HTTP_200_OK

                if response.data is None:
                    response.data = {}

                if not data_field_name:
                    response.data.update({"toast": toast.data})
                    return response

                response.data = {data_field_name: response.data, "toast": toast.data}

            return response

        return wrapper

    return decorator

作为一个初级网络开发人员,我找不到合并的方法

【问题讨论】:

    标签: django translation


    【解决方案1】:

    在我的领导的帮助下,我找到了解决方案。我们必须将 gettext() 提交给 self.message 以链接到来自装饰器调用的消息字符串:

    def reponse_toast_decorator(toast=None, data_field_name=""):
    """Décorateur permettant de modifier la response d'une vue"""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            response = func(*args, **kwargs)
            if not isinstance(toast, Toast):
                raise ValueError("L'argument 'toast' doit être une instance de la classe Toast")
    
            if isinstance(response, Response):
                if response.status_code == status.HTTP_204_NO_CONTENT:
                    response.status_code = status.HTTP_200_OK
    
                if response.data is None:
                    response.data = {}
    
                if not data_field_name:
                    response.data.update({"toast": toast.data})
                    return response
    
                response.data = {data_field_name: response.data, "toast": toast.data}
    
            return response
    
        return wrapper
    
    return decorator
    
    class Toast:
    def __init__(self, message, titre="", delai=2000, statut="succes", langue="", erreur=""):
        self.message = message
        self.statut = statut
        self.titre = titre
        self.langue = langue
        self.erreur = erreur
        self.delai = delai
    
    @property
    def data(self):
        """
        Ne pas oublier d'ajouter ici le gettext sur la variable 'message' pour la traduction
        """
        cur_langue = get_language() # Garnissage de la langue en cours pour être récupérée par le Front
        self.langue = cur_langue[0:2].upper()  # Formatage pour le Front
        return {
            "statut": self.statut,
            "message": gettext(self.message),
            "titre": self.titre,
            "langue": self.langue,
            "erreur": self.erreur,
            "delai": self.delai,
        }
    

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 2015-04-05
      • 2021-06-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      相关资源
      最近更新 更多