Android: ссылаясь на ресурсы в пользовательских XML - PullRequest
9 голосов
/ 24 ноября 2010

У меня есть многоязычное приложение для Android, где я поместил различные переводы в strings.xml в соответствующем каталоге.

Теперь у меня также есть пользовательский XML-файл, где я хотел бы ссылаться на такие тексты, какthis:

<?xml version="1.0" encoding="UTF-8"?>
<rooms>
    <room title="@+string/localizedtext" />
</rooms>

теперь, когда я читаю атрибут title в моем коде, я, очевидно, получаю неразрешенную строку "@ + string / localizedtext", как она есть.Возможно ли как-то автоматически разрешить эту ссылку на локализованный текст?

спасибо!

Ответы [ 5 ]

6 голосов
/ 03 ноября 2011

Почти год спустя:

    public static String getStringResource(Context context, String thingie) {
        try {
            String[] split = thingie.split("/");
            String pack = split[0].replace("@", "");
            String name = split[1];
            int id = context.getResources().getIdentifier(name, pack, context.getPackageName());
            return context.getResources().getString(id);
        } catch (Exception e) {
            return thingie;
        }
    }

Вот и все.

5 голосов
/ 19 августа 2012

Это может показаться широким ответом, но я верю, что это многое прояснит для людей, которые часами искали его (я один из них).

Короткий ответ: да, вы можете использовать ссылки в пользовательском XML, не только для строк, но и для примера, который я использую, для простоты понимания.

Учитывая контекст:

  • Рез / значения / strings.xml
    (Строки по умолчанию, обычно для удобства en-US, но это зависит от разработчика)
    <resources>
        <string name="sample_string">This is a sample string.</string>
    </resources>
  • Рез / значение-пт / strings.xml
    (локализованные французские струны)
    <resources>
        <string name="sample_string">Ceci est un exemple de chaîne</string>
    </resources>
  • Рез / XML / test.xml
    (пользовательский XML-файл)
    <!-- @string/sample_string identifies both
         the default and french localized strings,
         the system settings determine which is used at runtime.
    -->
    <test>
        <sample name="sampleName" text="@string/sample_string"/>
    </test>
  • SRC / COM / пример / приложение / TestXmlParser.java
    //Omitted imports for clarity.

    public class testXmlParser {
        public static final String ns = null;

        public int parse(XmlResourceParser parser) throws XmlPullParserException,
                                                          IOException{
            while(parser.next() != XmlPullParser.END_DOCUMENT){
                if(parser.getEventType() == XmlPullParser.START_TAG){
                    if(parser.getName().equalsIgnoreCase("sample")){

                        // This is what matters, we're getting a
                        // resource identifier and returning it.
                        return parser.getAttributeResourceValue(ns, "text", -1);    
                    }
                }
            }
            return -1;
        }

Используйте String getText(int id), чтобы получить строку, соответствующую id (локализовано, если доступно).

Используя приведенный выше пример, мы заменим:

//Return the resource id
return parser.getAttributeResourceValue(ns, "text", -1);

с:

//Return the localized string corresponding to the id.
int id = parser.getAttributeResourceValue(ns, "text", -1);
return getString(id); 
4 голосов
/ 24 ноября 2010

То, как вы пытались, невозможно.

Вы можете получить аналогичную функциональность с ресурсом <string-array>:

<resources>
    <string-array name="room">
        <item>@string/localizedText</item>
        <item>@string/otherLocalizedText</item>
    </string-array>
</resources>

тогда вы бы использовали это так:

String[] room = getResources().getStringArray(R.array.room);
String localizedText = room[0];
String otherLocalizedText = room[1];
1 голос
/ 24 ноября 2010

Локализация в Android осуществляется с помощью идентификаторов ресурсов.Ознакомьтесь с этим учебником по Android.

http://developer.android.com/resources/tutorials/localization/index.html

См. Обсуждение ниже.

0 голосов
/ 24 апреля 2013

Отличный ответ kyis, позор, у меня все еще не хватает очков брауни, чтобы оценить это.Чтобы ответить на вопрос Ника, просто измените последний бит кода на:

int id = parser.getAttributeResourceValue(ns, "text", 0);
return (id != 0) ? getString(id) : parser.getAttributeValue(ns, "text");

Обратите внимание, что я использовал 0 в качестве значения по умолчанию для ресурса, поскольку гарантированно никогда не будет реальным значением ресурса.-1 сделал бы тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...