You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React-admin资源字段翻译失效问题求助

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)之后,字段的标签还是显示英文,完全没用到我配置的翻译内容。

我自己琢磨了几个可能的方向,也列出来给大家参考:

可能的问题点及解决思路

  1. 对象合并结构错误
    我发现domainMessages的结构是外层包了一层fa,而farsiMessages应该是直接包含resources等键的对象。现在的合并方式是把整个domainMessages(也就是带有fa键的对象)合并到farsiMessages里,这就导致翻译结构不对了。正确的合并应该是取domainMessages.fa里的内容:

    const messages = {
      'fa': { 
        ...farsiMessages, 
        ...domainMessages.fa // 这里要拿到fa下的资源翻译内容
      }
    };
    

    这个应该是最可能的原因,我之前没注意到结构嵌套的问题。

  2. 字段名不匹配
    有没有可能后端返回的字段名和我配置的不一样?比如后端用的是firstName驼峰格式,而我写的是first_name下划线格式?react-admin的翻译字段名必须和数据里的字段严格对应,这个细节很容易忽略。

  3. 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>
      );
    };
    
  4. 缓存或热重载问题
    开发环境有时候热重载没生效,翻译文件的更新没被读取到。可以试试重启开发服务器,或者清空浏览器缓存再刷新页面看看。

有没有大佬碰到过类似的问题?或者还有其他我没考虑到的点?麻烦指点一下啦!

备注:内容来源于stack exchange,提问作者Ahmad

火山引擎 最新活动