Merge branch 'master' into master

This commit is contained in:
Donkie
2025-05-31 19:52:01 +02:00
committed by GitHub
5 changed files with 61 additions and 26 deletions

View File

@@ -361,6 +361,10 @@
"base_url": { "base_url": {
"label": "Basis URL", "label": "Basis URL",
"tooltip": "Die basis URL für die Generierung von Funktionen wie QR Codes." "tooltip": "Die basis URL für die Generierung von Funktionen wie QR Codes."
},
"round_prices": {
"label": "Gerundeter Preis",
"tooltip": "Rundet die Preise auf die nächsthöhere ganze Zahl."
} }
}, },
"extra_fields": { "extra_fields": {

View File

@@ -23,19 +23,19 @@
"archive": "Arquivar", "archive": "Arquivar",
"unArchive": "Desarquivar", "unArchive": "Desarquivar",
"hideArchived": "Ocultar Arquivados", "hideArchived": "Ocultar Arquivados",
"showArchived": "Mostrar Arquivado", "showArchived": "Mostrar Arquivados",
"notAccessTitle": "Você não tem permissão para acessar", "notAccessTitle": "Não tem permissão para aceder",
"hideColumns": "Ocultar Colunas", "hideColumns": "Ocultar Colunas",
"clearFilters": "Limpar Filtros", "clearFilters": "Limpar Filtros",
"create": "Criar", "create": "Criar",
"saveAndAdd": "Guardar e Adicionar", "saveAndAdd": "Guardar e Adicionar",
"continue": "Continuar" "continue": "Continuar"
}, },
"warnWhenUnsavedChanges": "Você tem certeza de que quer sair? Você tem alterações não salvas.", "warnWhenUnsavedChanges": "Tem certeza de que quer sair? Tem alterações não guardadas.",
"notifications": { "notifications": {
"success": "Sucesso", "success": "Sucesso",
"error": "Erro (código de status: {{statusCode}})", "error": "Erro (código de status: {{statusCode}})",
"undoable": "Você tem {{seconds}} segundos para desfazer.", "undoable": "Tem {{seconds}} segundos para desfazer.",
"createSuccess": "{{resource}} criado com sucesso", "createSuccess": "{{resource}} criado com sucesso",
"createError": "Ocorreu um erro ao criar {{resource}} (código de status: {{statusCode}})", "createError": "Ocorreu um erro ao criar {{resource}} (código de status: {{statusCode}})",
"deleteSuccess": "{{resource}} excluído com sucesso", "deleteSuccess": "{{resource}} excluído com sucesso",
@@ -43,7 +43,7 @@
"editSuccess": "{{resource}} editado com sucesso", "editSuccess": "{{resource}} editado com sucesso",
"editError": "Erro ao editar {{resource}} (código de status: {{statusCode}})", "editError": "Erro ao editar {{resource}} (código de status: {{statusCode}})",
"importProgress": "Importando: {{processed}}/{{total}}", "importProgress": "Importando: {{processed}}/{{total}}",
"saveSuccessful": "Salvo com sucesso!", "saveSuccessful": "Guardado com sucesso!",
"validationError": "Erro de validação: {{error}}" "validationError": "Erro de validação: {{error}}"
}, },
"kofi": "Doe no Ko-fi", "kofi": "Doe no Ko-fi",
@@ -106,8 +106,8 @@
"selectedTotal_many": "{{count}} bobines selecionados", "selectedTotal_many": "{{count}} bobines selecionados",
"selectedTotal_other": "{{count}} bobines selecionados", "selectedTotal_other": "{{count}} bobines selecionados",
"noSpoolsSelected": "Não selecionou nenhuma bobine.", "noSpoolsSelected": "Não selecionou nenhuma bobine.",
"title": "Selecionar Carretéis", "title": "Selecionar Bobines",
"description": "Selecione os carretéis para imprimir as etiquetas.", "description": "Selecione as bobines para imprimir as etiquetas.",
"showArchived": "Mostrar Arquivado", "showArchived": "Mostrar Arquivado",
"selectAll": "Selecionar/Desmarcar Tudo" "selectAll": "Selecionar/Desmarcar Tudo"
}, },
@@ -174,7 +174,7 @@
}, },
"fields_help": { "fields_help": {
"weight_to_use": "Selecione qual o valor de peso a inserir. O peso medido só estará disponível se o peso da bobine estiver definido para o filamento selecionado.", "weight_to_use": "Selecione qual o valor de peso a inserir. O peso medido só estará disponível se o peso da bobine estiver definido para o filamento selecionado.",
"lot_nr": "Número de lote do fabricante. Pode ser usado para garantir que uma impressão tenha cores consistentes se vários carretéis forem usados.", "lot_nr": "Número de lote do fabricante. Pode ser usado para garantir que uma impressão tenha cores consistentes se várias bobines forem usadas.",
"used_weight": "Quanto filamento foi usado da bobine. Uma nova bobine deve ter usado 0g.", "used_weight": "Quanto filamento foi usado da bobine. Uma nova bobine deve ter usado 0g.",
"remaining_weight": "Quanto filamento resta na bobine. Para uma bobine nova, deve corresponder ao peso da bobine.", "remaining_weight": "Quanto filamento resta na bobine. Para uma bobine nova, deve corresponder ao peso da bobine.",
"measured_weight": "Quanto pesa o filamento e a bobine.", "measured_weight": "Quanto pesa o filamento e a bobine.",
@@ -188,7 +188,7 @@
"create": "Criar Bobine", "create": "Criar Bobine",
"clone": "Clonar Bobine", "clone": "Clonar Bobine",
"edit": "Editar Bobine", "edit": "Editar Bobine",
"list": "Carretéis", "list": "Bobines",
"show": "Mostrar Bobine", "show": "Mostrar Bobine",
"show_title": "[Bobine #{{id}}] {{name}}", "show_title": "[Bobine #{{id}}] {{name}}",
"archive": "Arquivar Bobine", "archive": "Arquivar Bobine",
@@ -208,7 +208,7 @@
"messages": { "messages": {
"archive": "Tem certeza de que deseja arquivar esta bobine?" "archive": "Tem certeza de que deseja arquivar esta bobine?"
}, },
"spool": "Carretéis", "spool": "Bobines",
"formats": { "formats": {
"last_used": "Última utilização {{date}}" "last_used": "Última utilização {{date}}"
} }
@@ -232,7 +232,7 @@
"settings_extruder_temp": "Temperatura do Bico", "settings_extruder_temp": "Temperatura do Bico",
"settings_bed_temp": "Temperatura da Mesa", "settings_bed_temp": "Temperatura da Mesa",
"color_hex": "Cor", "color_hex": "Cor",
"spools": "Mostrar Carretéis", "spools": "Mostrar Bobines",
"external_id": "ID Externo", "external_id": "ID Externo",
"single_color": "Único", "single_color": "Único",
"multi_color": "Múltiplo", "multi_color": "Múltiplo",
@@ -246,7 +246,7 @@
"material": "Por exemplo PLA, ABS, PETG, etc.", "material": "Por exemplo PLA, ABS, PETG, etc.",
"weight": "O peso do filamento de uma bobine cheia (peso líquido). Isso não deve incluir o peso da bobine em si, apenas o filamento. É o que normalmente está escrito na embalagem.", "weight": "O peso do filamento de uma bobine cheia (peso líquido). Isso não deve incluir o peso da bobine em si, apenas o filamento. É o que normalmente está escrito na embalagem.",
"spool_weight": "O peso de uma bobine vazia. Usado para determinar o peso medido de uma bobine.", "spool_weight": "O peso de uma bobine vazia. Usado para determinar o peso medido de uma bobine.",
"multi_color_direction": "Os filamentos podem ter múltiplas cores de duas formas: por coextrusão, como os filamentos de duas cores com estas consistentes ao longo do filamento, or através de mudança de cor longitudinal, como os filamentos que contêm gradientes de cores que vão mudando ao longo da bobine." "multi_color_direction": "Os filamentos podem ter múltiplas cores de duas formas: por coextrusão, como os filamentos de duas cores com estas consistentes ao longo do filamento, ou através de mudança de cor longitudinal, como os filamentos que contêm gradientes de cores que vão mudando ao longo da bobine."
}, },
"titles": { "titles": {
"create": "Criar Filamento", "create": "Criar Filamento",
@@ -297,7 +297,7 @@
"help": "Ajuda", "help": "Ajuda",
"resources": { "resources": {
"filament": "Marcas de filamento. Eles têm propriedades como nome, material, cor, diâmetro e muito mais.", "filament": "Marcas de filamento. Eles têm propriedades como nome, material, cor, diâmetro e muito mais.",
"spool": "Carretéis físicos individuais de um filamento específico.", "spool": "Bobines físicas individuais de um filamento específico.",
"vendor": "As empresas que fabricam o filamento." "vendor": "As empresas que fabricam o filamento."
}, },
"description": "<title>Ajuda</title><p>Aqui estão algumas dicas para começar.</p><p>O Spoolman contém três tipos diferentes de dados:</p><itemsHelp/><p>Para adicionar uma nova bobine para a base de dados, comece por criar um <filamentCreateLink>Filamento</filamentCreateLink>. Feito isso, prossiga para criar uma <spoolCreateLink>Bobine</spoolCreateLink> para esse filamento específico. Se posteriormente adquirir bobines adicionais do mesmo filamento, simplesmente gere Bobines adicionais e reutilize o mesmo objeto Filamento.</p><p>Opcionalmente, também pode criar um <vendorCreateLink>Fabricante</vendorCreateLink> para a empresa que fabrica o filamento, se desejar rastrear essas informações.</p><p>Tem a opção de vincular outros serviços de impressora 3D ao Spoolman, como o Moonraker, que pode monitorizar automaticamente o uso do filamento e atualizar as bobines. Consulte o <readmeLink>README do Spoolman</readmeLink> para obter orientação sobre como configurar.</p>" "description": "<title>Ajuda</title><p>Aqui estão algumas dicas para começar.</p><p>O Spoolman contém três tipos diferentes de dados:</p><itemsHelp/><p>Para adicionar uma nova bobine para a base de dados, comece por criar um <filamentCreateLink>Filamento</filamentCreateLink>. Feito isso, prossiga para criar uma <spoolCreateLink>Bobine</spoolCreateLink> para esse filamento específico. Se posteriormente adquirir bobines adicionais do mesmo filamento, simplesmente gere Bobines adicionais e reutilize o mesmo objeto Filamento.</p><p>Opcionalmente, também pode criar um <vendorCreateLink>Fabricante</vendorCreateLink> para a empresa que fabrica o filamento, se desejar rastrear essas informações.</p><p>Tem a opção de vincular outros serviços de impressora 3D ao Spoolman, como o Moonraker, que pode monitorizar automaticamente o uso do filamento e atualizar as bobines. Consulte o <readmeLink>README do Spoolman</readmeLink> para obter orientação sobre como configurar.</p>"
@@ -318,7 +318,7 @@
"clone": "#{{id}} Clonar filamento | Spoolman" "clone": "#{{id}} Clonar filamento | Spoolman"
}, },
"spool": { "spool": {
"list": "Carretéis | Spoolman", "list": "Bobines | Spoolman",
"show": "#{{id}} Mostrar Bobine | Spoolman", "show": "#{{id}} Mostrar Bobine | Spoolman",
"edit": "#{{id}} Editar Bobine | Spoolman", "edit": "#{{id}} Editar Bobine | Spoolman",
"create": "Criar Bobine | Spoolman", "create": "Criar Bobine | Spoolman",
@@ -341,12 +341,12 @@
"title": "Leitor de Código QR", "title": "Leitor de Código QR",
"description": "Digitalize um código QR do Spoolman para ver detalhes sobre a bobine.", "description": "Digitalize um código QR do Spoolman para ver detalhes sobre a bobine.",
"error": { "error": {
"notAllowed": "Você não deu permissão de acesso à câmera.", "notAllowed": "Não deu permissão de acesso à câmara.",
"insecureContext": "A página não é protegida por HTTPS.", "insecureContext": "A página não é protegida por HTTPS.",
"streamApiNotSupported": "O navegador não oferece suporte à API MediaStream.", "streamApiNotSupported": "O navegador não oferece suporte à API MediaStream.",
"unknown": "Ocorreu um erro desconhecido. ({{error}})", "unknown": "Ocorreu um erro desconhecido. ({{error}})",
"notReadable": "A câmera não está acessível.", "notReadable": "A câmara não está acessível.",
"notFound": "Nenhuma câmera foi encontrada." "notFound": "Nenhuma câmara foi encontrada."
} }
}, },
"table": { "table": {
@@ -377,8 +377,8 @@
"key_not_changed": "Por favor, mude a chave por outra.", "key_not_changed": "Por favor, mude a chave por outra.",
"delete_confirm": "Apagar o campo {{name}}?", "delete_confirm": "Apagar o campo {{name}}?",
"delete_confirm_description": "Isto irá apagar o campo e todos os dados associados em todas as entidades.", "delete_confirm_description": "Isto irá apagar o campo e todos os dados associados em todas as entidades.",
"description": "<p>Aqui você pode adicionar campos personalizados extras às suas entidades.</p><p>Uma vez que um campo é adicionado, você não pode alterar sua chave ou tipo, e para campos do tipo \"opção\" você não pode remover as opções ou alterar o estado de múltipla opção. Se você remover um campo, os dados associados para todas as entidades serão excluídos.</p><p>A chave é como outros programas leem/gravam os dados, portanto, se seu campo personalizado se destina a se integrar com um programa de terceiros, certifique-se de defini-lo corretamente. O valor padrão só é aplicado a novos itens.</p><p>Campos extras não podem ser ordenados ou filtrados nas visualizações de tabela.</p>", "description": "<p>Aqui pode adicionar campos personalizados extras às suas entidades.</p><p>Uma vez que um campo é adicionado, não se pode alterar sua chave ou tipo, e para campos do tipo \"opção\" não se pode remover as opções ou alterar o estado da múltipla opção. Se remover um campo, os dados associados para todas as entidades serão excluídos.</p><p>A chave é como outros programas leem/gravam os dados, portanto, se o seu campo personalizado se destina a integrar com um programa de terceiros, certifique-se de defini-lo corretamente. O valor padrão só é aplicado a novos itens.</p><p>Campos extras não podem ser ordenados ou filtrados nas visualizações de tabela.</p>",
"choices_missing_error": "Você não pode remover as opções. As seguintes opções serão perdidas: {{choices}}", "choices_missing_error": "Não pode remover as opções. As seguintes opções serão perdidas: {{choices}}",
"tab": "Campos Extras", "tab": "Campos Extras",
"boolean_true": "Sim", "boolean_true": "Sim",
"boolean_false": "Não", "boolean_false": "Não",
@@ -394,6 +394,10 @@
"base_url": { "base_url": {
"label": "Endereço Base", "label": "Endereço Base",
"tooltip": "O endereço base a utilizar em funcionalidades tais como os códigos QR." "tooltip": "O endereço base a utilizar em funcionalidades tais como os códigos QR."
},
"round_prices": {
"tooltip": "Arredonda os preços para o número inteiro mais próximo.",
"label": "Arredondar preços"
} }
} }
}, },

