From 3b39f7cb3b9ff02a9207a45ade16bc50a21ce63d Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sat, 24 Oct 2026 10:18:12 +0700 Subject: [PATCH] #698: installing an API 4 plugin from a directory says it may offer files to save; the save strings in every catalog --- crates/ui-egui/locales/bn.toml | 4 ++++ crates/ui-egui/locales/cs.toml | 4 ++++ crates/ui-egui/locales/de.toml | 1 + crates/ui-egui/locales/en.toml | 1 + crates/ui-egui/locales/es.toml | 1 + crates/ui-egui/locales/fi.toml | 4 ++++ crates/ui-egui/locales/fr.toml | 4 ++++ crates/ui-egui/locales/id.toml | 4 ++++ crates/ui-egui/locales/ja.toml | 4 ++++ crates/ui-egui/locales/ka.toml | 4 ++++ crates/ui-egui/locales/ko.toml | 4 ++++ crates/ui-egui/locales/nl.toml | 4 ++++ crates/ui-egui/locales/pl.toml | 4 ++++ crates/ui-egui/locales/pt-BR.toml | 4 ++++ crates/ui-egui/locales/ru.toml | 4 ++++ crates/ui-egui/locales/sv.toml | 4 ++++ crates/ui-egui/locales/tr.toml | 4 ++++ crates/ui-egui/locales/zh-Hans.toml | 4 ++++ crates/ui-egui/src/plugins_browse_tests.rs | 5 +++++ crates/ui-egui/src/plugins_ui.rs | 6 ++++++ docs/plugins.md | 2 +- 21 files changed, 75 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/locales/bn.toml b/crates/ui-egui/locales/bn.toml index bc7c948c..8f4c3e10 100644 --- a/crates/ui-egui/locales/bn.toml +++ b/crates/ui-egui/locales/bn.toml @@ -324,6 +324,7 @@ status = "draft — needs native review" "Couldn't download the variables" = "ভেরিয়েবলগুলো ডাউনলোড করা যায়নি" "Couldn't reach {server}: showing what this computer remembers." = "{server}-এ পৌঁছানো যায়নি: এই কম্পিউটার যা মনে রেখেছে তা দেখানো হচ্ছে।" "Couldn't save automatically: {error}" = "স্বয়ংক্রিয়ভাবে সেভ করা যায়নি: {error}" +"Couldn't save the file" = "ফাইলটি সেভ করা যায়নি" "Count" = "গণনা" "Create" = "তৈরি করুন" "Create a variable collection first" = "প্রথমে একটি ভেরিয়েবল সংগ্রহ তৈরি করুন" @@ -1168,6 +1169,7 @@ status = "draft — needs native review" "Rulers" = "রুলার" "Run" = "চালান" "Run {label}" = "চালান {label}" +"Save file" = "ফাইল সেভ করুন" "Save files automatically" = "স্বয়ংক্রিয়ভাবে ফাইল সেভ করুন" "Search templates" = "টেমপ্লেট খুঁজুন" "See all templates" = "সব টেমপ্লেট দেখুন" @@ -1569,6 +1571,7 @@ status = "draft — needs native review" "call any command its access allows" = "এর অ্যাক্সেস অনুমতি দেয় এমন যেকোনো কমান্ড কল করুন" "call only: {commands}" = "শুধুমাত্র কল করুন: {commands}" "can edit the document" = "ডকুমেন্ট এডিট করতে পারেন" +"can save files" = "ফাইল সেভ করতে পারে" "conditional prototype actions nested too deeply were skipped" = "শর্তসাপেক্ষ প্রোটোটাইপ অ্যাকশনগুলো খুব গভীরভাবে নেস্ট করার কারণে বাদ দেওয়া হয়েছে" "conditional prototype actions with conditions that can't be evaluated were skipped" = "মূল্যায়ন করা যায় না এমন শর্তযুক্ত প্রোটোটাইপ অ্যাকশনগুলো বাদ দেওয়া হয়েছে" "connector label background was skipped: style data is missing" = "কানেক্টর লেবেলের ব্যাকগ্রাউন্ড বাদ দেওয়া হয়েছে: স্টাইল ডেটা অনুপস্থিত" @@ -1628,6 +1631,7 @@ status = "draft — needs native review" "nobody else here yet" = "এখানে আর কেউ নেই" "non-default slot settings are not represented and were skipped" = "অ-ডিফল্ট স্লট সেটিংস উপস্থাপিত হয়নি এবং বাদ দেওয়া হয়েছে" "now" = "এখন" +"offer files to save if it asks to (you choose where each one goes)" = "চাইলে সেভ করার জন্য ফাইল দিতে (প্রতিটি কোথায় যাবে, আপনি বেছে নেন)" "only in a text style or variable" = "শুধুমাত্র টেক্সট স্টাইল বা ভেরিয়েবলে" "or" = "অথবা" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "পয়েন্ট স্ট্রোক জয়েন্ট সংরক্ষিত হয়েছে; ড্যাশড বা পরিবর্তনশীল প্রস্থের স্ট্রোক লেয়ার জয়েন্ট দিয়ে রেন্ডার হয়" diff --git a/crates/ui-egui/locales/cs.toml b/crates/ui-egui/locales/cs.toml index e7a2dec1..c01ebecb 100644 --- a/crates/ui-egui/locales/cs.toml +++ b/crates/ui-egui/locales/cs.toml @@ -314,6 +314,7 @@ status = "draft — needs native review" "Corner smoothing" = "Vyhlazení rohů" "Couldn't reach {server}: showing what this computer remembers." = "Server {server} není dostupný: zobrazuje se stav uložený v tomto počítači." "Couldn't read {name}." = "Soubor {name} se nepodařilo přečíst." +"Couldn't save the file" = "Soubor se nepodařilo uložit" "Count" = "Počet" "Create" = "Vytvořit" "Create a variable collection first" = "Nejprve vytvořte kolekci proměnných" @@ -1146,6 +1147,7 @@ status = "draft — needs native review" "Rulers" = "Pravítka" "Run" = "Spustit" "Run {label}" = "Spustit {label}" +"Save file" = "Uložit soubor" "Search templates" = "Hledat šablony" "See all templates" = "Zobrazit všechny šablony" "Select layers and they space themselves as their content changes" = "Vyberte vrstvy a jejich rozestupy se přizpůsobí změnám obsahu" @@ -1535,6 +1537,7 @@ status = "draft — needs native review" "call any command its access allows" = "volat libovolný příkaz povolený jeho oprávněními" "call only: {commands}" = "volat pouze: {commands}" "can edit the document" = "může upravovat dokument" +"can save files" = "může ukládat soubory" "conditional prototype actions nested too deeply were skipped" = "podmíněné akce prototypu vnořené příliš hluboko byly přeskočeny" "conditional prototype actions with conditions that can't be evaluated were skipped" = "podmíněné akce prototypu s podmínkami, které nelze vyhodnotit, byly přeskočeny" "connector label background was skipped: style data is missing" = "pozadí popisku spojnice bylo přeskočeno: chybí data stylu" @@ -1594,6 +1597,7 @@ status = "draft — needs native review" "nobody else here yet" = "zatím tu není nikdo další" "non-default slot settings are not represented and were skipped" = "jiná než výchozí nastavení slotů nelze znázornit a byla přeskočena" "now" = "nyní" +"offer files to save if it asks to (you choose where each one goes)" = "nabízet soubory k uložení, pokud o to požádá (kam který půjde, vyberete vy)" "or" = "nebo" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "spojení tahu v bodech byla zachována; přerušované tahy a tahy s proměnnou šířkou se kreslí se spojením vrstvy" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "klíče preferovaných komponent slotů nelze přiřadit k vrstvám souboru, byly přeskočeny" diff --git a/crates/ui-egui/locales/de.toml b/crates/ui-egui/locales/de.toml index e88adab8..d614741e 100644 --- a/crates/ui-egui/locales/de.toml +++ b/crates/ui-egui/locales/de.toml @@ -1555,6 +1555,7 @@ status = "draft — needs native review" "nobody else here yet" = "noch niemand sonst hier" "non-default slot settings are not represented and were skipped" = "vom Standard abweichende Slot-Einstellungen werden nicht abgebildet und wurden übersprungen" "now" = "jetzt" +"offer files to save if it asks to (you choose where each one goes)" = "Dateien zum Speichern anbieten, falls es darum bittet (Sie wählen, wohin jede kommt)" "or" = "oder" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "die Konturecken der Punkte wurden übernommen; gestrichelte Konturen und Konturen mit variabler Breite werden mit der Ecke der Ebene gezeichnet" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "bevorzugte Komponentenschlüssel von Slots lassen sich keinen Ebenen der Datei zuordnen und wurden übersprungen" diff --git a/crates/ui-egui/locales/en.toml b/crates/ui-egui/locales/en.toml index e049d5fe..ae0daed4 100644 --- a/crates/ui-egui/locales/en.toml +++ b/crates/ui-egui/locales/en.toml @@ -1654,6 +1654,7 @@ name = "English" "nobody else here yet" = "nobody else here yet" "non-default slot settings are not represented and were skipped" = "non-default slot settings are not represented and were skipped" "now" = "now" +"offer files to save if it asks to (you choose where each one goes)" = "offer files to save if it asks to (you choose where each one goes)" "only in a text style or variable" = "only in a text style or variable" "or" = "or" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" diff --git a/crates/ui-egui/locales/es.toml b/crates/ui-egui/locales/es.toml index 1c15086d..4e006372 100644 --- a/crates/ui-egui/locales/es.toml +++ b/crates/ui-egui/locales/es.toml @@ -1655,6 +1655,7 @@ status = "draft — needs native review" "nobody else here yet" = "aún no hay nadie más" "non-default slot settings are not represented and were skipped" = "los ajustes de ranura no predeterminados no se representan y se omitieron" "now" = "ahora" +"offer files to save if it asks to (you choose where each one goes)" = "ofrecer archivos para guardar si lo pide (tú eliges dónde va cada uno)" "only in a text style or variable" = "solo en un estilo de texto o una variable" "or" = "o" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "se conservaron las uniones de trazo de los puntos; los trazos discontinuos o de ancho variable se dibujan con la unión de la capa" diff --git a/crates/ui-egui/locales/fi.toml b/crates/ui-egui/locales/fi.toml index f18ffeaf..fdd10b9a 100644 --- a/crates/ui-egui/locales/fi.toml +++ b/crates/ui-egui/locales/fi.toml @@ -326,6 +326,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "Palvelimeen {server} ei saatu yhteyttä. Näytetään tämän tietokoneen muistamat tiedot." "Couldn't read {name}." = "Tiedostoa {name} ei voitu lukea." "Couldn't save automatically: {error}" = "Automaattinen tallennus epäonnistui: {error}" +"Couldn't save the file" = "Tiedostoa ei voitu tallentaa" "Count" = "Määrä" "Create" = "Luo" "Create a variable collection first" = "Luo ensin muuttujakokoelma" @@ -1178,6 +1179,7 @@ status = "draft — needs native review" "Save" = "Tallenna" "Save as" = "Tallenna nimellä" "Save as preset…" = "Tallenna esiasetuksena…" +"Save file" = "Tallenna tiedosto" "Save files automatically" = "Tallenna tiedostot automaattisesti" "Save version {key}" = "Tallenna versio {key}" "Saved" = "Tallennettu" @@ -1574,6 +1576,7 @@ status = "draft — needs native review" "call any command its access allows" = "kutsua kaikkia käyttöoikeuksiensa sallimia komentoja" "call only: {commands}" = "kutsua vain: {commands}" "can edit the document" = "voi muokata asiakirjaa" +"can save files" = "voi tallentaa tiedostoja" "conditional prototype actions nested too deeply were skipped" = "liian syvälle sisäkkäiset ehdolliset prototyyppitoiminnot ohitettiin" "conditional prototype actions with conditions that can't be evaluated were skipped" = "ehdolliset prototyyppitoiminnot ohitettiin, koska niiden ehtoja ei voi laskea" "connector label background was skipped: style data is missing" = "yhdistimen tekstin tausta ohitettiin: tyylitiedot puuttuvat" @@ -1633,6 +1636,7 @@ status = "draft — needs native review" "nobody else here yet" = "kukaan muu ei ole vielä paikalla" "non-default slot settings are not represented and were skipped" = "oletuksesta poikkeavia sisältöpaikan asetuksia ei esitetä, ja ne ohitettiin" "now" = "nyt" +"offer files to save if it asks to (you choose where each one goes)" = "tarjota tiedostoja tallennettavaksi, jos se pyytää (valitset itse kunkin paikan)" "only in a text style or variable" = "vain tekstityylissä tai muuttujassa" "or" = "tai" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "pisteiden viivaliitokset säilytettiin; katko- ja vaihtelevanlevyiset viivat käyttävät tason liitostyyliä" diff --git a/crates/ui-egui/locales/fr.toml b/crates/ui-egui/locales/fr.toml index e5823983..1aec92cc 100644 --- a/crates/ui-egui/locales/fr.toml +++ b/crates/ui-egui/locales/fr.toml @@ -324,6 +324,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "Impossible de joindre {server} : affichage de ce dont cet ordinateur se souvient." "Couldn't read {name}." = "Impossible de lire {name}." "Couldn't save automatically: {error}" = "Impossible d’enregistrer automatiquement : {error}" +"Couldn't save the file" = "Impossible d’enregistrer le fichier" "Count" = "Nombre" "Create" = "Créer" "Create a variable collection first" = "Créez d’abord une collection de variables" @@ -1179,6 +1180,7 @@ status = "draft — needs native review" "Save" = "Enregistrer" "Save as" = "Enregistrer sous" "Save as preset…" = "Enregistrer comme préréglage…" +"Save file" = "Enregistrer le fichier" "Save files automatically" = "Enregistrer les fichiers automatiquement" "Save version {key}" = "Enregistrer une version {key}" "Saved" = "Enregistré" @@ -1577,6 +1579,7 @@ status = "draft — needs native review" "call any command its access allows" = "appeler toute commande que son accès autorise" "call only: {commands}" = "appeler seulement : {commands}" "can edit the document" = "peut modifier le document" +"can save files" = "peut enregistrer des fichiers" "conditional prototype actions nested too deeply were skipped" = "les actions de prototype conditionnelles trop profondément imbriquées ont été ignorées" "conditional prototype actions with conditions that can't be evaluated were skipped" = "les actions de prototype conditionnelles dont les conditions ne peuvent pas être évaluées ont été ignorées" "connector label background was skipped: style data is missing" = "l’arrière-plan du libellé du connecteur a été ignoré : les données de style sont manquantes" @@ -1636,6 +1639,7 @@ status = "draft — needs native review" "nobody else here yet" = "personne d’autre pour l’instant" "non-default slot settings are not represented and were skipped" = "les réglages d’emplacement autres que ceux par défaut ne sont pas représentés et ont été ignorés" "now" = "maintenant" +"offer files to save if it asks to (you choose where each one goes)" = "proposer des fichiers à enregistrer s’il le demande (vous choisissez où va chacun)" "or" = "ou" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "les jointures des points ont été conservées ; les contours en pointillés ou à largeur variable sont dessinés avec la jointure du calque" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "les clés de composants préférés des emplacements ne correspondent à aucun calque du fichier et ont été ignorées" diff --git a/crates/ui-egui/locales/id.toml b/crates/ui-egui/locales/id.toml index c06f2dff..a666b02d 100644 --- a/crates/ui-egui/locales/id.toml +++ b/crates/ui-egui/locales/id.toml @@ -318,6 +318,7 @@ status = "draft — needs native review" "Corner smoothing" = "Penghalusan sudut" "Couldn't reach {server}: showing what this computer remembers." = "Tidak dapat terhubung ke {server}: menampilkan data yang diingat komputer ini." "Couldn't read {name}." = "Tidak dapat membaca {name}." +"Couldn't save the file" = "Tidak dapat menyimpan file" "Count" = "Jumlah" "Create" = "Buat" "Create a variable collection first" = "Buat koleksi variabel terlebih dahulu" @@ -1150,6 +1151,7 @@ status = "draft — needs native review" "Rulers" = "Penggaris" "Run" = "Jalankan" "Run {label}" = "Jalankan {label}" +"Save file" = "Simpan file" "Search templates" = "Cari templat" "See all templates" = "Lihat semua templat" "Select layers and they space themselves as their content changes" = "Pilih layer dan jaraknya akan menyesuaikan saat kontennya berubah" @@ -1539,6 +1541,7 @@ status = "draft — needs native review" "call any command its access allows" = "memanggil perintah apa pun yang diizinkan aksesnya" "call only: {commands}" = "hanya memanggil: {commands}" "can edit the document" = "dapat mengedit dokumen" +"can save files" = "dapat menyimpan file" "conditional prototype actions nested too deeply were skipped" = "tindakan prototype kondisional yang bersarang terlalu dalam dilewati" "conditional prototype actions with conditions that can't be evaluated were skipped" = "tindakan prototype kondisional dengan kondisi yang tidak dapat dievaluasi dilewati" "connector label background was skipped: style data is missing" = "latar belakang label konektor dilewati: data gaya tidak ada" @@ -1598,6 +1601,7 @@ status = "draft — needs native review" "nobody else here yet" = "belum ada orang lain di sini" "non-default slot settings are not represented and were skipped" = "pengaturan slot non-default tidak dapat direpresentasikan dan dilewati" "now" = "sekarang" +"offer files to save if it asks to (you choose where each one goes)" = "menawarkan file untuk disimpan jika memintanya (Anda memilih lokasi tiap file)" "or" = "atau" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "sambungan stroke per titik dipertahankan; stroke putus-putus atau berlebar variabel digambar dengan sambungan layer" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "kunci component pilihan slot tidak dapat dicocokkan dengan layer di file dan dilewati" diff --git a/crates/ui-egui/locales/ja.toml b/crates/ui-egui/locales/ja.toml index d7ee7287..415e67f2 100644 --- a/crates/ui-egui/locales/ja.toml +++ b/crates/ui-egui/locales/ja.toml @@ -322,6 +322,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "{server} に接続できない:このコンピューターが覚えている内容を表示中。" "Couldn't read {name}." = "{name} を読み込めませんでした。" "Couldn't save automatically: {error}" = "自動保存できませんでした:{error}" +"Couldn't save the file" = "ファイルを保存できませんでした" "Count" = "数" "Create" = "作成" "Create a variable collection first" = "先に変数コレクションを作成" @@ -1166,6 +1167,7 @@ status = "draft — needs native review" "Save" = "保存" "Save as" = "名前を付けて保存" "Save as preset…" = "プリセットとして保存…" +"Save file" = "ファイルを保存" "Save files automatically" = "ファイルを自動保存" "Save version {key}" = "バージョンを保存 {key}" "Saved" = "保存済み" @@ -1558,6 +1560,7 @@ status = "draft — needs native review" "call any command its access allows" = "アクセス権で許可された任意のコマンドの呼び出し" "call only: {commands}" = "次のコマンドのみの呼び出し:{commands}" "can edit the document" = "ドキュメントを編集できる" +"can save files" = "ファイルを保存できる" "conditional prototype actions nested too deeply were skipped" = "入れ子が深すぎる条件付きプロトタイプアクションをスキップ" "conditional prototype actions with conditions that can't be evaluated were skipped" = "評価できない条件を持つ条件付きプロトタイプアクションをスキップ" "connector label background was skipped: style data is missing" = "コネクタラベルの背景をスキップ:スタイルデータがない" @@ -1617,6 +1620,7 @@ status = "draft — needs native review" "nobody else here yet" = "まだ他に誰もいない" "non-default slot settings are not represented and were skipped" = "デフォルト以外のスロット設定は再現できないためスキップ" "now" = "たった今" +"offer files to save if it asks to (you choose where each one goes)" = "要求した場合のファイル保存の提案(保存先はその都度選択)" "or" = "または" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "ポイントごとの角の形状は保持した。破線や可変幅の線はレイヤーの角の形状で描画" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "スロットの優先コンポーネントキーをファイル内のレイヤーに解決できないためスキップ" diff --git a/crates/ui-egui/locales/ka.toml b/crates/ui-egui/locales/ka.toml index 42f78be6..de5f60fe 100644 --- a/crates/ui-egui/locales/ka.toml +++ b/crates/ui-egui/locales/ka.toml @@ -326,6 +326,7 @@ status = "draft — reviewed by a native speaker, awaiting a maintainer's approv "Couldn't download the variables" = "ცვლადების ჩამოტვირთვა ვერ მოხერხდა" "Couldn't reach {server}: showing what this computer remembers." = "{server}-თან დაკავშირება ვერ მოხერხდა: ნაჩვენებია ის, რაც ამ კომპიუტერს ახსოვს." "Couldn't save automatically: {error}" = "ავტომატურად შენახვა ვერ მოხერხდა: {error}" +"Couldn't save the file" = "ფაილის შენახვა ვერ მოხერხდა" "Count" = "რაოდენობა" "Create" = "შექმნა" "Create a variable collection first" = "ჯერ შექმენით ცვლადების კოლექცია" @@ -1170,6 +1171,7 @@ status = "draft — reviewed by a native speaker, awaiting a maintainer's approv "Rulers" = "სახაზავები" "Run" = "გაშვება" "Run {label}" = "გაშვება: {label}" +"Save file" = "ფაილის შენახვა" "Save files automatically" = "ფაილების ავტომატურად შენახვა" "Search templates" = "შაბლონების ძიება" "See all templates" = "ყველა შაბლონის ნახვა" @@ -1571,6 +1573,7 @@ status = "draft — reviewed by a native speaker, awaiting a maintainer's approv "call any command its access allows" = "ნებისმიერი ბრძანების გამოძახება, რასაც მისი წვდომა უშვებს" "call only: {commands}" = "მხოლოდ გამოძახება: {commands}" "can edit the document" = "შეუძლია დოკუმენტის რედაქტირება" +"can save files" = "შეუძლია ფაილების შენახვა" "conditional prototype actions nested too deeply were skipped" = "ზედმეტად ღრმად ჩადგმული პირობითი მოქმედებები პროტოტიპში გამოტოვებულია" "conditional prototype actions with conditions that can't be evaluated were skipped" = "პროტოტიპის პირობითი მოქმედებები, რომელთა პირობების გამოთვლა ვერ ხერხდება, გამოტოვებულია" "connector label background was skipped: style data is missing" = "შემაერთებლის იარლიყის ფონი გამოტოვებულია: სტილის მონაცემები აკლია" @@ -1630,6 +1633,7 @@ status = "draft — reviewed by a native speaker, awaiting a maintainer's approv "nobody else here yet" = "აქ ჯერ სხვა არავინაა" "non-default slot settings are not represented and were skipped" = "სლოტის არანაგულისხმევი პარამეტრები არ არის წარმოდგენილი და გამოტოვებულია" "now" = "ახლა" +"offer files to save if it asks to (you choose where each one goes)" = "შესანახად ფაილების შეთავაზება, თუ ამას ითხოვს (თითოეულის ადგილს თქვენ ირჩევთ)" "only in a text style or variable" = "მხოლოდ ტექსტის სტილში ან ცვლადში" "or" = "ან" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "წერტილების კონტურის შეერთებები შენარჩუნებულია; ტირეებიანი ან ცვლადი სისქის კონტურები შრის შეერთებით გამოისახება" diff --git a/crates/ui-egui/locales/ko.toml b/crates/ui-egui/locales/ko.toml index 66eb54c2..6e7f5ed0 100644 --- a/crates/ui-egui/locales/ko.toml +++ b/crates/ui-egui/locales/ko.toml @@ -311,6 +311,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "{server}에 연결할 수 없음: 이 컴퓨터가 기억하는 내용을 표시함." "Couldn't read {name}." = "{name}을(를) 읽을 수 없습니다." "Couldn't save automatically: {error}" = "자동으로 저장할 수 없음: {error}" +"Couldn't save the file" = "파일을 저장할 수 없음" "Count" = "개수" "Create" = "만들기" "Create a variable collection first" = "먼저 변수 컬렉션을 만드세요" @@ -1116,6 +1117,7 @@ status = "draft — needs native review" "Save" = "저장" "Save as" = "다른 이름으로 저장" "Save as preset…" = "프리셋으로 저장…" +"Save file" = "파일 저장" "Save files automatically" = "파일 자동 저장" "Save version {key}" = "버전 저장 {key}" "Saved" = "저장됨" @@ -1485,6 +1487,7 @@ status = "draft — needs native review" "call any command its access allows" = "접근 권한이 허용하는 모든 명령 호출" "call only: {commands}" = "다음 명령만 호출: {commands}" "can edit the document" = "문서를 편집할 수 있음" +"can save files" = "파일을 저장할 수 있음" "conditional prototype actions nested too deeply were skipped" = "너무 깊게 중첩된 조건부 프로토타입 액션을 건너뜀" "conditional prototype actions with conditions that can't be evaluated were skipped" = "평가할 수 없는 조건이 있는 조건부 프로토타입 액션을 건너뜀" "connector label background was skipped: style data is missing" = "커넥터 레이블 배경을 건너뜀: 스타일 데이터가 없음" @@ -1543,6 +1546,7 @@ status = "draft — needs native review" "nobody else here yet" = "아직 다른 사람이 없음" "non-default slot settings are not represented and were skipped" = "기본값이 아닌 슬롯 설정은 표현할 수 없어 건너뜀" "now" = "방금" +"offer files to save if it asks to (you choose where each one goes)" = "요청하는 경우 저장할 파일 제공(각 파일의 위치는 직접 선택)" "or" = "또는" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "점별 선 연결을 유지함. 파선이나 가변 너비 선은 레이어의 선 연결로 그려짐" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "슬롯의 기본 설정 컴포넌트 키를 파일의 레이어로 확인할 수 없어 건너뜀" diff --git a/crates/ui-egui/locales/nl.toml b/crates/ui-egui/locales/nl.toml index 84f13545..eb0cf440 100644 --- a/crates/ui-egui/locales/nl.toml +++ b/crates/ui-egui/locales/nl.toml @@ -326,6 +326,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "Kon {server} niet bereiken: toont wat deze computer onthoudt." "Couldn't read {name}." = "Kon {name} niet lezen." "Couldn't save automatically: {error}" = "Kan niet automatisch opslaan: {error}" +"Couldn't save the file" = "Kan het bestand niet opslaan" "Count" = "Aantal" "Create" = "Maken" "Create a variable collection first" = "Maak eerst een variabeleverzameling" @@ -1178,6 +1179,7 @@ status = "draft — needs native review" "Save" = "Opslaan" "Save as" = "Opslaan als" "Save as preset…" = "Opslaan als preset…" +"Save file" = "Bestand opslaan" "Save files automatically" = "Bestanden automatisch opslaan" "Save version {key}" = "Versie opslaan {key}" "Saved" = "Opgeslagen" @@ -1574,6 +1576,7 @@ status = "draft — needs native review" "call any command its access allows" = "elke opdracht aanroepen die diens toegang toestaat" "call only: {commands}" = "alleen aanroepbaar: {commands}" "can edit the document" = "kan het document bewerken" +"can save files" = "kan bestanden opslaan" "conditional prototype actions nested too deeply were skipped" = "Voorwaardelijke prototype-acties die te diep genest zijn, zijn overgeslagen" "conditional prototype actions with conditions that can't be evaluated were skipped" = "voorwaardelijke prototypeacties met voorwaarden die niet konden worden geëvalueerd zijn overgeslagen" "connector label background was skipped: style data is missing" = "achtergrond van connectorlabel overgeslagen: stijldata ontbreekt" @@ -1633,6 +1636,7 @@ status = "draft — needs native review" "nobody else here yet" = "nog niemand anders hier" "non-default slot settings are not represented and were skipped" = "niet-standaard slot-instellingen zijn niet overgenomen en zijn overgeslagen" "now" = "nu" +"offer files to save if it asks to (you choose where each one goes)" = "bestanden aanbieden om op te slaan als het daarom vraagt (jij kiest waar elk bestand komt)" "only in a text style or variable" = "alleen in een tekststijl of variabele" "or" = "of" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "Lijnverbindingen op punten zijn behouden; gestreepte lijnen of lijnen met variabele breedte worden weergegeven met de verbinding van de laag" diff --git a/crates/ui-egui/locales/pl.toml b/crates/ui-egui/locales/pl.toml index 7f301a6e..c3538668 100644 --- a/crates/ui-egui/locales/pl.toml +++ b/crates/ui-egui/locales/pl.toml @@ -323,6 +323,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "Nie udało się połączyć z {server}: pokazywanie zawartości zapamiętanej przez ten komputer." "Couldn't read {name}." = "Nie udało się odczytać pliku {name}." "Couldn't save automatically: {error}" = "Nie udało się zapisać automatycznie: {error}" +"Couldn't save the file" = "Nie udało się zapisać pliku" "Count" = "Licznik" "Create" = "Utwórz" "Create a variable collection first" = "Najpierw utwórz kolekcję zmiennych" @@ -1168,6 +1169,7 @@ status = "draft — needs native review" "Rulers" = "Linijki" "Run" = "Uruchom" "Run {label}" = "Uruchom {label}" +"Save file" = "Zapisz plik" "Save files automatically" = "Zapisuj pliki automatycznie" "Search templates" = "Szukaj szablonów" "See all templates" = "Zobacz wszystkie szablony" @@ -1569,6 +1571,7 @@ status = "draft — needs native review" "call any command its access allows" = "wywołaj dowolne polecenie, na które zezwala dostęp" "call only: {commands}" = "wywołaj tylko: {commands}" "can edit the document" = "może edytować dokument" +"can save files" = "może zapisywać pliki" "conditional prototype actions nested too deeply were skipped" = "zbyt głęboko zagnieżdżone warunkowe akcje prototypu zostały pominięte" "conditional prototype actions with conditions that can't be evaluated were skipped" = "warunkowe akcje prototypu z warunkami niemożliwymi do obliczenia zostały pominięte" "connector label background was skipped: style data is missing" = "tło etykiety łącznika zostało pominięte: brak danych stylu" @@ -1628,6 +1631,7 @@ status = "draft — needs native review" "nobody else here yet" = "nikogo innego tu jeszcze nie ma" "non-default slot settings are not represented and were skipped" = "niedomyślne ustawienia gniazd nie są reprezentowane i zostały pominięte" "now" = "teraz" +"offer files to save if it asks to (you choose where each one goes)" = "proponować pliki do zapisania, jeśli o to poprosi (miejsce każdego wybierasz sam)" "only in a text style or variable" = "tylko w stylu tekstu lub zmiennej" "or" = "lub" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "połączenia punktów obrysu zostały zachowane; obrysy przerywane lub o zmiennej szerokości renderują się z łączeniem warstwy" diff --git a/crates/ui-egui/locales/pt-BR.toml b/crates/ui-egui/locales/pt-BR.toml index 22fffb17..62084c28 100644 --- a/crates/ui-egui/locales/pt-BR.toml +++ b/crates/ui-egui/locales/pt-BR.toml @@ -310,6 +310,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "Não foi possível alcançar {server}: mostrando o que este computador lembra." "Couldn't read {name}." = "Não foi possível ler {name}." "Couldn't save automatically: {error}" = "Não foi possível salvar automaticamente: {error}" +"Couldn't save the file" = "Não foi possível salvar o arquivo" "Count" = "Quantidade" "Create" = "Criar" "Create a variable collection first" = "Crie primeiro uma coleção de variáveis" @@ -1115,6 +1116,7 @@ status = "draft — needs native review" "Save" = "Salvar" "Save as" = "Salvar como" "Save as preset…" = "Salvar como predefinição…" +"Save file" = "Salvar arquivo" "Save files automatically" = "Salvar arquivos automaticamente" "Save version {key}" = "Salvar versão {key}" "Saved" = "Salvo" @@ -1484,6 +1486,7 @@ status = "draft — needs native review" "call any command its access allows" = "chamar qualquer comando que seu acesso permita" "call only: {commands}" = "chamar apenas: {commands}" "can edit the document" = "pode editar o documento" +"can save files" = "pode salvar arquivos" "conditional prototype actions nested too deeply were skipped" = "ações condicionais de protótipo aninhadas profundamente demais foram ignoradas" "conditional prototype actions with conditions that can't be evaluated were skipped" = "ações condicionais de protótipo com condições que não podem ser avaliadas foram ignoradas" "connector label background was skipped: style data is missing" = "o fundo do rótulo do conector foi ignorado: faltam os dados de estilo" @@ -1542,6 +1545,7 @@ status = "draft — needs native review" "nobody else here yet" = "ainda não há mais ninguém" "non-default slot settings are not represented and were skipped" = "configurações de slot diferentes do padrão não são representadas e foram ignoradas" "now" = "agora" +"offer files to save if it asks to (you choose where each one goes)" = "oferecer arquivos para salvar, se pedir (você escolhe onde cada um fica)" "or" = "ou" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "as junções de traço por ponto foram mantidas; traços tracejados ou de largura variável são desenhados com a junção da camada" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "chaves de componentes preferidos de slots não correspondem a camadas do arquivo e foram ignoradas" diff --git a/crates/ui-egui/locales/ru.toml b/crates/ui-egui/locales/ru.toml index baba56fd..3bf386b5 100644 --- a/crates/ui-egui/locales/ru.toml +++ b/crates/ui-egui/locales/ru.toml @@ -325,6 +325,7 @@ name = "Русский" "Couldn't reach {server}: showing what this computer remembers." = "Не удалось связаться с {server}: показаны данные, сохранённые на этом компьютере." "Couldn't read {name}." = "Не удалось прочитать {name}." "Couldn't save automatically: {error}" = "Не удалось сохранить автоматически: {error}" +"Couldn't save the file" = "Не удалось сохранить файл" "Count" = "Количество" "Create" = "Создать" "Create a variable collection first" = "Сначала создайте коллекцию переменных" @@ -1177,6 +1178,7 @@ name = "Русский" "Rulers" = "Линейки" "Run" = "Запустить" "Run {label}" = "Запустить {label}" +"Save file" = "Сохранить файл" "Save files automatically" = "Автоматически сохранять файлы" "Search pages" = "Поиск страниц" "Search templates" = "Поиск шаблонов" @@ -1584,6 +1586,7 @@ name = "Русский" "call any command its access allows" = "вызывать любые команды в рамках разрешений" "call only: {commands}" = "вызывать только: {commands}" "can edit the document" = "может редактировать документ" +"can save files" = "может сохранять файлы" "conditional prototype actions nested too deeply were skipped" = "условные действия прототипа со слишком глубокой вложенностью пропущены" "conditional prototype actions with conditions that can't be evaluated were skipped" = "условные действия прототипа с условиями, которые нельзя вычислить, пропущены" "connector label background was skipped: style data is missing" = "фон подписи соединительной линии пропущен: нет данных стиля" @@ -1643,6 +1646,7 @@ name = "Русский" "nobody else here yet" = "здесь пока больше никого нет" "non-default slot settings are not represented and were skipped" = "нестандартные настройки слотов не передаются и пропущены" "now" = "сейчас" +"offer files to save if it asks to (you choose where each one goes)" = "предлагать файлы для сохранения, если запросит (куда сохранить каждый, выбираете вы)" "only in a text style or variable" = "только в текстовом стиле или переменной" "or" = "или" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "соединения обводки в точках сохранены; пунктирные обводки и обводки переменной ширины рисуются с соединением слоя" diff --git a/crates/ui-egui/locales/sv.toml b/crates/ui-egui/locales/sv.toml index be25d38e..e5af1e18 100644 --- a/crates/ui-egui/locales/sv.toml +++ b/crates/ui-egui/locales/sv.toml @@ -320,6 +320,7 @@ name = "Svenska" "Couldn't reach {server}: showing what this computer remembers." = "Det gick inte att nå {server}: visar det som den här datorn minns." "Couldn't read {name}." = "Det gick inte att läsa {name}." "Couldn't save automatically: {error}" = "Det gick inte att spara automatiskt: {error}" +"Couldn't save the file" = "Det gick inte att spara filen" "Count" = "Antal" "Create" = "Skapa" "Create a variable collection first" = "Skapa en variabelsamling först" @@ -1160,6 +1161,7 @@ name = "Svenska" "Rulers" = "Linjaler" "Run" = "Kör" "Run {label}" = "Kör {label}" +"Save file" = "Spara fil" "Save files automatically" = "Spara filer automatiskt" "Search templates" = "Sök mallar" "See all templates" = "Se alla mallar" @@ -1557,6 +1559,7 @@ name = "Svenska" "call any command its access allows" = "anropa alla kommandon som dess åtkomst tillåter" "call only: {commands}" = "anropa endast: {commands}" "can edit the document" = "kan redigera dokumentet" +"can save files" = "kan spara filer" "conditional prototype actions nested too deeply were skipped" = "villkorliga prototypåtgärder som var nästlade för djupt hoppades över" "conditional prototype actions with conditions that can't be evaluated were skipped" = "villkorliga prototypåtgärder med villkor som inte kan utvärderas hoppades över" "connector label background was skipped: style data is missing" = "bakgrunden till etiketten på en kopplingslinje hoppades över: stildata saknas" @@ -1616,6 +1619,7 @@ name = "Svenska" "nobody else here yet" = "ingen annan här än" "non-default slot settings are not represented and were skipped" = "fackinställningar som avviker från standard återges inte och hoppades över" "now" = "nu" +"offer files to save if it asks to (you choose where each one goes)" = "erbjuda filer att spara om den ber om det (du väljer var varje fil hamnar)" "or" = "eller" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "punkternas hörntyper behölls; streckade konturer och konturer med variabel bredd ritas med lagrets hörntyp" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "nycklar för föredragna komponenter i fack kan inte kopplas till lager i filen och hoppades över" diff --git a/crates/ui-egui/locales/tr.toml b/crates/ui-egui/locales/tr.toml index 5d15c9c9..5e71a784 100644 --- a/crates/ui-egui/locales/tr.toml +++ b/crates/ui-egui/locales/tr.toml @@ -318,6 +318,7 @@ name = "Türkçe" "Corner smoothing" = "Köşe yumuşatma" "Couldn't reach {server}: showing what this computer remembers." = "{server} sunucusuna ulaşılamadı: bu bilgisayarın hatırladıkları gösteriliyor." "Couldn't read {name}." = "{name} okunamadı." +"Couldn't save the file" = "Dosya kaydedilemedi" "Count" = "Sayı" "Create" = "Oluştur" "Create a variable collection first" = "Önce bir değişken koleksiyonu oluşturun" @@ -1150,6 +1151,7 @@ name = "Türkçe" "Rulers" = "Cetveller" "Run" = "Çalıştır" "Run {label}" = "Çalıştır: {label}" +"Save file" = "Dosyayı kaydet" "Search templates" = "Şablonlarda ara" "See all templates" = "Tüm şablonları gör" "Select layers and they space themselves as their content changes" = "Katmanları seçin; içerikleri değiştikçe kendi aralıklarını ayarlarlar" @@ -1539,6 +1541,7 @@ name = "Türkçe" "call any command its access allows" = "erişiminin izin verdiği her komutu çağırmak" "call only: {commands}" = "yalnızca şunları çağırmak: {commands}" "can edit the document" = "belgeyi düzenleyebilir" +"can save files" = "dosya kaydedebilir" "conditional prototype actions nested too deeply were skipped" = "çok derin iç içe geçmiş koşullu prototip eylemleri atlandı" "conditional prototype actions with conditions that can't be evaluated were skipped" = "değerlendirilemeyen koşullara sahip koşullu prototip eylemleri atlandı" "connector label background was skipped: style data is missing" = "bağlayıcı etiketinin arka planı atlandı: stil verileri eksik" @@ -1598,6 +1601,7 @@ name = "Türkçe" "nobody else here yet" = "burada henüz başka kimse yok" "non-default slot settings are not represented and were skipped" = "varsayılan dışındaki yuva ayarları aktarılamıyor ve atlandı" "now" = "şimdi" +"offer files to save if it asks to (you choose where each one goes)" = "isterse kaydedilecek dosya sunmak (her birinin yerini siz seçersiniz)" "or" = "veya" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "nokta başına kontur birleşimleri korundu; kesikli veya değişken genişlikli konturlar katmanın birleşimiyle çizilir" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "yuvaların tercih edilen bileşen anahtarları dosyadaki katmanlarla eşleştirilemedi ve atlandı" diff --git a/crates/ui-egui/locales/zh-Hans.toml b/crates/ui-egui/locales/zh-Hans.toml index 7add99c5..1348a1ae 100644 --- a/crates/ui-egui/locales/zh-Hans.toml +++ b/crates/ui-egui/locales/zh-Hans.toml @@ -312,6 +312,7 @@ status = "draft — needs native review" "Couldn't reach {server}: showing what this computer remembers." = "无法连接 {server}:显示的是这台电脑记录的内容。" "Couldn't read {name}." = "无法读取 {name}。" "Couldn't save automatically: {error}" = "无法自动保存:{error}" +"Couldn't save the file" = "无法保存文件" "Count" = "数量" "Create" = "创建" "Create a variable collection first" = "请先创建变量集合" @@ -1117,6 +1118,7 @@ status = "draft — needs native review" "Save" = "保存" "Save as" = "另存为" "Save as preset…" = "存储为预设…" +"Save file" = "保存文件" "Save files automatically" = "自动保存文件" "Save version {key}" = "保存版本 {key}" "Saved" = "已保存" @@ -1486,6 +1488,7 @@ status = "draft — needs native review" "call any command its access allows" = "调用其访问权限允许的任何命令" "call only: {commands}" = "仅调用:{commands}" "can edit the document" = "可编辑文档" +"can save files" = "可以保存文件" "conditional prototype actions nested too deeply were skipped" = "已跳过嵌套过深的条件原型操作" "conditional prototype actions with conditions that can't be evaluated were skipped" = "已跳过条件无法求值的条件原型操作" "connector label background was skipped: style data is missing" = "已跳过连接线标签背景:缺少样式数据" @@ -1544,6 +1547,7 @@ status = "draft — needs native review" "nobody else here yet" = "这里还没有其他人" "non-default slot settings are not represented and were skipped" = "非默认的插槽设置无法表示,已跳过" "now" = "刚刚" +"offer files to save if it asks to (you choose where each one goes)" = "在请求时提供要保存的文件(每个文件的保存位置由你选择)" "or" = "或" "point stroke joins were preserved; dashed or variable-width strokes render with the layer join" = "已保留各点的描边转角;虚线描边或可变宽度描边以图层的转角绘制" "preferred slot component keys cannot be resolved to file nodes and were skipped" = "插槽的首选组件键无法对应到文件中的图层,已跳过" diff --git a/crates/ui-egui/src/plugins_browse_tests.rs b/crates/ui-egui/src/plugins_browse_tests.rs index 50585c48..a4a2d6ce 100644 --- a/crates/ui-egui/src/plugins_browse_tests.rs +++ b/crates/ui-egui/src/plugins_browse_tests.rs @@ -170,6 +170,11 @@ fn install_asks_first_and_then_installs() { for shown in ["read and edit the document", "call only: shape.rectangle", "From ws://127.0.0.1:9/"] { assert!(shows(&mut u, shown), "the confirmation shows {shown:?}"); } + // An API 4 plugin may ask to save files: the confirmation says so. + let save = "offer files to save"; + assert!(!shows(&mut u, save)); + u.app.session.plugins.directory.as_mut().unwrap().entries[0].api = 4; + assert!(shows(&mut u, save), "an API 4 plugin's confirmation mentions saving files"); let confirm = named(&mut u, "Install").into_iter().map(|n| centre(&n)).find(|p| p.distance(row_at) > 4.0).unwrap(); click(&mut u, confirm); assert_eq!(*fetched.lock().unwrap(), 1); diff --git a/crates/ui-egui/src/plugins_ui.rs b/crates/ui-egui/src/plugins_ui.rs index 7933fa7b..2f30ac69 100644 --- a/crates/ui-egui/src/plugins_ui.rs +++ b/crates/ui-egui/src/plugins_ui.rs @@ -477,6 +477,12 @@ fn confirm_window(app: &mut FigApp, ctx: &Context, t: &Tokens) { if e.widget { asks.push(tr("put a widget on the canvas").to_string()); } + // shortcut: a directory entry doesn't say whether the manifest asks for `saveFile` (a new + // field would break the entries' postcard wire format), so every API 4 plugin says it may; + // carry the permission in the entry once the directory protocol negotiates new fields. + if e.api >= 4 { + asks.push(tr("offer files to save if it asks to (you choose where each one goes)").to_string()); + } for a in asks { ui.add(egui::Label::new(RichText::new(format!("• {a}")).font(regular(11.0)).color(t.text)).wrap()); } diff --git a/docs/plugins.md b/docs/plugins.md index 6df9a863..18206e91 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -225,7 +225,7 @@ plugin directory requests (`plugin.directory.*` says so). Import plugins with `p | `author` | Optional: who made it, as you type it (64 characters at most); plugin directories show it. | | `main` | Required. The module, a `.wasm` path relative to the manifest, inside its folder. | | `api` | The plugin API version the plugin was written for: `1` (the default), `2` (panels and settings), `3` (widgets) or `4` (saving files). A manifest asking for a newer one than FigCraft runs is refused, so a plugin that needs panels, widgets or `saveFile` fails clearly on an older FigCraft. | -| `permissions.saveFile` | API 4: `true` lets the plugin offer a file to save (an exporter's output). FigCraft asks the user where it goes with its own Save dialog (a download in the browser); the plugin never gets a path. Manage plugins lists it ("can save files"); a plugin directory's entries don't carry it, so their wire format stays as it is. | +| `permissions.saveFile` | API 4: `true` lets the plugin offer a file to save (an exporter's output). FigCraft asks the user where it goes with its own Save dialog (a download in the browser); the plugin never gets a path. Manage plugins lists it ("can save files"). A plugin directory's entries don't carry it (their wire format stays as it is), so installing any API 4 plugin from one says it may offer files to save. | | `widget` | API 3: `true` when the plugin draws a widget (it's listed in Plugins ▸ Widgets). | | `permissions.access` | `read` (the default): commands that leave the document as it is; such plugins also run from Dev Mode's Inspect tab. `write`: edits too. | | `permissions.commands` | Optional allowlist: exact command ids or prefixes ending in `*` (`node.*`). Empty: any command the access allows. |