mirror of https://github.com/vladmandic/automatic
fix and regenerate locales
Signed-off-by: Vladimir Mandic <mandic00@live.com>pull/4139/head
parent
6f96b17e6b
commit
74da5095f0
|
|
@ -2,7 +2,9 @@
|
|||
|
||||
## Update for 2025-08-20
|
||||
|
||||
A quick service release with several important hotfixes, but also adding support for new Qwen variants...
|
||||
A quick service release with several important hotfixes, improved localization support and adding new **Qwen** model variants...
|
||||
|
||||
[ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867)
|
||||
|
||||
- **Models**
|
||||
- [Qwen-Image-Edit](https://huggingface.co/Qwen/Qwen-Image-Edit)
|
||||
|
|
@ -22,6 +24,7 @@ A quick service release with several important hotfixes, but also adding support
|
|||
- **UI**
|
||||
- new artwork for reference models in networks
|
||||
thanks @liutyi
|
||||
- updated [localization](https://vladmandic.github.io/sdnext-docs/Locale/) for all 8 languages
|
||||
- localization support for ModernUI
|
||||
- single-click on locale rotates current locale
|
||||
double-click on locale resets locale to `en`
|
||||
|
|
@ -46,6 +49,7 @@ A quick service release with several important hotfixes, but also adding support
|
|||
- install `hf_transfter` and `hf_xet` when needed
|
||||
- fix ui cropped network tags
|
||||
- enum reference models on startup
|
||||
- dont report errors if agent scheduler is disabled
|
||||
|
||||
## Update for 2025-08-15
|
||||
|
||||
|
|
|
|||
|
|
@ -6,10 +6,9 @@ const process = require('process');
|
|||
const { GoogleGenerativeAI } = require('@google/generative-ai');
|
||||
|
||||
const api_key = process.env.GOOGLE_AI_API_KEY;
|
||||
const model = 'gemini-2.0-flash-exp';
|
||||
const model = 'gemini-2.5-flash';
|
||||
const prompt = `
|
||||
Translate attached JSON from English to {language} using following rules: fields id and label should be preserved from original, field localized should be a translated version of field label and field hint should be translated in-place.
|
||||
Every JSON entry should have id, label, localized and hint fields. Output should be pure JSON without any additional text. To better match translation, context of the text is related to Stable Diffusion and topic of Generative AI.`;
|
||||
Translate attached JSON from English to {language} using following rules: fields id, label and reload should be preserved from original, field localized should be a translated version of field label and field hint should be translated in-place. if field is less than 3 characters, do not translate it and keep it as is. Every JSON entry should have id, label, localized, reload and hint fields. Output should be pure JSON without any additional text. To better match translation, context of the text is related to Stable Diffusion and topic of Generative AI.`;
|
||||
const languages = {
|
||||
hr: 'Croatian',
|
||||
de: 'German',
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 322664e57b815596140b9bd5024a1ef7cae9caff
|
||||
Subproject commit da4ccd4aa75e3b42937674ba23d406a02783df4f
|
||||
3779
html/locale_de.json
3779
html/locale_de.json
File diff suppressed because it is too large
Load Diff
|
|
@ -33,6 +33,10 @@
|
|||
],
|
||||
"main": [
|
||||
{"id":"","label":"Prompt","localized":"","reload":"","hint":"Describe image you want to generate"},
|
||||
{"id":"","label":"Start","localized":"","reload":"","hint":"Start"},
|
||||
{"id":"","label":"End","localized":"","reload":"","hint":"End"},
|
||||
{"id":"","label":"Core","localized":"","reload":"","hint":"Core settings"},
|
||||
{"id":"","label":"System prompt","localized":"","reload":"","hint":"System prompt controls behavior of LLM"},
|
||||
{"id":"","label":"Negative prompt","localized":"","reload":"","hint":"Describe what you don't want to see in generated image"},
|
||||
{"id":"","label":"Text","localized":"","reload":"","hint":"Create image from text"},
|
||||
{"id":"","label":"Image","localized":"","reload":"","hint":"Create image from image"},
|
||||
|
|
@ -166,6 +170,24 @@
|
|||
{"id":"","label":"Mask blur","localized":"","reload":"","hint":"How much to blur the mask before processing, in pixels"},
|
||||
{"id":"","label":"Latent noise","localized":"","reload":"","hint":"fill it with latent space noise"},
|
||||
{"id":"","label":"Latent nothing","localized":"","reload":"","hint":"fill it with latent space zeroes"},
|
||||
{"id":"","label":"Adapters","localized":"","reload":"","hint":"Settings related to IP Adapters"},
|
||||
{"id":"","label":"Inputs","localized":"","reload":"","hint":"Settings related to Input images"},
|
||||
{"id":"","label":"Control input type","localized":"","reload":"","hint":"Choose which input image is used for control process"},
|
||||
{"id":"","label":"Video format","localized":"","reload":"","hint":"Format and codec of output video"},
|
||||
{"id":"","label":"Size & Batch","localized":"","reload":"","hint":"Image size and batch"},
|
||||
{"id":"","label":"Sigma adjust","localized":"","reload":"","hint":"Adjust sampler sigma value"},
|
||||
{"id":"","label":"Adjust start","localized":"","reload":"","hint":"Starting step when sigma adjust occurs"},
|
||||
{"id":"","label":"Adjust end","localized":"","reload":"","hint":"Ending step when sigma adjust occurs"},
|
||||
{"id":"","label":"Options","localized":"","reload":"","hint":"Options"},
|
||||
{"id":"","label":"ControlNet","localized":"","reload":"","hint":"ControlNet is an advanced guidance model"},
|
||||
{"id":"","label":"Renoise","localized":"","reload":"","hint":"Apply additional noise during detailing"},
|
||||
{"id":"","label":"Renoise end","localized":"","reload":"","hint":"Final step when renoise is applied"},
|
||||
{"id":"","label":"Merge detailers","localized":"","reload":"","hint":"Merge results from multiple detailers into single mask before running detailing process"},
|
||||
{"id":"","label":"Inpaint mode","localized":"","reload":"","hint":"Inpaint mode"},
|
||||
{"id":"","label":"Inpaint area","localized":"","reload":"","hint":"Inpaint area"},
|
||||
{"id":"","label":"Texture tiling","localized":"","reload":"","hint":"Apply seamless tiling to generated image so it can be used as a texture"},
|
||||
{"id":"","label":"Override","localized":"","reload":"","hint":"Override settings that can change server behavior and are typically applied from imported image metadata"},
|
||||
{"id":"","label":"VAE type","localized":"","reload":"","hint":"Choose if you want to run full VAE, reduced quality VAE or attempt to use remote VAE service"},
|
||||
{"id":"","label":"Guess Mode","localized":"","reload":"","hint":"Removes the requirement to supply a prompt to a ControlNet. It forces Controlnet encoder to do it's 'best guess' based on the contents of the input control map."},
|
||||
{"id":"","label":"Control Only","localized":"","reload":"","hint":"This uses only the Control input below as the source for any ControlNet or IP Adapter type tasks based on any of our various options."},
|
||||
{"id":"","label":"Init Image Same As Control","localized":"","reload":"","hint":"Will additionally treat any image placed into the Control input window as a source for img2img type tasks, an image to modify for example."},
|
||||
|
|
@ -176,6 +198,8 @@
|
|||
{"id":"","label":"Install","localized":"","reload":"","hint":"Install"},
|
||||
{"id":"","label":"Search","localized":"","reload":"","hint":"Search"},
|
||||
{"id":"","label":"Sort by","localized":"","reload":"","hint":"Sort by"},
|
||||
{"id":"","label":"Nudenet","localized":"","reload":"","hint":"Flexible extension that can detect and obfustate nudity in images"},
|
||||
{"id":"","label":"Prompt enhance","localized":"","reload":"","hint":"Extension that can use different LLMs to rewrite prompt for improved results"},
|
||||
{"id":"","label":"Manage extensions","localized":"","reload":"","hint":"Manage extensions"},
|
||||
{"id":"","label":"Manual install","localized":"","reload":"","hint":"Manually install extension"},
|
||||
{"id":"","label":"Extension GIT repository URL","localized":"","reload":"","hint":"Specify extension repository URL on GitHub"},
|
||||
|
|
@ -250,6 +274,12 @@
|
|||
],
|
||||
"settings": [
|
||||
{"id":"","label":"Apply settings","localized":"","reload":"","hint":"Save current settings, server restart is recommended"},
|
||||
{"id":"","label":"Model Loading","localized":"","reload":"","hint":"Settings related to how model is loaded"},
|
||||
{"id":"","label":"Model Options","localized":"","reload":"","hint":"Settings related to behavior of specific models"},
|
||||
{"id":"","label":"Model Offloading","localized":"","reload":"","hint":"Settings related to model offloading and memory management"},
|
||||
{"id":"","label":"Model Quantization","localized":"","reload":"","hint":"Settings related to model quantization which is used to reduce memory usage"},
|
||||
{"id":"","label":"Image Metadata","localized":"","reload":"","hint":"Settings related to handling of metadata that is created with generated images"},
|
||||
{"id":"","label":"Legacy Options","localized":"","reload":"","hint":"Settings related to legacy options - should not be used"},
|
||||
{"id":"","label":"Restart server","localized":"","reload":"","hint":"Restart server"},
|
||||
{"id":"","label":"Shutdown server","localized":"","reload":"","hint":"Shutdown server"},
|
||||
{"id":"","label":"Preview theme","localized":"","reload":"","hint":"Show theme preview"},
|
||||
|
|
|
|||
3511
html/locale_es.json
3511
html/locale_es.json
File diff suppressed because it is too large
Load Diff
4077
html/locale_fr.json
4077
html/locale_fr.json
File diff suppressed because it is too large
Load Diff
4375
html/locale_hr.json
4375
html/locale_hr.json
File diff suppressed because it is too large
Load Diff
4459
html/locale_it.json
4459
html/locale_it.json
File diff suppressed because it is too large
Load Diff
3933
html/locale_ja.json
3933
html/locale_ja.json
File diff suppressed because it is too large
Load Diff
3847
html/locale_ko.json
3847
html/locale_ko.json
File diff suppressed because it is too large
Load Diff
3921
html/locale_pt.json
3921
html/locale_pt.json
File diff suppressed because it is too large
Load Diff
4929
html/locale_ru.json
4929
html/locale_ru.json
File diff suppressed because it is too large
Load Diff
3825
html/locale_zh.json
3825
html/locale_zh.json
File diff suppressed because it is too large
Load Diff
|
|
@ -601,7 +601,7 @@ def check_diffusers():
|
|||
if args.skip_git:
|
||||
install('diffusers')
|
||||
return
|
||||
sha = 'dba4e007fed65d0cdfa35a431e02f4be7b90753d' # diffusers commit hash
|
||||
sha = '4fcd0bc7ebb934a1559d0b516f09534ba22c8a0d' # diffusers commit hash
|
||||
pkg = pkg_resources.working_set.by_key.get('diffusers', None)
|
||||
minor = int(pkg.version.split('.')[1] if pkg is not None else -1)
|
||||
cur = opts.get('diffusers_version', '') if minor > -1 else ''
|
||||
|
|
|
|||
|
|
@ -126,13 +126,11 @@ async function tooltipShow(e) {
|
|||
if (e.target.dataset.reload) {
|
||||
const reloadType = e.target.dataset.reload;
|
||||
let reloadText = '';
|
||||
|
||||
if (reloadType === 'model') {
|
||||
reloadText = 'Requires model reload';
|
||||
} else if (reloadType === 'server') {
|
||||
reloadText = 'Requires server restart';
|
||||
}
|
||||
|
||||
if (reloadText) {
|
||||
content += `
|
||||
<div class="tooltip-reload-notice">
|
||||
|
|
@ -276,6 +274,33 @@ async function getLocaleData(desiredLocale = null) {
|
|||
return json;
|
||||
}
|
||||
|
||||
async function replaceTextContent(el, text) {
|
||||
if (el.children.length === 1 && el.firstElementChild.classList.contains('mask-icon')) return;
|
||||
if (el.querySelector('span')) el = el.querySelector('span');
|
||||
if (el.querySelector('div')) el = el.querySelector('div');
|
||||
if (el.classList.contains('mask-icon')) return; // skip icon buttons
|
||||
if (el.dataset.selector) { // replace on rehosted child if exists
|
||||
el = el.firstElementChild || el.querySelector(el.dataset.selector);
|
||||
replaceTextContent(el, text);
|
||||
return;
|
||||
}
|
||||
el.textContent = text;
|
||||
}
|
||||
|
||||
async function setHint(el, entry) {
|
||||
if (localeData.type === 1) {
|
||||
el.title = entry.hint;
|
||||
} else if (localeData.type === 2) {
|
||||
el.dataset.hint = entry.hint;
|
||||
if (entry.longHint && entry.longHint.length > 0) el.dataset.longHint = entry.longHint;
|
||||
if (entry.reload && entry.reload.length > 0) el.dataset.reload = entry.reload;
|
||||
el.addEventListener('mouseover', tooltipShow);
|
||||
el.addEventListener('mouseout', tooltipHide);
|
||||
} else {
|
||||
// tooltips disabled
|
||||
}
|
||||
}
|
||||
|
||||
async function setHints(analyze = false) {
|
||||
let json = {};
|
||||
let overrideData = [];
|
||||
|
|
@ -298,40 +323,22 @@ async function setHints(analyze = false) {
|
|||
let localized = 0;
|
||||
let hints = 0;
|
||||
const t0 = performance.now();
|
||||
for (const possible of elements) {
|
||||
let el = possible;
|
||||
if (possible.querySelector('span')) el = possible.querySelector('span');
|
||||
if (el.children.length === 1 && el.firstElementChild.classList.contains('mask-icon')) continue; // skip icon buttons
|
||||
for (const el of elements) {
|
||||
// localize elements text
|
||||
let found;
|
||||
if (el.dataset.original) found = localeData.data.find((l) => l.label.toLowerCase().trim() === el.dataset.original.toLowerCase().trim());
|
||||
else found = localeData.data.find((l) => l.label.toLowerCase().trim() === el.textContent.toLowerCase().trim());
|
||||
if (found?.localized?.length > 0) {
|
||||
if (!el.dataset.original) el.dataset.original = el.textContent;
|
||||
localized++;
|
||||
el.textContent = found.localized;
|
||||
replaceTextContent(el, found.localized);
|
||||
} else if (found?.label && !localeData.initial && (localeData.locale === 'en')) { // reset to english
|
||||
el.textContent = found.label;
|
||||
replaceTextContent(el, found.label);
|
||||
}
|
||||
// replaceButtonText(el);
|
||||
// set hints
|
||||
if (found?.hint?.length > 0) {
|
||||
hints++;
|
||||
if (localeData.type === 1) {
|
||||
el.title = found.hint;
|
||||
} else if (localeData.type === 2) {
|
||||
el.dataset.hint = found.hint;
|
||||
// Set long hint if available
|
||||
if (found.longHint && found.longHint.length > 0) {
|
||||
el.dataset.longHint = found.longHint;
|
||||
}
|
||||
// Set reload type if available
|
||||
if (found.reload && found.reload.length > 0) {
|
||||
el.dataset.reload = found.reload;
|
||||
}
|
||||
el.addEventListener('mouseover', tooltipShow);
|
||||
el.addEventListener('mouseout', tooltipHide);
|
||||
} else {
|
||||
// tooltips disabled
|
||||
}
|
||||
setHint(el, found);
|
||||
}
|
||||
}
|
||||
localeData.finished = true;
|
||||
|
|
|
|||
|
|
@ -22,14 +22,14 @@ def hf_init():
|
|||
elif opts.hf_transfer_mode == 'rust':
|
||||
install('hf_transfer')
|
||||
import huggingface_hub
|
||||
huggingface_hub.utils._runtime.is_hf_transfer_available = lambda: True # pylint: disable=W0640
|
||||
huggingface_hub.utils._runtime.is_hf_transfer_available = lambda: True # pylint: disable=protected-access
|
||||
os.environ.setdefault('HF_XET_HIGH_PERFORMANCE', 'false')
|
||||
os.environ.setdefault('HF_HUB_ENABLE_HF_TRANSFER', 'true')
|
||||
os.environ.setdefault('HF_HUB_DISABLE_XET', 'true')
|
||||
elif opts.hf_transfer_mode == 'xet':
|
||||
install('hf_xet')
|
||||
import huggingface_hub
|
||||
huggingface_hub.utils._runtime.is_xet_available = lambda: True # pylint: disable=W0640
|
||||
huggingface_hub.utils._runtime.is_xet_available = lambda: True # pylint: disable=protected-access
|
||||
os.environ.setdefault('HF_XET_HIGH_PERFORMANCE', 'true')
|
||||
os.environ.setdefault('HF_HUB_ENABLE_HF_TRANSFER', 'true')
|
||||
os.environ.setdefault('HF_HUB_DISABLE_XET', 'false')
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ options_templates.update(options_section(('sd', "Model Loading"), {
|
|||
"sd_checkpoint_cache": OptionInfo(0, "Cached models", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1, "visible": False }),
|
||||
}))
|
||||
|
||||
options_templates.update(options_section(('model_options', "Models Options"), {
|
||||
options_templates.update(options_section(('model_options', "Model Options"), {
|
||||
"model_sd3_sep": OptionInfo("<h2>Stable Diffusion 3.x</h2>", "", gr.HTML),
|
||||
"model_sd3_disable_te5": OptionInfo(False, "Disable T5 text encoder"),
|
||||
"model_h1_sep": OptionInfo("<h2>HiDream</h2>", "", gr.HTML),
|
||||
|
|
@ -702,6 +702,11 @@ options_templates.update(options_section(('extra_networks', "Networks"), {
|
|||
"wildcards_enabled": OptionInfo(True, "Enable file wildcards support"),
|
||||
}))
|
||||
|
||||
options_templates.update(options_section(('extensions', "Extensions"), {
|
||||
"disable_all_extensions": OptionInfo("none", "Disable all extensions", gr.Radio, {"choices": ["none", "user", "all"]}),
|
||||
}))
|
||||
|
||||
|
||||
options_templates.update(options_section(('hidden_options', "Hidden options"), {
|
||||
# internal options
|
||||
"diffusers_version": OptionInfo("", "Diffusers version", gr.Textbox, {"visible": False}),
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ legacy_options = options_section(('legacy_options', "Legacy options"), {
|
|||
"dataset_filename_join_string": LegacyOption(" ", "Filename join string", gr.Textbox, { "visible": False }),
|
||||
"dataset_filename_word_regex": LegacyOption("", "Filename word regex", gr.Textbox, { "visible": False }),
|
||||
"diffusers_force_zeros": LegacyOption(False, "Force zeros for prompts when empty", gr.Checkbox, {"visible": False}),
|
||||
"disable_all_extensions": LegacyOption("none", "Disable all extensions (preserves the list of disabled extensions)", gr.Radio, {"choices": ["none", "user", "all"]}),
|
||||
"disable_nan_check": LegacyOption(True, "Disable NaN check", gr.Checkbox, {"visible": False}),
|
||||
"embeddings_templates_dir": LegacyOption("", "Embeddings train templates directory", gr.Textbox, { "visible": False }),
|
||||
"extra_networks_card_fit": LegacyOption("cover", "UI image contain method", gr.Radio, {"choices": ["contain", "cover", "fill"], "visible": False}),
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ def load_qwen_nunchaku(repo_id):
|
|||
transformer = None
|
||||
try:
|
||||
from nunchaku.models.transformers.transformer_qwenimage import NunchakuQwenImageTransformer2DModel
|
||||
except:
|
||||
except Exception:
|
||||
shared.log.error(f'Load module: quant=Nunchaku module=transformer repo="{repo_id}" low nunchaku version')
|
||||
return None
|
||||
if repo_id.lower().endswith('qwen-image'):
|
||||
|
|
|
|||
Loading…
Reference in New Issue