Pular para o conteúdo

Da direita para a esquerda

Idiomas da direita para esquerda como árabe, persa ou hebraico são suportados. Para alterar a direção dos componentes de Material-UI, você deve seguir as etapas a seguir.

Passos

1. HTML

Certifique-se de que o atributo dir é definido no corpo (body), caso contrário, os componentes nativos serão quebrados:

<body dir="rtl">

As an alternative to the above, you can also wrap your application in an element with the dir attribute:

function App() {
  return (
    <div dir="rtl">
      <MyComponent />
    </div>
  );
}

This can be helpful for creating components to toggle language settings in the live application.

2. Tema

Defina a direção no seu tema customizado:

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

3. Instale o plugin rtl

Você precisa deste plugin JSS para inverter os estilos: jss-rtl.

npm install stylis-plugin-rtl

Note: Only emotion is compatible with version 2 of the plugin. styled-components requires version 1. If you are using styled-components as styled engine, make sure to install the correct version.

Se você estiver usando emotion ou styled-components, você precisa deste plugin de estilo para inverter os estilos: stylis-plugin-rtl.

npm install jss-rtl

Tendo instalado o plugin em seu projeto, os componentes do Material-UI ainda exigem que ele seja carregado pela instância do motor de estilo que você usa. Encontre guias abaixo de como você pode carregá-lo.

3. Carregando o plugin rtl

3.1 JSS

Depois de criar uma nova instância do JSS com o plugin, você precisará disponibilizá-la para todos os componentes na árvore de componentes. O componente StylesProvider permite isso:

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

// Create rtl cache
const cacheRtl = createCache({
  key: 'muirtl',
  stylisPlugins: [rtlPlugin],
});

function RTL(props) {
  return <CacheProvider value={cacheRtl}>{props.children}</CacheProvider>;
}

3.2 emotion

Se você usar styled-components como seu motor de estilo, você pode usar o StyleSheetManager e fornecer a propriedade stylis-plugin-rtl como um item da propriedade stylisPlugins:

import { StyleSheetManager } from 'styled-components';
import rtlPlugin from 'stylis-plugin-rtl';

function RTL(props) {
  return (
    <StyleSheetManager stylisPlugins={[rtlPlugin]}>
      {props.children}
    </StyleSheetManager>
  );
}

3.3 styled-components

Tendo instalado o plugin em seu projeto, os componentes de Material-UI ainda exigem que ele seja carregado pela instância do jss, conforme descrito abaixo. Depois de criar uma nova instância do JSS com o plugin, você precisará disponibilizá-la para todos os componentes na árvore de componentes. O componente StylesProvider permite isso:

import { create } from 'jss';
import rtl from 'jss-rtl';
import { StylesProvider, jssPreset } from '@material-ui/styles';

// Configure JSS
const jss = create({
  plugins: [...jssPreset().plugins, rtl()],
});

function RTL(props) {
  return <StylesProvider jss={jss}>{props.children}</StylesProvider>;
}

Vá para o README do plugin para aprender mais sobre isso. Internamente, withStyles está usando este plugin JSS quando direção: 'rtl' está definido no tema.

Demonstração

Use o botão de alternância de direção no canto superior direito para inverter toda a documentação

<CacheProvider value={cacheRtl}>
  <ThemeProvider theme={theme}>
    <div dir="rtl">
      <TextField label="Name" variant="standard" />
      <input type="text" placeholder="Name" />
    </div>
  </ThemeProvider>
</CacheProvider>

Optando pela transformação do rtl

emotion & styled-components

Você precisa a sintaxe de template literal e adicionar a diretiva /* @noflip */ antes da regra ou propriedade para a qual você deseja desativar os estilos da direita para a esquerda.

const AffectedText = styled('div')`
  text-align: left;
`;

const UnaffectedText = styled('div')`
  /* @noflip */
  text-align: left;
`;

Se você quiser evitar que um conjunto de regras específico seja afetado pela transformação rtl, você pode adicionar flip: false no inicio.

JSS

Se você quiser evitar que um conjunto de regras específico seja afetado pela transformação rtl, você pode adicionar flip: false no inicio.

const useStyles = makeStyles(
  (theme) => ({
    affected: {
      textAlign: 'right',
    },
    unaffected: {
      flip: false,
      textAlign: 'right',
    },
  }),
  { defaultTheme },
);