Возможен ли откат к макроязыку для пакета ресурсов в Java (например, nynorsk -> norsk) - PullRequest
1 голос
/ 18 марта 2011

Веб-браузер может запросить язык с помощью заголовка accept-language и перечислить несколько языков. Safari перечисляет только один язык в OSX, текущий язык, установленный в операционной системе. Это проблема норвежского языка. Норвежский язык имеет три языковых кода в ISO 639-1 (nb, nn, no). nb - букмол, nn - нюнорск, а no - «макроязык», объединяющий их.

Если у нас есть только Bokmål l10n, было бы неплохо предложить версию Bokmål кому-то, кто запрашивает нюнорск, вместо того, чтобы использовать язык по умолчанию. Мне кажется логичным, что должна быть возможность разрешить "наилучшее совпадение" на стороне сервера, если идеальное совпадение недоступно (например, кажется незначительным скачком, что nb и nn оба отступят на нет). В настоящее время ответственность за предоставление списка принятых языков лежит на стороне клиента.

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

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

Итак, как справиться с этим, не дублируя языковые ресурсы?

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

Создайте комплект ресурсов класса для нюнорского языка и установите его родительский комплект в комплект Bokmal. См. http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#getBundle%28java.lang.String,%20java.util.Locale,%20java.lang.ClassLoader%29 для объяснения того, как загружаются пакеты:

public class foobar_nn extends ListResourceBundle {
    public foobar_nn {
        setParent(ResourceBundle.getBundle("foobar", new Locale("nb")));
    }

    @Override 
    protected Object[][] getContents()  {
        return new Object[0][0];
    }
}

Или просто измените процесс сборки, чтобы каждый файл xxx_nb.properties копировался в xxx_nn.properties.

1 голос
/ 22 марта 2011

Таким образом, я решил это в общем виде, который позволяет мне определять «резервные» языки на стороне сервера, централизованно для всех веб-приложений.

Что я делаю, так это оборачиваю запрос HttpServletRequest и перехватываю getAttribute для javax.servlet.jsp.jstl.fmt.localizationContext.request.Обычно это String (базовое имя ResourceBundle), но вы можете разрешить его и заменить на LocalizationContext, который затем будет использоваться тегами fmt:message.При ее разрешении вы передаете ResourceBundle.Control орудия getFallbackLocale, которые выполняют соответствующее сопоставление.

Теперь, глядя на список макросов, я не вижу других очевидных языков, где это было бы распространено (ясомневаюсь, что люди пользуются серфингом на местном арабском диалекте, например, но теперь я готов :), но в Норвегии это должно быть неизбежно, как Бокмол и Нюнорск, на мой взгляд, широко используются в Интернете, и должно быть много сетисайты, которые локализованы только для одного из них.

...