View File

@@ -96,7 +96,7 @@
"description": "லேபிள்களை அச்சிட ச்பூல்களைத் தேர்ந்தெடுக்கவும்.", "description": "லேபிள்களை அச்சிட ச்பூல்களைத் தேர்ந்தெடுக்கவும்.",
"showArchived": "காப்பகப்படுத்தப்பட்டதைக் காட்டு", "showArchived": "காப்பகப்படுத்தப்பட்டதைக் காட்டு",
"noSpoolsSelected": "நீங்கள் எந்த ச்பூல்களையும் தேர்வு செய்யவில்லை.", "noSpoolsSelected": "நீங்கள் எந்த ச்பூல்களையும் தேர்வு செய்யவில்லை.",
"selectAll": "அனைத்தையும் தேர்ந்தெடுக்கவும்/தேர்ந்தெடுக்கவும்", "selectAll": "அனைத்தையும் தேர்ந்தெடு/தேர்வுநீக்கு",
"selectedTotal_one": "{{count}} ச்பூல் தேர்ந்தெடுக்கப்பட்டது", "selectedTotal_one": "{{count}} ச்பூல் தேர்ந்தெடுக்கப்பட்டது",
"selectedTotal_other": "{{count}} spools தேர்ந்தெடுக்கப்பட்டவை" "selectedTotal_other": "{{count}} spools தேர்ந்தெடுக்கப்பட்டவை"
} }
@@ -213,7 +213,7 @@
"form": { "form": {
"filament_updated": "இந்த பக்கத்தைத் திறந்ததிலிருந்து இந்த இழை யாரோ/வேறு ஏதாவது புதுப்பிக்கப்பட்டுள்ளது. சேமிப்பது அந்த மாற்றங்களை மேலெழுதும்!", "filament_updated": "இந்த பக்கத்தைத் திறந்ததிலிருந்து இந்த இழை யாரோ/வேறு ஏதாவது புதுப்பிக்கப்பட்டுள்ளது. சேமிப்பது அந்த மாற்றங்களை மேலெழுதும்!",
"import_external": "வெளிப்புறத்திலிருந்து இறக்குமதி", "import_external": "வெளிப்புறத்திலிருந்து இறக்குமதி",
"import_external_description": "அதன் விவரங்களை இழை உருவாக்கும் வடிவத்தில் தானாக விரிவுபடுத்த பட்டியலில் ஒரு இழை தேர்ந்தெடுக்கவும். இது நீங்கள் படிவத்தில் உள்ளிட்ட எந்த தரவையும் மேலெழுதும். <br> <br> தேவைப்பட்டால், சரி என்பதைக் சொடுக்கு செய்யும் போது ஒரு உற்பத்தியாளர் பொருள் தானாக உருவாக்கப்படும்." "import_external_description": "அதன் விவரங்களை இழை உருவாக்கும் வடிவத்தில் தானாக விரிவுபடுத்தப் பட்டியலில் ஒரு இழை தேர்ந்தெடுக்கவும். இது நீங்கள் படிவத்தில் உள்ளிட்ட எந்தத் தரவையும் மேலெழுதும். <br> <br> தேவைப்பட்டால், சரி என்பதைக் சொடுக்கு செய்யும்போது ஒரு உற்பத்தியாளர் பொருள் தானாக உருவாக்கப்படும்."
}, },
"buttons": { "buttons": {
"add_spool": "ச்பூல் சேர்க்கவும்" "add_spool": "ச்பூல் சேர்க்கவும்"
@@ -308,9 +308,9 @@
"createSuccess": "வெற்றிகரமாக உருவாக்கப்பட்டது {{resource}}", "createSuccess": "வெற்றிகரமாக உருவாக்கப்பட்டது {{resource}}",
"createError": "{{resource}} (நிலைக் குறியீடு: {{statusCode}}) உருவாக்கும் பிழை இருந்தது", "createError": "{{resource}} (நிலைக் குறியீடு: {{statusCode}}) உருவாக்கும் பிழை இருந்தது",
"deleteSuccess": "வெற்றிகரமாக நீக்கப்பட்டது {{resource}}", "deleteSuccess": "வெற்றிகரமாக நீக்கப்பட்டது {{resource}}",
"deleteError": "{{resource}} (நிலைக் குறியீடு: {{statusCode}}) நீக்கும்போது பிழை பிழை", "deleteError": "{{resource}} நீக்கும்போது பிழை (நிலைக் குறியீடு: {{statusCode}})",
"editSuccess": "வெற்றிகரமாக திருத்தப்பட்டது {{resource}}", "editSuccess": "வெற்றிகரமாக திருத்தப்பட்டது {{resource}}",
"editError": "{{resource}} (நிலை குறியீடு: {{statusCode}}) திருத்தும்போது பிழை பிழை", "editError": "{{resource}} திருத்தும்போது பிழை (நிலை குறியீடு: {{statusCode}})",
"importProgress": "இறக்குமதி: {{processed}}/{{total}}}", "importProgress": "இறக்குமதி: {{processed}}/{{total}}}",
"saveSuccessful": "வெற்றிகரமாக சேமிக்கவும்!", "saveSuccessful": "வெற்றிகரமாக சேமிக்கவும்!",
"validationError": "சரிபார்ப்பு பிழை: {{error}}" "validationError": "சரிபார்ப்பு பிழை: {{error}}"
@@ -378,7 +378,7 @@
"field_type": { "field_type": {
"text": "உரை", "text": "உரை",
"integer": "முழு எண்", "integer": "முழு எண்",
"integer_range": "முழு எண்", "integer_range": "முழு எண் வரம்பு",
"float": "மிதவை", "float": "மிதவை",
"float_range": "மிதவை வரம்பு", "float_range": "மிதவை வரம்பு",
"datetime": "தேதிநேரம்", "datetime": "தேதிநேரம்",

View File

@@ -392,6 +392,10 @@
"base_url": { "base_url": {
"label": "基础URL", "label": "基础URL",
"tooltip": "生成功能(例如二维码)时使用的基础 URL。" "tooltip": "生成功能(例如二维码)时使用的基础 URL。"
},
"round_prices": {
"label": "取整",
"tooltip": "将价格四舍五入到最接近的整数。"
} }
} }
}, },

