Added Portuguese (Brazil) translations (#766)

* Add support for Portuguese (Brazil) locale, except for moves and abilities.

* All ptBR translations, names of moves and abilities maintained in english.

* Small fixes

* Updated Frisk and fixed Plus and Minus descriptions

* Changed the settings label to "Português (BR)"
pull/403/head^2
José Ricardo Fleury Oliveira 2024-05-13 13:18:24 -03:00 committed by GitHub
parent 6d73500aeb
commit 2a32189ea1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 6479 additions and 22 deletions

1241
src/locales/pt_BR/ability.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,53 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} apareceu.",
"trainerAppeared": "{{trainerName}}\nquer batalhar!",
"singleWildAppeared": "Um {{pokemonName}} selvagem apareceu!",
"multiWildAppeared": "Um {{pokemonName1}} e um {{pokemonName2}} selvagens\napareceram!",
"playerComeBack": "{{pokemonName}}, retorne!",
"trainerComeBack": "{{trainerName}} retirou {{pokemonName}} da batalha!",
"playerGo": "{{pokemonName}}, eu escolho você!",
"trainerGo": "{{trainerName}} enviou {{pokemonName}}!",
"switchQuestion": "Quer trocar\n{{pokemonName}}?",
"trainerDefeated": "Você derrotou\n{{trainerName}}!",
"pokemonCaught": "{{pokemonName}} foi capturado!",
"pokemon": "Pokémon",
"sendOutPokemon": "{{pokemonName}}, eu escolho você!!",
"hitResultCriticalHit": "Um golpe crítico!",
"hitResultSuperEffective": "É supereficaz!",
"hitResultNotVeryEffective": "É pouco eficaz...",
"hitResultNoEffect": "Isso não afeta {{pokemonName}}!",
"hitResultOneHitKO": "Foi um nocaute de um golpe!",
"attackFailed": "Mas falhou!",
"attackHitsCount": `Acertou {{count}} vezes.`,
"expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.",
"levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!",
"learnMove": "{{pokemonName}} aprendeu {{moveName}}!",
"learnMovePrompt": "{{pokemonName}} quer aprender\n{{moveName}}.",
"learnMoveLimitReached": "Porém, {{pokemonName}} já sabe\nquatro movimentos.",
"learnMoveReplaceQuestion": "Quer substituir um de seus movimentos por {{moveName}}?",
"learnMoveStopTeaching": "Você não quer aprender\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} não aprendeu {{moveName}}.",
"learnMoveForgetQuestion": "Qual movimento quer esquecer?",
"learnMoveForgetSuccess": "{{pokemonName}} esqueceu como usar {{moveName}}.",
"levelCapUp": "O nível máximo aumentou\npara {{levelCap}}!",
"moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.",
"moveNoPP": "Não há mais PP\npara esse movimento!",
"moveDisabled": "Não se pode usar {{moveName}} porque foi desabilitado!",
"noPokeballForce": "Uma força misteriosa\nte impede de usar Poké Bolas.",
"noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!",
"noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!",
"noPokeballStrong": "Este Pokémon é forte demais para ser capturado!\nÉ preciso enfraquecê-lo primeiro!",
"noEscapeForce": "Uma força misteriosa\nte impede de fugir.",
"noEscapeTrainer": "Não se pode fugir de\nbatalhas contra treinadores!",
"noEscapePokemon": "O movimento {{moveName}} de {{pokemonName}} te impede de fugir!",
"runAwaySuccess": "Você fugiu com sucesso",
"runAwayCannotEscape": "Você nao conseguiu fugir!",
"escapeVerbSwitch": "trocar",
"escapeVerbFlee": "fugir",
"notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!",
"skipItemQuestion": "Tem certeza de que não quer escolher um item?",
"eggHatching": "Opa?",
"ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?"
} as const;

View File

@ -0,0 +1,9 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const commandUiHandler: SimpleTranslationEntries = {
"fight": "Lutar",
"ball": "Bolas",
"pokemon": "Pokémon",
"run": "Fugir",
"actionMessage": "O que {{pokemonName}}\ndeve fazer?",
} as const;

