Token导航 LogoToken导航TokenDH.com
研究检索操作浏览器github未标认证来源可访问许可证需确认审计通过

i18n-rtl国际化 RTL

Agent Skill

i18n-rtl 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

188

周安装

8

GitHub Stars

11

下载量

66
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:i18n-rtl(国际化 RTL)
来源仓库:https://github.com/lobbi-docs/claude
仓库路径:skills/i18n-rtl
安装命令:
npx skills add https://github.com/lobbi-docs/claude --skill i18n-rtl
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/lobbi-docs/claude --skill i18n-rtl

简介

i18n-rtl 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词快速定位候选结果时使用。

  • 适用于国际化项目中 RTL(从右到左)布局、文本方向和样式适配的研究任务。
  • 通过关键词和来源仓库筛选,Agent 可返回相关文档或代码片段供进一步分析。
  • 安装前建议确认权限范围和维护状态,注意是否会触发联网或文件读写操作。
  • i18n-rtl 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

MUI Internationalization & RTL Support

1. RTL Setup

Set the document direction and configure the MUI theme:

// index.html — set dir on <html>
<html dir="rtl" lang="ar">

// theme.ts
import { createTheme } from '@mui/material/styles';

const rtlTheme = createTheme({
  direction: 'rtl',
});

Install the Emotion RTL plugin for automatic style flipping:

npm install stylis-plugin-rtl stylis

Wrap the app with the RTL-aware cache provider:

import { CacheProvider } from '@emotion/react';
import createCache from '@emotion/cache';
import { ThemeProvider } from '@mui/material/styles';
import rtlPlugin from 'stylis-plugin-rtl';
import { prefixer } from 'stylis';

const cacheRtl = createCache({
  key: 'muirtl',
  stylisPlugins: [prefixer, rtlPlugin],
});

function App() {
  return (
    <CacheProvider value={cacheRtl}>
      <ThemeProvider theme={rtlTheme}>
        {/* All MUI components now render RTL */}
        <MyApplication />
      </ThemeProvider>
    </CacheProvider>
  );
}

2. Emotion RTL Cache

The RTL cache intercepts all Emotion-generated styles and flips directional properties (margin-left becomes margin-right, padding-left becomes padding-right, etc.).

import createCache from '@emotion/cache';
import rtlPlugin from 'stylis-plugin-rtl';
import { prefixer } from 'stylis';

// RTL cache — use for Arabic, Hebrew, Persian, Urdu
const rtlCache = createCache({
  key: 'muirtl',
  stylisPlugins: [prefixer, rtlPlugin],
});

// LTR cache — use for English, French, German, etc.
const ltrCache = createCache({
  key: 'muiltr',
  stylisPlugins: [prefixer],
});

Key points:

  • The key must be unique per cache instance (e.g. 'muirtl' vs 'muiltr').
  • prefixer adds vendor prefixes and should always be included.
  • rtlPlugin must come after prefixer in the array.

3. Dynamic Direction Switching

Toggle between LTR and RTL at runtime using React state:

import { useState, useMemo } from 'react';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { CacheProvider } from '@emotion/react';
import createCache from '@emotion/cache';
import rtlPlugin from 'stylis-plugin-rtl';
import { prefixer } from 'stylis';
import CssBaseline from '@mui/material/CssBaseline';
import IconButton from '@mui/material/IconButton';
import FormatTextdirectionLToRIcon from '@mui/icons-material/FormatTextdirectionLToR';
import FormatTextdirectionRToLIcon from '@mui/icons-material/FormatTextdirectionRToL';

const rtlCache = createCache({
  key: 'muirtl',
  stylisPlugins: [prefixer, rtlPlugin],
});

const ltrCache = createCache({
  key: 'muiltr',
  stylisPlugins: [prefixer],
});

function App() {
  const [direction, setDirection] = useState<'ltr' | 'rtl'>('ltr');

  const theme = useMemo(
    () => createTheme({ direction }),
    [direction],
  );

  const toggleDirection = () => {
    const newDir = direction === 'ltr' ? 'rtl' : 'ltr';
    setDirection(newDir);
    document.dir = newDir; // sync <html> dir attribute
  };

  return (
    <CacheProvider value={direction === 'rtl' ? rtlCache : ltrCache}>
      <ThemeProvider theme={theme}>
        <CssBaseline />
        <IconButton onClick={toggleDirection}>
          {direction === 'ltr'
            ? <FormatTextdirectionRToLIcon />
            : <FormatTextdirectionLToRIcon />}
        </IconButton>
        <MyApplication />
      </ThemeProvider>
    </CacheProvider>
  );
}

Important: always sync document.dir with the theme direction so native browser layout matches MUI.

4. Component Localization

MUI ships built-in locale strings for 50+ languages. Pass a locale object as the second argument to createTheme:

import { createTheme } from '@mui/material/styles';
import { deDE } from '@mui/material/locale';

