типичный процесс java i18n - отправка файлов ресурсов в переводческие компании для перевода

Существует множество руководств по использованию Java ResourceBundles для обеспечения пользовательского интерфейса на нескольких языках. Однако есть вопрос процесса относительно типичного взаимодействия с переводческими компаниями, на который я не могу найти ответа.

Предполагая, например, что я не знаю французского языка и мне нужно нанять переводческую компанию, чтобы получить переводы для моего приложения, я бы отправил их

  1. Файл свойств ресурса по умолчанию «whatever_en_US.properties», включая ключ и значение на английском языке, и вернуть «whatever_fr_FR.properties»?
  2. "whatever_fr_FR.properties" с пустыми значениями и "whatever_en_US.properties" для справки?
  3. какая-то другая комбинация?

person jwl    schedule 15.09.2010    source источник


Ответы (2)


Поскольку ваш вопрос касается процесса, а не технологии, я постараюсь дать вам подробное объяснение. Если предположить, что у вас есть приложение без предыдущего перевода, идеальный процесс должен выглядеть так:

  1. Отправьте английские файлы на перевод. В зависимости от вашего соглашения с подрядчиком по переводу вы можете использовать:

    • Your default properties files (you will be responsible for renaming them correctly)
    • Электронная таблица Excell, содержащая ключи, английскую фразу и пустой столбец для перевода
    • Файл(ы) Gettext *.po, если вы собираетесь использовать gettext
    • Файл(ы) памяти переводов (например, файлы Trados *.tmx)
  2. Когда вы получаете файлы обратно, вы вставляете эти переводы в продукт, создаете локализованную сборку и тестируете ее. Конечно, будут некоторые проблемы с пользовательским интерфейсом. Некоторые из них вы можете исправить самостоятельно, некоторые потребуют дополнительного перевода (например, жестко закодированные строки), другие потребуют сокращения перевода. Опять же, вы наймете подрядчика по переводу и предоставите ему строки, которые необходимо (повторно) перевести. Вы можете использовать электронную таблицу здесь (при условии, что не так много строк, которые нужно перевести).

  3. Если вы хотите выпускать одновременно (все языки сразу), вам нужно заранее привлечь переводчиков. Поскольку строки пользовательского интерфейса будут меняться (при условии отсутствия периода жесткой заморозки пользовательского интерфейса или периода заморозки перевода), вам придется обновить свои переводы. В этом случае вам нужно будет предоставить уже переведенные файлы со строками, которые необходимо перевести (на английском языке). Если изменения действительно небольшие, вы можете отправить только английские строки и объединить переводы вручную, в противном случае лучше использовать какой-либо формат обмена памятью переводов (здесь отлично подходят gettext *.po или trados *.tmx).

  4. Перевода файлов обычно недостаточно. Поскольку обычно контекст не указывается, а разные слова могут означать разные вещи на целевом языке, возникают ошибки перевода. Нет никакого способа узнать, что они внутри, если вы не знаете язык. Вот почему вам нужно сделать скриншоты пользовательского интерфейса и отправить их на рассмотрение (его может проверить ваш подрядчик по переводу или кто-то еще, в зависимости от требований к качеству).

  5. После проверки вам нужно будет применить изменения перевода и проверить наличие проблем с пользовательским интерфейсом...

Вот и все, если мы говорим о процессе перевода строк интерфейса. Но имейте в виду, что для правильной локализации приложения требуется гораздо больше (документация, файлы справки, значки, цвета, звуки...).

person Paweł Dyda    schedule 16.09.2010
comment
отличный! Я знаю многое из того, что вы поднимаете здесь, но вы прояснили, организовав это таким образом. И, надеюсь, будущие пользователи stackoverflow сочтут это полезным. - person jwl; 16.09.2010

Чтобы ответить на ваш вопрос, я бы выбрал (2).

На практике я обнаружил, что мне намного проще использовать что-то другое, а не наборы ресурсов Java.

Я лично использую другой способ обработки этого. Я использую способ gettext (там есть файл с именем GetTextResource.java, который вы должны использовать в своем приложении, чтобы воспользоваться преимуществами расширений gettext - см. здесь).

Если вы знакомы с gettext, этот подход определенно покажется вам намного проще и практичнее. Вы просто даете своим переводчикам файлы po (которые можно редактировать с помощью poedit). Из po-файлов вы создаете класс java, который будете использовать в своем приложении (это делается с помощью msgfmt — указания параметров для java-компиляции po-файлов). Файлы Po можно легко обновить с помощью команды xgettext (из командной строки).

Конечно, все находится в руководстве по gettext.

Преимущества:

  • gettext предлагает вам способ выбора формы множественного числа [ Больше никаких сообщений типа: «N файлов удалено» (где N — число) — см. ngettext.

  • скриптовый метод для перевода строк после обновления ваших java-файлов новыми токенами

  • нет необходимости обращаться к каждой строке с помощью некоторых макросов (например, Translate(DELETE_BUTTON_MACRO) ). Вы просто пишете свой код следующим образом:

    package translateutil;        
    import gnu.gettext.GettextResource;
    
    import java.util.ResourceBundle;
    
    import java.util.Locale;
    
    public class TranslateUtil
    {
    private static ResourceBundle myResources =null;
    
    public static boolean init(Locale loc, String resourceName)
    {
        boolean bRet = true;
        Locale.setDefault(loc);
    
        try
        {
            myResources = ResourceBundle.getBundle(resourceName);
    
            System.out.printf(  _("Current language: %s\n"),
                                Locale.getDefault().getDisplayName() );
    
            System.out.printf(  _("%s resource found\n"),
                                myResources.getClass().getName() );
        }
        catch(Exception e)
        {
            // let the application go on in English in case the ResourceBundle
            // was not found. Notify about the error
            bRet = false;
            System.out.println( e.toString() );
            myResources = null;
        }
    
        return bRet;
    }
    
    
    public static String _(String str)
    {
        if (myResources == null)
        {
            return str;
        }
        {
            return GettextResource.gettext(myResources, str);
        }
    }
    
    public static String _Plural(String singular, String plural, long param)
    {
        if (myResources == null)
        {
            if (param == 1)
            {
                return singular;
            }
            else
            {
                return plural;
            }
        }
        else
        {
            return GettextResource.ngettext(myResources, singular, plural, param);
        }
    }
    }
    

Вот образец

    // example
    // similar for plural

    import static translateutil.TranslateUtil._;

    System.out.println(_("The english text"));

Независимо от того, что вы выбираете: Удачи!

person INS    schedule 15.09.2010
comment
спасибо за подробный ответ ... На самом деле я на самом деле не использую наборы ресурсов Java, а проприетарное решение, НО решил спросить о пакетах ресурсов, чтобы упростить вопрос. - person jwl; 16.09.2010