View File

@ -0,0 +1,32 @@
import { ability } from "./ability";
import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth";
import { menu } from "./menu";
import { menuUiHandler } from "./menu-ui-handler";
import { move } from "./move";
import { nature } from "./nature";
import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial";
export const ptBrConfig = {
ability: ability,
battle: battle,
commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler,
menuUiHandler: menuUiHandler,
menu: menu,
move: move,
pokeball: pokeball,
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial,
nature: nature,
growth: growth
}

View File

@ -0,0 +1,7 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "Poder",
"accuracy": "Precisão",
} as const;

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Instável",
"Fast": "Rápido",
"Medium_Fast": "Meio Rápido",
"Medium_Slow": "Meio Lento",
"Slow": "Lento",
"Fluctuating": "Flutuante"
} as const;

View File

@ -0,0 +1,23 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const menuUiHandler: SimpleTranslationEntries = {
"GAME_SETTINGS": 'Configurações',
"ACHIEVEMENTS": "Conquistas",
"STATS": "Estatísticas",
"VOUCHERS": "Vouchers",
"EGG_LIST": "Incubadora",
"EGG_GACHA": "Gacha de Ovos",
"MANAGE_DATA": "Gerenciar Dados",
"COMMUNITY": "Comunidade",
"RETURN_TO_TITLE": "Voltar ao Início",
"LOG_OUT": "Logout",
"slot": "Slot {{slotNumber}}",
"importSession": "Importar Sessão",
"importSlotSelect": "Selecione um slot para importar.",
"exportSession": "Exportar Sessão",
"exportSlotSelect": "Selecione um slot para exportar.",
"importData": "Importar Dados",
"exportData": "Exportar Dados",
"cancel": "Cancelar",
"losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?"
} as const;

46
src/locales/pt_BR/menu.ts Normal file
View File

@ -0,0 +1,46 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The menu namespace holds most miscellaneous text that isn't directly part of the game's
* contents or directly related to Pokemon data. This includes menu navigation, settings,
* account interactions, descriptive text, etc.
*/
export const menu: SimpleTranslationEntries = {
"cancel": "Cancelar",
"continue": "Continuar",
"dailyRun": "Desafio diário (Beta)",
"loadGame": "Carregar Jogo",
"newGame": "Novo Jogo",
"selectGameMode": "Escolha um modo de jogo.",
"logInOrCreateAccount": "Inicie uma sessão ou crie uma conta para começar. Não é necessário email!",
"username": "Nome de Usuário",
"password": "Senha",
"login": "Iniciar sessão",
"register": "Registrar-se",
"emptyUsername": "Nome de usuário vazio",
"invalidLoginUsername": "Nome de usuário inválido",
"invalidRegisterUsername": "O nome de usuário só pode conter letras, números e sublinhados",
"invalidLoginPassword": "Senha inválida",
"invalidRegisterPassword": "A senha deve ter pelo menos 6 caracteres",
"usernameAlreadyUsed": "Esse nome de usuário já está em uso",
"accountNonExistent": "Esse nome de usuário não existe",
"unmatchingPassword": "Senha incorreta",
"passwordNotMatchingConfirmPassword": "As senhas não coincidem",
"confirmPassword": "Confirmar senha",
"registrationAgeWarning": "Se registrando, você confirma que tem pelo menos 13 anos de idade.",
"backToLogin": "Voltar ao Login",
"failedToLoadSaveData": "Não foi possível carregar os dados de salvamento. Por favor, recarregue a página.\nSe a falha persistir, contate o administrador.",
"sessionSuccess": "Sessão carregada com sucesso.",
"failedToLoadSession": "Não foi possível carregar os dados da sua sessão.\nEles podem estar corrompidos.",
"boyOrGirl": "Você é um menino ou uma menina?",
"boy": "Menino",
"girl": "Menina",
"dailyRankings": "Classificação Diária",
"weeklyRankings": "Classificação Semanal",
"noRankings": "Sem Classificação",
"loading": "Carregando…",
"playersOnline": "Jogadores Ativos",
"empty": "Vazio",
"yes": "Sim",
"no": "Não",
} as const;

