/* Client language preference shared by the SwagDecor custom domains. */ (() => { const entries = [ ['Buscar produto, código ou cor...','Search product, code or color...'], ['Encontre produtos para sua ocasião','Find products for your occasion'], ['Congressos e eventos','Conferences and events'],['Final de ano','Year-end'], ['Relacionamento com clientes','Customer relationships'],['Limpar ocasião','Clear occasion'], ['Comparar produto','Compare product'],['✓ Na comparação','✓ Selected for comparison'], ['Comparar produtos','Compare products'],['Comparar','Compare'],['Limpar','Clear'], ['Lembrar meus dados e arte neste navegador','Remember my details and artwork in this browser'], ['Continue depois com o carrinho salvo. Desmarque esta opção se estiver em um computador compartilhado.','Resume later with your saved cart. Uncheck this option on a shared computer.'], ['Apagar dados e arte salvos','Delete saved details and artwork'], ['Seus dados anteriores foram recuperados.','Your previous details have been restored.'], ['Dados salvos neste navegador.','Details saved in this browser.'], ['Características','Features'],['Capacidade','Capacity'],['Dimensões','Dimensions'], ['Estoque consultado','Stock availability'],['Escolher','Choose'], ['Ver cores e quantidade','Choose color and quantity'], ['Kits escritório premium para presentear e valorizar cada experiência.','Premium office kits for thoughtful gifts and experiences.'], ['Caderneta','Notebooks'],['Bloco','Notepads'],['Início','Home'],['Categorias','Categories'],['Buscar no catálogo...','Search the catalog...'],['Carrinho','Cart'],['Produtos em destaque','Featured products'],['Resultados da busca','Search results'],['produtos encontrados','products found'],['Nenhum produto encontrado.','No products found.'],['Não encontramos produtos para essa busca. Tente outra palavra ou capacidade.','No products match this search. Try another word or capacity.'],['Anterior','Previous'],['Próxima','Next'],['Página','Page'],['de','of'], ['Escolha uma cor','Choose a color'],['Quantidade','Quantity'],['Pedido mínimo: 15 unidades por produto.','Minimum order: 15 units per product.'],['Adicionar ao carrinho','Add to cart'],['Estoque insuficiente','Insufficient stock'],['Valor unitário','Unit price'],['Estoque da cor','Color stock'],['Estoque total do fornecedor','Supplier total stock'],['Ver foto desta cor','View this color'],['Foto desta cor indisponível','Photo unavailable for this color'],['Sem imagem','No image'],['Ver foto','View photo'],['un.','units'],['A definir','To be confirmed'],['Não informado pelo fornecedor','Not provided by supplier'],['Cores disponíveis','Available colors'],['Pedido mínimo','Minimum order'],['Dimensões','Dimensions'],['Material','Material'],['Personalização','Customization'],['Código','Code'],['Visualização ampliada','Larger view'], ['Seu carrinho','Your cart'],['Seu carrinho está vazio.','Your cart is empty.'],['Remover','Remove'],['Cor:','Color:'],['Total do produto:','Product total:'],['Valor total','Total'],['Dados para a solicitação','Request details'],['Preencha seus dados e informe como deseja personalizar os produtos.','Enter your details and describe how you want the products customized.'],['Nome da empresa','Company name'],['Nome','Name'],['E-mail','Email'],['Telefone / WhatsApp','Phone / WhatsApp'],['Arte ou logo para personalização','Artwork or logo for customization'],['Quantidade de cores na personalização','Number of colors in the customization'],['Observações','Notes'],['Enviar solicitação','Submit request'],['Baixar carrinho em PDF','Download cart as PDF'],['Baixar última solicitação em PDF','Download last request as PDF'],['Personalização não inclusa.','Customization not included.'],['A disponibilidade segue o estoque informado por cada fornecedor.','Availability follows the stock reported by each supplier.'],['Os valores da Só Marcas são indicativos até a confirmação da proposta.','Só Marcas prices are indicative until the proposal is confirmed.'],['Os valores apresentados não incluem a personalização. O valor desse serviço será calculado conforme a arte, a técnica e a quantidade escolhidas.','Shown prices exclude customization. Its cost will be calculated based on the artwork, method and quantity selected.'],['Produção, personalização, armazenamento e envio em uma única operação.','Production, customization, storage and shipping in one operation.'],['Produtos para transformar cada entrega em experiência.','Products that make every delivery memorable.'],['Escolha os produtos, informe os dados da sua empresa e envie a solicitação diretamente para a SwagDecor.','Choose products, enter your company details and send your request to SwagDecor.'],['Garrafas, mochilas, copos, canecas, canetas e cadernos.','Bottles, backpacks, cups, mugs, pens and notebooks.'],['Use os filtros para encontrar o produto ideal.','Use filters to find the right product.'],['Filtre os produtos','Filter products'],['Todos os materiais','All materials'],['Todas as capacidades','All capacities'],['Todas as cores','All colors'],['Limpar filtros','Clear filters'],['Produto','Product'],['Ex.: garrafa 600 ml ou mochila 20 litros','E.g. 600 ml bottle or 20 liter backpack'],['Ex.: preta, azul ou branca','E.g. black, blue or white'], ['Praia e Verão','Beach & Summer'],['Kits Prontos','Ready-Made Kits'],['Kit Churrasco','Barbecue Kits'],['Kit Queijo','Cheese Kits'],['Kit Caderno','Notebook Kits'],['Kit de Café','Coffee Sets'],['Kit Taça','Wine & Glass Sets'],['Kit Pizza','Pizza Sets'],['Kit Onboarding','Onboarding Kits'],['Cozinha','Kitchen'],['Canecas','Mugs'],['Copos','Cups'],['Canetas','Pens'],['Mochilas','Backpacks'],['Bolsas','Bags'],['Bolsas Térmicas','Cooler Bags'],['Malas','Luggage'],['Sacolas','Tote Bags'],['Sacochilas','Drawstring Bags'],['Nécessaires','Toiletry Bags'],['Roupas','Clothing'],['Tábuas','Boards'],['Petisco','Appetizer Sets'],['Ferramentas','Tools'],['Chaveiros','Keychains'],['Cadernos','Notebooks'],['Isolamento térmico','Thermal insulation'],['Térmica','Insulated'],['Não térmica','Non-insulated'],['Não informado','Not specified'],['Todas as opções','All options'],['Garrafas','Bottles'],['Squeezes e Garrafas','Bottles'],['Blocos e Cadernetas','Notepads & Notebooks'],['Power Bank','Power Banks'],['Carregadores','Chargers'],['Fone','Headphones'],['Fones de Ouvido','Headphones'],['Caixas de Som','Speakers'],['Guarda-Chuva','Umbrellas'],['Escritório','Office'],['Casa','Home & Living'],['Cuidados Pessoais','Personal Care'],['Bar e Bebidas','Bar & Drinks'],['Esporte e Jogos','Sports & Games'],['Brinquedos','Toys'],['Embalagens','Packaging'],['Utilidades','Everyday Items'],['Estojos','Cases'],['Pastas','Folders'],['Porta Retratos','Photo Frames'],['Porta-documentos e ID','Document & ID Holders'],['Linha Pet','Pet Collection'],['Linha Feminina','Women’s Collection'],['Linha Masculina','Men’s Collection'],['Linha Ecológica','Eco Collection'],['Lanternas e Luminárias','Flashlights & Lamps'],['Conjuntos Executivos','Executive Sets'],['Lápis e Lapiseiras','Pencils & Mechanical Pencils'],['Relógios','Watches'],['Espelhos','Mirrors'],['Moda e Estilo','Fashion & Style'],['Acessórios p/ Celular','Phone Accessories'],['Acessórios para Carros','Car Accessories'], ['Portal do Cliente','Client Portal'],['Acesse sua conta','Sign in to your account'],['Crie o acesso da empresa','Create your company account'],['Recupere seu acesso','Recover your access'],['Entrar no portal','Sign in'],['Criar acesso','Create account'],['Enviar instruções','Send instructions'],['Esqueci minha senha','Forgot password'],['Manter conectado','Keep me signed in'],['Voltar para o acesso','Back to sign in'],['Primeiro acesso da sua empresa?','First time accessing your company account?'],['E-mail corporativo','Work email'],['Senha','Password'],['Mínimo de 8 caracteres','At least 8 characters'],['Nome do responsável','Contact name'],['Seu nome completo','Your full name'],['Empresa','Company'],['Nome da empresa','Company name'],['Aguarde...','Please wait...'],['AMBIENTE EXCLUSIVO','PRIVATE ACCESS'],['Seus dados protegidos','Your data is protected'],['Cada empresa acessa somente suas próprias informações.','Each company can access only its own information.'],['Sua operação de brindes mais simples, visível e inteligente.','A simpler, clearer and smarter way to manage branded merchandise.'],['Acompanhe produção, estoque, reposições e envios com clareza do início ao fim.','Track production, inventory, replenishment and shipping from start to finish.'],['GESTÃO DA EXPERIÊNCIA, EM UM SÓ LUGAR','EXPERIENCE MANAGEMENT IN ONE PLACE'],['Estoque sob controle','Inventory under control'],['Entre com o e-mail corporativo cadastrado.','Sign in with your registered work email.'],['Informe os dados do responsável pela conta.','Enter the details of the account owner.'],['Digite seu e-mail corporativo para receber as instruções.','Enter your work email to receive instructions.'], ['Meu Estoque','My Inventory'],['Acompanhar Produção','Track Production'],['Mockups','Mockups'],['Meus Envios','My Shipments'],['Novos Envios','New Shipments'],['Repor Estoque','Replenish Inventory'],['Relatórios','Reports'],['Meu Perfil','My Profile'],['Experiência','Experience'],['Notificações','Notifications'],['Sair','Sign out'],['Visão geral','Overview'],['Produtos','Products'],['Produção','Production'],['Envios','Shipments'],['Reposições','Replenishments'],['Avaliações','Reviews'],['Pedidos','Orders'],['Estoque','Inventory'],['Disponível','Available'],['Reservado','Reserved'],['Mínimo','Minimum'],['Físico','Physical'],['Em trânsito','In transit'],['Entregue','Delivered'],['Pendente','Pending'],['Aprovado','Approved'],['Rejeitado','Rejected'],['Em produção','In production'],['Nenhum envio no período.','No shipments in this period.'],['Nenhum produto requer reposição.','No products need replenishment.'],['Nenhuma produção ativa no momento.','No active production at the moment.'],['Os produtos aparecerão aqui após o cadastro pela SwagDecor.','Products will appear here after SwagDecor adds them.'],['Os novos pedidos aparecerão aqui.','New orders will appear here.'],['Salvar alterações','Save changes'],['Solicitar reposição','Request replenishment'],['Solicitar alteração','Request changes'],['Aprovar','Approve'],['Não aprovar','Do not approve'],['Ver produção','View production'],['Baixar relatório','Download report'],['Exportar relatório','Export report'],['Buscar','Search'],['Pesquisar','Search'],['Últimos 30 dias','Last 30 days'],['Últimos 90 dias','Last 90 days'],['Últimos 6 meses','Last 6 months'],['Últimos 12 meses','Last 12 months'],['Todos os produtos','All products'],['Todos os estados','All statuses'],['Hoje','Today'],['Ontem','Yesterday'],['Próxima etapa','Next step'],['Confirmar','Confirm'],['Cancelar','Cancel'],['Voltar','Back'],['Continuar','Continue'],['Revisão','Review'],['Destinatário','Recipient'],['Destinatários','Recipients'],['Endereço','Address'],['Número','Number'],['Prazo desejado, cores ou outras orientações','Requested deadline, colors or other instructions'], ['Sua experiência importa','Your experience matters'],['Como você se sentiu ao receber?','How did you feel when you received it?'],['Como podemos chamar você?','What is your name?'],['Quer contar mais sobre a experiência?','Would you like to share more?'],['Escreva aqui seu comentário...','Write your comment here...'],['Obrigado por compartilhar sua experiência!','Thank you for sharing your experience!'],['Esta pesquisa não está ativa','This survey is not active'],['Enviar avaliação','Submit review'],['De 1 a 5, quanto você se sentiu valorizado(a)?','From 1 to 5, how valued did you feel?'],['Essa experiência mudou sua percepção sobre a empresa?','Did this experience change your perception of the company?'],['Não mudou','No change'],['Autorizo o uso deste depoimento e da foto em comunicações da empresa.','I authorize the use of this testimonial and photo in company communications.'] ]; const translations = new Map(entries); for (const [pt, en] of [ ['Acompanhe os números reais da sua operação e tome ações rápidas.','Track your real operating metrics and take action quickly.'],['Acompanhe os principais números e tome ações rápidas.','Track key metrics and take action quickly.'],['Acompanhamento atualizado pela operação SwagDecor.','Updates from the SwagDecor operations team.'],['Acompanhamento logístico recente','Recent shipping updates'],['Pedidos em operação','Active orders'],['Projetos e produção','Projects and production'],['Produtos próximos do estoque mínimo','Products nearing minimum stock'],['Produtos que precisam da sua atenção','Products needing your attention'],['Seu estoque está sob controle.','Your inventory is under control.'],['Olá, Carla. Seu estoque está sob controle.','Hello, Carla. Your inventory is under control.'],['Visão rápida dos produtos armazenados','Quick view of stored products'],['Saldos e reposições em tempo real','Inventory and replenishment in real time'],['Movimentações recentes','Recent stock movements'],['Movimentações de estoque','Stock movements'],['Histórico auditável do estoque','Auditable inventory history'],['Histórico auditável','Auditable history'],['Nenhuma movimentação registrada.','No stock movements recorded.'],['Estoque saudável','Healthy inventory'],['Sugestões de reposição','Replenishment suggestions'],['Reposições em andamento','Replenishments in progress'],['Solicite novas unidades e acompanhe cada etapa de produção.','Request more units and track each production stage.'],['Unidades disponíveis','Available units'],['disponíveis','available'],['em personalização','being customized'],['em personalização ou embalagem','being customized or packaged'],['aguardam validação','awaiting approval'],['artes disponíveis','artwork available'],['no período selecionado','in the selected period'], ['PRODUÇÃO DOS PRODUTOS COMPRADOS','PRODUCTION OF PURCHASED PRODUCTS'],['Da solicitação à entrada no centro de distribuição','From request to arrival at the distribution center'],['Os pedidos ativos vêm diretamente do banco. Ao concluir a entrada no CD, o item deixa esta fila e retorna ao estoque.','Active orders come directly from the system. Once received at the distribution center, an item leaves this queue and returns to inventory.'],['Confira a aplicação da sua marca antes de liberar o produto para personalização.','Review your brand placement before approving the product for customization.'],['Confira posição, proporção e legibilidade da marca. Clique na imagem para ampliar.','Check the brand position, proportions and legibility. Click the image to enlarge.'],['APLICAÇÃO DA MARCA','BRAND PLACEMENT'],['VALIDAÇÃO DAS ARTES','ARTWORK APPROVAL'],['Sugestão ou motivo da reprovação','Suggestion or reason for rejection'],['Ex.: aumentar o logotipo e centralizar a aplicação...','E.g. make the logo larger and center it...'],['Pedido de produção:','Production order:'],['Previsão','Estimated date'],['Último retorno','Last update'], ['O que você deseja enviar?','What would you like to send?'],['Forma de seleção','Selection method'],['Envie o kit completo em uma única seleção','Send the complete kit in one selection'],['Kit preparado e armazenado como uma única unidade, seguindo a composição e o mockup aprovados.','A kit prepared and stored as one unit, following the approved contents and mockup.'],['Informe quem receberá este envio. Todos os campos marcados são salvos com o pedido.','Enter the recipient details. All marked fields will be saved with the order.'],['Dados do destinatário','Recipient details'],['Nome do destinatário *','Recipient name *'],['Endereço *','Address *'],['Número *','Number *'],['SOLICITAÇÃO DE SAÍDA','SHIPPING REQUEST'],['O estoque dos itens foi reservado e a equipe SwagDecor já recebeu sua solicitação.','The items have been reserved and the SwagDecor team has received your request.'],['A SwagDecor analisará a solicitação e enviará uma proposta para aprovação antes de iniciar a produção.','SwagDecor will review the request and send a proposal for approval before production begins.'],['Destinatários recentes','Recent recipients'],['Últimos envios realizados','Latest shipments'],['Últimos envios','Latest shipments'],['Rastreio e histórico centralizados','Tracking and history in one place'],['Copiar código de rastreio','Copy tracking code'],['Visão logística atual','Current shipping overview'],['Envios este mês','Shipments this month'],['Ocorrências','Issues'], ['ANÁLISES','ANALYTICS'],['INVENTÁRIO','INVENTORY'],['LOGÍSTICA','SHIPPING'],['RECOMPOSIÇÃO','REPLENISHMENT'],['VISÃO GERAL','OVERVIEW'],['CENTRAL DE OPERAÇÕES','OPERATIONS CENTER'],['Indicadores de logística, estoque e experiência em um só lugar.','Shipping, inventory and experience metrics in one place.'],['Consumo, movimentações e custos para decisões mais inteligentes.','Usage, stock movements and costs for better decisions.'],['Envios por período','Shipments over time'],['Envios por mês','Monthly shipments'],['Envios por estado','Shipments by state'],['Produtos mais enviados','Most shipped products'],['Volume mensal de solicitações','Monthly request volume'],['Evolução dos últimos seis meses','Trend over the last six months'],['Distribuição dos destinos atendidos','Distribution of shipping destinations'],['Valor médio por envio','Average cost per shipment'],['média no período','average in this period'],['custos logísticos','shipping costs'],['Período analisado','Period analyzed'],['Hoje · Operação registrada','Today · Operation recorded'],['Com comentários','With comments'],['Comentários recentes','Recent comments'],['Nenhuma avaliação encontrada','No reviews found'], ['Experiência que deixa marca','An experience that leaves a mark'],['Experiência que vira informação','Experience becomes insight'],['Entenda como os presentes fortalecem a percepção da sua marca.','See how gifts shape perceptions of your brand.'],['Avaliações recebidas','Reviews received'],['Avaliações dos colaboradores','Employee reviews'],['Resumo da experiência','Experience summary'],['Resumo das avaliações','Review summary'],['Índice calculado pelas respostas recebidas dos colaboradores.','Index calculated from employee responses.'],['Percepção de quem recebeu','Recipient perception'],['Percepção sobre a empresa','Perception of the company'],['Percepção melhorou','Perception improved'],['Experiência média','Average experience'],['Participação','Participation'],['Sua experiência importa','Your experience matters'],['Leva menos de 2 minutos. Suas respostas ajudam a melhorar os próximos momentos.','It takes under two minutes. Your answers help us improve future experiences.'],['LINK INDISPONÍVEL','LINK UNAVAILABLE'],['Solicite um novo link à empresa responsável pelo envio do presente.','Request a new link from the company that sent the gift.'],['AVALIAÇÃO ENVIADA','REVIEW SUBMITTED'],['Avaliação verificada','Verified review'],['Depoimentos exibidos somente quando há consentimento','Testimonials are shown only with consent.'], ['Dados da empresa, usuários e preferências.','Company details, users and preferences.'],['Dados da empresa e usuários vinculados ao acesso.','Company details and users linked to this account.'],['Usuários e permissões','Users and permissions'],['Convidar usuário','Invite user'],['Nenhum usuário cadastrado.','No users registered.'],['Conta ativa','Active account'],['Ambiente privado','Private environment'],['Usuários desta empresa acessam exclusivamente os dados vinculados à Acme Brasil.','Users of this company can access only Acme Brasil data.'],['As informações exibidas nesta tela vêm do cadastro da empresa no banco.','The information shown here comes from the company account.'],['Suas informações são armazenadas com segurança.','Your information is stored securely.'] ]) translations.set(pt, en); const originals = new WeakMap(); const attrOriginals = new WeakMap(); const cookie = document.cookie.match(/(?:^|; )swag_lang=(en|pt)(?:;|$)/); let language = cookie?.[1] || localStorage.getItem('swag_lang') || 'pt'; let observer; const translate = value => { const trimmed = value.trim(); if (!trimmed) return value; const exact = translations.get(trimmed); if (exact) return value.replace(trimmed, exact); const count = trimmed.match(/^(\d[\d.]*) produtos encontrados$/); if (count) return value.replace(trimmed, `${count[1]} products found`); const page = trimmed.match(/^Página (\d+) de (\d+)$/); if (page) return value.replace(trimmed, `Page ${page[1]} of ${page[2]}`); return value; }; function walk(root = document.body) { if (!root) return; const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT); for (let node; (node = walker.nextNode()); ) { const parent = node.parentElement; if (!parent || parent.closest('[data-swag-language]') || /^(SCRIPT|STYLE|NOSCRIPT|TEXTAREA)$/.test(parent.tagName)) continue; let original = originals.get(node); if (original === undefined || (node.nodeValue !== original && node.nodeValue !== translate(original))) original = node.nodeValue; originals.set(node, original); const next = language === 'en' ? translate(original) : original; if (node.nodeValue !== next) node.nodeValue = next; } for (const el of [root, ...root.querySelectorAll('*')]) { if (!(el instanceof Element) || el.closest('[data-swag-language]')) continue; let prior = attrOriginals.get(el) || {}; for (const key of ['placeholder','title','aria-label']) { const value = el.getAttribute(key); if (value === null) continue; if (prior[key] === undefined || (value !== prior[key] && value !== translate(prior[key]))) prior[key] = value; const next = language === 'en' ? translate(prior[key]) : prior[key]; if (value !== next) el.setAttribute(key, next); } attrOriginals.set(el, prior); } } function setLanguage(next) { language = next === 'en' ? 'en' : 'pt'; localStorage.setItem('swag_lang', language); document.cookie = `swag_lang=${language}; Domain=.swagdecorbrindes.com.br; Path=/; Max-Age=31536000; SameSite=Lax; Secure`; document.documentElement.lang = language === 'en' ? 'en' : 'pt-BR'; window.SWAG_LANG = language; walk(); } function mount(target) { if (!target || target.querySelector('select')) return; target.dataset.swagLanguage = ''; target.innerHTML = ''; const select = target.querySelector('select'); select.value = language; select.addEventListener('change', () => setLanguage(select.value)); setLanguage(language); observer?.disconnect(); let queued = false; observer = new MutationObserver(() => { if (queued) return; queued = true; requestAnimationFrame(() => { queued = false; observer.disconnect(); walk(); observer.observe(document.body, { childList: true, characterData: true, subtree: true }); }); }); observer.observe(document.body, { childList: true, characterData: true, subtree: true }); } window.SwagI18n = { mount, setLanguage, get language() { return language; } }; const ready = () => mount(document.querySelector('#language-switcher')); if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', ready, { once: true }); else ready(); })();