3

this is my first question :)

I'm developing an application that stores animal species in a database. The app must be multilanguage, so I tought to take advantage of using strings.xml resource files.

The idea is to store the english name of the species on the db, for example "cat", "dog" etc.. and then display to the user the actual translation, based on an xml like this (for italian):

<string name="dog">Cane</string>
<string name="cat">Gatto</string>

The problem is that R.string contains the name dog and cat, but they are actually int, so I'm searching a way to use the "dog" string to be used to compare the R.string.dog translated value.

I'm almost sure that my design is terribly wrong, but don't know what the correct way to doing this kind of work, since the app is now in a very early stage of development.

Thank you

EDIT with example

This example illustrates the problem:

Database data:

row1: id="1", value="dog"

row2: id="2", value="cat"

String file strings.xml:

<string name="dog">Dog</string>
<string name="cat">Cat</string>

String file strings-it.xml:

<string name="dog">Cane</string>
<string name="cat">Gatto</string>

My problem is: the user want to insert a specie in his native language (eg. "Cane"), and I want to search in the DB for its existence before inserting.

I should loop for every row on the DB (where values are stored in english), get the the translation of each row (eg: I found cat, then I translate to "Gatto") and compare with the user input.

Is it possible to do that?

Scognito
  • 152
  • 1
  • 13

3 Answers3

6

If you have a string name you want to use, you can use getIdentifier() to get the string id. As an example, to find R.string.cat:

Resources res = getResources();
int stringId = res.getIdentifier("cat", "string", packageName);

In the above example, if there is no R.string.cat found, it will simply return 0. It's an easy test to see if a string exists.

Alternatively, you can get an array of all the string ids in your R.java by using something like:

Field[] fields = R.string.class.getFields();
int[] ids = new int[fields.length];
for(int i=0;i<field.length;i++)
    ids[i] = field[i].getInt(null);

Of course, that will also look for any strings that you don't really intend as translations, such as dialog/window titles, label/button captions, etc. I wouldn't advise it in the general case. If I had to do it, I'd prefix the "translation" strings with something so I could easily tell what is what, something like "entry_cat".

Note that we're using reflection, and if you have a lot of strings, it could slow you down. If you are going to loop through R.java, I'd advise only doing it on start-up, and saving the values in some sort of array/list.

Geobits
  • 22,218
  • 6
  • 59
  • 103
  • Thanks! That's exactly was I searching for! In the meantime I found another way to design my database, similiar to this http://stackoverflow.com/questions/929410/what-are-best-practices-for-multi-language-database-design. This help could be useful for other functions in my app. Sorry I can't upvote as I'm new. – Scognito Jul 31 '13 at 07:44
  • That's probably a better database design in general, yes. `getIdentifier` does come in handy in other areas, though. It has for me at least, so it's not a bad thing to keep in mind. – Geobits Jul 31 '13 at 13:08
-1

First read this.

http://developer.android.com/training/basics/supporting-devices/languages.html

You can create value folder with many language's i.e janapee,dutch etc

you can find out value folder inside the res folder in your project. and create new value folders.

res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml

JUST TRANSLATE YOUR WORDS BY GOOGLE TRANSLATOR IN ANY LANGUAGE AND PUT INSIDE THE STRING.XML FILE .

Monty
  • 3,205
  • 8
  • 36
  • 61
  • 1
    As stated in the other my answer, I know how to statically use resource files, the problem is how to do that dinamically: I've updated the question with an example – Scognito Jul 30 '13 at 12:29
  • These are facts which are known and therefore useless for the original question. – D4ddy Mar 26 '15 at 07:06
-2

Well, first of all, start reading this here:

Suppose that your application's default language is English. Suppose also that you want to localize all the text in your application to French, and most of the text in your application (everything except the application's title) to Japanese. In this case, you could create three alternative strings.xml files, each stored in a locale-specific resource directory:

res/values/strings.xml Contains English text for all the strings that the application uses, including text for a string named title. res/values-fr/strings.xml Contain French text for all the strings, including title. res/values-ja/strings.xml Contain Japanese text for all the strings except title. If your Java code refers to R.string.title, here is what will happen at runtime:

If the device is set to any language other than French, Android will load title from the res/values/strings.xml file. If the device is set to French, Android will load title from the res/values-fr/strings.xml file. Notice that if the device is set to Japanese, Android will look for title in the res/values-ja/strings.xml file. But because no such string is included in that file, Android will fall back to the default, and will load title in English from the res/values/strings.xml file.

g00dy
  • 6,752
  • 2
  • 30
  • 43
  • Thanks for response. I know how to use localization, as my widget (buttons and labels) are already translated correctly. My problem arise when I search for an existing specie, for example I want to search "cane" (dog in english) inside my database, where all values are stored in english. How I do this dinamic translation and compare the stored value with R.string. value? – Scognito Jul 30 '13 at 10:51
  • The thing is that you'll ave to create separate folders like `values-fr`, `values-es` in the `res` folder so that they can be used accordingly. – g00dy Jul 30 '13 at 10:52
  • I repeat: I know how to use translation. Mr problem is to write a query like this: select * from species where $inputSpecieInItalian = $dbspecieInEnglish – Scognito Jul 30 '13 at 11:07
  • Ok, then why not put `Dog` in the resource, so that you know that when searching for "cane" you get the resource with that name and visualize the String value behind it. – g00dy Jul 30 '13 at 11:10