Localização: como mapear as informações da cultura para um nome de script ou alcance de caracteres Unicode?

StackOverflow https://stackoverflow.com/questions/252662

Pergunta

Preciso de algumas informações sobre localização. Estou usando o .NET 2.0 com C# 2.0, que cuida da maioria dos problemas relacionados à localização. No entanto, preciso desenhar manualmente os alfabetos correspondentes à cultura atual na tela em uma tela específica.

Isso seria semelhante à tela de contatos no Microsoft Outlook (exibição de cartões de endereço ou visualização detalhada dos cartões de endereço em contatos) e, portanto, precisa de uma coluna de botões na extremidade direita, um para cada alfabeto.

Estou tentando imitar isso, mas não quero pedir ao usuário para escolher o script. Se a cultura atual é, em chinês, quero desenhar alfabetos chineses. Quando o usuário altera as informações da cultura para o inglês (e quando ele reinicia o aplicativo), quero desenhar alfabetos em inglês. Espero que você entenda para onde estou indo com esta consulta.

Posso determinar a cultura do usuário atual (Application.CurrentCulture ou System.Globalization.cultureInfo.CurrentCulture fornecerá informações relacionadas à cultura). Eu também tenho todos os scripts para renderizar os alfabetos. No entanto, o problema é que não sei como mapear as informações da cultura para o nome de um script.

Em outras palavras, existe uma maneira de determinar o nome do script correspondente a uma cultura? Ou é possível determinar o intervalo de valores de caracteres unicode correspondentes a uma cultura? Qualquer um deles me permitiria renderizar os alfabetos no botão corretamente.

Quaisquer sugestões ou orientações sobre isso são realmente apreciadas. Se houver algo fundamentalmente errado com minha abordagem (ou com o que estou tentando alcançar), aponte isso também. Obrigado pelo seu tempo.

PS: Eu sei que a solução mais fácil é configurar o nome do script como parte das preferências do usuário ou exibir uma lista de idiomas para o usuário escolher (um contato à la no Outlook 2007). Mas estou apenas tentando ver se posso renderizar os alfabetos correspondentes à cultura sem que o usuário tenha que fazer qualquer coisa.

Foi útil?

Solução

No código nativo, existem Locale_Sscripts para getLocaleInfoEx () (Vista & acima) que mostram quais scripts são esperados para um local. Não há um conceito semelhante para .NET neste momento.

Outras dicas

Os chineses têm milhares de personagens, por isso pode não ser viável mostrar todos os personagens em seu conjunto de personagens. Não existe um conceito nativo de 'alfabeto' em chinês, e eu não acho que o chinês tenha um silabário como o japonês.

Pinyin (chinês escrito no alfabeto romano) pode ser usado para representar os caracteres chineses, e isso pode ajudá -lo a indexá -los. Eu sei que isso não responde à sua pergunta, mas espero que seja útil.

Eu concordo plenamente com Mikiemacman. Além disso, um determinado laguage não usa necessariamente todas as letras de um script.

De qualquer forma, o mais próximo que consigo pensar é a culturainfo.textinfo.ansicodePage -> Há apenas um punhado de Páginas de código ANSI. Você poderia ter criado uma tabela (ou uma instrução switch (), qualquer que seja) que lista o script para cada página de código ANSI.

Proto, espere! Há uma solução muito mais precisa. É um não gerenciado em Hance, você pode ter que p/invocar.

GetLocaleInfoW(MAKELCID(wLangId, SORT_DEFAULT), LOCALE_FONTSIGNATURE, wcBuf, MAXWCBUF);

Isso te dá um Localesignature Estrutura. A ANWER está no campo LSUSB: UNICODE SIGSIENS BITFIELD. Ratos! A página do MS para esta estrutura está vazia. Mas procure na sua cópia do MSDN. Está totalmente documentado lá: um conjunto inteiro de sinalizadores que descrevem quais scripts são spported. E sim, há uma bandeira para o tâmil ;-)

Hth.

EDIT: OOPS! Não tinha visto a resposta de Shawne. Uau! Resposta de um especialista interno! ;-) De qualquer forma, você ainda pode estar interessado em uma resposta compatível com pré-vista.

Tópico fascinante. Embora possa não responder sua pergunta, Omniglot é um bom recurso.

A resposta correta provavelmente será complexa e depende do problema exato que você está resolvendo. Supondo que seu objetivo mostrando apenas letras usadas em um idioma específico para separar as seções da lista telefônica (como no Outlook), poucas das questões são:

  • Pessoas que têm nomes de contato abrangendo vários scripts/idiomas.
  • 2-glifos (por exemplo, 'LJ' em sérvio). É um fonema, sempre tratado como uma única letra, embora tenha 2 símbolos unicode. 'Teria sua própria seção na lista telefônica (separada de' L ').
  • Muitos glifos para listar (por exemplo, chinês)
  • Pedidos não ortodoxos (por exemplo, Thai - uma lista telefônica seria separada apenas por consoantes, ignorando as vogais).
  • Distinção em maiúsculas / minúsculas (presumivelmente você gostaria apenas de um caso para idiomas que a sustentam - o que se decompõe de maneiras pequenas de 'i' turco).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top