3812
src/locales/pt_BR/move.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Destemida",
"Lonely": "Solitária",
"Brave": "Valente",
"Adamant": "Rígida",
"Naughty": "Teimosa",
"Bold": "Corajosa",
"Docile": "Dócil",
"Relaxed": "Descontraída",
"Impish": "Inquieta",
"Lax": "Relaxada",
"Timid": "Tímida",
"Hasty": "Apressada",
"Serious": "Séria",
"Jolly": "Alegre",
"Naive": "Ingênua",
"Modest": "Modesta",
"Mild": "Mansa",
"Quiet": "Quieta",
"Bashful": "Atrapalhada",
"Rash": "Imprudente",
"Calm": "Calma",
"Gentle": "Gentil",
"Sassy": "Atrevida",
"Careful": "Cuidadosa",
"Quirky": "Peculiar",
} as const;

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokeball: SimpleTranslationEntries = {
"pokeBall": "Poké Bola",
"greatBall": "Grande Bola",
"ultraBall": "Ultra Bola",
"rogueBall": "Rogue Bola",
"masterBall": "Master Bola",
"luxuryBall": "Bola de Luxo",
} as const;

View File

@ -0,0 +1,16 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokemonStat: SimpleTranslationEntries = {
"HP": "PS",
"HPshortened": "PS",
"ATK": "Ataque",
"ATKshortened": "Ata",
"DEF": "Defesa",
"DEFshortened": "Def",
"SPATK": "At. Esp.",
"SPATKshortened": "AtEsp",
"SPDEF": "Def. Esp.",
"SPDEFshortened": "DefEsp",
"SPD": "Veloc.",
"SPDshortened": "Veloc."
} as const;

1086
src/locales/pt_BR/pokemon.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The menu namespace holds most miscellaneous text that isn't directly part of the game's
* contents or directly related to Pokemon data. This includes menu navigation, settings,
* account interactions, descriptive text, etc.
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": 'Começar com esses Pokémon?',
"growthRate": "Crescimento:",
"ability": "Hab.:",
"passive": "Passiva:",
"nature": "Nature:",
"eggMoves": "Mov. de Ovo",
"start": "Iniciar",
"addToParty": "Adicionar à equipe",
"toggleIVs": "Mostrar IVs",
"manageMoves": "Mudar Movimentos",
"useCandies": "Usar Doces",
"selectMoveSwapOut": "Escolha um movimento para substituir.",
"selectMoveSwapWith": "Escolha o movimento que substituirá",
"unlockPassive": "Aprender Passiva",
"reduceCost": "Reduzir Custo",
"cycleShiny": "R: Mudar Shiny",
"cycleForm": 'F: Mudar Forma',
"cycleGender": 'G: Mudar Gênero',
"cycleAbility": 'E: Mudar Habilidade',
"cycleNature": 'N: Mudar Nature',
"cycleVariant": 'V: Mudar Variante',
"enablePassive": "Ativar Passiva",
"disablePassive": "Desativar Passiva"
}

View File

