React-admin资源字段翻译失效问题求助
嗨,我最近在给react-admin项目配置波斯语翻译的时候碰到了个棘手的问题,想请各位大佬帮忙看看怎么解决😅
我先说说我的配置情况:
首先创建了i18n.ts文件,专门定义members资源的波斯语翻译:
// i18n.ts const domainMessages = { fa: { resources: { members: { name: "ﺎﻌﺿﺍﺀ", fields: { email: "ﭗﺴﺗ ﺎﻠﮑﺗﺭﻮﻨﯿﮑﯾ", first_name: "ﺎﺴﻣ" } } } } }; export default domainMessages;
接着配置i18nProvider的时候,把自定义的翻译和react-admin自带的波斯语消息合并了:
import domainMessages from './i18n'; const messages = { 'fa': { ...farsiMessages, ...domainMessages} }; const i18nProvider = polyglotI18nProvider(locale => messages[locale], 'fa');
然后在Admin组件里注册了members资源:
export const SiteAdmin = () => ( <Admin theme={myTheme} layout={MyLayout} loginPage={LoginPage} i18nProvider={i18nProvider} dataProvider={dataProvider} authProvider={authProvider}> <Resource name="members" options={{ label: 'ﺎﻌﺿﺍﺀ' }} list={ListGuesser} edit={EditGuesser} show={ShowGuesser} /> ...
结果奇怪的事情发生了:资源列表的标签显示是正常的波斯语,但点进详情页(比如http://localhost:5173/members/3)之后,字段的标签还是显示英文,完全没用到我配置的翻译内容。
我自己琢磨了几个可能的方向,也列出来给大家参考:
可能的问题点及解决思路
对象合并结构错误
我发现domainMessages的结构是外层包了一层fa,而farsiMessages应该是直接包含resources等键的对象。现在的合并方式是把整个domainMessages(也就是带有fa键的对象)合并到farsiMessages里,这就导致翻译结构不对了。正确的合并应该是取domainMessages.fa里的内容:const messages = { 'fa': { ...farsiMessages, ...domainMessages.fa // 这里要拿到fa下的资源翻译内容 } };这个应该是最可能的原因,我之前没注意到结构嵌套的问题。
字段名不匹配
有没有可能后端返回的字段名和我配置的不一样?比如后端用的是firstName驼峰格式,而我写的是first_name下划线格式?react-admin的翻译字段名必须和数据里的字段严格对应,这个细节很容易忽略。Guesser组件的局限性
ListGuesser、EditGuesser这些自动生成的组件有时候可能不会正确读取自定义翻译,尤其是字段名比较特殊的时候。如果上面的方法都没用,试试手动写List/Edit组件,明确指定字段的label,或者用useTranslate钩子来获取翻译:// 手动编写的MemberEdit组件示例 import { Edit, SimpleForm, TextInput, useTranslate } from 'react-admin'; export const MemberEdit = () => { const translate = useTranslate(); return ( <Edit> <SimpleForm> <TextInput source="first_name" label={translate('resources.members.fields.first_name')} /> <TextInput source="email" label={translate('resources.members.fields.email')} /> </SimpleForm> </Edit> ); };缓存或热重载问题
开发环境有时候热重载没生效,翻译文件的更新没被读取到。可以试试重启开发服务器,或者清空浏览器缓存再刷新页面看看。
有没有大佬碰到过类似的问题?或者还有其他我没考虑到的点?麻烦指点一下啦!
备注:内容来源于stack exchange,提问作者Ahmad




