Localizando mensagens de erro

Objective

After completing this lesson, you will be able to fornecer mensagens de erro localizadas

Arquivos de agrupamento de texto

Usamos o método req.error() do API de mensagem na classe de implementação para o AdminService de nosso cenário e na classe de implementação para nosso CatalogService. Utilizamos este método para emitir mensagens de erro se as validações falharem. Até agora, codificamos as mensagens reportadas como literais de texto.

Nesta lição, aprenderemos a internacionalizar mensagens. Em vez de incorporá-los com programação incondicional, eles são atualizados em arquivos separados - os chamados pacotes de texto - como pares chave-valor. Em seguida, as chaves são utilizadas pelo código de aplicação para acessar os textos correspondentes. Isso significa que os valores para as chaves são os textos reais específicos do idioma. Para suportar idiomas diferentes, são atualizados diferentes arquivos que fornecem textos traduzidos para as mesmas chaves (consulte a figura a seguir). 

Criando arquivos de agrupamento para internacionalizar mensagens de erro

O procedimento detalhado é o seguinte: Crie um arquivo com o nome messages.properties em uma pasta chamada _i18n, i18n ou assets/i18n. A pasta para o arquivo messages.properties deve estar localizada diretamente abaixo do diretório do projeto ou em um diretório que contenha arquivos que são usados para definir modelos de serviço (como o diretório srv em nosso projeto).

Nota

Os nomes das pastas nas quais o CAP procura pacotes de texto podem ser configurados no arquivo package.json do projeto usando a propriedade cds.i18n.folders . Por padrão, esses são os nomes de pasta _18n, i18n e assets/i18n.

Os textos necessários são atualizados como pares chave-valor no arquivo messages.properties. Normalmente, os textos são atualizados aí em inglês. Caracteres de preenchimento podem ser usados, que são anotados na forma "{n} ". n percorre os números naturais começando com 0.

Para suportar idiomas adicionais, arquivos adicionais são criados na mesma pasta que o arquivo messages.properties de acordo com a seguinte convenção de nomes: messages<_languageCode><_countryCode>.properties. O código do país é opcional. Exemplos desses nomes de arquivo são messages_de.properties, messages_fr_CA.properties ou messages_es_MX.properties.

Os arquivos adicionais usam as mesmas chaves que o arquivo messages.properties. No entanto, os valores para as chaves são traduzidos de acordo com o código de idioma e, se aplicável, o código do país do nome do arquivo.

No exemplo mostrado, dois arquivos .properties foram criados: messages.properties com textos em inglês e messages_de.properties com as traduções correspondentes em alemão.

Cadeia fallback

Pressuponha que um texto é consultado por meio de uma chave ao processar uma solicitação, em que o alemão foi determinado para o idioma. Se for atualizado um texto para a chave no file messages_de.properties, este texto é utilizado pela aplicação. No entanto, se não houver um arquivo messages_de.properties ou a chave usada não for mantida no arquivo messages_de.properties existente, CAP voltará para o arquivo messages.properties e tentará determinar um valor para a chave por meio desse arquivo. Se isso for possível, o texto correspondente é utilizado pela aplicação. Se messages.properties também não contiver uma entrada correspondente, o aplicativo usará o nome da chave como texto.

Nota

O nome básico de mensagens para os conjuntos de textos é obrigatório. Isso significa que os arquivos criados devem ter o seguinte nome: messages<_languageCode><_countryCode>.properties. Tecnicamente, no entanto, não é necessário criar um arquivo bruto sem sufixos com o nome messages.properties. Os textos em inglês também podem ser atualizados em um arquivo chamado messages_en.properties. Neste caso, no entanto, você não se beneficia do mecanismo fallback descrito acima. Este mecanismo garante que os textos do arquivo messages.properties são utilizados se nenhum arquivo .properties tiver sido criado para um idioma específico ou se uma chave específica não tiver sido atualizada para um idioma específico no arquivo .properties relacionado.

Acessando mensagens localizadas

Os textos atualizados nos agrupamentos de textos podem ser acessados por meio do API de mensagem, por exemplo, por meio dos métodos req.error() ou req.warn(). Para isso, a chave correspondente é simplesmente transferida para esses métodos em vez da mensagem real (consulte a figura seguinte).

Opcionalmente, uma matriz com valores de espaço reservado pode ser transferida para os métodos da API de mensagem como último parâmetro. O primeiro valor da matriz é depois utilizado para o caractere de preenchimento {0}, o segundo valor da matriz para o caractere de preenchimento {1} e assim por diante.

Teste

Você pode usar o parâmetro URL sap-locale para testar diferentes idiomas. No exemplo seguinte, são solicitados textos em alemão:

Code Snippet
1234567
POST <service_url>/submitOrder?sap-locale=de Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 0 }

Como alternativa, você também pode utilizar solicitações com um cabeçalho Accept-Language apropriado:

Code Snippet
12345678
POST <service_url>/submitOrder Accept-Language: de Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 0 }

O parâmetro de URL sap-locale tem a preferência mais alta. Ele substitui o cabeçalho Accept-Language caso isso também deva ser definido.

Demonstração e exercício: utilizar mensagens de erro localizadas

Nota

Como exercício, execute as instruções passo a passo na demonstração a seguir no SAP Business Application Studio.

Como ponto de partida para o exercício, utilize o resultado do exercício anterior Utilizar consultas na implementação de serviços CAP se você o tiver concluído com êxito. Como alternativa, você também pode utilizar a ramificação 14_queries do seguinte repositório GitHub como ponto de partida:

https://github.com/SAP-samples/cap-development-learning-journey

A implementação completa da simulação pode ser encontrada no ramo 15_error_messages do repositório GitHub.

Informações detalhadas sobre o conteúdo do repositório e como usá-lo podem ser encontradas aqui.

Assista ao vídeo para ver como usar mensagens de erro localizadas.