Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apps/mint/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,14 @@ API `https://mint-api.juw12.workers.dev/api/health`
formulas follow the renamed tabs.
- **Links pick the language (3.5.1).** Add `?lang=en|id|zh|es` to any Mint link (Budget, the marketplace, the
legal pages) and it opens in that language without changing the reader's saved choice.
- **Every Studio reply, every language (3.5.4).** The rarer replies are translated too (`列“供应商”已存在。`,
`Rumus salah: kolom [Foo] tidak ada.`, `Ya hay otra columna llamada “Precio”.`), Indonesian gets highlights and
card words (`sorot Laba kurang dari 0 merah`, `rata-rata Jumlah`), and the “didn’t understand” hint suggests
commands in your language that really work. Describing your own tracker works in Chinese and Spanish too
(`建一个装修记录表,列:项目、费用、日期`, `columnas: Producto, Precio y Fecha`), and the example chips send the
words you see on them. `add a row` works without a number in every language (`加一行`, `añade una fila`,
`tambah baris`), Chinese highlights can name the column first (`利润 小于 0 标红`), and Spanish theme names work
(`cambia el tema a medianoche`).
- **Studio speaks your language all the way (3.5.3).** Replies no longer leave English bits behind: theme names
(`主题已设为午夜(深色)`, `Tema cambiado a Bosque`), column types (`teks`, `数字`, `fecha`) and card functions are
translated, and a dashboard card added by a command (`合计 数量`, `promedio de cantidad`) is labelled in the
Expand Down
2 changes: 1 addition & 1 deletion apps/mint/desktop/mint.spec
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import os
import sys

DESKTOP = os.path.dirname(os.path.abspath(SPEC)) # noqa: F821 (provided by PyInstaller)
VERSION = os.environ.get("MINT_VERSION", "3.5.3")
VERSION = os.environ.get("MINT_VERSION", "3.5.4")
VERSION_FILE = os.environ.get("MINT_VERSION_FILE") or None
ICON = os.environ.get("MINT_ICON") or None
IS_WIN = sys.platform == "win32"
Expand Down
2 changes: 1 addition & 1 deletion apps/mint/desktop/mint_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import urllib.request
import webbrowser

