# International Components for Unicode

Componentes Internacionais para Unicode ou International Components for Unicode (ICU) é um projeto de código aberto de bibliotecas C/C++ e Java para suporte ao Unicode, internacionalização de software e globalização de software. ICU é amplamente portátil para muitos sistemas operacionais e ambientes. Ele fornece aos aplicativos os mesmos resultados em todas as plataformas e entre software C, C++ e Java. O projeto ICU é um comitê técnico do Consórcio Unicode é patrocinado, apoiado e usado pela IBM e muitas outras empresas.
ICU fornece os seguintes serviços: manipulação de texto Unicode, propriedades completas de caracteres e conversões de conjuntos de caracteres; Expressões regulares Unicode; conjuntos completos de Unicode; limites de caracteres, palavras e linhas; comparação e pesquisa sensíveis à linguagem; normalização, conversão de maiúsculas e minúsculas e transliterações de script; dados de local abrangente e arquitetura de pacote de recursos por meio do Common Locale Data Repository (CLDR); multi- calendário e fusos horários; e formatação e análise baseadas em regras de datas, horas, números, moedas e mensagens. ICU fornecia serviço de layout de texto complexo para árabe, hebraico, índico e tailandês historicamente, mas isso foi descontinuado na versão 54 e foi completamente removido na versão 58 em favor do HarfBuzz.
ICU fornece recursos de internacionalização mais extensos do que as bibliotecas padrão para C e C ++. ICU 67 oferece suporte a Unicode 13.0 e trata da remoção da Grã-Bretanha das regiões da UE. ICU 64 suporta Unicode 12.0, enquanto ICU 64.2 adicionou suporte para Unicode 12.1, ou seja, o novo símbolo único para a era atual Reiwa japonesa (mas o suporte para ele também foi retransmitido para versões mais antigas de ICU até ICU 4.8.2). ICU 58 (com suporte a Unicode 9.0) é a última versão a oferecer suporte a plataformas mais antigas, como Windows XP, Windows Vista. O suporte para AIX, Solaris ez / OS também é limitado em versões posteriores.
ICU tem usado historicamente UTF-16 e ainda usa apenas para Java; enquanto para C / C ++ UTF-8 é suportado, incluindo o tratamento correto de "UTF-8 ilegal".

## Origem e desenvolvimento

Depois que a Taligent se tornou parte da IBM no início de 1996, a Sun Microsystems decidiu que a nova linguagem Java deveria ter um suporte melhor para internacionalização. Como a Taligent tinha experiência com essas tecnologias e era próxima geograficamente, seu grupo de texto internacional foi convidado a contribuir com as classes internacionais para o Java Development Kit como parte das APIs de internacionalização JDK 1.1. Uma grande parte desse código ainda existe nos pacotes java.text e java.util. Outros recursos de internacionalização foram adicionados a cada versão posterior do Java.
As classes de internacionalização Java foram então portadas para C ++ e C como parte de uma biblioteca conhecida como ICU4C ("ICU for C"). O projeto ICU também fornece ICU4J ("ICU para Java"), que adiciona recursos não presentes nas bibliotecas Java padrão. ICU4C e ICU4J são muito semelhantes, embora não idênticos; por exemplo, ICU4C inclui uma API de Expressão Regular, enquanto ICU4J não. Ambas as estruturas foram aprimoradas ao longo do tempo para oferecer suporte a novos recursos e novos recursos de Unicode e Common Locale Data Repository (CLDR).
ICU foi lançado como um projeto de código aberto em 1999 com o nome IBM Classes for Unicode. Posteriormente, foi renomeado para International Components For Unicode. Em maio de 2016, o projeto ICU passou a fazer parte do consórcio Unicode como comitê técnico ICU-TC, e as fontes da biblioteca agora são distribuídas sob a licença Unicode.

## MessageFormat

Uma parte do ICU é a classe MessageFormat, É um sistema de formatação de "localização 2.0" (l20n) que permite qualquer número de argumentos para controlar a forma plural (plural, selectordinal) ou selectordinal mais geral no estilo switch-case (select) para as coisas como gênero gramatical. Essas instruções podem ser aninhadas. Uma porta JavaScript desta biblioteca é comumente usada por desenvolvedores de Angular.js em combinação com ngx-translate, para que a biblioteca simples baseada em chave possa lidar com entradas de localização diferenciadas. Um exemplo para este sistema pode ser:
Observe que o próprio ICU não chama MessageFormat como um sistema l20n. O termo vem de uma biblioteca JavaScript de mesmo nome da Mozilla com uma funcionalidade semelhante, que foi substituída por outro sistema JavaScript chamado "Fluent" mais tarde.
ICU MessageFormat foi criado adicionando o sistema de plural e de seleção a um sistema com nome idêntico em Java SE.