DEV Community

Inácio Bueno
Inácio Bueno

Posted on

i18n e ASP.NET Core Web API

i18n é uma abreviação para internacionalização, um processo que visa tornar um software adaptável a diferentes idiomas e culturas, sem a necessidade de grandes reestruturações. Em outras palavras, é preparar um software para ser utilizado em qualquer parte do mundo. A i18n envolve a separação do texto do código, a formatação de datas, números e moedas de acordo com cada cultura, e o suporte a diferentes conjuntos de caracteres. Ao internacionalizar um software, você amplia seu alcance, melhora a experiência do usuário e aumenta sua competitividade no mercado global.
Neste post irei te ensinar como iniciar o processo de internacionalização em um projeto webapi .net 8. Tenho aqui um projeto recém iniciado que usarei como exemplo e deixarei o link do github caso queira conferir o código.
A primeira coisa que devemos fazer é adicionar o serviço de localização na aplicação:

builder.Services.AddLocalization();
.
.
.
//Declaramos um array de culturas suportadas
var supportedCultures = new [] {"en-US", "pt-BR"};


// Especificamos as opções para o RequestLocalizationMiddleware
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture("pt-BR")
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);


// Adiciona o RequestLocalizationMiddleware para definir automaticamente as 
// informações de cultura para solicitações com base nas informações 
//fornecidas pelo cliente.
app.UseRequestLocalization(localizationOptions);
Enter fullscreen mode Exit fullscreen mode

(**Um detalhe importante que é ressaltado na documentação é que: "O middleware de localização precisa ser configurado antes de qualquer middleware que possa verificar a cultura de solicitação (por exemplo, app.UseMvcWithDefaultRoute())." Então preste atenção na ordem que vc está configurando os componentes do middleware.)

Agora iremos adicionar os recursos necessários para fazer as traduções. Irei criar um projeto classlib chamado Common, adicioná-lo na solução e referenciá-lo no projeto da api (estou usando dotnet cli, mas fique à vontade para utilizar uma ide se preferir):

dotnet new classlib -n Common
dotnet sln add Common/
dotnet add Api/Api.csproj reference Common/Common.csproj
Enter fullscreen mode Exit fullscreen mode

Dentro do projeto Common criamos um diretório chamado "Resources" e nele criaremos dois arquivos de recurso. A estrutura fica assim:
Image description

Podemos começar a criar nosso primeiro texto para ser traduzido:

Image description
O item (1) é chave (2) e (3) são os valores que serão utilizados conforme o idioma requisitado.
Mas antes clique em propriedades do recurso, adicione Public nesse campo (custom tool):

Image description
E também altere a classe Resource para ter seu modificador de acesso para Public

public class Resource {...}
Enter fullscreen mode Exit fullscreen mode

Na controller iremo injetar o IStringLocalizer que vem de Microsoft.Extensions.Localization. E o Resource é o que criamos então faça também o using de Common.Resources;

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using Common.Resources;

namespace Api.Controllers;

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private readonly IStringLocalizer<Resource> _localizer;

    public WeatherForecastController(IStringLocalizer<Resource> localizer)
    {
        _localizer = localizer;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public IActionResult Get()
    {
        return Ok($"Sucesso na traducao: {_localizer["msg_sucesso"]}");
    }
}

Enter fullscreen mode Exit fullscreen mode

O uso do _localizer fica assim: _localizer["chave"].
Para testar nossa aplicação utilizaremos o postman:

Image description
E em inglês temos:

Image description
E quando não colocamos nada, permanece aquele que configuramos como padrão:

Image description

E isso é tudo, pessoal! Fiquem à vontade para comentar qualquer equívoco ou sugestão. Espero que tenha te ajudado!

Top comments (0)