Как предоставить услугу i18n для разработчика и конечного пользователя - PullRequest
0 голосов
/ 30 декабря 2010

Многие приложения для Android имеют довольно слабую поддержку i18n, и по понятной причине, поскольку это добавляет много работы для разработчика.

С интуитивной и культурной точки зрения было бы хорошо, если бы конечные пользователи могли сами переводить приложения, а OTA делиться переводом без переустановки самого приложения.

В концепции; как в википедии, некоторые легко добавляют контент, другие используют только то, что там есть.

Конечно, важно, чтобы сервис был максимально прост в использовании как для разработчиков приложений, так и для людей, желающих транскрибировать.

Проще говоря, это решение, которое я выбираю;

Перспектива разработчика:

  • Разработчик использует настраиваемый setContentView при открытии действий / макетов, которые будут искать слова xml-записей. (Ниже)

  • Настраиваемая версия предоставляется в виде бесплатной загружаемой библиотеки / класса ..., превращая функцию i18n в более или менее одну строку.

Перспектива пользователя:

  • Пользователь загружает приложение без перевода

  • Когда приложение запускается, оно проверяет локаль, запущенную на телефоне, и будет искать переведенный xml-файл в общем пространстве в SD.

  • Если нет или устарел старый xml (выше), попробуйте скачать новый с интернет-сервиса (ansync). Это все сделано библиотекой выше, нет необходимости в намерениях.

Перспектива переводчика:

  • Отдельное приложение для предоставления переводов для любого приложения, использующего службу i18n выше. (Может быть, просто веб-приложение), с некоторой формой QA для переводчиков / ввода.

ВОПРОС: Теперь, чтобы это работало эффективно, это должен быть AeasyAP, чтобы разработчик даже беспокоился, и наиболее гибким решением была бы настроенная версия setContentView, которая просто загружает переведенные значения из внешнего xml, а не в apk .

Возможно ли это вообще, и если нет, каковы ваши предлагаемые решения?

(И, конечно же, С Новым годом, Фелиз Ано Ново, blwyddyn newydd dda, Готт Ньютт Ор, kontan ane nouvo, szczęśliwego nowego roku ... )

С уважением, / Т * +1061 *

Ответы [ 3 ]

0 голосов
/ 30 декабря 2010

Что касается второй части вопроса, то можно использовать существующую службу перевода, такую ​​как Launchpad , которая работает с файлами .po для gettext.Однако есть android2po, который может преобразовывать XML-код Android в формат gettext .po .

На Launchpad уже есть переводы для Android, например ConnectBot, однако для входа в систему требуется вход в систему.В качестве альтернативы вам следует ознакомиться с доступными пакетами веб-переводчиков на основе gettext, которые вы также можете запускать самостоятельно, например Pootle.

Извините, я не могу публиковать более одного URL.Пожалуйста, оставьте Google в покое: (

0 голосов
/ 31 декабря 2010

layoutinflator.factory - это то, что я искал ...

0 голосов
/ 30 декабря 2010

Да, это возможно, только если кто-то (возможно, вы, я или другие) перепишете setContentView() - поскольку я вижу корень проблемы только там. Позвольте мне объяснить:

  1. Макеты XML хранятся в res / layout, который упакован в APK
  2. Нет способа изменить время выполнения APK (по крайней мере, я об этом никогда не слышал)
  3. Это означает, что в принципе вы не можете переопределить XML-код настраиваемого / интернационализированного макета в режиме реального времени в res / layout *
  4. Так что вам нужно место для хранения пользовательских XML: либо в настройках, либо в SQLite
  5. В обоих случаях необходимо накачать XML в Activity / Dialog, что можно сделать с помощью setContentView
  6. Итак, в конце - вам нужно переопределить setContentView

Как это сделать? 2 варианта:

  • Героический: полностью переписать setContentView в исходниках Android
  • Менее героический: создайте свой собственный OwnActivity класс, который переопределит setContentView(int id). Например: OwnActivity.setContentView() ищет в SQLite известный XML-идентификатор с текущей локалью, если не найден, он раздувает XML из res / layout

EDIT1:

Вы можете переопределить его как:

public class MyActivity extends Activity
{
    @Override
    public void setContentView(int id)
    {
        if(checkPresenceInStorage(id))
            //...
        else
            super.setContentView(id);
    }
}
...