This is the alternate text

The care behind the craft

Between writing my own words and safeguarding those of others, my commitment is simple: to treat all stories with the care they deserve. That means localization grounded in linguistic precision, sensitivity to nuance, and genuine respect for your creative vision.

This is the alternate text

Game Localization 🎮

(function () { const games = [ { title: "Outliers: Incrementum", color: "#00a6a6", description: "⚔️ ARPG, Hack & Slash, Incremental", details: "🎮 Demo & Steam Page Loc. + LQA | PT + PT-BR", steam: "https://store.steampowered.com/app/4697990/Outliers_Incrementum_Demo/", images: ["https://joanarcgomes.carrd.co/assets/images/image07.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image08.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image10.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image09.jpg?v=20c7e37e" ] }, { title: "Walk the Frog", color: "#a5b900", description: "⚒️ Puzzle, Adventure, Story Rich", details: "🎮 Full Game + Store Pages Localization | PT", steam: "https://store.steampowered.com/app/3336240/Walk_The_Frog/", images: ["https://joanarcgomes.carrd.co/assets/images/image07.jpg?v=a35e3bcc", "https://joanarcgomes.carrd.co/assets/images/image08.jpg?v=a35e3bcc", "https://joanarcgomes.carrd.co/assets/images/image06.jpg?v=e1c6fdbd", "https://joanarcgomes.carrd.co/assets/images/image07.jpg?v=e1c6fdbd", ] }, { title: "Decrypting Life", color: "#76684e", description: "🔒 Incremental, Casual", details: "🎮 Demo + Steam Page Localization | PT", steam: "https://store.steampowered.com/app/4935140/Decrypting_Life_Demo/", images: ["https://joanarcgomes.carrd.co/assets/images/image11.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image12.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image13.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image14.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image15.jpg?v=20c7e37e"] }, { title: "Puni the Florist", color: "#f47724", description: "🏵️ Simulation, Cozy, Shop Keeper", details: "🎮 Full Game Localization (Ongoing) | PT", steam: "https://store.steampowered.com/app/3396290/Puni_the_Florist/", images: ["https://joanarcgomes.carrd.co/assets/images/image16.jpg?v=20c7e37e"] }, { title: "Glowlings", color: "#7084c3", description: "🔩 Action Roguelite, Shoot 'em Up, Hack & Slash", details: "🎮 Demo Localization + LQA | PT + PT-BR", steam: "https://store.steampowered.com/app/3098030/Glowlings/", images: ["https://joanarcgomes.carrd.co/assets/images/image17.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image18.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image19.jpg?v=20c7e37e"] }, { title: "Return from the Tavern", color: "#79b42b", description: "♟️ Strategy, Action", details: "🎮 Full Game Localization + LQA | PT", steam: "https://irog.itch.io/return-from-the-tavern", images: ["https://joanarcgomes.carrd.co/assets/images/image20.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image21.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image22.jpg?v=20c7e37e"] } ]; const steamPages = [ { title: "Rottenroots", color: "#766b8d", description: "🪵 Visual Novel, Mystery, Choices Matter", details: "🎮 Steam Page Localization | PT + PT-BR", steam: "https://store.steampowered.com/app/3177730/Rottenroots/", images: ["https://joanarcgomes.carrd.co/assets/images/image23.jpg?v=20c7e37e"] }, { title: "Bladehold", color: "#72513f", description: "🗡️ Action Roguelite, Hack & Slash", details: "🎮 Steam Page Localization | PT", steam: "https://store.steampowered.com/app/5279820/Bladehold/", images: ["https://joanarcgomes.carrd.co/assets/images/image26.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image25.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image06.jpg?v=20c7e37e"] }, { title: "Commissions Open", color: "#6f7dc2", description: "🎨 Simulation, Anime", details: "🎮 Steam Page Localization | PT + PT-BR", steam: "https://store.steampowered.com/app/4436650/Commissions_Open/", images: ["https://joanarcgomes.carrd.co/assets/images/image27.jpg?v=20c7e37e"] }, { title: "Rootknot", color: "#8d6280", description: "🃏 Strategy, Arcade, Deckbuilding", details: "🎮 Steam Page Revision | PT", steam: "https://store.steampowered.com/app/4564690/Rootknot/", images: ["https://joanarcgomes.carrd.co/assets/images/image28.jpg?v=20c7e37e", "https://joanarcgomes.carrd.co/assets/images/image24.jpg?v=20c7e37e"] } ]; function renderCards(list, containerId) { const container = document.getElementById(containerId); if (!container) return; list.forEach(function (game) { const card = document.createElement("article"); card.className = "loc-card"; const media = document.createElement("div"); media.className = "loc-media"; const images = (game.images || []).filter(function (src) { return typeof src === "string" && src.trim() !== ""; }); let current = 0; let isTransitioning = false; let transitionTimer; const link = document.createElement("a"); link.className = "loc-cover-link"; link.href = game.steam || "#"; link.target = "_blank"; link.rel = "noopener noreferrer"; link.setAttribute("aria-label", "Open " + game.title + " on Steam"); const image = document.createElement("img"); image.className = "loc-image"; image.alt = game.title; image.loading = "lazy"; image.decoding = "async"; const nextImage = document.createElement("img"); nextImage.className = "loc-image-next"; nextImage.alt = ""; nextImage.setAttribute("aria-hidden", "true"); nextImage.decoding = "async"; function imageAlt(index) { return game.title + ( index === 0 ? " — cover" : " — screenshot " + index ); } function showImage(index) { if (!images.length) { image.removeAttribute("src"); nextImage.removeAttribute("src"); image.alt = game.title + " — add image URLs in the code"; return; } current = (index + images.length) % images.length; image.classList.remove("is-visible"); nextImage.classList.remove("is-visible"); image.src = images[current]; image.alt = imageAlt(current); } function changeImage(index) { if (images.length < 2 || isTransitioning) return; const target = (index + images.length) % images.length; if (target === current) return; isTransitioning = true; nextImage.onload = null; nextImage.onerror = null; nextImage.src = images[target]; function beginFade() { nextImage.classList.add("is-visible"); transitionTimer = setTimeout(function () { image.src = images[target]; image.alt = imageAlt(target); nextImage.classList.remove("is-visible"); current = target; isTransitioning = false; }, 500); } if (nextImage.complete && nextImage.naturalWidth > 0) { requestAnimationFrame(beginFade); } else { nextImage.onload = function () { nextImage.onload = null; beginFade(); }; nextImage.onerror = function () { nextImage.onerror = null; isTransitioning = false; }; } } showImage(0); link.appendChild(image); link.appendChild(nextImage); media.appendChild(link); function addArrow(direction, symbol, label) { const button = document.createElement("button"); button.type = "button"; button.className = "loc-arrow loc-" + direction; button.textContent = symbol; button.setAttribute("aria-label", label + " — " + game.title); button.hidden = images.length < 2; button.addEventListener("click", function (event) { event.preventDefault(); event.stopPropagation(); changeImage( current + (direction === "next" ? 1 : -1) ); }); media.appendChild(button); } addArrow("prev", "‹", "Previous screenshot"); addArrow("next", "›", "Next screenshot"); const title = document.createElement("h3"); title.className = "loc-name"; title.style.color = game.color; title.textContent = game.title; card.appendChild(media); card.appendChild(title); if (game.description) { const description = document.createElement("p"); description.className = "loc-description"; description.textContent = game.description; card.appendChild(description); } if (game.details) { const details = document.createElement("p"); details.className = "loc-details"; details.textContent = game.details; card.appendChild(details); } container.appendChild(card); }); } renderCards(games, "loc-games"); renderCards(steamPages, "loc-steam"); })();
This is the alternate text

