две вещи
1) Я бы добавил переменную для хранения результата сообщения в
<fmt:message key="registration.direction" var="direction" />
тогда
2) Я бы сделал следующее с вашим кодом
<fmt:setBundle basename="class.path.to.resource.bundle"/>
<fmt:message key="registration.direction" var="direction" />
<table align=center class="" dir="${direction}">
Теперь, что касается ваших пакетов ресурсов, обычно вы должны иметь следующую структуру для ваших пакетов ресурсов
/foo/bar/MyResourceBundle.properties
/foo/bar/MyResourceBundle_en.properties
/foo/bar/MyResourceBundle_en_US.properties
/foo/bar/MyResourceBundle_<lang>[_COUNTRY[_VAR]].properties
Если ваш комплект не структурирован таким образом, это может быть вашей проблемой.
Убедитесь, что все ключи, которые, как ожидается, будут доступны, определены в MyResourceBundle с разумными значениями по умолчанию.
Я изменяю этот ответ, так как не уверен, что мой комментарий потерялся в функции скрытия.
С учетом того, что вы используете Struts 2, у меня сложилось впечатление, что вы используете перехватчик i18n. Перехватчик сохранит текущую локаль в переменной sesion с именем WW_TRANS_I18N_LOCALE. Таким образом, вы должны иметь возможность добраться до него и установить языковой стандарт для тегов JSTL с помощью следующего:
<fmt:setLocale scope="session" value="${sessionScope.WW_TRANS_I18N_LOCALE}" />
Надеюсь, что это работает для вас.