Этот сайт создан как клуб русификаторщиков. Для нас существуют три основных правила.
1. Мы никому и ничего не должны!
2.Один пришедший на сайт толковый русификаторщик дороже всех пользователей.
3. Мы делаем русификаторы для своего сайта, но в оригинале ими могут пользоваться все в интернете.
Нет, у меня тоже не работает. Можно об этом написать автору, который предлагает это в начале статьи на странице http://keepnote.org/faq.shtml, хотя по поводу локализации он мне не ответил. Правда, я не настолько часто пользуюсь разнообразием цветов. Вижу, Вам, Leserg, удались переводы о выборе цвета. Наверное, Вы добились так:
Цитата: Leserg
Для всех строк без транслятора можно подкорректировать исходный код, скомпилировать приложение заново и дополнить языковой файл.
Я так не смогу. Да и с этими надписями трудности:
Сообщение отредактировал greg 3 марта 2025 - 21:28
Создание мультиязычных приложений с использованием файлов формата MO/PO выполняется при помощи кроссплатформенной библиотеки GNU gettext.
В коде программы объявляется импорт библиотеки gettext и функция трансляции строк. Обычно для уменьшения размера исходного кода и улучшения его читаемости эту функцию объявляют символом "_" (символ подчеркивания). Строки, для которых требуется перевод, вызываются через эту функцию, например, _("String for translation"). Более подробную информацию смотрите в документации.
Теперь смотрим исходный код приложения "keepnote". Объявление библиотеки gettext и функция трансляции:
Пример вызова строки через функцию трансляции:
Если строки не имеют трансляции, то можно это исправить самостоятельно и теперь вы уже знаете как. Например, на панели выбора цвета есть строки "_Default Color" и "_New Color...":
Производим поиск этих строк по файлам исходного кода и находим их в файле colortool.py.
Как видно, эти строки вызываются без функции трансляции. Добавляем функцию и сохраняем изменения в файле.
Всё, вот вы и научились программировать на языке Python.
Далее добавляем строки "_Default Color" и "_New Color..." в языковой файл, переводим и компилируем в файл mo.
Теперь займемся компиляцией (сборкой приложения из исходного кода). Задача получить бинарный формат файла colortool.py, а именно colortool.pyc. Потом этим файлом мы заменим исходный файл, который находится в архиве library.zip по пути "library.zip\keepnote\gui\".
Для сборки приложения следует использовать те же самые версии компонентов, из которых была собрана оригинальная версия программы. Все эти компоненты перечислены в документе "INSTALL".
Все они прекрасно гуглятся, тем более являются бесплатными, и скачать их не составит никакого труда.
Также для сборки желательно использовать ОС Windows XP. Например, мне не удалось выполнить сборку на ОС Windows 11 64 bit из-за кучи ошибок и несовместимости вызываемых компилятором функций API. Разбираться с этим нет никакого желания и времени. Для таких случаев у меня всегда под рукой виртуальная ОС нужной версии.
Выполняем установку компонентов в указанном порядке. Пути установки и настройки используем по умолчанию, чтобы потом не искать причины сбоев компиляции. После установки необходимо дополнить системную переменную "Path" путями к папкам с установленным Python (C:\Python25) и его сценариям (C:\Python25\Scripts). Делается это в свойствах системы (Мой компьютер -> контекстное меню "Свойства" -> вкладка "Дополнительно" -> кнопка "Переменные среды" -> раздел "Системные переменные" -> выбрать строку с переменной "Path" -> кнопка "Изменить" -> в поле "Значение переменной" в конце строки поставить точку с запятой и добавить пути "C:\Python25;C:\Python25\Scripts").
Сохраняем сделанные изменения, нажимая "ОК" во всех открытых диалогах.
Из архива с исходным кодом программы, файла keepnote-0.7.9.tar.gz, извлекаем папку "keepnote-0.7.9" в корень диска С:\. Вносим изменения в файл colortool.py по пути "С:\keepnote-0.7.9\keepnote\gui\", как было описано выше и сохраняем изменения.
Далее в корне папки "С:\keepnote-0.7.9\" открываем в текстовом редакторе файл setup.py и закомментируем две последние строки сценария:
Просто перед этими строками записываем признак комментария при помощи символа #, как показано выше. Сохраняем изменения. Причина исключения этих строк - у нас нет сценария post_py2exe.py, а автор его не предоставил.
Теперь открываем командную строку в папке "С:\keepnote-0.7.9\" и вводим команду "python setup.py py2exe" (без кавычек!):
Нажимаем Ввод (Enter). Начнётся сборка программы:
Через некоторое время сборка будет успешно завершена и в командной строке вы увидите следующие сообщения (сборка не была прервана и отсутствуют ошибки).
После сборки в папке "keepnote-0.7.9" появятся две новые папки: "build" и "dist". Папка "build" содержит промежуточные файлы компиляции и она не нужна - её можно смело удалить. А вот папка "dist" содержит скомпилированное приложение. Запустить собранное приложение не удаться, т.к. дистрибутив был собран не полностью из-за отсутствия сценария post_py2exe.py. Но нам это и не нужно.
Находим в папке "dist" файл архива под именем library.zip и извлекаем из него файл colortool.pyc (в архиве он лежит по пути library.zip\keepnote\gui\).
Переходим папку с установленной программой и делаем резервную копию оригинального файла library.zip на всякий непредвиденный случай. Затем в архиве library.zip выполняем замену исходного файла colortool.pyc на новый по пути library.zip\keepnote\gui\.
На этапе отладки можете попробовать менять архив полностью. Т.е. собрали приложение и скопируйте полученный новый архив library.zip в каталог с установленной программой, заменив существующий. Если программа не запустится, вернете оригинальный архив, а потом замените в нем только изменённый файл из нового архива. При любых изменениях в исходном коде программы компиляцию повторяете.
В итоге, после запуска программы эти строки будут на русском языке (при условии, что вы дополнили новыми строками языковой файл).
Аналогичным способом можно добавить переводы для других строк, которые остались без трансляции. Находим строку в файлах исходного кода, добавляем функцию трансляции, компилируем, подменяем новым файлом исходный файл в архиве library.zip, дополняем языковой файл и компилируем его в формат MO.
Ранее мы рассмотрели строки, указанные в коде напрямую. Но есть строки, с которыми выполняются различные операции, прежде чем они будут выведены на экран (чтение, копирование, преобразование и т.п.). Примером таких строк являются строки в диалоге настроек в разделе "Внешние программы":
Эти строки состоят из дух частей: собственно строки и символа двоеточия. Например, строка "File Launcher" + ":" > "File Launcher:". Особенностью функции gettext является то, что объявленная в языковом файле строка должна полностью совпадать с источником. Только в этом случае будет прочитан перевод этой строки, иначе строка останется без перевода. Например, символ "С" на английском и русском языках выглядят одинаково, но имеют различный НЕХ-код. Из-за одного этого несоответствия, сделанного по ошибке или невнимательности, строка не будет транслирована. Поэтому очень важно для языковых файлов указывать исходные строки так, как они указаны в коде программы.
Зададим поиск этих строк и найдём их в файле __init__.py по пути "keepnote\".
Как видите эти строки не имеют в конце строки символа двоеточия. Добавление здесь функции трансляции ничего не даст. Во-первых, функция трансляции работает только для строк, которые выводятся на графический интерфейс. Во-вторых, эти строки объявлены как константа в массиве данных DEFAULT_EXTERNAL_APPS. То есть в программе, из этого массива сначала считывается нужное значение в определенную переменную, а потом значение этой переменной с необходимыми преобразованиями выводится в интерфейс программы.
Конечно, чтобы уметь читать исходный код программы, необходимо знать язык на котором она написана, хотя-бы в минимальном объеме.
Итак, ищем имена переменных, объявленные для этого массива. Они находятся здесь же, чуть выше:
Нужные нам строки в массиве находятся на второй позиции, для которой соответствует переменная "title" (заголовок, название).
Теперь ищем в коде, где эта переменная вызывается. Мы уже знаем, что это диалог настроек, поэтому нужно искать соответствующий файл. Переходим в каталог "keepnote\gui\" и там сразу бросается в глаза файл с именем dialog_app_options.py (диалог настроек приложения). Или же воспользуйтесь поиском строки вида ".title" по файлам в папке "keepnote\gui\". Открываем этот файл в текстовом редакторе и ищем выражение ".title". Вот оно:
В строке под номером 435 значение переменной title присваивается другой переменной под именем app_title и ниже, в строке под номером 439 формируется строка вида "app_title:", где вместо app_title будет подставлено соответствующее значение из массива. По итогу окончательная строка выводится на интерфейс элементом Label.
Так вот, чтобы задействовать перевод для этих строк, необходимо для переменной app_title вызывать функцию трансляции. Вносим изменения в код в строке 439:
Сохраняем изменения в файле. Компилируем приложение. Из полученного архива library.zip извлекаем файл dialog_app_options.pyc заменяем им одноименный файл в архиве установленной программы, как было рассказано ранее.
Строки заголовков таблицы в главном окне программы:
Поищем эти строки в исходном коде программы. Они будут найдены в файле __init__.py по пути "keepnote\notebook\".
Здесь также, эти и другие строки являются элементами массива g_default_attr_defs. И хотя мы видим в программе только три строки из этого массива, все же, думаю, нужно все эти строки объявить в языковом файле. Возможно мы ещё не полностью знакомы с функциями программы и просто ещё не увидели их. Чуть выше по коду можно узнать имена элементов массива.
В частности нас интересует имя переменной для заголовков таблицы - это переменная name. Переходим в каталог "keepnote\gui\" и производим поиск выражения вида ".name". Будет найдено несколько файлов, но обращает на себя внимание файл под именем listview.py, поскольку графический элемент, в котором содержатся искомые строки, является табличным элементом управления, а listview - это таблица. Открываем этот файл в редакторе и выполняем поиск выражения ".name". Есть такое - строка кода номер 251. Здесь значение переменной массива под именем name присваивается переменной col_title, имя которой говорит само за себя. Далее вниз по коду, в строке под номером 269, значение этой переменной устанавливается в заголовок таблицы.
Добавляем функцию трансляции при обращении к этой переменной:
Сохраняем изменения в файле. Компилируем приложение. Из полученного архива library.zip извлекаем файл listview.pyc заменяем им одноименный файл в архиве установленной программы, как было рассказано ранее.
Переводим и компилируем языковой файл в формате MO. Запускаем программу, и если нигде не сделали ошибок, то увидите заголовки таблицы на русском языке.
P.S. При работе с различными файлами не забывайте делать их резервные копии.
Большое спасибо, Leserg за подробный рассказ! Отличный материал и Вы умело его излагаете. Большой и потребует времени на изучение. Завидую Вашей памяти и способностям, ведь Вы обладаете знаниями многих языков программирования, и Python - один из них.
Цитата: Leserg
Сколько существует языков программирования?
Названий основных языков в википедии насчитал более сорока. И еще - только у Вас так красиво оформленные указатели с пояснениями:
Сообщение отредактировал greg 5 марта 2025 - 19:57
Большое спасибо, Leserg за подробный рассказ! Отличный материал и Вы умело его излагаете. Большой и потребует времени на изучение. Завидую Вашей памяти и способностям, ведь Вы обладаете знаниями многих языков программирования, и Python - один из них.
Уважаемый Leserg ака Сергей! А не создать ли тему на форуме по азам программирования? От простого и примитивного к более сложным элементам, подробно, пошагово, с примерами... Я бы и сам в этой теме поучаствовал, порой бывает весьма интересно... Сколько ни просил наших программеров показать азы - им все некогда. Ну так как насчет темы по программированию?
Такую тему под патронажем уважаемого Leserg ака Сергей я бы и сам с удовольствием поддержал. В то же время нужно понимать, что языков программирования уйма, поэтому именно по азам, с развитием по конкретному языку по выбору Leserg(а)
И нас уже двое! Прогресс! Давно завидую тем, кто умеет программировать, несколько раз пытался самостоятельно научиться - не срослось. Нужен гуру, он же Leserg.