// German locale — translates MUI component strings
// (e.g. TablePagination "Rows per page" -> "Zeilen pro Seite")
const theme = createTheme(
  {
    palette: {
      primary: { main: '#1976d2' },
    },
  },
  deDE, // locale object as second argument
);

Common locale imports:

import { enUS } from '@mui/material/locale'; // English (default)
import { frFR } from '@mui/material/locale'; // French
import { esES } from '@mui/material/locale'; // Spanish
import { jaJP } from '@mui/material/locale'; // Japanese
import { zhCN } from '@mui/material/locale'; // Chinese (Simplified)
import { arSA } from '@mui/material/locale'; // Arabic (Saudi Arabia)
import { heIL } from '@mui/material/locale'; // Hebrew (Israel)
import { koKR } from '@mui/material/locale'; // Korean
import { ptBR } from '@mui/material/locale'; // Portuguese (Brazil)
import { trTR } from '@mui/material/locale'; // Turkish

For RTL languages, combine direction with locale:

import { arSA } from '@mui/material/locale';

const arabicTheme = createTheme(
  {
    direction: 'rtl',
    typography: {
      fontFamily: '"Noto Sans Arabic", "Roboto", sans-serif',
    },
  },
  arSA,
);

5. MUI X Localization

MUI X components (DataGrid, DatePicker, TreeView) have their own locale strings, imported separately:

import { createTheme } from '@mui/material/styles';
import { deDE as coreDeDE } from '@mui/material/locale';
import { deDE as dataGridDeDE } from '@mui/x-data-grid/locales';
import { deDE as datePickerDeDE } from '@mui/x-date-pickers/locales';

// Combine core + DataGrid + DatePicker locales
const theme = createTheme(
  {
    palette: { primary: { main: '#1976d2' } },
  },
  dataGridDeDE,    // DataGrid locale
  datePickerDeDE,  // DatePicker locale
  coreDeDE,        // Core MUI locale (last to allow overrides)
);

DataGrid locale strings cover:

  • Column menu labels (columnMenuLabel, columnMenuSortAsc, columnMenuFilter)
  • Toolbar labels (toolbarColumns, toolbarFilters, toolbarExport)
  • Pagination (MuiTablePagination labels)
  • Filter panel labels (filterPanelOperator, filterPanelColumns, filterPanelInputLabel)
  • No rows overlay (noRowsLabel, noResultsOverlayLabel)

DatePicker locale strings cover:

  • Field placeholders and labels
  • Calendar navigation (previousMonth, nextMonth)
  • Toolbar labels (datePickerToolbarTitle, timePickerToolbarTitle)
  • Action bar labels (okButtonLabel, cancelButtonLabel, clearButtonLabel)

6. Custom Locale

Override individual translation strings by deep-merging with a built-in locale:

import { createTheme } from '@mui/material/styles';
import { enUS } from '@mui/material/locale';
import { enUS as dataGridEnUS } from '@mui/x-data-grid/locales';
import deepmerge from 'deepmerge';

// Custom locale: override specific DataGrid strings
const customDataGridLocale = deepmerge(dataGridEnUS, {
  components: {
    MuiDataGrid: {
      defaultProps: {
        localeText: {
          noRowsLabel: 'No records found',
          footerRowSelected: (count: number) =>
            count === 1
              ? '1 record selected'
              : `${count.toLocaleString()} records selected`,
          toolbarExport: 'Download',
          toolbarExportCSV: 'Download as CSV',
          toolbarExportPrint: 'Print view',
        },
      },
    },
  },
});

// Custom locale: override core MUI strings
const customCoreLocale = deepmerge(enUS, {
  components: {
    MuiTablePagination: {
      defaultProps: {
        labelRowsPerPage: 'Items per page:',
        labelDisplayedRows: ({ from, to, count }: { from: number; to: number; count: number }) =>
          `Showing ${from}-${to} of ${count !== -1 ? count : `more than ${to}`}`,
      },
    },
    MuiAlert: {
      defaultProps: {
        closeText: 'Dismiss',
      },
    },
  },
});

const theme = createTheme(
  { palette: { primary: { main: '#1976d2' } } },
  customDataGridLocale,
  customCoreLocale,
);

Per-component override (without theme-level locale):

import { DataGrid } from '@mui/x-data-grid';

<DataGrid
  rows={rows}
  columns={columns}
  localeText={{
    noRowsLabel: 'Nothing here yet',
    toolbarFilters: 'Search filters',
    columnMenuSortAsc: 'Sort A to Z',
    columnMenuSortDesc: 'Sort Z to A',
  }}
/>

7. Portal Components & RTL

Portal-based components (Dialog, Popper, Menu, Popover, Snackbar, Tooltip) render outside the main React tree into document.body. They inherit the document direction from document.dir, but they need the Emotion cache and theme context to style correctly.

This works automatically when:

  1. document.dir is set to 'rtl'
  2. The CacheProvider with rtlCache wraps the app root
// Dialogs automatically flip their layout in RTL
import Dialog from '@mui/material/Dialog';
import DialogTitle from '@mui/material/DialogTitle';
import DialogContent from '@mui/material/DialogContent';
import DialogActions from '@mui/material/DialogActions';
import Button from '@mui/material/Button';

