|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Готовы ли Вы принять участие в русификации jdk? |
| Да |
|
38% |
[14] |
| Нет |
|
30% |
[11] |
| Оно мне не надо |
|
30% |
[11] |
|
| Всего голосов : 36 |
|
| Автор |
Сообщение |
aleksandy : 1077 Завсегдатай
|
Июн 11, 2008 8:33 |
|
|
В общем, кому, как и мне, надоело использовать JOptionPane.showOptionDialog() с кучей параметров предлагаю следующий код, который, по крайней мере в нужном мне объеме, все-таки изменил все надписи на кнопках, диалогах, ифреймах...
Вот 3 класа, перед компиляцией желательно пропустить через native2ascii. JAR-файл положить в CLASSPATH, установить в программе отечественную локаль и наслаждаться...
На авторство не претендую часть перевода взял из properties-файлов Сергея Астахова для русификации для jdk1.4. Оригинальные файлы для супостатской локали получил jad-ом (а как по-другому и быстро? ).
| Код: |
package com.sun.swing.internal.plaf.basic.resources;
import java.util.ListResourceBundle;
public final class basic_ru extends ListResourceBundle {
public basic_ru() {
}
@Override
protected final Object[][] getContents() {
return (new Object[][] {
new Object[] { "AbstractButton.clickText", "клик" },
new Object[] { "AbstractDocument.additionText", "добавление" },
new Object[] { "AbstractDocument.deletionText", "удаление" },
new Object[] { "AbstractDocument.redoText", "Повторить" },
new Object[] { "AbstractDocument.styleChangeText",
"смену стиля" },
new Object[] { "AbstractDocument.undoText", "Отменить" },
new Object[] { "AbstractUndoableEdit.redoText", "Повторить" },
new Object[] { "AbstractUndoableEdit.undoText", "Отменить" },
new Object[] { "ColorChooser.cancelText", "Отмена" },
new Object[] { "ColorChooser.hsbBlueText", "B" },
new Object[] { "ColorChooser.hsbBrightnessText", "Яркость" },
new Object[] { "ColorChooser.hsbDisplayedMnemonicIndex", "0" },
new Object[] { "ColorChooser.hsbGreenText", "G" },
new Object[] { "ColorChooser.hsbHueText", "Оттенок" },
new Object[] { "ColorChooser.hsbMnemonic", "72" },
new Object[] { "ColorChooser.hsbNameText", "HSB" },
new Object[] { "ColorChooser.hsbRedText", "R" },
new Object[] { "ColorChooser.hsbSaturationText", "Насыщенность" },
new Object[] { "ColorChooser.okText", "OK" },
new Object[] { "ColorChooser.previewText", "Просмотр" },
new Object[] { "ColorChooser.resetMnemonic", "82" },
new Object[] { "ColorChooser.resetText", "Сброс" },
new Object[] { "ColorChooser.rgbBlueMnemonic", "66" },
new Object[] { "ColorChooser.rgbBlueText", "Синий" },
new Object[] { "ColorChooser.rgbDisplayedMnemonicIndex", "1" },
new Object[] { "ColorChooser.rgbGreenMnemonic", "78" },
new Object[] { "ColorChooser.rgbGreenText", "Зеленый" },
new Object[] { "ColorChooser.rgbMnemonic", "71" },
new Object[] { "ColorChooser.rgbNameText", "RGB" },
new Object[] { "ColorChooser.rgbRedMnemonic", "68" },
new Object[] { "ColorChooser.rgbRedText", "Красный" },
new Object[] { "ColorChooser.sampleText",
"Пример текста Пример текста" },
new Object[] { "ColorChooser.swatchesDisplayedMnemonicIndex",
"0" },
new Object[] { "ColorChooser.swatchesMnemonic", "83" },
new Object[] { "ColorChooser.swatchesNameText", "Палитра" },
new Object[] { "ColorChooser.swatchesRecentText", "Последние:" },
new Object[] { "ComboBox.togglePopupText", "Раскрыть список" },
new Object[] { "FileChooser.acceptAllFileFilterText",
"Все файлы" },
new Object[] { "FileChooser.cancelButtonMnemonic", "67" },
new Object[] { "FileChooser.cancelButtonText", "Отмена" },
new Object[] { "FileChooser.cancelButtonToolTipText",
"Закрыть диалог" },
new Object[] { "FileChooser.directoryDescriptionText", "Папка" },
new Object[] { "FileChooser.directoryOpenButtonMnemonic", "79" },
new Object[] { "FileChooser.directoryOpenButtonText", "Открыть" },
new Object[] { "FileChooser.directoryOpenButtonToolTipText",
"Открыть выбранную директорию" },
new Object[] { "FileChooser.fileDescriptionText", "Все файлы" },
new Object[] { "FileChooser.fileSizeGigaBytes", "{0} GB" },
new Object[] { "FileChooser.fileSizeKiloBytes", "{0} KB" },
new Object[] { "FileChooser.fileSizeMegaBytes", "{0} MB" },
new Object[] { "FileChooser.helpButtonMnemonic", "72" },
new Object[] { "FileChooser.helpButtonText", "Помощь" },
new Object[] { "FileChooser.helpButtonToolTipText",
"Показать справку" },
new Object[] { "FileChooser.newFolderErrorSeparator", ": " },
new Object[] { "FileChooser.newFolderErrorText",
"Ошибка при создании каталога" },
new Object[] { "FileChooser.openButtonMnemonic", "79" },
new Object[] { "FileChooser.openButtonText", "Открыть" },
new Object[] { "FileChooser.openButtonToolTipText",
"Открыть выбранный файл" },
new Object[] { "FileChooser.openDialogTitleText", "Открыть" },
new Object[] { "FileChooser.other.newFolder", "Новая папка" },
new Object[] { "FileChooser.other.newFolder.subsequent",
"Новая папка.{0}" },
new Object[] { "FileChooser.saveButtonMnemonic", "83" },
new Object[] { "FileChooser.saveButtonText", "Сохранить" },
new Object[] { "FileChooser.saveButtonToolTipText",
"Сохранить выбранный файл" },
new Object[] { "FileChooser.saveDialogTitleText", "Сохранить" },
new Object[] { "FileChooser.updateButtonMnemonic", "85" },
new Object[] { "FileChooser.updateButtonText", "Обновить" },
new Object[] { "FileChooser.updateButtonToolTipText",
"Обновить список директорий" },
new Object[] { "FileChooser.win32.newFolder", "Новая папка" },
new Object[] { "FileChooser.win32.newFolder.subsequent",
"Новая папка ({0})" },
new Object[] { "FormView.browseFileButtonText", "Просмотр..." },
new Object[] { "FormView.resetButtonText", "Сброс" },
new Object[] { "FormView.submitButtonText", "Отправить запрос" },
new Object[] { "InternalFrame.closeButtonToolTip", "Закрыть" },
new Object[] { "InternalFrame.iconButtonToolTip", "Свернуть" },
new Object[] { "InternalFrame.maxButtonToolTip", "Развернуть" },
new Object[] { "InternalFrame.restoreButtonToolTip",
"Восстановить" },
new Object[] {
"InternalFrameTitlePane.closeButtonAccessibleName",
"Закрыть" },
new Object[] { "InternalFrameTitlePane.closeButtonText",
"Закрыть" },
new Object[] {
"InternalFrameTitlePane.iconifyButtonAccessibleName",
"Свернуть" },
new Object[] {
"InternalFrameTitlePane.maximizeButtonAccessibleName",
"Развернуть" },
new Object[] { "InternalFrameTitlePane.maximizeButtonText",
"Развернуть" },
new Object[] { "InternalFrameTitlePane.minimizeButtonText",
"Свернуть" },
new Object[] { "InternalFrameTitlePane.moveButtonText", "Переместить" },
new Object[] { "InternalFrameTitlePane.restoreButtonText",
"Восстановить" },
new Object[] { "InternalFrameTitlePane.sizeButtonText",
"Размер" },
new Object[] { "IsindexView.prompt",
"Индексированный поиск. Введите ключевые слова:" },
new Object[] { "OptionPane.cancelButtonMnemonic", "0" },
new Object[] { "OptionPane.cancelButtonText", "Отмена" },
new Object[] { "OptionPane.inputDialogTitle", "Ввод" },
new Object[] { "OptionPane.messageDialogTitle", "Сообщение" },
new Object[] { "OptionPane.noButtonMnemonic", "78" },
new Object[] { "OptionPane.noButtonText", "Нет" },
new Object[] { "OptionPane.okButtonMnemonic", "0" },
new Object[] { "OptionPane.okButtonText", "OK" },
new Object[] { "OptionPane.titleText", "Выберите значение" },
new Object[] { "OptionPane.yesButtonMnemonic", "89" },
new Object[] { "OptionPane.yesButtonText", "Да" },
new Object[] {
"PrintingDialog.abortButtonDisplayedMnemonicIndex", "0" },
new Object[] { "PrintingDialog.abortButtonMnemonic", "65" },
new Object[] { "PrintingDialog.abortButtonText", "Прервать" },
new Object[] { "PrintingDialog.abortButtonToolTipText",
"Прервать печать" },
new Object[] { "PrintingDialog.contentAbortingText",
"Прерывание печати..." },
new Object[] { "PrintingDialog.contentInitialText",
"Идет печать..." },
new Object[] { "PrintingDialog.contentProgressText",
"Печатается страница {0}..." },
new Object[] { "PrintingDialog.titleAbortingText",
"Печать (прерывание)" },
new Object[] { "PrintingDialog.titleProgressText", "Печать" },
new Object[] { "ProgressMonitor.progressText", "Процесс..." },
new Object[] { "SplitPane.leftButtonText", "левая кнопка" },
new Object[] { "SplitPane.rightButtonText", "правая кнопка" } });
}
}
|
| Код: |
package com.sun.swing.internal.plaf.metal.resources;
import java.util.ListResourceBundle;
public final class metal_ru extends ListResourceBundle
{
public metal_ru()
{
}
protected final Object[][] getContents()
{
return (new Object[][] {
new Object[] {
"FileChooser.detailsViewActionLabelText", "Таблица"
}, new Object[] {
"FileChooser.detailsViewButtonAccessibleName", "Таблица"
}, new Object[] {
"FileChooser.detailsViewButtonToolTipText", "Таблица"
}, new Object[] {
"FileChooser.fileAttrHeaderText", "Атрибуты"
}, new Object[] {
"FileChooser.fileDateHeaderText", "Modified"
}, new Object[] {
"FileChooser.fileNameHeaderText", "Имя"
}, new Object[] {
"FileChooser.fileNameLabelText", "Имя файла:"
}, new Object[] {
"FileChooser.fileSizeHeaderText", "Размер"
}, new Object[] {
"FileChooser.fileTypeHeaderText", "Тип"
}, new Object[] {
"FileChooser.filesOfTypeLabelText", "Тип файлов:"
}, new Object[] {
"FileChooser.homeFolderAccessibleName", "Домой"
}, new Object[] {
"FileChooser.homeFolderToolTipText", "Домой"
}, new Object[] {
"FileChooser.listViewActionLabelText", "Список"
}, new Object[] {
"FileChooser.listViewButtonAccessibleName", "Список"
}, new Object[] {
"FileChooser.listViewButtonToolTipText", "Список"
}, new Object[] {
"FileChooser.lookInLabelText", "Просмотр:"
}, new Object[] {
"FileChooser.newFolderAccessibleName", "Новая папка"
}, new Object[] {
"FileChooser.newFolderActionLabelText", "Новая папка"
}, new Object[] {
"FileChooser.newFolderToolTipText", "Создать новую папку"
}, new Object[] {
"FileChooser.refreshActionLabelText", "Обновить"
}, new Object[] {
"FileChooser.saveInLabelText", "Сохранить в:"
}, new Object[] {
"FileChooser.upFolderAccessibleName", "Вверх"
}, new Object[] {
"FileChooser.upFolderToolTipText", "На один уровень вверх"
}, new Object[] {
"FileChooser.viewMenuLabelText", "Просмотр"
}, new Object[] {
"MetalTitlePane.closeMnemonic", "67"
}, new Object[] {
"MetalTitlePane.closeTitle", "Закрыть"
}, new Object[] {
"MetalTitlePane.iconifyMnemonic", "69"
}, new Object[] {
"MetalTitlePane.iconifyTitle", "Свернуть"
}, new Object[] {
"MetalTitlePane.maximizeMnemonic", "88"
}, new Object[] {
"MetalTitlePane.maximizeTitle", "Развернуть"
}, new Object[] {
"MetalTitlePane.restoreMnemonic", "82"
}, new Object[] {
"MetalTitlePane.restoreTitle", "Восстановить"
}
});
}
}
|
| Код: |
package com.sun.swing.internal.plaf.synth.resources;
import java.util.ListResourceBundle;
public final class synth_ru extends ListResourceBundle
{
public synth_ru()
{
}
protected final Object[][] getContents()
{
return (new Object[][] {
new Object[] {
"FileChooser.detailsViewActionLabelText", "Таблица"
}, new Object[] {
"FileChooser.detailsViewButtonAccessibleName", "Таблица"
}, new Object[] {
"FileChooser.detailsViewButtonToolTipText", "Таблица"
}, new Object[] {
"FileChooser.fileAttrHeaderText", "Атрибуты"
}, new Object[] {
"FileChooser.fileDateHeaderText", "Изменен"
}, new Object[] {
"FileChooser.fileNameHeaderText", "Имя"
}, new Object[] {
"FileChooser.fileNameLabelText", "Имя файла:"
}, new Object[] {
"FileChooser.fileSizeHeaderText", "Размер"
}, new Object[] {
"FileChooser.fileTypeHeaderText", "Тип"
}, new Object[] {
"FileChooser.filesOfTypeLabelText", "Тип файлов:"
}, new Object[] {
"FileChooser.homeFolderAccessibleName", "Домой"
}, new Object[] {
"FileChooser.homeFolderToolTipText", "Домой"
}, new Object[] {
"FileChooser.listViewActionLabelText", "Список"
}, new Object[] {
"FileChooser.listViewButtonAccessibleName", "Список"
}, new Object[] {
"FileChooser.listViewButtonToolTipText", "Список"
}, new Object[] {
"FileChooser.lookInLabelText", "Просмотр:"
}, new Object[] {
"FileChooser.newFolderAccessibleName", "Новая папка"
}, new Object[] {
"FileChooser.newFolderActionLabelText", "Новая папка"
}, new Object[] {
"FileChooser.newFolderToolTipText", "Создать новую папку"
}, new Object[] {
"FileChooser.refreshActionLabelText", "Обновить"
}, new Object[] {
"FileChooser.saveInLabelText", "Сохранить в:"
}, new Object[] {
"FileChooser.upFolderAccessibleName", "Вверх"
}, new Object[] {
"FileChooser.upFolderToolTipText", "Вверх на один уровень"
}, new Object[] {
"FileChooser.viewMenuLabelText", "Просмотр"
}
});
}
}
|
Все мнемоники остались с англиской локали
На очереди у меня еще парочка файлов из rt.jar. Вот уйду в отпуск и займусь ими... |
|
|
|
 |
