3

I have a textview in my android messaging app I get messages of my android phone and I show them in textviews I want to set layout_gravity to right if the text is persian so how can I detect language of text that I get from below uri?

Uri uri = Uri.parse("content://sms/");
Suzi
  • 89
  • 4
  • 16
  • not understand your question – Bhavdip Sagar Sep 26 '15 at 13:37
  • @BhavdipPathar what is the problem with it? My app is a sms app, and I am getting messages from database and showing them some of them are wriiten in english and some persian, how can I detect that the sms is in persian or not? – Suzi Sep 26 '15 at 13:40
  • 1
    there are third party options available for language detection. [check this out](https://www.google.co.in/search?q=language+detection+online+apis&oq=language+detection+online+apis&aqs=chrome..69i57.7601j0j1&sourceid=chrome&es_sm=93&ie=UTF-8#q=language+detection+google+apis+android). – Rahul Tiwari Sep 26 '15 at 13:41
  • I am not sure but you can do using the third pary library or online api making the call request help for language detection. but I would not suggest to check using API. You can use the third party ib locally check the language. – Bhavdip Sagar Sep 26 '15 at 13:51

1 Answers1

3

There is Bidi class. This class has getBaseLevel() method which returns 0 if your text is left-to-right otherwise 1 (if right-to-left).

example:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
        if(bidi.getBaseLevel() == 0)
            convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
        else
            convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);

There is another method, baseIsLeftToRight() that might be better to be used in if statement. Result was same as above.

Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
if(bidi.baseIsLeftToRight())
                convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
            else
                convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);

SRC: https://stackoverflow.com/a/18008575/797495


public final class Bidi
extends Object

This class implements the Unicode Bidirectional Algorithm.

A Bidi object provides information on the bidirectional reordering of the text used to create it. This is required, for example, to properly display Arabic or Hebrew text. These languages are inherently mixed directional, as they order numbers from left-to-right while ordering most other text from right-to-left.

Once created, a Bidi object can be queried to see if the text it represents is all left-to-right or all right-to-left. Such objects are very lightweight and this text is relatively easy to process.

If there are multiple runs of text, information about the runs can be accessed by indexing to get the start, limit, and level of a run. The level represents both the direction and the 'nesting level' of a directional run. Odd levels are right-to-left, while even levels are left-to-right. So for example level 0 represents left-to-right text, while level 1 represents right-to-left text, and level 2 represents left-to-right text embedded in a right-to-left run.

Bhargav Thanki
  • 4,924
  • 2
  • 37
  • 43
Pedro Lobito
  • 94,083
  • 31
  • 258
  • 268