Die Rebellion
Joseph Roth

Translated Joseph Roth's Die Rebellion for publication by Letras Errantes publishing house (forthcoming)

  • Rendered idiomatic expressions, figurative language, and stylistic devices with attention to tone, authorial voice, and literary aesthetics

  • Conducted extensive contextual and cultural research to ensure accuracy

  • Performed terminology research to maintain lexical and stylistic consistency

  • Produced paratextual materials such as prefaces and appendices

  • Edited and proofread texts in accordance with the publisher’s style guide

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut posuere rhoncus hendrerit. Proin nibh metus, rhoncus vel consectetur at, pulvinar quis elit. Cras placerat neque et tortor dignissim pretium.

Vivamus ut pellentesque ex. Donec lacinia odio ex, ut placerat lorem iaculis quis. Proin ac augue mauris. Aliquam porttitor sapien quis purus fermentum suscipit.

Walk The Frog studio

~ Fabian Baldszun

Working with Joana on Glowlings was a great experience. She did an excellent job with localization, and also contributed many helpful ideas and insights on the game's development and marketing. I really appreciated her support and input throughout the project!

Display Your Vision studio

~ Felix Opderbecke

This is the alternate text

ABOUT ME

My work centers on video game localization and literary translation, with a particular interest in games where creative adaptation and linguistic nuance matter as much as functionality. Experienced in Portuguese localization of in‑game text, UI, achievements, and store content, spanning narrative‑driven, cozy and creatively demanding titles.


🎓 EDUCATION

Master of Arts in Translation and Language Services
Faculty of Arts and Humanities, University of Porto
Portuguese/German specialization
Bachelor of Arts in Languages, Literatures and Cultures
Faculty of Arts and Humanities, University of Porto
Double major in Portuguese and German

🎮 Localization training

Translating Rhyme in Video Games
Lucas Rodrigues Oliveira | Translators101
Creative Translation in Video Game Localization
Ivan L. Lopes | Translators101
Video Game Localization: Language & Media
Horacio Corral | Translators101
Intro to Video Game Localization for Linguists
memoQ Academy

GET IN TOUCH 📩

Want to reach out or get a quote for your project?