Староверъ : 7629 Ктапубеп Откуда: Elfland
|
Июн 11, 2008 9:22 |
|
|
|
|
|
|
 |
gesser : 3589 JavaTalks Team Member
|
Июн 11, 2008 10:42 |
|
|
| А вы уверены что это еще не сделано Саном? В поставке иде куча i18n файлов. Вы исследовали этот вопрос? |
|
|
|
 |
aleksandy : 1077 Завсегдатай
|
Июн 11, 2008 11:03 |
|
|
| gesser писал(а): |
| А вы уверены что это еще не сделано Саном? В поставке иде куча i18n файлов. Вы исследовали этот вопрос? |
Саном это сделано на треть, если вообще считать сделанным: для русской локали есть классы, только для всевозможных форматтеров, для календаря и т.п. Т.е. то, что касается непосредственно ГИП-а(надписи на кнопках, в диалогах и т.д.) не переведено.
Тут можно посмотреть все, что касается сделанного Саном.
| Старовъръ писал(а): |
| Может все фреймворки, все технологии, всю литературу тогда уже переведешь. Давай, давай - взялся за гуж, не говори, что не дюж. |
Не надо утрировать... Тема локализации поднимается периодически, а толку от этого мало. Я не нашел в сети ни одного рабочего способа сделать надписи на кнопках JOptionPane на русском языке, не используя showOptionDialog с кучей различных параметров... Кстати, файлы локализации для других языков даже не включены в архив jdk-src, скачанный с сайта. Поэтому пришлось использовать декомпилятор... |
|
|
|
 |
gesser : 3589 JavaTalks Team Member
|
Июн 11, 2008 12:10 |
|
|
Да! похоже что для Swing`а русской локализации нет  |
|
|
|
 |
finalizer : 1794 Завсегдатай
|
Сен 22, 2008 17:41 |
|
|
| Интересно, существуют ли какие-то стандарты для локализаци? Ведь один и тот же термин довольно часто можно перевести множеством способов. Есть ли у Sun официальный англо-русский словарь терминов? |
|
|
|
 |
Sergey Astakhov : 54 Новичок
|
Дек 13, 2008 15:23 |
|
|
| aleksandy писал(а): |
| Кстати, файлы локализации для других языков даже не включены в архив jdk-src, скачанный с сайта. Поэтому пришлось использовать декомпилятор... |
Надо было полные исходники качать - там всё есть.
Для последних версий 6-ки перестали выкладывать исходники, но для предыдущих найти ещё можно. Или сразу заняться 7-кой.
Я пытался занятся в прошлом году переводом текстов для 6-ки, но, увы, не сложилось. Для качественной русификации всего JRE там нужно много усилий потратить - ведь только JavaWebStart содержит более 1000 сообщений, требующий перевода. Другое объёмное место - сообщения об ошибках xalan. Найти все места можно сделав глобальный поиск по маске *_de.* (ресурсы для немецкого). Кроме того, просто перевести файл ресурсов недостаточно - как правило, нужно ещё смотреть в каком контексте это сообщение используется, от этого зависит как правильно переводить то или иное слово, и нужно ли его переводить вообще.
Да, и ещё было бы неплохо доработать вывод на консоль, иначе установка пакета русификации приведёт к тому, что под виндами ошибки на консоль начнут выдаваться закорючками (из-за того, что консоль по умолчанию работает в OEM-кодировке). |
|
|
|
 |
aleksandy : 1077 Завсегдатай
|
Дек 25, 2008 6:35 |
|
|
| Sergey Astakhov писал(а): |
| Или сразу заняться 7-кой. |
Наверное, так и надо поступить, тем более, что ее релиз состоится в начале 2010 г., и время еще есть.
| Sergey Astakhov писал(а): |
| Для качественной русификации всего JRE там нужно много усилий потратить - ведь только JavaWebStart содержит более 1000 сообщений, требующий перевода. Другое объёмное место - сообщения об ошибках xalan. |
Да, работы много, но ведь, как говорится, потмки будут нам благодарны .
И потом, ведь можно начать с малого. Сначала то, что сразу бросается в глаза (сообщения, файл-чузеры, в общем, гуй). Потом уже перейти на сообщения об ошибках. |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Локализация (l10n & i18n) |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|