function RTLDialog({ open, onClose }: { open: boolean; onClose: () => void }) {
  return (
    <Dialog open={open} onClose={onClose}>
      <DialogTitle>{"title"}</DialogTitle>
      <DialogContent>
        {/* Content flows right-to-left automatically */}
        <p>{"content"}</p>
      </DialogContent>
      <DialogActions>
        {/* Buttons position correctly: primary action on left in RTL */}
        <Button onClick={onClose}>{"cancel"}</Button>
        <Button onClick={onClose} variant="contained">{"confirm"}</Button>
      </DialogActions>
    </Dialog>
  );
}

If using multiple directions in the same page (e.g., an LTR widget inside an RTL page), wrap the LTR section:

import { ThemeProvider, createTheme } from '@mui/material/styles';
import { CacheProvider } from '@emotion/react';

function LTRSection({ children }: { children: React.ReactNode }) {
  const ltrTheme = createTheme({ direction: 'ltr' });

  return (
    <div dir="ltr">
      <CacheProvider value={ltrCache}>
        <ThemeProvider theme={ltrTheme}>
          {children}
        </ThemeProvider>
      </CacheProvider>
    </div>
  );
}

8. Bidirectional Layout Tips

Icons that need flipping

Some icons have directional meaning and should be mirrored in RTL:

import { useTheme } from '@mui/material/styles';
import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
import ArrowBackIcon from '@mui/icons-material/ArrowBack';
import SendIcon from '@mui/icons-material/Send';

function DirectionalIcon() {
  const theme = useTheme();
  const isRtl = theme.direction === 'rtl';

  // Option 1: Swap icons based on direction
  const NextIcon = isRtl ? ArrowBackIcon : ArrowForwardIcon;
  const PrevIcon = isRtl ? ArrowForwardIcon : ArrowBackIcon;

  // Option 2: CSS flip for icons that should mirror
  return (
    <SendIcon
      sx={{
        transform: isRtl ? 'scaleX(-1)' : 'none',
      }}
    />
  );
}

Icons that should NOT flip: icons without directional meaning (close, add, delete, search, settings).

Icons that SHOULD flip: arrows, navigation chevrons, send, reply, undo/redo, text indent, list bullets, external link.

Spacing in RTL

Use logical properties in the sx prop instead of physical ones:

// BAD: physical properties — break in RTL
<Box sx={{ marginLeft: 2, paddingRight: 1 }} />

// GOOD: logical properties — work in both LTR and RTL
<Box sx={{ marginInlineStart: 2, paddingInlineEnd: 1 }} />

// ALSO GOOD: MUI shorthand with theme-aware flipping
// ml/mr are auto-flipped by the RTL plugin
<Box sx={{ ml: 2, pr: 1 }} />

The stylis-plugin-rtl automatically converts margin-left to margin-right (and vice versa), so MUI shorthand (ml, mr, pl, pr) works correctly. However, if you use inline styles (style={{marginLeft: 16}}), those are NOT flipped — always prefer sx.

Logical CSS properties reference

Physical (avoid)Logical (prefer)
left / rightinset-inline-start / inset-inline-end
margin-left / margin-rightmargin-inline-start / margin-inline-end
padding-left / padding-rightpadding-inline-start / padding-inline-end
border-left / border-rightborder-inline-start / border-inline-end
text-align: lefttext-align: start
float: leftfloat: inline-start

Opt out of RTL flipping

For elements that should remain LTR even in an RTL context (e.g., code blocks, phone numbers, LTR brand names):

// Use the noflip directive in sx
<Box
  sx={{
    /* @noflip */
    textAlign: 'left',
    direction: 'ltr',
  }}
/>

// Or wrap in a dir="ltr" container
<span dir="ltr" style={{ unicodeBidi: 'embed' }}>
  +1 (555) 123-4567
</span>

TextField and input alignment

Text inputs automatically inherit direction. For mixed-direction inputs (e.g., a search field that might contain Arabic or English):

import TextField from '@mui/material/TextField';

<TextField
  label="Search"
  inputProps={{
    dir: 'auto', // browser auto-detects direction from content
  }}
/>

RTL testing checklist

  1. Verify document.dir="rtl" is set
  2. Check createTheme({direction: 'rtl'}) is configured
  3. Confirm CacheProvider with rtlCache wraps the app
  4. Test all Dialogs, Menus, and Drawers open/close correctly
  5. Verify navigation icons (arrows, chevrons) point correctly
  6. Check form layouts and label alignment
  7. Verify DataGrid column order and sort icons
  8. Test text truncation with ellipsis in RTL
  9. Check absolute/fixed positioned elements
  10. Verify scrollbar position (should be on the left in RTL)

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

33.04%
按下载量换算22

Claude

31.95%
按下载量换算21

Cursor

19.05%
按下载量换算13

Gemini CLI

9.27%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

操作浏览器

该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills