fastapi-localization并没有翻译我的API响应



我已经安装并实现了fastapi本地化,就像这里的fastapi本地化的pypi.org文档页面中的文档所说的那样。但它并没有相应地翻译回应有人能建议我如何解决这个问题,或者用其他更好的方法将API响应翻译成各种语言吗?提前谢谢

我的代码与文档中所说的完全一样-

from fastapi_localization import TranslateJsonResponse
from fastapi_localization import TranslatableStringField
from typing import List
from pydantic import BaseModel
class LanguageTranslatableSchema(BaseModel):
code: str
title: TranslatableStringField

@pr.get(
'/language',
response_class=TranslateJsonResponse,
response_model=List[LanguageTranslatableSchema],
status_code=status.HTTP_200_OK
)
async def languages():
# return "hello"
return [{'code': 'ru', 'title': 'Russia'},
{'code': 'en', 'title': 'English'}]

发送请求时我的卷曲是:

curl --request GET 
--url http://localhost:8888/api/v1/public/language 
--header 'Accept-Language: ru'

我应该得到这样的回应:

[{"code":"ru","title":"Русский"},{"code":"en","title":"Английский"}]

相反,我得到了这样一个未翻译的回复:

[{"code":"ru","title":"Russia"},{"code":"en","title":"English"}]

在他们的文档中没有那么清楚,但您需要添加中间件、异常处理程序等来处理翻译,如这里提供的示例所示,如下所示。此外,您还需要提供翻译,如图所示。

from typing import List
from fastapi import FastAPI
from fastapi.exceptions import RequestValidationError
from pydantic import BaseSettings, BaseModel
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.exceptions import HTTPException as StarletteHTTPException
from pydantic import (
EmailStr,
)
from fastapi_localization import (
SystemLocalizationMiddleware,
http_exception_handler,
validation_exception_handler,
LocalizationRoute,
TranslatableStringField,
TranslateJsonResponse,
)
from fastapi_localization import lazy_gettext as _
class Settings(BaseSettings):
localization_dir: str = 'locales'
localization_domain: str = 'base'
settings = Settings()
app = FastAPI()
# register localization middleware
localization_middleware = SystemLocalizationMiddleware(
domain=settings.localization_domain,
translation_dir=settings.localization_dir,
)
app.add_middleware(BaseHTTPMiddleware, dispatch=localization_middleware)
# register error handlers for localization errors
app.add_exception_handler(StarletteHTTPException, http_exception_handler)
app.add_exception_handler(RequestValidationError, validation_exception_handler)
app.router.route_class = LocalizationRoute
class LanguageTranslatableSchema(BaseModel):
code: str
title: TranslatableStringField
@app.get(
'/language',
response_class=TranslateJsonResponse,
response_model=List[LanguageTranslatableSchema])
async def languages():
return [{'code': 'ru', 'title': 'Russia'},
{'code': 'en', 'title': 'English'}]
@app.get(
'/country',
response_class=TranslateJsonResponse)
async def countries():
return [{'code': 'ru', 'title': _('Russia')},
{'code': 'us', 'title': 'USA'}]
class InputSchema(BaseModel):
email = EmailStr()
@app.post(
'/input',
response_class=TranslateJsonResponse)
async def countries(value: InputSchema):
return value

最新更新