@ -0,0 +1,43 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = {
"intro": `Bem-vindo ao PokéRogue! Este é um jogo de Pokémon feito por fãs focado em batalha com elementos roguelite.
$Este jogo não é monetizado e não reivindicamos propriedade de Pokémon nem dos ativos protegidos por direitos autorais usados.
$O jogo é um trabalho em andamento, mas totalmente jogável.\nPara relatórios de bugs, use a comunidade no Discord.
$Se o jogo rodar lentamente, certifique-se de que a 'Aceleração de hardware' esteja ativada nas configurações do seu navegador.`,
"accessMenu": `Para acessar o menu, aperte M ou Esc.
$O menu contém configurações e diversas funções.`,
"menu": `A partir deste menu, você pode acessar as configurações.
$Nas configurações, você pode alterar a velocidade do jogo, o estilo da janela e outras opções.
$Existem também vários outros recursos aqui, então não deixe de conferir todos eles!`,
"starterSelect": `Nessa tela, você pode selecionar seus iniciais.\nEsses são os Pokémon iniciais da sua equipe.
$Cada inicial tem seu próprio custo. Sua equipe pode ter até \n6 membros contando que o preço não ultrapasse 10.
$Você pode também selecionar o gênero, habilidade, e formas dependendo \ndas variantes que você capturou ou chocou.
$Os IVs da espécie são os melhores de todos que você \njá capturou ou chocou, então tente conseguir vários Pokémon da mesma espécie!`,
"pokerus": `Todo dia, 3 Pokémon iniciais ficam com uma borda roxa.
$Caso veja um inicial que você possui com uma dessa, tente\nadicioná-lo a sua equipe. Lembre-se de olhar seu sumário!`,
"statChange": `As mudanças de estatísticas se mantém depois do combate\ndesde que o Pokémon não seja trocado.
$Seus Pokémon voltam a suas Poké Bolas antes de batalhas contra treinadores e de entrar em um novo bioma.
$Também é possível ver as mudanças de estatísticas dos Pokémon em campo mantendo pressionado C ou Shift.`,
"selectItem": `Após cada batalha você pode escolher entre 3 itens aleatórios.\nVocê pode escolher apenas um.
$Esses variam entre consumíveis, itens de segurar, e itens passivos permanentes.
$A maioria dos efeitos de itens não consumíveis serão acumulados de várias maneiras.
$Alguns itens só aparecerão se puderem ser usados, por exemplo, itens de evolução.
$Você também pode transferir itens de segurar entre os Pokémon utilizando a opção de transferir.
$A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar.
$Você pode comprar itens consumíveis com dinheiro, e uma maior variedade ficará disponível conforme você for mais longe.
$Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolher, a próxima batalha começará.`,
"eggGacha": `Nesta tela você pode trocar seus vouchers\npor ovos de Pokémon.
$Ovos ficam mais próximos de chocar depois de cada batalha.\nOvos raros demoram mais para chocar.
$Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais.
$Pokémon chocados geralmente possuem IVs melhores\nque Pokémon selvagens.
$Alguns Pokémon só podem ser obtidos através de seus ovos.
$Há 3 máquinas, cada uma com um bônus diferente,\nentão escolha a que mais lhe convém!`,
} as const;

View File