View File

@@ -44,6 +44,26 @@ export async function useSpoolFilament(spool: ISpool, length?: number, weight?:
await fetch(request, init); await fetch(request, init);
} }
/**
* Adjust usage based on the spool's current gross weight
* @param spool The spool
* @param weight The weight of the spool, in g
*/
export async function useSpoolFilamentMeasure(spool: ISpool, weight: number) {
const init: RequestInit = {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
weight: weight,
}),
};
const request = new Request(`${getAPIURL()}/spool/${spool.id}/measure`);
await fetch(request, init);
}
/** /**
* Returns an array of queries using the useQueries hook from @tanstack/react-query. * Returns an array of queries using the useQueries hook from @tanstack/react-query.
* Each query fetches a spool by its ID from the server. * Each query fetches a spool by its ID from the server.
@@ -173,7 +193,7 @@ export function useGetFilamentSelectOptions() {
}; };
} }
type MeasurementType = "length" | "weight"; type MeasurementType = "length" | "weight" | "measured_weight";
export function useSpoolAdjustModal() { export function useSpoolAdjustModal() {
const t = useTranslate(); const t = useTranslate();
@@ -207,8 +227,10 @@ export function useSpoolAdjustModal() {
if (measurementType === "length") { if (measurementType === "length") {
await useSpoolFilament(curSpool, value, undefined); await useSpoolFilament(curSpool, value, undefined);
} else { } else if (measurementType === "weight") {
await useSpoolFilament(curSpool, undefined, value); await useSpoolFilament(curSpool, undefined, value);
} else {
await useSpoolFilamentMeasure(curSpool, value);
} }
setCurSpool(null); setCurSpool(null);
@@ -225,6 +247,7 @@ export function useSpoolAdjustModal() {
> >
<Radio.Button value="length">{t("spool.form.measurement_type.length")}</Radio.Button> <Radio.Button value="length">{t("spool.form.measurement_type.length")}</Radio.Button>
<Radio.Button value="weight">{t("spool.form.measurement_type.weight")}</Radio.Button> <Radio.Button value="weight">{t("spool.form.measurement_type.weight")}</Radio.Button>
<Radio.Button value="measured_weight">{t("spool.fields.measured_weight")}</Radio.Button>
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
<Form.Item label={t("spool.form.adjust_filament_value")} name="filament_value"> <Form.Item label={t("spool.form.adjust_filament_value")} name="filament_value">