VERSION = "3.5.3"
VERSION = "3.5.4"
TITLE = "Mint"
APP_URL = os.environ.get("MINT_DESKTOP_URL") or "https://juw12.github.io/projects/mint/"
DEFAULT_SIZE = (1280, 860)
Expand Down
28 changes: 27 additions & 1 deletion apps/mint/tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,23 @@ def seed_checks():
esRemove: tEsRemove.spec.sheet.columns.map(function (c) { return c.name; }),
esSum: tEsSum.spec.summary.map(function (s) { return s.fn + ":" + s.column; }),
esCur: tEsCur.spec.currency,
zhGenTheme: C.generate("网店库存表,绿色").spec.theme
zhGenTheme: C.generate("网店库存表,绿色").spec.theme,
// 3.5.4: Indonesian highlight and card words
idRule: C.applyTweak(budget, "sorot Actual lebih dari 500 merah").spec.rules.slice(-1)
.map(function (k) { return k.column + k.op + k.value + ":" + k.style; })[0],
idAvg: C.applyTweak(budget, "rata-rata Actual").spec.summary.slice(-1).map(function (s) { return s.fn + ":" + s.column; })[0],
zhListed: C.generate("建一个互助会记录表,列:姓名、日期、存款").spec.sheet.columns.map(function (c) { return c.name + ":" + c.type; }),
esListed: C.generate("Crea una plantilla de tanda con columnas: Nombre, Fecha y Aporte").spec.sheet.columns.map(function (c) { return c.name + ":" + c.type; }),
zhListedTitle: C.generate("建一个互助会记录表,列:姓名、日期、存款").spec.title,
zhListedOwn: C.generate("建一个装修记录表,列:项目、费用、日期").spec.blueprint,
oneRow: ["add a row", "加一行", "añade una fila", "tambah baris"].map(function (cmd) {
return C.applyTweak(budget, cmd).spec.sheet.rows.length - budget.sheet.rows.length;
}),
zhColumnFirst: C.applyTweak(budget, "Actual 小于 0 标红").spec.rules.slice(-1)
.map(function (k) { return k.column + k.op + k.value + ":" + k.style; })[0],
esThemeWord: C.applyTweak(budget, "cambia el tema a medianoche").spec.theme,
enStill: C.applyTweak(budget, "warnai Actual below 0 red").spec.rules.slice(-1)
.map(function (k) { return k.column + k.op + k.value + ":" + k.style; })[0]
};
out.tweaks = {
rows: t1.spec.sheet.rows.length,
Expand Down Expand Up @@ -376,6 +392,16 @@ def js_checks():
check("SUM:Actual" in intl["esSum"], "es 'suma de'")
check(intl["esCur"] == "MXN", "es currency words")
check(intl["zhGenTheme"] == "forest", "zh colour word picks the theme in prompts")
check(intl["idRule"] == "Actual>500:bad", "id 'sorot … lebih dari … merah' " + str(intl["idRule"]))
check(intl["idAvg"] == "AVERAGE:Actual", "id 'rata-rata' card " + str(intl["idAvg"]))
check(intl["enStill"] == "Actual<0:bad", "English 'warnai … below' still works " + str(intl["enStill"]))
check(intl["zhListed"] == ["姓名:text", "日期:date", "存款:currency"], "zh '列:' column list with types " + str(intl["zhListed"]))
check(intl["esListed"] == ["Nombre:text", "Fecha:date", "Aporte:currency"], "es 'con columnas:' list with types " + str(intl["esListed"]))
check(intl["zhListedTitle"] == "互助会记录表", "zh custom title stops before the column list " + intl["zhListedTitle"])
check(intl["zhListedOwn"] == "custom", "a listed column called 项目 does not pick the project blueprint " + intl["zhListedOwn"])
check(intl["oneRow"] == [1, 1, 1, 1], "add a row without a number works in en/zh/es/id " + str(intl["oneRow"]))
check(intl["zhColumnFirst"] == "Actual<0:bad", "zh column-first highlight 标红 " + str(intl["zhColumnFirst"]))
check(intl["esThemeWord"] == "midnight", "es theme word medianoche " + str(intl["esThemeWord"]))
check(out["diffRows"] == [p[0] - p[1] for p in pairs], "Diff column evaluates per row")

f = out["formulas"]
Expand Down
2 changes: 1 addition & 1 deletion apps/mint/web/budget/js/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
(function (root) {
'use strict';
const K = (root.MintBudget = root.MintBudget || {});
K.VERSION = '3.5.3';
K.VERSION = '3.5.4';

/** Compare dotted versions numerically: 1, 0 or -1 ("1.10.0" is newer than "1.9.9"). */
K.compareVersions = function (a, b) {
Expand Down
2 changes: 1 addition & 1 deletion apps/mint/web/budget/sw.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* Mint Budget service worker: network-first app shell so updates land immediately, cache as offline fallback.
* Scope is budget/ only; Mint Templates (../app.html) has its own worker at ../sw.js. */
const CACHE = 'mint-budget-v18';
const CACHE = 'mint-budget-v19';
// Caches this worker owns: its own generations, plus the ones versions before Mint 3.0 left behind.
// Never touch other caches: every app on this origin shares one CacheStorage.
const OWN_CACHE = /^(mint-budget-v|kitty-v)/;
Expand Down
18 changes: 9 additions & 9 deletions apps/mint/web/budget/version.json
Original file line number Diff line number Diff line change
@@ -1,46 +1,46 @@
{
"version": "3.5.3",
"version": "3.5.4",
"released": "2026-11-09",
"notes": {
"en": [
"Templates Studio answers every message in your language, including “that column already exists” and formula errors, and understands Indonesian highlights like “sorot Laba kurang dari 0 merah”.",
"Templates Studio answers fully in your language: theme names, column types and the dashboard cards a command adds (like 数量合计 or Promedio de cantidad) no longer slip into English.",
"Templates come out in your language: a prompt in Indonesian, Chinese or Spanish gives column names, dropdowns, cards and sample rows in that language, with every formula still working.",
"Links can choose the language: add ?lang=es (or id, zh, en) and Budget, the marketplace and the legal pages open in it, without changing your saved choice.",
"Templates Studio understands Chinese and Spanish commands, like 添加供应商列 or añade la columna Proveedor.",
"Live prices in Invest: stocks and ETFs (IDX and US), crypto and gold update from the market. Tap Refresh prices any time; prices you type yourself stay until you refresh.",
"Mint asks your browser to keep its data, shows when you last backed up, and reminds you to sync or back up once a budget has real history.",
"Templates and the Marketplace now speak Chinese and Spanish too, and downloaded .xlsx files use your language for tabs and tips.",
"Privacy and Terms are available in Indonesian, Chinese and Spanish."
"Templates and the Marketplace now speak Chinese and Spanish too, and downloaded .xlsx files use your language for tabs and tips."
],
"id": [
"Studio Template menjawab setiap pesan dalam bahasamu, termasuk “kolom sudah ada” dan kesalahan rumus, dan kini paham perintah sorot seperti “sorot Laba kurang dari 0 merah”.",
"Studio Template menjawab sepenuhnya dalam bahasamu: nama tema, jenis kolom, dan kartu dashboard yang ditambahkan lewat perintah tidak lagi muncul dalam bahasa Inggris.",
"Template kini keluar dalam bahasamu: perintah dalam Bahasa Indonesia, Mandarin, atau Spanyol menghasilkan nama kolom, pilihan, kartu, dan contoh baris dalam bahasa itu, dengan semua rumus tetap berjalan.",
"Tautan bisa memilih bahasa: tambahkan ?lang=id (atau en, zh, es) dan Budget, marketplace, serta halaman legal terbuka dalam bahasa itu tanpa mengubah pilihan tersimpanmu.",
"Studio Template kini memahami perintah berbahasa Mandarin dan Spanyol, seperti 添加供应商列 atau añade la columna Proveedor.",
"Harga live di Investasi: saham dan ETF (BEI dan AS), kripto, dan emas mengikuti pasar. Ketuk Perbarui harga kapan saja; harga yang kamu isi sendiri tetap sampai kamu memperbarui.",
"Mint meminta browser menyimpan datanya, menampilkan kapan terakhir kamu mencadangkan, dan mengingatkan untuk sinkron atau mencadangkan saat anggaran sudah berisi banyak riwayat.",
"Template dan Marketplace kini juga berbahasa Mandarin dan Spanyol, dan file .xlsx yang diunduh memakai bahasamu untuk tab dan petunjuk.",
"Privasi dan Ketentuan tersedia dalam bahasa Indonesia, Mandarin, dan Spanyol."
"Template dan Marketplace kini juga berbahasa Mandarin dan Spanyol, dan file .xlsx yang diunduh memakai bahasamu untuk tab dan petunjuk."
],
"zh": [
"模板工作室的每条回复都使用你的语言,包括“列已存在”和公式错误提示;也能听懂印尼语的高亮指令。",
"模板工作室完全用你的语言回复:主题名称、列类型以及通过指令添加的仪表盘卡片(例如“数量合计”)不再夹杂英文。",
"模板现在用你的语言生成:用中文、印尼语或西班牙语描述,列名、下拉选项、汇总卡片和示例行都会是该语言,所有公式照常运行。",
"链接可以指定语言:加上 ?lang=zh(或 en、id、es),预算、市场和法律页面就会以该语言打开,不会改变你保存的设置。",
"模板工作室现在能听懂中文和西班牙语指令,例如“添加供应商列”或“añade la columna Proveedor”。",
"投资页实时价格:股票和 ETF(印尼与美股)、加密货币和黄金按市场价更新。随时点“刷新价格”;你手动填写的价格会保留到你刷新为止。",
"Mint 会请求浏览器保留数据,显示上次备份时间,并在预算有了足够记录后提醒你同步或备份。",
"模板和市场现在也支持中文和西班牙语,下载的 .xlsx 文件的工作表名称和提示也使用你的语言。",
"隐私政策和条款现提供印尼语、中文和西班牙语版本。"
"模板和市场现在也支持中文和西班牙语,下载的 .xlsx 文件的工作表名称和提示也使用你的语言。"
],
"es": [
"El estudio de Plantillas responde cada mensaje en tu idioma, incluidos «la columna ya existe» y los errores de fórmula, y entiende resaltados en indonesio.",
"El estudio de Plantillas responde del todo en tu idioma: los nombres de tema, los tipos de columna y las tarjetas del panel que añade una orden (como «Promedio de cantidad») ya no salen en inglés.",
"Las plantillas salen en tu idioma: una petición en español, chino o indonesio da nombres de columna, listas, tarjetas y filas de ejemplo en ese idioma, y todas las fórmulas siguen funcionando.",
"Los enlaces pueden elegir el idioma: añade ?lang=es (o en, id, zh) y Budget, el mercado y las páginas legales se abren en ese idioma sin cambiar tu elección guardada.",
"El estudio de Plantillas entiende órdenes en chino y en español, como «añade la columna Proveedor» o 添加供应商列.",
"Precios en vivo en Invertir: acciones y ETF (IDX y EE. UU.), cripto y oro se actualizan con el mercado. Toca Actualizar precios cuando quieras; los precios que escribes tú se quedan hasta que actualices.",
"Mint pide al navegador que conserve sus datos, muestra cuándo hiciste la última copia y te recuerda sincronizar o hacer copia cuando un presupuesto ya tiene historial.",
"Plantillas y el Marketplace ahora también hablan chino y español, y los .xlsx descargados usan tu idioma en pestañas y consejos.",
"Privacidad y Términos disponibles en indonesio, chino y español."
"Plantillas y el Marketplace ahora también hablan chino y español, y los .xlsx descargados usan tu idioma en pestañas y consejos."
]
}
}
3 changes: 2 additions & 1 deletion apps/mint/web/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -2445,7 +2445,8 @@
var chip = e.target.closest("[data-example]");
if (chip) {
var form = chip.closest("form");
form.querySelector("textarea").value = chip.dataset.example;
// the chip shows the example in the app language; use that text so the template comes out in it too
form.querySelector("textarea").value = (chip.textContent || "").trim() || chip.dataset.example;
form.querySelector("textarea").focus();
}
});
Expand Down
Loading
Loading