@ -6,6 +6,7 @@ import { enConfig } from '#app/locales/en/config.js';
import { esConfig } from '#app/locales/es/config.js';
import { frConfig } from '#app/locales/fr/config.js';
import { itConfig } from '#app/locales/it/config.js';
import { ptBrConfig } from '#app/locales/pt_BR/config.js';
import { zhCnConfig } from '#app/locales/zh_CN/config.js';
export interface SimpleTranslationEntries {
@ -59,7 +60,7 @@ export function initI18n(): void {
i18next.use(LanguageDetector).init({
lng: lang,
fallbackLng: 'en',
supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh_CN'],
supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh_CN','pt_BR'],
debug: true,
interpolation: {
escapeValue: false,
@ -80,6 +81,9 @@ export function initI18n(): void {
de: {
...deConfig
},
pt_BR: {
...ptBrConfig
},
zh_CN: {
...zhCnConfig
}

View File

@ -1,10 +1,10 @@
import SettingsUiHandler from "#app/ui/settings-ui-handler";
import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import BattleScene from "../battle-scene";
import { hasTouchscreen } from "../touch-controls";
import { updateWindowType } from "../ui/ui-theme";
import { PlayerGender } from "./game-data";
import { Mode } from "#app/ui/ui";
import SettingsUiHandler from "#app/ui/settings-ui-handler";
export enum Setting {
Game_Speed = "GAME_SPEED",
@ -40,28 +40,28 @@ export interface SettingDefaults {
}
export const settingOptions: SettingOptions = {
[Setting.Game_Speed]: [ '1x', '1.25x', '1.5x', '2x', '2.5x', '3x', '4x', '5x' ],
[Setting.Game_Speed]: ['1x', '1.25x', '1.5x', '2x', '2.5x', '3x', '4x', '5x'],
[Setting.Master_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'),
[Setting.BGM_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'),
[Setting.SE_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'),
[Setting.Language]: [ 'English', 'Change' ],
[Setting.Damage_Numbers]: [ 'Off', 'Simple', 'Fancy' ],
[Setting.UI_Theme]: [ 'Default', 'Legacy' ],
[Setting.Language]: ['English', 'Change'],
[Setting.Damage_Numbers]: ['Off', 'Simple', 'Fancy'],
[Setting.UI_Theme]: ['Default', 'Legacy'],
[Setting.Window_Type]: new Array(5).fill(null).map((_, i) => (i + 1).toString()),
[Setting.Tutorials]: [ 'Off', 'On' ],
[Setting.Enable_Retries]: [ 'Off', 'On' ],
[Setting.Sprite_Set]: [ 'Consistent', 'Mixed Animated' ],
[Setting.Move_Animations]: [ 'Off', 'On' ],
[Setting.Show_Stats_on_Level_Up]: [ 'Off', 'On' ],
[Setting.EXP_Gains_Speed]: [ 'Normal', 'Fast', 'Faster', 'Skip' ],
[Setting.EXP_Party_Display]: [ 'Normal', 'Level Up Notification', 'Skip' ],
[Setting.HP_Bar_Speed]: [ 'Normal', 'Fast', 'Faster', 'Instant' ],
[Setting.Fusion_Palette_Swaps]: [ 'Off', 'On' ],
[Setting.Player_Gender]: [ 'Boy', 'Girl' ],
[Setting.Gamepad_Support]: [ 'Auto', 'Disabled' ],
[Setting.Swap_A_and_B]: [ 'Enabled', 'Disabled' ],
[Setting.Touch_Controls]: [ 'Auto', 'Disabled' ],
[Setting.Vibration]: [ 'Auto', 'Disabled' ]
[Setting.Tutorials]: ['Off', 'On'],
[Setting.Enable_Retries]: ['Off', 'On'],
[Setting.Sprite_Set]: ['Consistent', 'Mixed Animated'],
[Setting.Move_Animations]: ['Off', 'On'],
[Setting.Show_Stats_on_Level_Up]: ['Off', 'On'],
[Setting.EXP_Gains_Speed]: ['Normal', 'Fast', 'Faster', 'Skip'],
[Setting.EXP_Party_Display]: ['Normal', 'Level Up Notification', 'Skip'],
[Setting.HP_Bar_Speed]: ['Normal', 'Fast', 'Faster', 'Instant'],
[Setting.Fusion_Palette_Swaps]: ['Off', 'On'],
[Setting.Player_Gender]: ['Boy', 'Girl'],
[Setting.Gamepad_Support]: ['Auto', 'Disabled'],
[Setting.Swap_A_and_B]: ['Enabled', 'Disabled'],
[Setting.Touch_Controls]: ['Auto', 'Disabled'],
[Setting.Vibration]: ['Auto', 'Disabled']
};
export const settingDefaults: SettingDefaults = {
@ -89,7 +89,7 @@ export const settingDefaults: SettingDefaults = {
[Setting.Vibration]: 0
};
export const reloadSettings: Setting[] = [ Setting.UI_Theme, Setting.Language, Setting.Sprite_Set ];
export const reloadSettings: Setting[] = [Setting.UI_Theme, Setting.Language, Setting.Sprite_Set];
export function setSetting(scene: BattleScene, setting: Setting, value: integer): boolean {
switch (setting) {
@ -210,6 +210,10 @@ export function setSetting(scene: BattleScene, setting: Setting, value: integer)
label: '简体中文',
handler: () => changeLocaleHandler('zh_CN')
},
{
label: 'Português (BR)',
handler: () => changeLocaleHandler('pt_BR')
},
{
label: 'Cancel',
handler: () => cancelHandler()