diff --git a/translations/frontend.pt_BR.xlf b/translations/frontend.pt_BR.xlf
new file mode 100644
index 00000000..fb2f2335
--- /dev/null
+++ b/translations/frontend.pt_BR.xlf
@@ -0,0 +1,59 @@
+
+
+
+
+
+ search.placeholder
+ Pesquisar
+
+
+
+
+ part.labelp
+ Componentes
+
+
+
+
+ entity.select.group.new_not_added_to_DB
+ Novo (não adicionado ainda no DB)
+
+
+
+
+ user.password_strength.very_weak
+ Muito fraca
+
+
+
+
+ user.password_strength.weak
+ Fraca
+
+
+
+
+ user.password_strength.medium
+ Média
+
+
+
+
+ user.password_strength.strong
+ Forte
+
+
+
+
+ user.password_strength.very_strong
+ Bem forte
+
+
+
+
+ search.submit
+ Vá!
+
+
+
+
diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf
index 8af54745..1a37106f 100644
--- a/translations/messages.en.xlf
+++ b/translations/messages.en.xlf
@@ -13068,145 +13068,145 @@ Buerklin-API Authentication server:
-
+ settings.aiAI
-
+ settings.ai.openrouterOpenRouter
-
+ settings.ai.lmstudioLMStudio
-
+ settings.ips.ai_extractor.modelAI Model
-
+ settings.ips.ai_extractor.ai_platformAI Platform
-
+ settings.ips.ai_extractor.model.helpThe AI model that should be used for extraction. Must support structured output.
-
+ settings.ips.ai_extractor.max_content_lengthMax. Website Content length
-
+ settings.ips.ai_extractor.max_content_length.descriptionThe maximum number of characters of the website that are sent to the AI service.
-
+ settings.ips.ai_extractor.output_languageOutput language
-
+ settings.ips.ai_extractor.output_language.descriptionBy default, the providers returns information in the same language as the website. With that option you can ask the AI to translate it for you. Might only work with certain models.
-
+ settings.ips.ai_extractor.additional_instructionsAdditional instructions
-
+ settings.ips.ai_extractor.additional_instructions.descriptionThe additional instructions will be appended to the system prompt.
-
+ info_providers.search.advanced_optionsAdvanced options
-
+ info_providers.no_cache_searchDo not cache search results / Force fresh search
-
+ info_providers.no_cache_detailsDo not cache result details / Force fresh part detail retrieval
-
+ info_providers.from_url.method.generic_webClassic Web Scraper
-
+ info_providers.from_url.method.ai_webAI Web Scraper
-
+ info_providers.from_url.methodMethod
-
+ info_providers.from_url.no_cacheIgnore cache / Force fresh info retrieval
-
+ info_providers.from_url.skip_delegationDo not delegate to specialized info providers
-
+ settings.ips.ai_extractorAI Web Extractor
-
+ settings.ips.ai_extractor.descriptionThis info provider uses an large language model (LLM) to extract detailed part information from arbitary shop URLs.
-
+ settings.ai.openrouter.helpAccess to many AI models via openrouter.ai
-
+ settings.ai.lmstudio.hosturlHost URL
diff --git a/translations/security.pt_BR.xlf b/translations/security.pt_BR.xlf
new file mode 100644
index 00000000..284b32d9
--- /dev/null
+++ b/translations/security.pt_BR.xlf
@@ -0,0 +1,23 @@
+
+
+
+
+
+ user.login_error.user_disabled
+ Sua conta está desativada! Fale com um administrador se você acredita ser um erro.
+
+
+
+
+ saml.error.cannot_login_local_user_per_saml
+ Você não pode fazer o login na conta com um usuário local por SSO! Use sua senha de usuário local.
+
+
+
+
+ saml.error.cannot_login_saml_user_locally
+ Você não pode usar autenticação local como login como usuário SAML! Use seu login SSO.
+
+
+
+
diff --git a/translations/validators.pt_BR.xlf b/translations/validators.pt_BR.xlf
new file mode 100644
index 00000000..fb07b80a
--- /dev/null
+++ b/translations/validators.pt_BR.xlf
@@ -0,0 +1,257 @@
+
+
+
+
+
+ part.master_attachment.must_be_picture
+ O anexo de pré-visualização deve ser uma imagem válida!
+
+
+
+
+ structural.entity.unique_name
+ Um elemento com esse nome já existe nesse nível!
+
+
+
+
+ parameters.validator.min_lesser_typical
+ Valor precisa ser menor ou igual ao valor típico ({{ compared_value }}).
+
+
+
+
+ parameters.validator.min_lesser_max
+ Valor precisa ser menor ao valor máximo ({{ compared_value }}).
+
+
+
+
+ parameters.validator.max_greater_typical
+ Valor precisa ser maior ou igual ao valor típico ({{ compared_value }}).
+
+
+
+
+ validator.user.username_already_used
+ Um usuário com esse nome já existe
+
+
+
+
+ user.invalid_username
+ O nome de usuário precisa conter apenas letras, números, underscores, pontos, mais ou menos e não pode começar com um @!
+
+
+
+
+ obsolete
+
+
+ validator.noneofitschild.self
+ Um elemento não pode ser seu próprio parente!
+
+
+
+
+ obsolete
+
+
+ validator.noneofitschild.children
+ Você não pode assimilar um elemento filho como pai (pode causar loops)!
+
+
+
+
+ validator.select_valid_category
+ Selecione uma categoria válida!
+
+
+
+
+ validator.part_lot.only_existing
+ Não se pode adicionar novos componentes a essa localização já que está marcado como "Somente existentes"
+
+
+
+
+ validator.part_lot.location_full.no_increase
+ Localização está cheia. Quantidade não pode ser aumentada (novo valor deve ser menor que {{ old_amount }}).
+
+
+
+
+ validator.part_lot.location_full
+ Localização está cheia. Não pode ser adicionados novos componentes a ela.
+
+
+
+
+ validator.part_lot.single_part
+ Essa localização só pode conter um único componente que já está cheio!
+
+
+
+
+ validator.attachment.must_not_be_null
+ Você precisa selecionar um tipo de anexo!
+
+
+
+
+ validator.orderdetail.supplier_must_not_be_null
+ Você precisa selecionar um fornecedor!
+
+
+
+
+ validator.measurement_unit.use_si_prefix_needs_unit
+ Para habilitar prefixos do SI, você precisa inserir um símbolo de unidade!
+
+
+
+
+ part.ipn.must_be_unique
+ Um número de componente interno precisa ser único. {{ value }} já está em uso!
+
+
+
+
+ validator.project.bom_entry.name_or_part_needed
+ Você precisa escolher um componente ou inserir um nome a uma entrada BOM que não indica um componente.
+
+
+
+
+ project.bom_entry.name_already_in_bom
+ Já existe uma entrada BOM com esse nome!
+
+
+
+
+ project.bom_entry.part_already_in_bom
+ Esse componente já existe no BOM!
+
+
+
+
+ project.bom_entry.mountnames_quantity_mismatch
+ A quantidade de nome de componentes deve coincidir com a quantidade prevista no BOM
+
+
+
+
+ project.bom_entry.can_not_add_own_builds_part
+ Você não pode adicionar um componente de produção interna ao projeto de sua lista de materiais (BOM)
+
+
+
+
+ project.bom_has_to_include_all_subelement_parts
+ O BOM do projeto precisa incluir todas as montagens de componentes dos subprojetos. Componente %part_name% do projeto %project_name% está faltando!
+
+
+
+
+ project.bom_entry.price_not_allowed_on_parts
+ Preços não são permitidos em entradas BOM associadas a um componente. Defina o preço a um componente.
+
+
+
+
+ validator.project_build.lot_bigger_than_needed
+ Você selecionou uma quantidade maior que a necessária para retirar! Remova a quantidade desnecessária.
+
+
+
+
+ validator.project_build.lot_smaller_than_needed
+ Você selecionou menos quantidade para retirar que a necessária! Adicione a quantidade necessária.
+
+
+
+
+ part.name.must_match_category_regex
+ O nome do componente não coincide com a expressão regular inserida pela categoria: %regex%
+
+
+
+
+ validator.attachment.name_not_blank
+ Adicione um valor aqui, ou insira um arquivo para automaticamente usar o nome do arquivo como nome do anexo.
+
+
+
+
+ validator.part_lot.owner_must_match_storage_location_owner
+ O dono do lote precisa coincidir com o dono da localização do armazém selecionado (%owner_name%)!
+
+
+
+
+ validator.part_lot.owner_must_not_be_anonymous
+ Um dono de lote não pode ser um usuário anônimo!
+
+
+
+
+ validator.part_association.must_set_an_value_if_type_is_other
+ Se você atribuir o tipo para "outro", então deve adicionar o valor descrição para ele!
+
+
+
+
+ validator.part_association.part_cannot_be_associated_with_itself
+ Um componente não pode ser associado a ele mesmo!
+
+
+
+
+ validator.part_association.already_exists
+ A atribuição desse componente já foi feita!
+
+
+
+
+ validator.part_lot.vendor_barcode_must_be_unique
+ O valor do código de barras do vendedor já está sendo usado por outro lote. Precisa ser único!
+
+
+
+
+ validator.year_2038_bug_on_32bit
+ Por limitações técnicas, não é possível selecionar datas depois de 19/01/2038 em um sistema de 32 bits!
+
+
+
+
+ validator.fileSize.invalidFormat
+ Formato de tamanho de arquivo inválido. Use um número inteiro com K, M, G de sufixo par Kilo, Mega ou Gigabytes.
+
+
+
+
+ validator.invalid_range
+ O intervalo atual não é válido!
+
+
+
+
+ validator.google_code.wrong_code
+ Código inválido. Confira se o seu aplicativo de autenticação está configurado corretamente e se ambos servidor e o dispositivo de autenticação estão com os horários sincronizados.
+
+
+
+
+ settings.synonyms.type_synonyms.collection_type.duplicate
+ Já existe uma tradução definida para esse tipo e idioma
+
+
+
+
+ validator.invalid_gtin
+ Esse não é um GTIN / EAN válido!
+
+
+
+