Como lidar com idiomas RTL e LTR mistos nas notificações?
O Android 4.3 adicionou muito suporte para idiomas RTL (da direita para a esquerda), como hebraico e árabe.
O problemaMesmo que haja "textDirection", "layoutDirection" e "gravity", não consigo encontrar os equivalentes para o construtor de notificações, nem mesmo na biblioteca de compatibilidade.
Isso significa que, se houver palavras hebraicas e inglesas juntas, a ordem está errada. Por exemplo (e escrevo em inglês para simplificar):
Em vez de "X chamado Y", você obtém "Y chamado X" (suponha que "chamado" seja uma palavra em hebraico), pois a string deve estar neste formato:
<string name="notification">%1$s called %2$s</string>
Nota: X e Y podem ser palavras RTL ou LTR (e números pares).
O requisito é que, em hebraico, a palavra à direita seja X, depois a palavra "chamada" (mas em hebraico, é claro) e, em seguida, Y à esquerda. Como tentei mostrar no exemplo da analogia em inglês, é o contrário.
O que eu tenteiuma. Tentei pesquisar na documentação e tudo o que descobri é que provavelmente precisarei substituir o layout, mas essa não é uma boa solução. As razões:
Talvez eu não use o estilo correto do Android.Não é uma prova do futuro para as próximas versões do Android, que podem usar um estilo diferente.Não suporta o texto do ticker.b. Também tentei investigar quais caracteres especiais forçariam a direção do texto a ser diferente, e funcionou adicionando '\ u200f' ao início e no final do texto para mostrar, mas há algumas falhas:
não é tão flexível quanto os outros atributos.Não sei se utilizo a maneira oficial de lidar com esse problema.Preciso adicionar isso sempre que uso uma notificaçãoNão funciona para o tickerText. apenas para notificações e, mesmo assim, não para todos os casos.Aqui está um código de exemplo:
/** prepares a string to be shown in a notification, so that it will be shown even on RTL languages */
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public static String prepareNotificationText(final Context context, final String text) {
if (VERSION.SDK_INT < VERSION_CODES.JELLY_BEAN_MR1)
return text;
final boolean isRTL = context.getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
if (!isRTL)
return text;
return '\u200f' + text + '\u200f';
}
c. Eu também poderia alternar entre o '1' e o '2' na string, mas isso não lida com todos os casos, além de ser ainda mais confuso para os tradutores.
A questãoExiste alguma maneira de fazer o construtor de notificações manipular textos corretamente (para notificações e TickerText)?
Alguma maneira de ajustá-lo sem criar layouts totalmente novos para as notificações (ou alterar as strings), que podem não estar no mesmo estilo nativo do Android?
Qual é a maneira oficial de lidar com uma coisa dessas?