DEV Community

Cover image for Monólitos Modernos com Internacionalização:InertiaJS, React & Laravel.
pedrovian4
pedrovian4

Posted on

2 2 2 2 2

Monólitos Modernos com Internacionalização:InertiaJS, React & Laravel.

InertiaJS é um adpater para aplicações monólitos usarem frameworks/bibliotecas e afins do ecossistema JavaScript. Esse artigo vai se limitar em somente em como fazer uma internacionalização usando ainda as ferramentas out of box do laravel.

Internacionalização padrão laravel. 🌎️

Nos tópicos de internacionalização ou localização do framework laravel, é deixado explícito que por padrão laravel não vem com os diretórios de internacionalização criados, para isso é necessário rodar php artisan lang:publish. Por padrão laravel criará uma estrutura nesse estilo.


/lang
    /en
        messages.php
    /es
        messages.php

Enter fullscreen mode Exit fullscreen mode

Para usar nesse tutorial do inertia, apague os subdiretórios com en, es, nosso método de internacionalização será usando arquivos json. Antes de avançar para os próximos passos, caso tenham interesse recomendo uma leitura mais detalhada de documentação de internacionalização do laravel. Documentação

Internacionalizando com Inertia 🇧🇷 🇷🇺 🇨🇳 🇿🇦 🇮🇳

1) Definição de língua padrão do seu sistema

Qual a importância disso? Bom, essa será a língua que você estará programando no seu dia a dia, escolha com cuidado, sempre busque usar a língua o qual seu cliente alvos são nativos.

Já escolheu? Certo, então vamos lá.

2) Criação dos arquivos de internacionalização

Dentro do diretório lang/ crie um arquivo com o nome da localização da sua língua do tipo JSON. Exemplo: Em meu sistema a língua padrão é o inglês, mas esse sistema será usado por brasileiros também, então irei criar um arquivo lang/pt_br.json, nesse arquivo irei definir as string em via chave e valor, do inglês para português brasileiro. O arquivo ficará na possível seguinte estrutura.


{
    "Log in":"Entrar",
    "Password": "Senha",
    "Remember me": "Lembrar do ultímo acesso",
    "Email":"E-mail",
    "Forgot your password?":"Esqueci minha senha",
    "Name":"Nome",
    "Confirm Password": "Confirme sua senha",
    "Already registered?": "Já possui um registro?",
    "Register": "Registrar"
}  

Enter fullscreen mode Exit fullscreen mode

Chuchu🥒Beleza👍️! Agora você já tem seus arquivo de internacionalização. Você pode criar quantos quiser, apenas garanta que o nome do arquivo seja igual o nome da localização, normalmente essa informação fica no seu env com a chave APP_LOCALE da sua aplicação.

3) Enviando dados para para o frontend.

Essa parte é simples, no seu Inertia Middleware. Coloque o seguinte código.

    $locale = app()->currentLocale();
    $filePath = base_path('lang/' . $locale . '.json');
    $language = File::json($filePath);
Enter fullscreen mode Exit fullscreen mode

agora basta enviar esses dados para frontend, um conselho de amigo é colocar esse código em uma função de helper. Seu middleware estará parecendo algo como.

l é a minha função que traz o arquivo de tradução.


    /**
     * Define the props that are shared by default.
     *
     * @return array<string, mixed>
     */
    public function share(Request $request): array
    {
        $lang = l();
        logs()->debug(["lang" => $lang]);
        return [
            ...parent::share($request),
            'auth' => [
                'user' => $request->user(),
            ],
            'ziggy' => fn() => [
                ...(new Ziggy)->toArray(),
                'location' => $request->url(),
            ],
            'lang' => $lang,
        ];
    }

Enter fullscreen mode Exit fullscreen mode

4) Consumindo no frontend.

Agora que já podemos acessar esses dados pela o hook do inertia de usePage().props, podemos criar uma função de utils em nosso front que nos retorne o valor traduzido.


export function t(key: string) {
    // eslint-disable-next-line react-hooks/rules-of-hooks
    const { lang } = usePage<PageProps>().props;

    if (!lang) return key;

    if (!lang[key]) return key;

    return lang[key];
}
Enter fullscreen mode Exit fullscreen mode

Dessa forma nosso frontend podemos agora escrever nossos componentes da seguinte maneira.

 <InputLabel htmlFor="email" value={t('Email')} />
Enter fullscreen mode Exit fullscreen mode

Assim tornando uma internacionalização mais simples. Claro, há problemas que essa abordagem não trata como pluralização e substituição. Mas o intuito dela é resolver o problema para aplicações com uso simples de internacionalização. Caso sua aplicação precise de coisas além, pode comentar aqui para nós trocarmos uma ideia e quem sabe pensar em uma solução. Até mais 👋

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (1)

Collapse
 
lumamontes profile image
Luma Montes

Muito bom, migo! Parece bem prático implementar internacionalização com Inertia e Laravel dessa forma

The best way to debug slow web pages cover image

The best way to debug slow web pages

Tools like Page Speed Insights and Google Lighthouse are great for providing advice for front end performance issues. But what these tools can’t do, is evaluate performance across your entire stack of distributed services and applications.

Watch video