diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml index ffb4fd6fe8..91d6e6b8e7 100644 --- a/.github/workflows/pypi-release.yml +++ b/.github/workflows/pypi-release.yml @@ -28,7 +28,7 @@ jobs: run: twine check dist/* - name: check PyPI versions - if: github.ref == 'refs/heads/main' + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/v2.3' run: | pip install --upgrade requests python -c "\ diff --git a/README.md b/README.md index 6a2e9cc00d..5857b2d898 100644 --- a/README.md +++ b/README.md @@ -259,7 +259,7 @@ cleanup, testing, or code reviews, is very much encouraged to do so. To join, just raise your hand on the InvokeAI Discord server (#dev-chat) or the GitHub discussion board. -If you'd like to help with localization, please register on [Weblate][translation status link]. If you want add a new language, please let us know which language and we will add it to the Weblate project. +If you'd like to help with translation, please see our [translation guide](docs/other/TRANSLATION.md). If you are unfamiliar with how to contribute to GitHub projects, here is a diff --git a/docs/other/TRANSLATION.md b/docs/other/TRANSLATION.md new file mode 100644 index 0000000000..4d9a9b98e7 --- /dev/null +++ b/docs/other/TRANSLATION.md @@ -0,0 +1,19 @@ +# Translation + +InvokeAI uses [Weblate](https://weblate.org) for translation. Weblate is a FOSS project providing a scalable translation service. Weblate automates the tedious parts of managing translation of a growing project, and the service is generously provided at no cost to FOSS projects like InvokeAI. + +## Contributing + +If you'd like to contribute by adding or updating a translation, please visit our [Weblate project](https://hosted.weblate.org/engage/invokeai/). You'll need to sign in with your GitHub account (a number of other accounts are supported, including Google). + +Once signed in, select a language and then the Web UI component. From here you can Browse and Translate strings from English to your chosen language. Zen mode offers a simpler translation experience. + +Your changes will be attributed to you in the automated PR process; you don't need to do anything else. + +## Help & Questions + +Please check Weblate's [documentation](https://docs.weblate.org/en/latest/index.html) or ping @psychedelicious or @blessedcoolant on Discord if you have any questions. + +## Thanks + +Thanks to the InvokeAI community for their efforts to translate the project! diff --git a/installer/create_installer.sh b/installer/create_installer.sh index 82826d7c2b..8d01c2b331 100755 --- a/installer/create_installer.sh +++ b/installer/create_installer.sh @@ -20,10 +20,9 @@ echo Building installer for version $VERSION echo "Be certain that you're in the 'installer' directory before continuing." read -p "Press any key to continue, or CTRL-C to exit..." -read -e -p "Commit and tag this repo with '${VERSION}' and '${LATEST_TAG}'? [n]: " input +read -e -p "Tag this repo with '${VERSION}' and '${LATEST_TAG}'? [n]: " input RESPONSE=${input:='n'} if [ "$RESPONSE" == 'y' ]; then - git commit -a if ! git tag $VERSION ; then echo "Existing/invalid tag" @@ -32,6 +31,8 @@ if [ "$RESPONSE" == 'y' ]; then git push origin :refs/tags/$LATEST_TAG git tag -fa $LATEST_TAG + + echo "remember to push --tags!" fi # ---------------------- diff --git a/installer/lib/installer.py b/installer/lib/installer.py index fb1fd2b217..beafa63286 100644 --- a/installer/lib/installer.py +++ b/installer/lib/installer.py @@ -336,7 +336,8 @@ class InvokeAiInstance: elif el in ['-y','--yes','--yes-to-all']: new_argv.append(el) sys.argv = new_argv - + + import requests # to catch download exceptions from messages import introduction introduction() @@ -346,7 +347,21 @@ class InvokeAiInstance: # NOTE: currently the config script does its own arg parsing! this means the command-line switches # from the installer will also automatically propagate down to the config script. # this may change in the future with config refactoring! - invokeai_configure.main() + succeeded = False + try: + invokeai_configure.main() + succeeded = True + except requests.exceptions.ConnectionError as e: + print(f'\nA network error was encountered during configuration and download: {str(e)}') + except OSError as e: + print(f'\nAn OS error was encountered during configuration and download: {str(e)}') + except Exception as e: + print(f'\nA problem was encountered during the configuration and download steps: {str(e)}') + finally: + if not succeeded: + print('To try again, find the "invokeai" directory, run the script "invoke.sh" or "invoke.bat"') + print('and choose option 7 to fix a broken install, optionally followed by option 5 to install models.') + print('Alternatively you can relaunch the installer.') def install_user_scripts(self): """ diff --git a/installer/templates/invoke.bat.in b/installer/templates/invoke.bat.in index cc569e27b6..d5ec9d07e9 100644 --- a/installer/templates/invoke.bat.in +++ b/installer/templates/invoke.bat.in @@ -6,8 +6,9 @@ setlocal call .venv\Scripts\activate.bat set INVOKEAI_ROOT=. +:start echo Do you want to generate images using the -echo 1. command-line +echo 1. command-line interface echo 2. browser-based UI echo 3. run textual inversion training echo 4. merge models (diffusers type only) @@ -17,7 +18,8 @@ echo 7. re-run the configure script to fix a broken install echo 8. open the developer console echo 9. update InvokeAI echo 10. command-line help -set /P restore="Please enter 1-10: [2] " +echo Q - quit +set /P restore="Please enter 1-10, Q: [2] " if not defined restore set restore=2 IF /I "%restore%" == "1" ( echo Starting the InvokeAI command-line.. @@ -60,9 +62,19 @@ IF /I "%restore%" == "1" ( python .venv\Scripts\invokeai.exe --help %* pause exit /b +) ELSE IF /I "%restore%" == "q" ( + echo Goodbye! + goto ending ) ELSE ( echo Invalid selection pause exit /b ) +goto start + endlocal +pause + +:ending +exit /b + diff --git a/installer/templates/invoke.sh.in b/installer/templates/invoke.sh.in index c2282f7acd..812bcba458 100644 --- a/installer/templates/invoke.sh.in +++ b/installer/templates/invoke.sh.in @@ -24,9 +24,11 @@ if [ "$(uname -s)" == "Darwin" ]; then export PYTORCH_ENABLE_MPS_FALLBACK=1 fi +while true +do if [ "$0" != "bash" ]; then echo "Do you want to generate images using the" - echo "1. command-line" + echo "1. command-line interface" echo "2. browser-based UI" echo "3. run textual inversion training" echo "4. merge models (diffusers type only)" @@ -35,35 +37,36 @@ if [ "$0" != "bash" ]; then echo "7. re-run the configure script to fix a broken install" echo "8. open the developer console" echo "9. update InvokeAI" - echo "10. command-line help " + echo "10. command-line help" + echo "Q - Quit" echo "" - read -p "Please enter 1-10: [2] " yn + read -p "Please enter 1-10, Q: [2] " yn choice=${yn:='2'} case $choice in 1) echo "Starting the InvokeAI command-line..." - exec invokeai $@ + invokeai $@ ;; 2) echo "Starting the InvokeAI browser-based UI..." - exec invokeai --web $@ + invokeai --web $@ ;; 3) echo "Starting Textual Inversion:" - exec invokeai-ti --gui $@ + invokeai-ti --gui $@ ;; 4) echo "Merging Models:" - exec invokeai-merge --gui $@ + invokeai-merge --gui $@ ;; 5) - exec invokeai-model-install --root ${INVOKEAI_ROOT} + invokeai-model-install --root ${INVOKEAI_ROOT} ;; 6) - exec invokeai-configure --root ${INVOKEAI_ROOT} --skip-sd-weights --skip-support-models + invokeai-configure --root ${INVOKEAI_ROOT} --skip-sd-weights --skip-support-models ;; 7) - exec invokeai-configure --root ${INVOKEAI_ROOT} --yes --default_only + invokeai-configure --root ${INVOKEAI_ROOT} --yes --default_only ;; 8) echo "Developer Console:" @@ -72,10 +75,13 @@ if [ "$0" != "bash" ]; then ;; 9) echo "Update:" - exec invokeai-update + invokeai-update ;; 10) - exec invokeai --help + invokeai --help + ;; + [qQ]) + exit 0 ;; *) echo "Invalid selection" @@ -86,3 +92,4 @@ else # in developer console echo "Press ^D to exit" export PS1="(InvokeAI) \u@\h \w> " fi +done diff --git a/invokeai/frontend/dist/locales/it.json b/invokeai/frontend/dist/locales/it.json index c5f6d423ca..4bf52db853 100644 --- a/invokeai/frontend/dist/locales/it.json +++ b/invokeai/frontend/dist/locales/it.json @@ -465,7 +465,10 @@ "isScheduled": "Annullamento", "setType": "Imposta il tipo di annullamento", "immediate": "Annulla immediatamente" - } + }, + "hSymmetryStep": "Passi Simmetria Orizzontale", + "vSymmetryStep": "Passi Simmetria Verticale", + "symmetry": "Simmetria" }, "settings": { "models": "Modelli", diff --git a/invokeai/frontend/dist/locales/ru.json b/invokeai/frontend/dist/locales/ru.json index e9a018bb1e..e08540809b 100644 --- a/invokeai/frontend/dist/locales/ru.json +++ b/invokeai/frontend/dist/locales/ru.json @@ -4,7 +4,7 @@ "themeLabel": "Тема", "languagePickerLabel": "Язык", "reportBugLabel": "Сообщить об ошибке", - "settingsLabel": "Настройка", + "settingsLabel": "Настройки", "darkTheme": "Темная", "lightTheme": "Светлая", "greenTheme": "Зеленая", @@ -17,9 +17,9 @@ "postProcessing": "Постобработка", "postProcessDesc1": "Invoke AI предлагает широкий спектр функций постобработки. Увеличение изображения (upscale) и восстановление лиц уже доступны в интерфейсе. Получите доступ к ним из меню 'Дополнительные параметры' на вкладках 'Текст в изображение' и 'Изображение в изображение'. Обрабатывайте изображения напрямую, используя кнопки действий с изображениями над текущим изображением или в режиме просмотра.", "postProcessDesc2": "В ближайшее время будет выпущен специальный интерфейс для более продвинутых процессов постобработки.", - "postProcessDesc3": "Интерфейс командной строки Invoke AI предлагает различные другие функции, включая увеличение Embiggen", + "postProcessDesc3": "Интерфейс командной строки Invoke AI предлагает различные другие функции, включая Embiggen.", "training": "Обучение", - "trainingDesc1": "Специальный интерфейс для обучения собственных моделей с использованием Textual Inversion и Dreambooth", + "trainingDesc1": "Специальный интерфейс для обучения собственных моделей с использованием Textual Inversion и Dreambooth.", "trainingDesc2": "InvokeAI уже поддерживает обучение моделей с помощью TI, через интерфейс командной строки.", "upload": "Загрузить", "close": "Закрыть", @@ -44,7 +44,9 @@ "statusUpscaling": "Увеличение", "statusUpscalingESRGAN": "Увеличение (ESRGAN)", "statusLoadingModel": "Загрузка модели", - "statusModelChanged": "Модель изменена" + "statusModelChanged": "Модель изменена", + "githubLabel": "Github", + "discordLabel": "Discord" }, "gallery": { "generations": "Генерации", @@ -285,15 +287,15 @@ "description": "Описание", "descriptionValidationMsg": "Введите описание модели", "config": "Файл конфигурации", - "configValidationMsg": "Путь до файла конфигурации", + "configValidationMsg": "Путь до файла конфигурации.", "modelLocation": "Расположение модели", - "modelLocationValidationMsg": "Путь до файла с моделью", + "modelLocationValidationMsg": "Путь до файла с моделью.", "vaeLocation": "Расположение VAE", - "vaeLocationValidationMsg": "Путь до VAE", + "vaeLocationValidationMsg": "Путь до файла VAE.", "width": "Ширина", - "widthValidationMsg": "Исходная ширина изображений", + "widthValidationMsg": "Исходная ширина изображений модели.", "height": "Высота", - "heightValidationMsg": "Исходная высота изображений", + "heightValidationMsg": "Исходная высота изображений модели.", "addModel": "Добавить модель", "updateModel": "Обновить модель", "availableModels": "Доступные модели", @@ -320,7 +322,8 @@ "deleteModel": "Удалить модель", "deleteConfig": "Удалить конфигурацию", "deleteMsg1": "Вы точно хотите удалить модель из InvokeAI?", - "deleteMsg2": "Это не удалит файл модели с диска. Позже вы можете добавить его снова." + "deleteMsg2": "Это не удалит файл модели с диска. Позже вы можете добавить его снова.", + "repoIDValidationMsg": "Онлайн-репозиторий модели" }, "parameters": { "images": "Изображения", @@ -411,15 +414,15 @@ "sentToUnifiedCanvas": "Отправить на холст", "parametersSet": "Параметры заданы", "parametersNotSet": "Параметры не заданы", - "parametersNotSetDesc": "Не найдены метаданные этого изображения", + "parametersNotSetDesc": "Не найдены метаданные изображения.", "parametersFailed": "Проблема с загрузкой параметров", - "parametersFailedDesc": "Невозможно загрузить исходное изображение", + "parametersFailedDesc": "Невозможно загрузить исходное изображение.", "seedSet": "Сид задан", "seedNotSet": "Сид не задан", - "seedNotSetDesc": "Не удалось найти сид для изображения", + "seedNotSetDesc": "Не удалось найти сид для изображения.", "promptSet": "Запрос задан", "promptNotSet": "Запрос не задан", - "promptNotSetDesc": "Не удалось найти запрос для изображения", + "promptNotSetDesc": "Не удалось найти запрос для изображения.", "upscalingFailed": "Увеличение не удалось", "faceRestoreFailed": "Восстановление лиц не удалось", "metadataLoadFailed": "Не удалось загрузить метаданные", @@ -477,7 +480,7 @@ "showCanvasDebugInfo": "Показать отладку холста", "clearCanvasHistory": "Очистить историю холста", "clearHistory": "Очистить историю", - "clearCanvasHistoryMessage": "Очистка истории холста оставляет текущий холст нетронутым, но удаляет историю отмены и повтора", + "clearCanvasHistoryMessage": "Очистка истории холста оставляет текущий холст нетронутым, но удаляет историю отмен и повторов.", "clearCanvasHistoryConfirm": "Вы уверены, что хотите очистить историю холста?", "emptyTempImageFolder": "Очистить временную папку", "emptyFolder": "Очистить папку", diff --git a/invokeai/frontend/public/locales/it.json b/invokeai/frontend/public/locales/it.json index c5f6d423ca..4bf52db853 100644 --- a/invokeai/frontend/public/locales/it.json +++ b/invokeai/frontend/public/locales/it.json @@ -465,7 +465,10 @@ "isScheduled": "Annullamento", "setType": "Imposta il tipo di annullamento", "immediate": "Annulla immediatamente" - } + }, + "hSymmetryStep": "Passi Simmetria Orizzontale", + "vSymmetryStep": "Passi Simmetria Verticale", + "symmetry": "Simmetria" }, "settings": { "models": "Modelli", diff --git a/invokeai/frontend/public/locales/ru.json b/invokeai/frontend/public/locales/ru.json index e9a018bb1e..e08540809b 100644 --- a/invokeai/frontend/public/locales/ru.json +++ b/invokeai/frontend/public/locales/ru.json @@ -4,7 +4,7 @@ "themeLabel": "Тема", "languagePickerLabel": "Язык", "reportBugLabel": "Сообщить об ошибке", - "settingsLabel": "Настройка", + "settingsLabel": "Настройки", "darkTheme": "Темная", "lightTheme": "Светлая", "greenTheme": "Зеленая", @@ -17,9 +17,9 @@ "postProcessing": "Постобработка", "postProcessDesc1": "Invoke AI предлагает широкий спектр функций постобработки. Увеличение изображения (upscale) и восстановление лиц уже доступны в интерфейсе. Получите доступ к ним из меню 'Дополнительные параметры' на вкладках 'Текст в изображение' и 'Изображение в изображение'. Обрабатывайте изображения напрямую, используя кнопки действий с изображениями над текущим изображением или в режиме просмотра.", "postProcessDesc2": "В ближайшее время будет выпущен специальный интерфейс для более продвинутых процессов постобработки.", - "postProcessDesc3": "Интерфейс командной строки Invoke AI предлагает различные другие функции, включая увеличение Embiggen", + "postProcessDesc3": "Интерфейс командной строки Invoke AI предлагает различные другие функции, включая Embiggen.", "training": "Обучение", - "trainingDesc1": "Специальный интерфейс для обучения собственных моделей с использованием Textual Inversion и Dreambooth", + "trainingDesc1": "Специальный интерфейс для обучения собственных моделей с использованием Textual Inversion и Dreambooth.", "trainingDesc2": "InvokeAI уже поддерживает обучение моделей с помощью TI, через интерфейс командной строки.", "upload": "Загрузить", "close": "Закрыть", @@ -44,7 +44,9 @@ "statusUpscaling": "Увеличение", "statusUpscalingESRGAN": "Увеличение (ESRGAN)", "statusLoadingModel": "Загрузка модели", - "statusModelChanged": "Модель изменена" + "statusModelChanged": "Модель изменена", + "githubLabel": "Github", + "discordLabel": "Discord" }, "gallery": { "generations": "Генерации", @@ -285,15 +287,15 @@ "description": "Описание", "descriptionValidationMsg": "Введите описание модели", "config": "Файл конфигурации", - "configValidationMsg": "Путь до файла конфигурации", + "configValidationMsg": "Путь до файла конфигурации.", "modelLocation": "Расположение модели", - "modelLocationValidationMsg": "Путь до файла с моделью", + "modelLocationValidationMsg": "Путь до файла с моделью.", "vaeLocation": "Расположение VAE", - "vaeLocationValidationMsg": "Путь до VAE", + "vaeLocationValidationMsg": "Путь до файла VAE.", "width": "Ширина", - "widthValidationMsg": "Исходная ширина изображений", + "widthValidationMsg": "Исходная ширина изображений модели.", "height": "Высота", - "heightValidationMsg": "Исходная высота изображений", + "heightValidationMsg": "Исходная высота изображений модели.", "addModel": "Добавить модель", "updateModel": "Обновить модель", "availableModels": "Доступные модели", @@ -320,7 +322,8 @@ "deleteModel": "Удалить модель", "deleteConfig": "Удалить конфигурацию", "deleteMsg1": "Вы точно хотите удалить модель из InvokeAI?", - "deleteMsg2": "Это не удалит файл модели с диска. Позже вы можете добавить его снова." + "deleteMsg2": "Это не удалит файл модели с диска. Позже вы можете добавить его снова.", + "repoIDValidationMsg": "Онлайн-репозиторий модели" }, "parameters": { "images": "Изображения", @@ -411,15 +414,15 @@ "sentToUnifiedCanvas": "Отправить на холст", "parametersSet": "Параметры заданы", "parametersNotSet": "Параметры не заданы", - "parametersNotSetDesc": "Не найдены метаданные этого изображения", + "parametersNotSetDesc": "Не найдены метаданные изображения.", "parametersFailed": "Проблема с загрузкой параметров", - "parametersFailedDesc": "Невозможно загрузить исходное изображение", + "parametersFailedDesc": "Невозможно загрузить исходное изображение.", "seedSet": "Сид задан", "seedNotSet": "Сид не задан", - "seedNotSetDesc": "Не удалось найти сид для изображения", + "seedNotSetDesc": "Не удалось найти сид для изображения.", "promptSet": "Запрос задан", "promptNotSet": "Запрос не задан", - "promptNotSetDesc": "Не удалось найти запрос для изображения", + "promptNotSetDesc": "Не удалось найти запрос для изображения.", "upscalingFailed": "Увеличение не удалось", "faceRestoreFailed": "Восстановление лиц не удалось", "metadataLoadFailed": "Не удалось загрузить метаданные", @@ -477,7 +480,7 @@ "showCanvasDebugInfo": "Показать отладку холста", "clearCanvasHistory": "Очистить историю холста", "clearHistory": "Очистить историю", - "clearCanvasHistoryMessage": "Очистка истории холста оставляет текущий холст нетронутым, но удаляет историю отмены и повтора", + "clearCanvasHistoryMessage": "Очистка истории холста оставляет текущий холст нетронутым, но удаляет историю отмен и повторов.", "clearCanvasHistoryConfirm": "Вы уверены, что хотите очистить историю холста?", "emptyTempImageFolder": "Очистить временную папку", "emptyFolder": "Очистить папку", diff --git a/invokeai/frontend/stats.html b/invokeai/frontend/stats.html index cbf2fc66ea..1e7823a4ff 100644 --- a/invokeai/frontend/stats.html +++ b/invokeai/frontend/stats.html @@ -6157,7 +6157,7 @@ var drawChart = (function (exports) {