- Add two airports (north/south) with full geometry: runways, taxiways,
aprons, terminals, hangars, stands, and helipads; walkable airport
grounds extend beyond city bounds.
- Introduce ATC AI agent ("Torre de Controle City10") using AI_ATC_MODEL
to generate takeoff clearances; includes dispatch endpoint with
30-second cooldown and deterministic fallback on failure.
- Implement AI model fallback chain: preferred model → AI_FALLBACK_MODEL
before failing, applied in ChatController and PersonTalkController.
- Add luminous sign labels (letreiros) for plazas, beach, food, hospital,
school, city hall, and airports with day/night glow.
- Fix city presence cache: compute is_me per viewer instead of baking
into shared per-second cache to prevent cross-user flag leakage.
- Add tests: AirportTest, CityPresenceTest, SignLabelsTest, and
PersonTalkTest fallback model retry scenario.
264 lines
14 KiB
JSON
Executable File
264 lines
14 KiB
JSON
Executable File
{
|
|
"Login": "Entrar",
|
|
"Logout": "Sair",
|
|
"Register": "Cadastrar",
|
|
"Dashboard": "Painel",
|
|
"Email": "E-mail",
|
|
"Password": "Senha",
|
|
"Password Confirmation": "Confirmar Senha",
|
|
"Remember Me": "Lembrar de mim",
|
|
"Name": "Nome",
|
|
"Save": "Salvar",
|
|
"Cancel": "Cancelar",
|
|
"Delete": "Excluir",
|
|
"Edit": "Editar",
|
|
"Create": "Criar",
|
|
"Search": "Buscar",
|
|
"Back": "Voltar",
|
|
"Welcome": "Bem-vindo ao City10",
|
|
"auth.failed": "As credenciais fornecidas não correspondem aos nossos registros.",
|
|
"auth.disabled": "Esta conta foi desativada. Contate o administrador.",
|
|
"auth.forbidden": "Você não tem permissão para acessar este recurso.",
|
|
"auth.logged_out": "Sessão encerrada com sucesso.",
|
|
"auth.throttle": "Muitas tentativas. Tente novamente em :seconds segundos.",
|
|
"legal.accept_required": "Você precisa aceitar os Termos de Uso e a Política de Privacidade antes de continuar.",
|
|
"legal.accepted": "Termos aceitos com sucesso.",
|
|
"legal.must_accept_terms": "Você precisa aceitar os Termos de Uso.",
|
|
"legal.must_accept_privacy": "Você precisa aceitar a Política de Privacidade.",
|
|
"legal.must_accept_cookies": "Você precisa aceitar a Política de Cookies.",
|
|
"validation.captcha_required": "Resolva a verificação matemática.",
|
|
"validation.captcha_failed": "Resposta da verificação matemática incorreta.",
|
|
"validation.model_not_allowed": "O modelo de IA selecionado não está na lista de permitidos.",
|
|
"users.cannot_deactivate_self": "Você não pode desativar sua própria conta.",
|
|
"users.deactivated": "Conta desativada com sucesso.",
|
|
"stores.deleted": "Loja excluída com sucesso.",
|
|
"agents.deleted": "Agente excluído com sucesso.",
|
|
"welcome.tagline": "Uma cidade 3D viva no navegador, com agentes de IA autônomos — Prefeito, pedestres, lojistas e veículos — decidindo em tempo real através do OpenRouter.ai.",
|
|
"welcome.card1.title": "🌐 Cidade 3D em Tempo Real",
|
|
"welcome.card1.desc": "Explore ruas, avenidas, pontes, rios, praças e edifícios renderizados com Three.js direto no navegador.",
|
|
"welcome.card2.title": "🤖 Agentes de IA",
|
|
"welcome.card2.desc": "Prefeito, pedestres e lojistas tomam decisões estratégicas através de modelos gratuitos do OpenRouter.ai.",
|
|
"welcome.card3.title": "🔒 Seguro & LGPD",
|
|
"welcome.card3.desc": "Autenticação diferenciada (Admin/User), CAPTCHA matemático e consentimento auditável de termos conforme a legislação brasileira.",
|
|
"welcome.city.title": "🗺️ Elementos da Cidade (Fase 1)",
|
|
"welcome.city.desc": "A base de dados já modela casas, edifícios, escolas, parques, praças, semáforos, ruas, avenidas, pontes, aeroportos, rios, indústrias, lojas e lojistas — todos com coordenadas 3D (X, Y, Z) prontas para o motor de renderização.",
|
|
"welcome.no_account": "Não tem conta?",
|
|
"welcome.has_account": "Já tem conta?",
|
|
"nav.city": "Cidade 3D",
|
|
"nav.admin": "Administração",
|
|
"dashboard.open_viewer": "Abrir visualizador 3D",
|
|
"dashboard.viewer_desc": "Explore o chão da cidade, lojas e agentes com câmera controlável.",
|
|
"dashboard.stores_title": "Lojas",
|
|
"dashboard.stores_desc": "Lojas cadastradas na cidade 3D.",
|
|
"dashboard.legal_title": "Consentimentos",
|
|
"dashboard.consent_history": "Ver histórico de aceites",
|
|
"legal.terms_label": "Termos",
|
|
"legal.privacy_label": "Privacidade",
|
|
"legal.cookies_label": "Cookies",
|
|
"admin.stores.title": "Gerenciar Lojas",
|
|
"admin.stores.manage": "Gerenciar lojas",
|
|
"admin.stores.admin_desc": "Cadastre lojas e defina a posição 3D delas na cidade.",
|
|
"admin.stores.new": "Nova loja",
|
|
"admin.stores.created": "Loja criada com sucesso.",
|
|
"admin.stores.updated": "Loja atualizada com sucesso.",
|
|
"admin.stores.edit_title": "Editar loja",
|
|
"admin.stores.create_title": "Nova loja",
|
|
"admin.stores.empty": "Nenhuma loja cadastrada ainda.",
|
|
"admin.stores.position": "Posição 3D na cidade",
|
|
"admin.stores.position_hint": "Clique no chão para definir X/Z, ou digite as coordenadas. Use os controles para girar/zoom.",
|
|
"admin.stores.pos_x": "Posição X",
|
|
"admin.stores.pos_y": "Altura Y (chão = 0)",
|
|
"admin.stores.pos_z": "Posição Z",
|
|
"admin.stores.dimensions": "Dimensões do prédio",
|
|
"admin.stores.width": "Largura",
|
|
"admin.stores.height": "Altura",
|
|
"admin.stores.depth": "Profundidade",
|
|
"admin.stores.type": "Tipo de loja",
|
|
"admin.stores.description": "Descrição",
|
|
"admin.stores.owner": "Dono (usuário)",
|
|
"admin.stores.agent": "Agente de IA (lojista)",
|
|
"admin.stores.is_open": "Loja aberta",
|
|
"admin.stores.no_owner": "Sem dono",
|
|
"admin.stores.no_agent": "Sem agente",
|
|
"admin.stores.actions": "Ações",
|
|
"admin.stores.coords": "Coordenadas",
|
|
"admin.stores.confirm_delete": "Excluir esta loja da cidade?",
|
|
"city.title": "Visualizador 3D da Cidade",
|
|
"city.loading": "Carregando cidade…",
|
|
"city.error": "Falha ao carregar os dados da cidade.",
|
|
"city.stores_count": "lojas",
|
|
"city.agents_count": "agentes",
|
|
"city.hint": "Clique na tela para controlar · WASD para andar · Mouse para olhar · Esc para sair · Chegue perto de alguém para conversar",
|
|
"city.refresh": "Recarregar",
|
|
"city.selected": "Selecionada",
|
|
"city.open": "Aberta",
|
|
"city.closed": "Fechada",
|
|
"city.hint_fps": "WASD para andar · Mouse para olhar · Esc para sair · Clique no NPC para conversar",
|
|
"city.position": "POSIÇÃO",
|
|
"city.on_ground": "no chão",
|
|
"city.triangles": "tris de colisão",
|
|
"city.chat_placeholder": "Digite sua mensagem…",
|
|
"city.chat_thinking": "pensando…",
|
|
"city.chat_responding": "respondendo…",
|
|
"city.chat_accepted": "Mensagem enviada ao agente.",
|
|
"city.chat_error": "Desculpe, não consegui responder agora. Tente novamente.",
|
|
"city.talk_ratelimited": "Muitas mensagens — aguarde um instante e tente de novo.",
|
|
"city.chat_send": "Enviar",
|
|
"city.chat_with": "Conversando com",
|
|
"city.clock": "Horário",
|
|
"city.weather": "Clima",
|
|
"city.weather_clear": "Ensolarado",
|
|
"city.weather_cloudy": "Nublado",
|
|
"city.weather_rain": "Chuva",
|
|
"city.weather_storm": "Tempestade",
|
|
"city.vehicles_count": "veículos",
|
|
"city.pedestrians_count": "pedestres",
|
|
"auth.pending": "Sua conta aguarda aprovação do administrador.",
|
|
"auth.pending_title": "Aguardando aprovação",
|
|
"auth.pending_body": "Seu cadastro foi recebido. Um administrador precisa aprovar sua conta antes que você possa entrar na cidade. Você pode fechar esta página e tentar novamente mais tarde.",
|
|
"admin.citizens.title": "Cidadãos",
|
|
"admin.citizens.hint": "Aprove contas pendentes para criar o personagem na cidade.",
|
|
"admin.citizens.name": "Nome",
|
|
"admin.citizens.status": "Status",
|
|
"admin.citizens.character": "Personagem",
|
|
"admin.citizens.actions": "Ações",
|
|
"admin.citizens.approve": "Aprovar",
|
|
"admin.citizens.approved": "Cidadão aprovado e personagem criado.",
|
|
"admin.citizens.ban": "Banir",
|
|
"admin.citizens.banned": "Cidadão banido.",
|
|
"admin.citizens.cannot_ban_self": "Você não pode banir a própria conta.",
|
|
"admin.cities.title": "Cidades e território",
|
|
"admin.cities.hint": "Crie novas cidades ou expanda o território das existentes (+40 por quadra).",
|
|
"admin.cities.name": "Nome da cidade",
|
|
"admin.cities.create": "Criar cidade",
|
|
"admin.cities.created": "Cidade criada.",
|
|
"admin.cities.bounds": "Limites",
|
|
"admin.cities.expansions": "Expansões",
|
|
"admin.cities.expand": "Expandir",
|
|
"admin.cities.expanded": "Território expandido.",
|
|
"admin.cities.max_expansions": "Limite de expansões atingido.",
|
|
"nav.citizens": "Cidadãos",
|
|
"nav.cities": "Cidades",
|
|
"city.action_unknown": "Ação desconhecida.",
|
|
"city.action_ok": "Ação realizada.",
|
|
"city.no_food": "Você não tem comida no inventário.",
|
|
"city.no_water": "Você não tem água no inventário.",
|
|
"city.no_house": "Você precisa de uma casa concluída para dormir.",
|
|
"city.no_job": "Você não tem emprego. Candidate-se a uma vaga.",
|
|
"city.no_school": "Não há escola disponível nesta cidade.",
|
|
"city.job_other_city": "Esta vaga pertence a outra cidade.",
|
|
"city.job_education": "Educação insuficiente para esta vaga.",
|
|
"city.no_money": "Dinheiro insuficiente.",
|
|
"city.no_inventory": "Quantidade insuficiente no inventário.",
|
|
"city.out_of_bounds": "Posição fora dos limites da cidade.",
|
|
"city.no_materials": "Você precisa de 50 materiais para construir.",
|
|
"city.site_taken": "Este terreno já está ocupado.",
|
|
"city.build_started": "Construção iniciada. O ticker conclui a casa.",
|
|
"city.social_unknown": "Ação social desconhecida.",
|
|
"city.social_self": "Você não pode fazer isso consigo mesmo.",
|
|
"city.social_exists": "Relação já existe ou está pendente.",
|
|
"city.social_friend_sent": "Pedido de amizade enviado.",
|
|
"city.social_friend_ok": "Amizade aceita.",
|
|
"city.social_need_friend": "Vocês precisam ser amigos aceitos.",
|
|
"city.social_married": "Você já é casado(a).",
|
|
"city.social_married_ok": "Casamento realizado.",
|
|
"city.social_need_spouse": "Você precisa ser casado(a) para ter um filho.",
|
|
"city.social_child_ok": "Nasceu um filho na cidade!",
|
|
"city.chat_sent": "Mensagem enviada.",
|
|
"city.hud_hunger": "Fome",
|
|
"city.hud_thirst": "Sede",
|
|
"city.hud_energy": "Energia",
|
|
"city.hud_money": "Dinheiro",
|
|
"city.hud_state": "Estado",
|
|
"city.hud_education": "Educação",
|
|
"city.hud_inventory": "Inventário",
|
|
"city.hud_jobs": "Empregos",
|
|
"city.hud_actions": "Ações",
|
|
"city.hud_social": "Social",
|
|
"city.act_eat": "Comer",
|
|
"city.act_drink": "Beber",
|
|
"city.act_sleep": "Dormir",
|
|
"city.act_wake": "Acordar",
|
|
"city.act_work": "Trabalhar",
|
|
"city.act_stop": "Parar",
|
|
"city.act_study": "Estudar",
|
|
"city.act_buy": "Comprar kit",
|
|
"city.act_sell_v": "Vender produto",
|
|
"city.act_build": "Construir casa (50 mat.)",
|
|
"city.act_apply": "Candidate-se",
|
|
"city.act_friend": "Amizade",
|
|
"city.act_marry": "Casar",
|
|
"city.act_child": "Filho",
|
|
"city.me": "Meu personagem",
|
|
"city.citizens_near": "Cidadãos",
|
|
"city.apply_job": "Aplicar para",
|
|
"city.buy_hint": "Compra 1 comida+1 água+10 materiais",
|
|
"city.hospital_hit": "Você foi atropelado! Internado no hospital por 1 hora.",
|
|
"city.hospital_already": "Você já está internado no hospital.",
|
|
"city.hospital_blocked": "Você está internado no hospital e não pode fazer isso agora.",
|
|
"city.hospital_bed": "Internado no hospital",
|
|
"city.hospital_released": "Alta do hospital: você foi liberado.",
|
|
"city.hospital_title": "Hospitalizado",
|
|
"city.hospital_left": "Alta em",
|
|
"city.audio": "Áudio",
|
|
"city.vol_master": "Geral",
|
|
"city.vol_music": "Música",
|
|
"city.vol_sfx": "Efeitos",
|
|
"city.mute": "Mudo",
|
|
"city.audio_hint": "Volume salvo neste dispositivo.",
|
|
"city.hud_health": "Saúde",
|
|
"city.hud_exercise": "Exercícios",
|
|
"city.exercise_use": "Pressione E para exercitar",
|
|
"city.exercise_active": "Exercitando",
|
|
"city.exercise_stopHint": "para parar",
|
|
"city.exercise_ok": "Boa! +2 de saúde.",
|
|
"city.beach_need": "Para relaxar, vá até a praia.",
|
|
"city.beach_ok": "Você relaxou na praia e recuperou ânimo!",
|
|
"city.beach_full": "Energia e saúde já estão no máximo.",
|
|
"city.beach_busy": "Termine o exercício atual primeiro.",
|
|
"city.beach_start": "Descansando na areia…",
|
|
"city.beach_prompt": "Relaxar na praia",
|
|
"city.beach_active": "Relaxando na praia",
|
|
"city.atc_missing": "Nenhuma torre de controle configurada.",
|
|
"city.sign_plaza": "Praça",
|
|
"city.sign_beach": "Praia",
|
|
"city.sign_food": "Comidas",
|
|
"city.sign_hospital": "Hospital",
|
|
"city.sign_school": "Escola",
|
|
"city.sign_cityhall": "Prefeitura",
|
|
"city.exercise_need_equipment": "Aproxime-se de um equipamento da praça.",
|
|
"city.exercise_need_awake": "Você precisa estar acordado para se exercitar.",
|
|
"city.exercise_tired": "Você está cansado demais para se exercitar.",
|
|
"city.exercise_max_health": "Saúde já está no máximo!",
|
|
"city.exerciseStart": "Começando a se exercitar…",
|
|
"city.exerciseStop": "Exercício encerrado.",
|
|
"city.ped_red": "Semáforo de pedestre vermelho — aguarde o sinal verde.",
|
|
"nav.world": "Mundo",
|
|
"admin.world.title": "Painel do mundo",
|
|
"admin.world.hint": "Métricas ao vivo da plataforma persistente.",
|
|
"admin.world.users": "Usuários",
|
|
"admin.world.characters": "Personagens",
|
|
"admin.world.economy": "Economia",
|
|
"admin.world.trade_volume": "Volume de trocas",
|
|
"admin.world.world": "Casas prontas",
|
|
"admin.world.market": "Mercado",
|
|
"admin.world.missions": "Missões",
|
|
"admin.world.health": "Saúde média",
|
|
"admin.world.education": "Educação média",
|
|
"city.customize_saved": "Aparência atualizada.",
|
|
"city.market_listed": "Anúncio publicado no mercado.",
|
|
"city.market_bought": "Compra realizada!",
|
|
"city.market_unavailable": "Anúncio indisponível.",
|
|
"city.ride_need_stop": "Aproxime-se de uma via (ônibus) ou dos trilhos (trem).",
|
|
"city.ride_bus_ok": "Você embarcou no ônibus!",
|
|
"city.ride_train_ok": "Você embarcou no trem!",
|
|
"city.missions_done": "Missão concluída",
|
|
"city.act_market": "Mercado",
|
|
"city.act_customize": "Aparência",
|
|
"city.act_ride_bus": "Ônibus",
|
|
"city.act_ride_train": "Trem",
|
|
"city.hud_minimap": "Mapa",
|
|
"city.online_now": "online",
|
|
"city.marketBuy": "Comprar"
|
|
}
|