v0.2.0: i18n 18 idiomas + pantalla ajustes + bancos multiidioma

Internacionalización completa:
- 18 ficheros .arb: es, en, fr, pt, de, it, ru, ja, ko, zh, zh_TW, ar, hi, tr, pl, nl, ca, eu
- Todos los strings extraídos de todas las pantallas
- Detección automática de idioma del sistema
- Selector manual en pantalla de ajustes

Pantalla de ajustes nueva:
- Selector de idioma con banderas emoji
- Vibración ON/OFF
- Acerca de (versión, desarrollador)

Bancos de palabras multiidioma:
- palabras.json (castellano, 1000 palabras)
- palabras_en.json (inglés, 1000 palabras)
- palabras_fr.json (francés, 1000 palabras)
- Fallback a castellano si no hay banco del idioma

13138 líneas Dart, 39 ficheros, 0 issues en flutter analyze
This commit is contained in:
ShanaiaBot
2026-04-04 01:18:09 +02:00
parent de2c8ffa18
commit 1bca50af1d
56 changed files with 14389 additions and 201 deletions

124
assets/palabras_en.json Normal file
View File

@@ -0,0 +1,124 @@
{
"categorias": {
"animales": [
"Dog", "Cat", "Horse", "Cow", "Pig", "Sheep", "Goat", "Hen", "Duck", "Rabbit",
"Lion", "Tiger", "Elephant", "Giraffe", "Zebra", "Hippopotamus", "Rhinoceros", "Gorilla", "Chimpanzee", "Orangutan",
"Eagle", "Falcon", "Owl", "Hummingbird", "Pelican", "Flamingo", "Penguin", "Parrot", "Canary", "Crow",
"Shark", "Dolphin", "Whale", "Octopus", "Jellyfish", "Turtle", "Crocodile", "Snake", "Iguana", "Chameleon",
"Bee", "Butterfly", "Ant", "Spider", "Scorpion", "Dragonfly", "Beetle", "Ladybug", "Firefly", "Cricket",
"Wolf", "Fox", "Bear", "Deer", "Wild boar", "Squirrel", "Beaver", "Otter", "Raccoon", "Badger",
"Camel", "Llama", "Alpaca", "Bison", "Buffalo", "Moose", "Reindeer", "Antelope", "Gazelle", "Wildebeest",
"Seal", "Walrus", "Narwhal", "Orca", "Manta ray", "Swordfish", "Salmon", "Trout", "Tuna", "Sardine",
"Koala", "Kangaroo", "Platypus", "Wombat", "Panda", "Lemur", "Meerkat", "Hyena", "Leopard", "Panther",
"Toucan", "Peacock", "Ostrich", "Swan", "Seagull", "Albatross", "Vulture", "Stork", "Heron", "Crane"
],
"comida": [
"Pizza", "Hamburger", "Paella", "Omelette", "Croquette", "French fries", "Sushi", "Ramen", "Tacos", "Burrito",
"Pasta", "Risotto", "Lasagna", "Ravioli", "Gnocchi", "Cannelloni", "Macaroni", "Spaghetti", "Noodles", "Tagliatelle",
"Salad", "Gazpacho", "Soup", "Cream soup", "Stew", "Beef stew", "Chickpea stew", "Pot roast", "Pottage", "Lentils",
"Bread", "Croissant", "Baguette", "Churros", "Donut", "Muffin", "Cookie", "Sponge cake", "Cake", "Flan",
"Ice cream", "Custard", "Rice pudding", "Nougat", "Chocolate", "Candy", "Chewing gum", "Lollipop", "Gummy bear", "Licorice",
"Apple", "Banana", "Orange", "Strawberry", "Grape", "Watermelon", "Melon", "Pineapple", "Mango", "Kiwi",
"Tomato", "Onion", "Garlic", "Bell pepper", "Carrot", "Pumpkin", "Eggplant", "Zucchini", "Cucumber", "Lettuce",
"Roast chicken", "Steak", "Ribs", "Meatballs", "Sausage", "Ham", "Chorizo", "Bacon", "Chicken breast", "Drumstick",
"Cheese", "Yogurt", "Butter", "Cream", "Milk", "Egg", "Oil", "Vinegar", "Salt", "Pepper",
"Coffee", "Tea", "Juice", "Smoothie", "Lemonade", "Beer", "Wine", "Sangria", "Cocktail", "Soft drink"
],
"paises": [
"Spain", "France", "Italy", "Germany", "Portugal", "United Kingdom", "Ireland", "Netherlands", "Belgium", "Switzerland",
"Austria", "Greece", "Turkey", "Russia", "Poland", "Sweden", "Norway", "Denmark", "Finland", "Iceland",
"United States", "Canada", "Mexico", "Brazil", "Argentina", "Chile", "Colombia", "Peru", "Venezuela", "Ecuador",
"Japan", "China", "India", "South Korea", "Thailand", "Vietnam", "Indonesia", "Philippines", "Malaysia", "Singapore",
"Egypt", "Morocco", "South Africa", "Nigeria", "Kenya", "Ethiopia", "Tanzania", "Ghana", "Senegal", "Tunisia",
"Australia", "New Zealand", "Cuba", "Jamaica", "Costa Rica", "Panama", "Uruguay", "Paraguay", "Bolivia", "Honduras",
"Croatia", "Czech Republic", "Hungary", "Romania", "Bulgaria", "Serbia", "Ukraine", "Lithuania", "Latvia", "Estonia",
"Israel", "Lebanon", "Jordan", "Saudi Arabia", "United Arab Emirates", "Qatar", "Iran", "Iraq", "Pakistan", "Bangladesh",
"Nepal", "Sri Lanka", "Mongolia", "Cambodia", "Myanmar", "Taiwan", "Macau", "Hong Kong", "Laos", "Brunei",
"Maldives", "Madagascar", "Mozambique", "Angola", "Cameroon", "Ivory Coast", "Mali", "Niger", "Congo", "Uganda"
],
"deportes": [
"Soccer", "Basketball", "Tennis", "Swimming", "Athletics", "Cycling", "Boxing", "Judo", "Karate", "Taekwondo",
"Golf", "Rugby", "Cricket", "Baseball", "Hockey", "Volleyball", "Handball", "Water polo", "Fencing", "Archery",
"Skiing", "Snowboard", "Ice skating", "Surfing", "Windsurfing", "Sailing", "Rowing", "Canoeing", "Scuba diving", "Rock climbing",
"Gymnastics", "Weightlifting", "Wrestling", "Sumo", "MMA", "Kickboxing", "Muay thai", "Capoeira", "Wrestling", "Sambo",
"Padel", "Squash", "Badminton", "Ping pong", "Billiards", "Darts", "Bowling", "Petanque", "Croquet", "Polo",
"Formula 1", "Motorcycle racing", "Rally", "Karting", "NASCAR", "Motocross", "Trial", "Enduro", "Superbike", "Dragster",
"Skateboard", "BMX", "Parkour", "Breakdance", "Cheerleading", "Acrobatics", "Trapeze", "Tightrope", "Slackline", "Bungee",
"Chess", "Checkers", "Backgammon", "Go", "Dominoes", "Poker", "Bridge", "Mahjong", "Scrabble", "Risk",
"Triathlon", "Decathlon", "Marathon", "Ultra trail", "Ironman", "Duathlon", "Cross country", "Orienteering", "Geocaching", "Hiking",
"Basque pelota", "Jai alai", "Hurling", "Lacrosse", "Kabaddi", "Sepak takraw", "Bossaball", "Quidditch", "Ultimate frisbee", "Spikeball"
],
"profesiones": [
"Doctor", "Nurse", "Dentist", "Veterinarian", "Pharmacist", "Surgeon", "Psychologist", "Physiotherapist", "Optometrist", "Nutritionist",
"Lawyer", "Judge", "Notary", "Prosecutor", "Detective", "Police officer", "Firefighter", "Soldier", "Spy", "Bodyguard",
"Professor", "Teacher", "University professor", "Tutor", "Educator", "Speech therapist", "School principal", "Researcher", "Scientist", "Archaeologist",
"Architect", "Engineer", "Electrician", "Plumber", "Carpenter", "Bricklayer", "Painter", "Welder", "Mechanic", "Locksmith",
"Chef", "Waiter", "Barista", "Sommelier", "Pastry chef", "Baker", "Butcher", "Fishmonger", "Fruit seller", "Ice cream maker",
"Actor", "Film director", "Screenwriter", "Cameraman", "Producer", "Singer", "Musician", "DJ", "Dancer", "Magician",
"Journalist", "Writer", "Editor", "Photographer", "Designer", "Illustrator", "Animator", "Translator", "Announcer", "Presenter",
"Pilot", "Astronaut", "Sailor", "Captain", "Truck driver", "Taxi driver", "Bus driver", "Train driver", "Mail carrier", "Courier",
"Programmer", "Hacker", "System administrator", "Community manager", "Data scientist", "Youtuber", "Streamer", "Gamer", "Tester", "Scrum master",
"Farmer", "Rancher", "Gardener", "Beekeeper", "Lumberjack", "Miner", "Geologist", "Biologist", "Botanist", "Zoologist"
],
"objetos": [
"Phone", "Computer", "Television", "Radio", "Clock", "Camera", "Headphones", "Speaker", "Microphone", "Remote control",
"Chair", "Table", "Sofa", "Bed", "Wardrobe", "Bookshelf", "Lamp", "Mirror", "Carpet", "Curtain",
"Knife", "Fork", "Spoon", "Plate", "Glass", "Cup", "Frying pan", "Pot", "Blender", "Microwave",
"Key", "Padlock", "Door", "Window", "Ladder", "Elevator", "Swing", "Slide", "Trampoline", "Hammock",
"Book", "Notebook", "Pen", "Pencil", "Eraser", "Ruler", "Scissors", "Glue", "Paintbrush", "Marker",
"Umbrella", "Fan", "Glasses", "Gloves", "Scarf", "Hat", "Belt", "Tie", "Ring", "Necklace",
"Ball", "Racket", "Bicycle", "Scooter", "Skateboard", "Jump rope", "Spinning top", "Dice", "Puzzle", "Doll",
"Hammer", "Screwdriver", "Pliers", "Saw", "Drill", "Level", "Tape measure", "Wrench", "Screw", "Nail",
"Suitcase", "Backpack", "Handbag", "Wallet", "Coin purse", "Envelope", "Package", "Box", "Bucket", "Bottle",
"Candle", "Match", "Lighter", "Flashlight", "Compass", "Map", "Globe", "Telescope", "Microscope", "Magnifying glass"
],
"lugares": [
"Beach", "Mountain", "Forest", "Desert", "Jungle", "Meadow", "Volcano", "Glacier", "Waterfall", "Cave",
"Hospital", "School", "University", "Library", "Museum", "Theater", "Cinema", "Nightclub", "Restaurant", "Cafeteria",
"Supermarket", "Pharmacy", "Hair salon", "Bank", "Post office", "Gas station", "Workshop", "Laundromat", "Gym", "Swimming pool",
"Airport", "Train station", "Port", "Highway", "Bridge", "Tunnel", "Roundabout", "Parking lot", "Toll booth", "Bus stop",
"Church", "Mosque", "Synagogue", "Temple", "Cathedral", "Monastery", "Cemetery", "Hermitage", "Sanctuary", "Chapel",
"Park", "Garden", "Zoo", "Aquarium", "Circus", "Fair", "Water park", "Amusement park", "Stadium", "Soccer field",
"Castle", "Palace", "Tower", "City wall", "Fortress", "Pyramid", "Colosseum", "Aqueduct", "Lighthouse", "Windmill",
"Office", "Factory", "Warehouse", "Laboratory", "Studio", "Study", "Meeting room", "Coworking", "Workshop", "Industrial warehouse",
"Prison", "Police station", "Military base", "Courthouse", "City hall", "Parliament", "Embassy", "Consulate", "Customs", "Border",
"Island", "Oasis", "Reef", "Marsh", "Swamp", "Cliff", "Valley", "Canyon", "Plateau", "Delta"
],
"peliculas": [
"Titanic", "Avatar", "Star Wars", "Harry Potter", "The Lord of the Rings", "The Matrix", "Jurassic Park", "Indiana Jones", "Rocky", "Terminator",
"The Godfather", "Gladiator", "Braveheart", "Forrest Gump", "The Lion King", "Toy Story", "Frozen", "Coco", "Up", "Wall-E",
"Inception", "Interstellar", "Gravity", "The Martian", "Alien", "Predator", "Robocop", "Blade Runner", "Mad Max", "Tron",
"Batman", "Superman", "Spider-Man", "Iron Man", "The Avengers", "X-Men", "Aquaman", "Thor", "Hulk", "Deadpool",
"Pirates of the Caribbean", "Mission Impossible", "James Bond", "Jason Bourne", "Fast & Furious", "John Wick", "Kill Bill", "Kingsman", "Jack Reacher", "The Equalizer",
"Shrek", "Madagascar", "Finding Nemo", "Monsters Inc.", "Ratatouille", "The Incredibles", "Zootopia", "Inside Out", "Soul", "Luca",
"Titanic", "Ghost", "Dirty Dancing", "Grease", "Pretty Woman", "Notting Hill", "Love Actually", "La La Land", "Moulin Rouge", "Casablanca",
"The Exorcist", "It", "Saw", "Scream", "Halloween", "A Nightmare on Elm Street", "The Shining", "Poltergeist", "Dracula", "Frankenstein",
"Back to the Future", "E.T.", "The Goonies", "The Karate Kid", "Ghostbusters", "Gremlins", "Beetlejuice", "Labyrinth", "Willow", "The NeverEnding Story",
"The Silence of the Lambs", "Seven", "Fight Club", "Memento", "Shutter Island", "Gone Girl", "Zodiac", "Prisoners", "Mystic River", "Ender's Game"
],
"musica": [
"Guitar", "Piano", "Drums", "Bass", "Violin", "Saxophone", "Trumpet", "Flute", "Harp", "Accordion",
"Rock", "Pop", "Jazz", "Blues", "Reggaeton", "Salsa", "Bachata", "Cumbia", "Tango", "Flamenco",
"Rap", "Hip hop", "Trap", "R&B", "Soul", "Funk", "Disco", "House", "Techno", "Dubstep",
"Metal", "Punk", "Grunge", "Indie", "Ska", "Reggae", "Country", "Folk", "Gospel", "Choir",
"Opera", "Symphony", "Concerto", "Sonata", "Waltz", "Bolero", "Serenade", "Anthem", "March", "Polka",
"Microphone", "Amplifier", "Speaker", "Headphones", "Vinyl", "Cassette", "CD", "MP3", "Turntable", "Metronome",
"Ukulele", "Banjo", "Mandolin", "Zither", "Lute", "Oboe", "Clarinet", "Bassoon", "Tuba", "Trombone",
"Tambourine", "Maracas", "Bongo", "Djembe", "Cajon", "Castanets", "Triangle", "Xylophone", "Gong", "Cymbals",
"Karaoke", "Playback", "Chorus", "Duet", "Solo", "Quartet", "Orchestra", "Band", "DJ", "Singer-songwriter",
"Festival", "Concert", "Tour", "Nightclub", "Street party", "Jam session", "Open mic", "Recital", "Serenade", "Rehearsal"
],
"tecnologia": [
"Smartphone", "Tablet", "Laptop", "Smartwatch", "Bluetooth headphones", "Drone", "Robot", "3D printer", "Virtual reality", "Augmented reality",
"WiFi", "Bluetooth", "GPS", "NFC", "USB", "HDMI", "Ethernet", "Fiber optics", "Satellite", "Antenna",
"Google", "Amazon", "Apple", "Microsoft", "Tesla", "Netflix", "Spotify", "TikTok", "Instagram", "WhatsApp",
"Artificial intelligence", "Blockchain", "Cryptocurrency", "Bitcoin", "NFT", "Metaverse", "Cloud computing", "Big data", "IoT", "5G",
"Video game", "Console", "Controller", "Joystick", "Arcade", "VR", "Streaming", "Podcast", "Blog", "Meme",
"QR code", "Password", "Fingerprint", "Facial recognition", "Encryption", "Firewall", "Antivirus", "Backup", "Server", "Database",
"Python", "JavaScript", "HTML", "CSS", "Java", "Swift", "Kotlin", "Rust", "Go", "Ruby",
"Linux", "Windows", "macOS", "Android", "iOS", "Ubuntu", "Chrome OS", "Arduino", "Raspberry Pi", "BIOS",
"Pixel", "Megabyte", "Gigabyte", "Terabyte", "RAM", "SSD", "Processor", "Graphics card", "Motherboard", "Power supply",
"Email", "Spam", "Phishing", "Hacker", "Bug", "Patch", "Update", "App", "Widget", "Plugin"
]
}
}

124
assets/palabras_fr.json Normal file
View File

@@ -0,0 +1,124 @@
{
"categorias": {
"animales": [
"Chien", "Chat", "Cheval", "Vache", "Cochon", "Mouton", "Chèvre", "Poule", "Canard", "Lapin",
"Lion", "Tigre", "Éléphant", "Girafe", "Zèbre", "Hippopotame", "Rhinocéros", "Gorille", "Chimpanzé", "Orang-outan",
"Aigle", "Faucon", "Hibou", "Colibri", "Pélican", "Flamant rose", "Pingouin", "Perroquet", "Canari", "Corbeau",
"Requin", "Dauphin", "Baleine", "Pieuvre", "Méduse", "Tortue", "Crocodile", "Serpent", "Iguane", "Caméléon",
"Abeille", "Papillon", "Fourmi", "Araignée", "Scorpion", "Libellule", "Scarabée", "Coccinelle", "Luciole", "Grillon",
"Loup", "Renard", "Ours", "Cerf", "Sanglier", "Écureuil", "Castor", "Loutre", "Raton laveur", "Blaireau",
"Chameau", "Lama", "Alpaga", "Bison", "Buffle", "Élan", "Renne", "Antilope", "Gazelle", "Gnou",
"Phoque", "Morse", "Narval", "Orque", "Raie manta", "Espadon", "Saumon", "Truite", "Thon", "Sardine",
"Koala", "Kangourou", "Ornithorynque", "Wombat", "Panda", "Lémurien", "Suricate", "Hyène", "Léopard", "Panthère",
"Toucan", "Paon", "Autruche", "Cygne", "Mouette", "Albatros", "Vautour", "Cigogne", "Héron", "Grue"
],
"comida": [
"Pizza", "Hamburger", "Paella", "Omelette", "Croquette", "Frites", "Sushi", "Ramen", "Tacos", "Burrito",
"Pâtes", "Risotto", "Lasagne", "Raviolis", "Gnocchis", "Cannellonis", "Macaronis", "Spaghettis", "Nouilles", "Tagliatelles",
"Salade", "Gaspacho", "Soupe", "Crème", "Ragoût", "Mijoté", "Pot-au-feu", "Marmite", "Potage", "Lentilles",
"Pain", "Croissant", "Baguette", "Churros", "Beignet", "Madeleine", "Biscuit", "Gâteau", "Tarte", "Flan",
"Glace", "Crème anglaise", "Riz au lait", "Nougat", "Chocolat", "Caramel", "Chewing-gum", "Sucette", "Bonbon", "Réglisse",
"Pomme", "Banane", "Orange", "Fraise", "Raisin", "Pastèque", "Melon", "Ananas", "Mangue", "Kiwi",
"Tomate", "Oignon", "Ail", "Poivron", "Carotte", "Citrouille", "Aubergine", "Courgette", "Concombre", "Laitue",
"Poulet rôti", "Steak", "Côtelettes", "Boulettes", "Saucisse", "Jambon", "Chorizo", "Bacon", "Blanc de poulet", "Cuisse",
"Fromage", "Yaourt", "Beurre", "Crème fraîche", "Lait", "Œuf", "Huile", "Vinaigre", "Sel", "Poivre",
"Café", "Thé", "Jus", "Milkshake", "Limonade", "Bière", "Vin", "Sangria", "Cocktail", "Soda"
],
"paises": [
"Espagne", "France", "Italie", "Allemagne", "Portugal", "Royaume-Uni", "Irlande", "Pays-Bas", "Belgique", "Suisse",
"Autriche", "Grèce", "Turquie", "Russie", "Pologne", "Suède", "Norvège", "Danemark", "Finlande", "Islande",
"États-Unis", "Canada", "Mexique", "Brésil", "Argentine", "Chili", "Colombie", "Pérou", "Venezuela", "Équateur",
"Japon", "Chine", "Inde", "Corée du Sud", "Thaïlande", "Vietnam", "Indonésie", "Philippines", "Malaisie", "Singapour",
"Égypte", "Maroc", "Afrique du Sud", "Nigeria", "Kenya", "Éthiopie", "Tanzanie", "Ghana", "Sénégal", "Tunisie",
"Australie", "Nouvelle-Zélande", "Cuba", "Jamaïque", "Costa Rica", "Panama", "Uruguay", "Paraguay", "Bolivie", "Honduras",
"Croatie", "République tchèque", "Hongrie", "Roumanie", "Bulgarie", "Serbie", "Ukraine", "Lituanie", "Lettonie", "Estonie",
"Israël", "Liban", "Jordanie", "Arabie saoudite", "Émirats arabes", "Qatar", "Iran", "Irak", "Pakistan", "Bangladesh",
"Népal", "Sri Lanka", "Mongolie", "Cambodge", "Myanmar", "Taïwan", "Macao", "Hong Kong", "Laos", "Brunei",
"Maldives", "Madagascar", "Mozambique", "Angola", "Cameroun", "Côte d'Ivoire", "Mali", "Niger", "Congo", "Ouganda"
],
"deportes": [
"Football", "Basketball", "Tennis", "Natation", "Athlétisme", "Cyclisme", "Boxe", "Judo", "Karaté", "Taekwondo",
"Golf", "Rugby", "Cricket", "Baseball", "Hockey", "Volleyball", "Handball", "Water-polo", "Escrime", "Tir à l'arc",
"Ski", "Snowboard", "Patinage", "Surf", "Planche à voile", "Voile", "Aviron", "Canoë-kayak", "Plongée", "Escalade",
"Gymnastique", "Haltérophilie", "Lutte", "Sumo", "MMA", "Kickboxing", "Muay thaï", "Capoeira", "Catch", "Sambo",
"Padel", "Squash", "Badminton", "Ping-pong", "Billard", "Fléchettes", "Bowling", "Pétanque", "Croquet", "Polo",
"Formule 1", "Motocyclisme", "Rallye", "Karting", "NASCAR", "Motocross", "Trial", "Enduro", "Superbike", "Dragster",
"Skateboard", "BMX", "Parkour", "Breakdance", "Cheerleading", "Acrobatie", "Trapèze", "Funambulisme", "Slackline", "Saut à l'élastique",
"Échecs", "Dames", "Backgammon", "Go", "Dominos", "Poker", "Bridge", "Mahjong", "Scrabble", "Risk",
"Triathlon", "Décathlon", "Marathon", "Ultra-trail", "Ironman", "Duathlon", "Cross-country", "Course d'orientation", "Géocaching", "Randonnée",
"Pelote basque", "Jaï alaï", "Hurling", "Crosse", "Kabaddi", "Sepak takraw", "Bossaball", "Quidditch", "Ultimate frisbee", "Spikeball"
],
"profesiones": [
"Médecin", "Infirmière", "Dentiste", "Vétérinaire", "Pharmacien", "Chirurgien", "Psychologue", "Kinésithérapeute", "Optométriste", "Nutritionniste",
"Avocat", "Juge", "Notaire", "Procureur", "Détective", "Policier", "Pompier", "Soldat", "Espion", "Garde du corps",
"Professeur", "Instituteur", "Professeur d'université", "Tuteur", "Pédagogue", "Orthophoniste", "Directeur d'école", "Chercheur", "Scientifique", "Archéologue",
"Architecte", "Ingénieur", "Électricien", "Plombier", "Charpentier", "Maçon", "Peintre", "Soudeur", "Mécanicien", "Serrurier",
"Chef cuisinier", "Serveur", "Barista", "Sommelier", "Pâtissier", "Boulanger", "Boucher", "Poissonnier", "Primeur", "Glacier",
"Acteur", "Réalisateur", "Scénariste", "Cadreur", "Producteur", "Chanteur", "Musicien", "DJ", "Danseur", "Magicien",
"Journaliste", "Écrivain", "Éditeur", "Photographe", "Designer", "Illustrateur", "Animateur", "Traducteur", "Présentateur radio", "Présentateur télé",
"Pilote", "Astronaute", "Marin", "Capitaine", "Routier", "Chauffeur de taxi", "Conducteur de bus", "Conducteur de train", "Facteur", "Coursier",
"Programmeur", "Hacker", "Administrateur système", "Community manager", "Data scientist", "Youtubeur", "Streameur", "Gamer", "Testeur", "Scrum master",
"Agriculteur", "Éleveur", "Jardinier", "Apiculteur", "Bûcheron", "Mineur", "Géologue", "Biologiste", "Botaniste", "Zoologiste"
],
"objetos": [
"Téléphone", "Ordinateur", "Télévision", "Radio", "Horloge", "Appareil photo", "Écouteurs", "Haut-parleur", "Microphone", "Télécommande",
"Chaise", "Table", "Canapé", "Lit", "Armoire", "Étagère", "Lampe", "Miroir", "Tapis", "Rideau",
"Couteau", "Fourchette", "Cuillère", "Assiette", "Verre", "Tasse", "Poêle", "Casserole", "Mixeur", "Micro-ondes",
"Clé", "Cadenas", "Porte", "Fenêtre", "Escalier", "Ascenseur", "Balançoire", "Toboggan", "Trampoline", "Hamac",
"Livre", "Cahier", "Stylo", "Crayon", "Gomme", "Règle", "Ciseaux", "Colle", "Pinceau", "Feutre",
"Parapluie", "Éventail", "Lunettes", "Gants", "Écharpe", "Bonnet", "Ceinture", "Cravate", "Bague", "Collier",
"Ballon", "Raquette", "Vélo", "Trottinette", "Planche à roulettes", "Corde à sauter", "Toupie", "Dé", "Puzzle", "Poupée",
"Marteau", "Tournevis", "Pince", "Scie", "Perceuse", "Niveau", "Mètre", "Clé à molette", "Vis", "Clou",
"Valise", "Sac à dos", "Sac à main", "Portefeuille", "Porte-monnaie", "Enveloppe", "Colis", "Boîte", "Seau", "Bouteille",
"Bougie", "Allumette", "Briquet", "Lampe de poche", "Boussole", "Carte", "Globe terrestre", "Télescope", "Microscope", "Loupe"
],
"lugares": [
"Plage", "Montagne", "Forêt", "Désert", "Jungle", "Prairie", "Volcan", "Glacier", "Cascade", "Grotte",
"Hôpital", "École", "Université", "Bibliothèque", "Musée", "Théâtre", "Cinéma", "Discothèque", "Restaurant", "Cafétéria",
"Supermarché", "Pharmacie", "Salon de coiffure", "Banque", "Bureau de poste", "Station-service", "Atelier", "Laverie", "Salle de sport", "Piscine",
"Aéroport", "Gare", "Port", "Autoroute", "Pont", "Tunnel", "Rond-point", "Parking", "Péage", "Arrêt de bus",
"Église", "Mosquée", "Synagogue", "Temple", "Cathédrale", "Monastère", "Cimetière", "Ermitage", "Sanctuaire", "Chapelle",
"Parc", "Jardin", "Zoo", "Aquarium", "Cirque", "Foire", "Parc aquatique", "Parc d'attractions", "Stade", "Terrain de football",
"Château", "Palais", "Tour", "Rempart", "Forteresse", "Pyramide", "Colisée", "Aqueduc", "Phare", "Moulin",
"Bureau", "Usine", "Entrepôt", "Laboratoire", "Studio", "Cabinet", "Salle de réunion", "Espace de coworking", "Atelier", "Hangar industriel",
"Prison", "Commissariat", "Caserne", "Tribunal", "Mairie", "Parlement", "Ambassade", "Consulat", "Douane", "Frontière",
"Île", "Oasis", "Récif", "Marais salant", "Marécage", "Falaise", "Vallée", "Canyon", "Plateau", "Delta"
],
"peliculas": [
"Titanic", "Avatar", "Star Wars", "Harry Potter", "Le Seigneur des anneaux", "Matrix", "Jurassic Park", "Indiana Jones", "Rocky", "Terminator",
"Le Parrain", "Gladiator", "Braveheart", "Forrest Gump", "Le Roi Lion", "Toy Story", "La Reine des neiges", "Coco", "Là-haut", "Wall-E",
"Inception", "Interstellar", "Gravity", "Seul sur Mars", "Alien", "Predator", "Robocop", "Blade Runner", "Mad Max", "Tron",
"Batman", "Superman", "Spider-Man", "Iron Man", "Les Vengeurs", "X-Men", "Aquaman", "Thor", "Hulk", "Deadpool",
"Pirates des Caraïbes", "Mission impossible", "James Bond", "Jason Bourne", "Fast & Furious", "John Wick", "Kill Bill", "Kingsman", "Jack Reacher", "Equalizer",
"Shrek", "Madagascar", "Le Monde de Nemo", "Monstres et Cie", "Ratatouille", "Les Indestructibles", "Zootopie", "Vice-versa", "Soul", "Luca",
"Titanic", "Ghost", "Dirty Dancing", "Grease", "Pretty Woman", "Coup de foudre à Notting Hill", "Love Actually", "La La Land", "Moulin Rouge", "Casablanca",
"L'Exorciste", "Ça", "Saw", "Scream", "Halloween", "Les Griffes de la nuit", "Shining", "Poltergeist", "Dracula", "Frankenstein",
"Retour vers le futur", "E.T.", "Les Goonies", "Karaté Kid", "S.O.S. Fantômes", "Gremlins", "Beetlejuice", "Labyrinthe", "Willow", "L'Histoire sans fin",
"Le Silence des agneaux", "Seven", "Fight Club", "Memento", "Shutter Island", "Gone Girl", "Zodiac", "Prisoners", "Mystic River", "La Stratégie Ender"
],
"musica": [
"Guitare", "Piano", "Batterie", "Basse", "Violon", "Saxophone", "Trompette", "Flûte", "Harpe", "Accordéon",
"Rock", "Pop", "Jazz", "Blues", "Reggaeton", "Salsa", "Bachata", "Cumbia", "Tango", "Flamenco",
"Rap", "Hip-hop", "Trap", "R&B", "Soul", "Funk", "Disco", "House", "Techno", "Dubstep",
"Métal", "Punk", "Grunge", "Indie", "Ska", "Reggae", "Country", "Folk", "Gospel", "Chorale",
"Opéra", "Symphonie", "Concerto", "Sonate", "Valse", "Boléro", "Sérénade", "Hymne", "Marche", "Polka",
"Microphone", "Amplificateur", "Haut-parleur", "Casque", "Vinyle", "Cassette", "CD", "MP3", "Tourne-disque", "Métronome",
"Ukulélé", "Banjo", "Mandoline", "Cithare", "Luth", "Hautbois", "Clarinette", "Basson", "Tuba", "Trombone",
"Tambourin", "Maracas", "Bongo", "Djembé", "Cajón flamenco", "Castagnettes", "Triangle", "Xylophone", "Gong", "Cymbales",
"Karaoké", "Playback", "Chœur", "Duo", "Solo", "Quatuor", "Orchestre", "Groupe", "DJ", "Auteur-compositeur",
"Festival", "Concert", "Tournée", "Discothèque", "Bal populaire", "Jam session", "Scène ouverte", "Récital", "Sérénade", "Répétition"
],
"tecnologia": [
"Smartphone", "Tablette", "Ordinateur portable", "Montre connectée", "Écouteurs Bluetooth", "Drone", "Robot", "Imprimante 3D", "Réalité virtuelle", "Réalité augmentée",
"WiFi", "Bluetooth", "GPS", "NFC", "USB", "HDMI", "Ethernet", "Fibre optique", "Satellite", "Antenne",
"Google", "Amazon", "Apple", "Microsoft", "Tesla", "Netflix", "Spotify", "TikTok", "Instagram", "WhatsApp",
"Intelligence artificielle", "Blockchain", "Cryptomonnaie", "Bitcoin", "NFT", "Métavers", "Cloud computing", "Big data", "IoT", "5G",
"Jeu vidéo", "Console", "Manette", "Joystick", "Arcade", "VR", "Streaming", "Podcast", "Blog", "Mème",
"Code QR", "Mot de passe", "Empreinte digitale", "Reconnaissance faciale", "Chiffrement", "Pare-feu", "Antivirus", "Sauvegarde", "Serveur", "Base de données",
"Python", "JavaScript", "HTML", "CSS", "Java", "Swift", "Kotlin", "Rust", "Go", "Ruby",
"Linux", "Windows", "macOS", "Android", "iOS", "Ubuntu", "Chrome OS", "Arduino", "Raspberry Pi", "BIOS",
"Pixel", "Mégaoctet", "Gigaoctet", "Téraoctet", "RAM", "SSD", "Processeur", "Carte graphique", "Carte mère", "Alimentation",
"E-mail", "Spam", "Hameçonnage", "Pirate informatique", "Bug", "Correctif", "Mise à jour", "Application", "Widget", "Plugin"
]
}
}

5
l10n.yaml Normal file
View File

@@ -0,0 +1,5 @@
arb-dir: lib/l10n
template-arb-file: app_es.arb
output-localization-file: app_localizations.dart
output-class: AppLocalizations
output-dir: lib/l10n/generated

224
lib/l10n/app_ar.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "ar",
"appTitle": "المنتحل",
"subtitle": "لعبة تخمين اجتماعية",
"loadingWords": "جارٍ تحميل الكلمات...",
"playersRange": "3-20 لاعبًا • بدون إنترنت",
"createGame": "إنشاء لعبة",
"joinGame": "الانضمام إلى لعبة",
"howToPlay": "كيفية اللعب",
"settings": "الإعدادات",
"gameMode": "وضع اللعب",
"singleDevice": "جهاز واحد",
"multiDevice": "أجهزة متعددة",
"category": "الفئة",
"categoryAll": "الكل",
"categoryAnimals": "حيوانات",
"categoryFood": "طعام",
"categoryCountries": "دول",
"categorySports": "رياضة",
"categoryProfessions": "مهن",
"categoryObjects": "أشياء",
"categoryPlaces": "أماكن",
"categoryMovies": "أفلام",
"categoryMusic": "موسيقى",
"categoryTechnology": "تكنولوجيا",
"playersCount": "اللاعبون ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "اسم اللاعب",
"playerAlreadyExists": "يوجد لاعب بهذا الاسم بالفعل",
"maxPlayersReached": "الحد الأقصى 20 لاعبًا",
"minPlayersRequired": "يلزم 3 لاعبين على الأقل",
"configuration": "الإعدادات",
"impostors": "🎭 المنتحلون",
"impostorClue": "🔍 تلميح للمنتحل",
"impostorClueDescription": "المنتحل يعرف الفئة",
"debateTime": "⏱️ وقت النقاش",
"noLimit": "بلا حد",
"oneMin": "1 د",
"twoMin": "2 د",
"threeMin": "3 د",
"fiveMin": "5 د",
"startGame": "بدء اللعبة",
"seeYourWord": "اعرف كلمتك",
"eachPlayerMustSee": "يجب على كل لاعب رؤية كلمته بسرية",
"roundNumber": "الجولة {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "شاهد كلمته بالفعل",
"tapToSee": "اضغط للعرض",
"allSeenStartDebate": "الجميع شاهد ← بدء النقاش",
"playersRemaining": "متبقٍّ {count} لاعبين",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "أنت المنتحل!",
"yourWordIs": "كلمتك هي:",
"clueCategory": "تلميح: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "اضغط مطولًا لرؤية كلمتك",
"makeSureNoOneLooks": "تأكد أن لا أحد ينظر",
"showingWord": "👁️ جارٍ العرض...",
"holdToSee": "👆 اضغط مطولًا للعرض",
"seenMyWord": "رأيت كلمتي",
"debateRound": "النقاش - الجولة {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ انتهى الوقت!",
"timeRemaining": "⏱️ الوقت المتبقي",
"playersInDebate": "اللاعبون في النقاش",
"activePlayersInfo": "{active} نشطون • {impostors} منتحل(ون) مختبئون",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "تم إقصاؤه",
"notes": "ملاحظات",
"goToVoting": "الانتقال للتصويت",
"voting": "🗳️ التصويت",
"turnToVote": "دورك للتصويت:",
"votesProgress": "الأصوات: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "من تعتقد أنه المنتحل؟",
"confirmVote": "تأكيد التصويت",
"votingComplete": "🗳️ اكتمل التصويت",
"allVoted": "صوّت الجميع!",
"tapToReveal": "اضغط لكشف النتيجة",
"revealResult": "كشف النتيجة",
"result": "النتيجة",
"revealing": "جارٍ الكشف...",
"wasImpostor": "كان المنتحل! 🎉",
"wasInnocent": "كان بريئًا 😱",
"votesThisRound": "أصوات هذه الجولة",
"seeEndResult": "عرض النتيجة النهائية",
"impostorGuessWord": "هل يخمّن المنتحل الكلمة؟",
"nextRound": "الجولة التالية",
"impostorGuessTitle": "🎯 تخمين المنتحل",
"impostorCanGuess": "يمكن للمنتحل المُقصى\nمحاولة تخمين الكلمة",
"ifCorrectImpostorsWin": "إذا أصاب، يفوز المنتحلون!",
"guessWordHint": "ما الكلمة برأيك؟",
"dontGuess": "عدم المحاولة",
"guess": "تخمين",
"correctGuess": "تخمين صحيح!",
"theWordWas": "الكلمة كانت: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "فاز المنتحلون!",
"wrongGuess": "تخمين خاطئ!",
"gameContinues": "اللعبة مستمرة...",
"gameOver": "انتهت اللعبة",
"playersWin": "فاز اللاعبون!",
"theSecretWordWas": "🔍 الكلمة كانت:",
"categoryLabel": "الفئة: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 المنتحل كان:",
"theImpostorsWere": "🎭 المنتحلون كانوا:",
"votingHistory": "📊 سجل التصويت",
"roundElimination": "الجولة {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "إعادة المباراة",
"mainMenu": "القائمة الرئيسية",
"notesTitle": "📝 ملاحظات",
"notesSaved": "تم حفظ الملاحظات",
"whoAreYou": "من أنت؟",
"selectYourName": "اختر اسمك لعرض ملاحظاتك الخاصة",
"notesOf": "ملاحظات {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "ملاحظات عن كل لاعب",
"playerNoteHint": "ماذا قال؟ هل هو مشبوه؟",
"freeNote": "ملاحظة حرة",
"freeNoteHint": "ملاحظات شخصية...",
"rulesTitle": "📖 كيفية اللعب",
"rulesWhatIsTitle": "🎭 ما هو المنتحل؟",
"rulesWhatIsBody": "لعبة تخمين اجتماعية لـ 3-20 لاعبًا. الجميع يحصل على كلمة سرية... ما عدا المنتحل! مهمتك: اكتشف من يتظاهر.",
"rulesHowToPlayTitle": "🔍 كيف تُلعب؟",
"rulesHowToPlayBody": "1. توزيع الأدوار: الجميع يحصل على نفس الكلمة، ما عدا المنتحل(ين).\n\n2. النقاش: بالتناوب، كل لاعب يصف الكلمة دون ذكرها مباشرة. على المنتحل التظاهر بمعرفتها.\n\n3. التصويت: بعد انتهاء النقاش، يصوّت الجميع على من يعتقدون أنه المنتحل.\n\n4. الإقصاء: الأكثر حصولًا على الأصوات يُقصى ويُكشف ما إذا كان منتحلًا أم لا.\n\n5. إذا كان منتحلًا، يمكنه محاولة تخمين الكلمة. إذا أصاب، يفوز المنتحلون!",
"rulesWhoWinsTitle": "🏆 من يفوز؟",
"rulesWhoWinsBody": "• اللاعبون: يفوزون بإقصاء جميع المنتحلين.\n• المنتحلون: يفوزون إذا لم يُكتشفوا حتى يتساوى أو يقل عدد اللاعبين العاديين عن عدد المنتحلين، أو إذا خمّنوا الكلمة عند إقصائهم.",
"rulesTipsPlayersTitle": "💡 نصائح للاعبين",
"rulesTipsPlayersBody": "• أعطِ تلميحات ذكية تُثبت معرفتك بالكلمة، لكن ليست واضحة جدًا ليستغلها المنتحل.\n• راقب من يعطي إجابات غامضة أو عامة.\n• استخدم الملاحظات لتدوين ما يقوله كل شخص.\n• لا تقل الكلمة مباشرة، فهذا يساعد المنتحل!",
"rulesTipsImpostorTitle": "🎭 نصائح للمنتحل",
"rulesTipsImpostorBody": "• استمع بانتباه لتلميحات الآخرين.\n• حاول استنتاج الكلمة لتقديم تلميحات مقنعة.\n• لا تكن أول من يتحدث إن لم تكن متأكدًا.\n• إذا حصلت على تلميح الفئة، استغله لصالحك.\n• اتّهم الآخرين لصرف الانتباه عنك.",
"rulesModesTitle": "📱 أوضاع اللعب",
"rulesModesBody": "• جهاز واحد: الجميع يشارك نفس الجهاز. كل لاعب يرى كلمته بالضغط المطول على الزر.\n\n• أجهزة متعددة: كل لاعب يستخدم جهازه الخاص. يتم الاتصال عبر بلوتوث/WiFi Direct بدون حاجة للإنترنت.",
"rulesExampleTitle": "✏️ مثال على لعبة",
"rulesExampleBody": "الكلمة السرية: \"بيتزا\"\n\n• أحمد: \"تُؤكل ساخنة\" ✓\n• فاطمة: \"تأتي في صندوق\" ✓\n• ليلى (المنتحل): \"شيء شائع جدًا\" 🤔\n• خالد: \"عليها جبنة\" ✓\n\nإجابة ليلى كانت عامة جدًا... مشبوهة!",
"joinGameTitle": "الانضمام إلى لعبة",
"multiDeviceMode": "وضع الأجهزة المتعددة",
"scanQrDescription": "امسح رمز QR الذي يعرضه المضيف للاتصال باللعبة عبر بلوتوث/WiFi Direct.",
"comingSoon": "قريبًا",
"nearbyNotAvailable": "اتصال الأجهزة المتعددة عبر Nearby Connections يتطلب أجهزة أندرويد فعلية.\n\nحاليًا، استخدم وضع \"جهاز واحد\" للعب على جهاز مشترك.",
"back": "رجوع",
"yes": "نعم",
"no": "لا",
"cancel": "إلغاء",
"accept": "قبول",
"next": "التالي",
"settingsTitle": "الإعدادات",
"language": "اللغة",
"soundVolume": "مستوى المؤثرات الصوتية",
"vibration": "الاهتزاز",
"about": "حول التطبيق",
"version": "الإصدار",
"developer": "المطوّر",
"licenses": "التراخيص"
}

224
lib/l10n/app_ca.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "ca",
"appTitle": "L'Impostor",
"subtitle": "Joc de deducció social",
"loadingWords": "Carregant paraules...",
"playersRange": "3-20 jugadors • Sense internet",
"createGame": "Crear partida",
"joinGame": "Unir-se a partida",
"howToPlay": "Com jugar",
"settings": "Configuració",
"gameMode": "Mode de joc",
"singleDevice": "Un sol mòbil",
"multiDevice": "Multimòbil",
"category": "Categoria",
"categoryAll": "Totes",
"categoryAnimals": "Animals",
"categoryFood": "Menjar",
"categoryCountries": "Països",
"categorySports": "Esports",
"categoryProfessions": "Professions",
"categoryObjects": "Objectes",
"categoryPlaces": "Llocs",
"categoryMovies": "Pel·lícules",
"categoryMusic": "Música",
"categoryTechnology": "Tecnologia",
"playersCount": "Jugadors ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Nom del jugador",
"playerAlreadyExists": "Ja existeix un jugador amb aquest nom",
"maxPlayersReached": "Màxim 20 jugadors",
"minPlayersRequired": "Calen almenys 3 jugadors",
"configuration": "Configuració",
"impostors": "🎭 Impostors",
"impostorClue": "🔍 Pista per a l'impostor",
"impostorClueDescription": "L'impostor coneix la categoria",
"debateTime": "⏱️ Temps de debat",
"noLimit": "Sense límit",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Iniciar partida",
"seeYourWord": "Veure la teva paraula",
"eachPlayerMustSee": "Cada jugador ha de veure la seva paraula en secret",
"roundNumber": "Ronda {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Ja ha vist la seva paraula",
"tapToSee": "Toca per veure",
"allSeenStartDebate": "Tots han vist → Iniciar debat",
"playersRemaining": "Falten {count} jugadors",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Ets l'impostor!",
"yourWordIs": "La teva paraula és:",
"clueCategory": "Pista: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Mantén premut per veure la teva paraula",
"makeSureNoOneLooks": "Assegura't que ningú més mira",
"showingWord": "👁️ Mostrant...",
"holdToSee": "👆 Mantén premut per veure",
"seenMyWord": "He vist la meva paraula",
"debateRound": "Debat - Ronda {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Temps esgotat!",
"timeRemaining": "⏱️ Temps restant",
"playersInDebate": "Jugadors en debat",
"activePlayersInfo": "{active} actius • {impostors} impostor(s) ocults",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Eliminat",
"notes": "Notes",
"goToVoting": "Anar a votació",
"voting": "🗳️ Votació",
"turnToVote": "Torn de votar:",
"votesProgress": "Vots: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Qui creus que és l'impostor?",
"confirmVote": "Confirmar vot",
"votingComplete": "🗳️ Votació completa",
"allVoted": "Tots han votat!",
"tapToReveal": "Toca per revelar el resultat",
"revealResult": "Revelar resultat",
"result": "Resultat",
"revealing": "Revelant...",
"wasImpostor": "Era IMPOSTOR! 🎉",
"wasInnocent": "Era INNOCENT 😱",
"votesThisRound": "Vots d'aquesta ronda",
"seeEndResult": "Veure resultat final",
"impostorGuessWord": "L'impostor endevina la paraula?",
"nextRound": "Següent ronda",
"impostorGuessTitle": "🎯 Endevinalla de l'impostor",
"impostorCanGuess": "L'impostor eliminat pot\nintentar endevinar la paraula",
"ifCorrectImpostorsWin": "Si encerta, els impostors guanyen!",
"guessWordHint": "Quina creus que és la paraula?",
"dontGuess": "No intentar",
"guess": "Endevinar",
"correctGuess": "Ha encertat!",
"theWordWas": "La paraula era: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Els impostors guanyen!",
"wrongGuess": "No ha encertat!",
"gameContinues": "La partida continua...",
"gameOver": "Fi de partida",
"playersWin": "Els jugadors guanyen!",
"theSecretWordWas": "🔍 La paraula era:",
"categoryLabel": "Categoria: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 L'impostor era:",
"theImpostorsWere": "🎭 Els impostors eren:",
"votingHistory": "📊 Historial de votacions",
"roundElimination": "Ronda {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Revenja",
"mainMenu": "Menú principal",
"notesTitle": "📝 Notes",
"notesSaved": "Notes desades",
"whoAreYou": "Qui ets?",
"selectYourName": "Selecciona el teu nom per veure les teves notes privades",
"notesOf": "Notes de {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Apunts sobre cada jugador",
"playerNoteHint": "Què ha dit? Sospitós?",
"freeNote": "Nota lliure",
"freeNoteHint": "Apunts personals...",
"rulesTitle": "📖 Com jugar",
"rulesWhatIsTitle": "🎭 Què és L'Impostor?",
"rulesWhatIsBody": "Un joc de deducció social per a 3-20 jugadors. Tots reben una paraula secreta... excepte l'impostor! La teva missió: descobrir qui fingeix.",
"rulesHowToPlayTitle": "🔍 Com es juga?",
"rulesHowToPlayBody": "1. Es reparteixen els rols: tots reben la mateixa paraula, excepte l'impostor/els impostors.\n\n2. Debat: per torns, cada jugador descriu la paraula SENSE dir-la directament. L'impostor ha de fingir que la coneix.\n\n3. Votació: en acabar el debat, tots voten qui creuen que és l'impostor.\n\n4. Eliminació: el més votat queda eliminat i es revela si era impostor o no.\n\n5. Si era impostor, pot intentar endevinar la paraula. Si encerta, els impostors guanyen!",
"rulesWhoWinsTitle": "🏆 Qui guanya?",
"rulesWhoWinsBody": "• Jugadors: guanyen si eliminen TOTS els impostors.\n• Impostors: guanyen si no són descoberts fins que quedin igual o menys jugadors normals que impostors, o si endevinen la paraula en ser eliminats.",
"rulesTipsPlayersTitle": "💡 Consells per als jugadors",
"rulesTipsPlayersBody": "• Dona pistes subtils que demostrin que coneixes la paraula, però no tan evidents que l'impostor les pugui fer servir.\n• Observa qui dona respostes vagues o genèriques.\n• Fes servir les notes per apuntar el que diu cadascú.\n• No diguis la paraula directament, això ajuda l'impostor!",
"rulesTipsImpostorTitle": "🎭 Consells per a l'impostor",
"rulesTipsImpostorBody": "• Escolta atentament les pistes dels altres.\n• Intenta deduir la paraula per donar pistes creïbles.\n• No siguis el primer a parlar si no n'estàs segur.\n• Si et donen la categoria com a pista, aprofita-la.\n• Acusa els altres per desviar l'atenció.",
"rulesModesTitle": "📱 Modes de joc",
"rulesModesBody": "• Un sol mòbil: tots comparteixen el dispositiu. Cada jugador veu la seva paraula prement i mantenint un botó.\n\n• Multimòbil: cada jugador fa servir el seu propi dispositiu. Es connecten per Bluetooth/WiFi Direct sense necessitat d'internet.",
"rulesExampleTitle": "✏️ Exemple de partida",
"rulesExampleBody": "Paraula secreta: \"Pizza\"\n\n• Laia: \"Es menja calenta\" ✓\n• Jordi: \"Ve en una capsa\" ✓\n• Marta (impostor): \"És molt popular\" 🤔\n• Pau: \"Té formatge\" ✓\n\nLa Marta va donar una resposta molt genèrica... Sospitosa!",
"joinGameTitle": "Unir-se a partida",
"multiDeviceMode": "Mode multimòbil",
"scanQrDescription": "Escaneja el codi QR que mostra l'amfitrió per connectar-te a la partida via Bluetooth/WiFi Direct.",
"comingSoon": "Properament",
"nearbyNotAvailable": "La connexió multimòbil amb Nearby Connections requereix dispositius Android físics.\n\nDe moment, fes servir el mode \"Un sol mòbil\" per jugar en un dispositiu compartit.",
"back": "Tornar",
"yes": "Sí",
"no": "No",
"cancel": "Cancel·lar",
"accept": "Acceptar",
"next": "Següent",
"settingsTitle": "Configuració",
"language": "Idioma",
"soundVolume": "Volum d'efectes",
"vibration": "Vibració",
"about": "Quant a",
"version": "Versió",
"developer": "Desenvolupador",
"licenses": "Llicències"
}

224
lib/l10n/app_de.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "de",
"appTitle": "Der Hochstapler",
"subtitle": "Soziales Deduktionsspiel",
"loadingWords": "Wörter werden geladen...",
"playersRange": "3-20 Spieler • Ohne Internet",
"createGame": "Spiel erstellen",
"joinGame": "Spiel beitreten",
"howToPlay": "Spielanleitung",
"settings": "Einstellungen",
"gameMode": "Spielmodus",
"singleDevice": "Ein Gerät",
"multiDevice": "Mehrere Geräte",
"category": "Kategorie",
"categoryAll": "Alle",
"categoryAnimals": "Tiere",
"categoryFood": "Essen",
"categoryCountries": "Länder",
"categorySports": "Sport",
"categoryProfessions": "Berufe",
"categoryObjects": "Gegenstände",
"categoryPlaces": "Orte",
"categoryMovies": "Filme",
"categoryMusic": "Musik",
"categoryTechnology": "Technologie",
"playersCount": "Spieler ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Name des Spielers",
"playerAlreadyExists": "Ein Spieler mit diesem Namen existiert bereits",
"maxPlayersReached": "Maximal 20 Spieler",
"minPlayersRequired": "Mindestens 3 Spieler erforderlich",
"configuration": "Konfiguration",
"impostors": "🎭 Hochstapler",
"impostorClue": "🔍 Hinweis für den Hochstapler",
"impostorClueDescription": "Der Hochstapler kennt die Kategorie",
"debateTime": "⏱️ Diskussionszeit",
"noLimit": "Kein Limit",
"oneMin": "1 Min",
"twoMin": "2 Min",
"threeMin": "3 Min",
"fiveMin": "5 Min",
"startGame": "Spiel starten",
"seeYourWord": "Dein Wort ansehen",
"eachPlayerMustSee": "Jeder Spieler muss sein Wort im Geheimen ansehen",
"roundNumber": "Runde {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Hat sein Wort bereits gesehen",
"tapToSee": "Tippen zum Ansehen",
"allSeenStartDebate": "Alle haben gesehen → Diskussion starten",
"playersRemaining": "Noch {count} Spieler übrig",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Du bist der Hochstapler!",
"yourWordIs": "Dein Wort ist:",
"clueCategory": "Hinweis: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Gedrückt halten, um dein Wort zu sehen",
"makeSureNoOneLooks": "Stelle sicher, dass niemand anderes hinschaut",
"showingWord": "👁️ Wird angezeigt...",
"holdToSee": "👆 Gedrückt halten zum Ansehen",
"seenMyWord": "Ich habe mein Wort gesehen",
"debateRound": "Diskussion - Runde {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Zeit abgelaufen!",
"timeRemaining": "⏱️ Verbleibende Zeit",
"playersInDebate": "Spieler in der Diskussion",
"activePlayersInfo": "{active} aktiv • {impostors} versteckte(r) Hochstapler",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Ausgeschieden",
"notes": "Notizen",
"goToVoting": "Zur Abstimmung",
"voting": "🗳️ Abstimmung",
"turnToVote": "Jetzt abstimmen:",
"votesProgress": "Stimmen: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Wer ist deiner Meinung nach der Hochstapler?",
"confirmVote": "Stimme bestätigen",
"votingComplete": "🗳️ Abstimmung abgeschlossen",
"allVoted": "Alle haben abgestimmt!",
"tapToReveal": "Tippen, um das Ergebnis aufzudecken",
"revealResult": "Ergebnis aufdecken",
"result": "Ergebnis",
"revealing": "Wird aufgedeckt...",
"wasImpostor": "War ein HOCHSTAPLER! 🎉",
"wasInnocent": "War UNSCHULDIG 😱",
"votesThisRound": "Stimmen dieser Runde",
"seeEndResult": "Endergebnis anzeigen",
"impostorGuessWord": "Errät der Hochstapler das Wort?",
"nextRound": "Nächste Runde",
"impostorGuessTitle": "🎯 Tipp des Hochstaplers",
"impostorCanGuess": "Der ausgeschiedene Hochstapler kann\nversuchen, das Wort zu erraten",
"ifCorrectImpostorsWin": "Bei richtigem Tipp gewinnen die Hochstapler!",
"guessWordHint": "Was glaubst du, ist das Wort?",
"dontGuess": "Nicht versuchen",
"guess": "Raten",
"correctGuess": "Richtig geraten!",
"theWordWas": "Das Wort war: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Die Hochstapler gewinnen!",
"wrongGuess": "Falsch geraten!",
"gameContinues": "Das Spiel geht weiter...",
"gameOver": "Spielende",
"playersWin": "Die Spieler gewinnen!",
"theSecretWordWas": "🔍 Das Wort war:",
"categoryLabel": "Kategorie: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 Der Hochstapler war:",
"theImpostorsWere": "🎭 Die Hochstapler waren:",
"votingHistory": "📊 Abstimmungsverlauf",
"roundElimination": "Runde {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Revanche",
"mainMenu": "Hauptmenü",
"notesTitle": "📝 Notizen",
"notesSaved": "Notizen gespeichert",
"whoAreYou": "Wer bist du?",
"selectYourName": "Wähle deinen Namen, um deine privaten Notizen zu sehen",
"notesOf": "Notizen von {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Notizen zu jedem Spieler",
"playerNoteHint": "Was hat er/sie gesagt? Verdächtig?",
"freeNote": "Freie Notiz",
"freeNoteHint": "Persönliche Notizen...",
"rulesTitle": "📖 Spielanleitung",
"rulesWhatIsTitle": "🎭 Was ist Der Hochstapler?",
"rulesWhatIsBody": "Ein soziales Deduktionsspiel für 3-20 Spieler. Alle erhalten ein geheimes Wort... außer der Hochstapler! Deine Mission: herausfinden, wer blufft.",
"rulesHowToPlayTitle": "🔍 Wie wird gespielt?",
"rulesHowToPlayBody": "1. Die Rollen werden verteilt: Alle erhalten dasselbe Wort, außer der/die Hochstapler.\n\n2. Diskussion: Reihum beschreibt jeder Spieler das Wort, OHNE es direkt zu sagen. Der Hochstapler muss so tun, als ob er es kennt.\n\n3. Abstimmung: Nach der Diskussion stimmen alle ab, wer ihrer Meinung nach der Hochstapler ist.\n\n4. Ausscheiden: Der Spieler mit den meisten Stimmen scheidet aus und es wird aufgedeckt, ob er der Hochstapler war oder nicht.\n\n5. War es der Hochstapler, darf er versuchen, das Wort zu erraten. Bei richtigem Tipp gewinnen die Hochstapler!",
"rulesWhoWinsTitle": "🏆 Wer gewinnt?",
"rulesWhoWinsBody": "• Spieler: gewinnen, wenn sie ALLE Hochstapler entlarven.\n• Hochstapler: gewinnen, wenn sie nicht entdeckt werden, bis gleich viele oder weniger normale Spieler als Hochstapler übrig sind, oder wenn sie beim Ausscheiden das Wort erraten.",
"rulesTipsPlayersTitle": "💡 Tipps für Spieler",
"rulesTipsPlayersBody": "• Gib subtile Hinweise, die zeigen, dass du das Wort kennst, aber nicht so offensichtlich, dass der Hochstapler sie nutzen kann.\n• Achte darauf, wer vage oder allgemeine Antworten gibt.\n• Nutze die Notizen, um aufzuschreiben, was jeder sagt.\n• Sage das Wort nicht direkt, das hilft dem Hochstapler!",
"rulesTipsImpostorTitle": "🎭 Tipps für den Hochstapler",
"rulesTipsImpostorBody": "• Höre aufmerksam auf die Hinweise der anderen.\n• Versuche das Wort zu erraten, um glaubwürdige Hinweise zu geben.\n• Sprich nicht als Erster, wenn du dir unsicher bist.\n• Wenn du die Kategorie als Hinweis bekommst, nutze sie zu deinem Vorteil.\n• Beschuldige andere, um die Aufmerksamkeit abzulenken.",
"rulesModesTitle": "📱 Spielmodi",
"rulesModesBody": "• Ein Gerät: Alle teilen sich das Gerät. Jeder Spieler sieht sein Wort, indem er einen Button gedrückt hält.\n\n• Mehrere Geräte: Jeder Spieler nutzt sein eigenes Gerät. Die Verbindung erfolgt über Bluetooth/WiFi Direct ohne Internetzugang.",
"rulesExampleTitle": "✏️ Beispielrunde",
"rulesExampleBody": "Geheimes Wort: \"Pizza\"\n\n• Lisa: \"Man isst es warm\" ✓\n• Max: \"Kommt in einer Schachtel\" ✓\n• Nina (Hochstapler): \"Ist sehr beliebt\" 🤔\n• Felix: \"Hat Käse drauf\" ✓\n\nNina gab eine sehr allgemeine Antwort... Verdächtig!",
"joinGameTitle": "Spiel beitreten",
"multiDeviceMode": "Mehrere-Geräte-Modus",
"scanQrDescription": "Scanne den QR-Code des Hosts, um der Partie über Bluetooth/WiFi Direct beizutreten.",
"comingSoon": "Demnächst",
"nearbyNotAvailable": "Die Mehrgeräte-Verbindung mit Nearby Connections erfordert physische Android-Geräte.\n\nVerwende vorerst den Modus \"Ein Gerät\", um auf einem gemeinsamen Gerät zu spielen.",
"back": "Zurück",
"yes": "Ja",
"no": "Nein",
"cancel": "Abbrechen",
"accept": "Akzeptieren",
"next": "Weiter",
"settingsTitle": "Einstellungen",
"language": "Sprache",
"soundVolume": "Effektlautstärke",
"vibration": "Vibration",
"about": "Über",
"version": "Version",
"developer": "Entwickler",
"licenses": "Lizenzen"
}

158
lib/l10n/app_en.arb Normal file
View File

@@ -0,0 +1,158 @@
{
"@@locale": "en",
"appTitle": "The Impostor",
"subtitle": "Social deduction game",
"loadingWords": "Loading words...",
"playersRange": "3-20 players • No internet needed",
"createGame": "Create game",
"joinGame": "Join game",
"howToPlay": "How to play",
"settings": "Settings",
"gameMode": "Game mode",
"singleDevice": "Single device",
"multiDevice": "Multi-device",
"category": "Category",
"categoryAll": "All",
"categoryAnimals": "Animals",
"categoryFood": "Food",
"categoryCountries": "Countries",
"categorySports": "Sports",
"categoryProfessions": "Professions",
"categoryObjects": "Objects",
"categoryPlaces": "Places",
"categoryMovies": "Movies",
"categoryMusic": "Music",
"categoryTechnology": "Technology",
"playersCount": "Players ({count})",
"@playersCount": {"placeholders": {"count": {"type": "int"}}},
"playersRangeHint": "3-20",
"playerNameHint": "Player name",
"playerAlreadyExists": "A player with that name already exists",
"maxPlayersReached": "Maximum 20 players",
"minPlayersRequired": "At least 3 players are needed",
"configuration": "Configuration",
"impostors": "🎭 Impostors",
"impostorClue": "🔍 Clue for impostor",
"impostorClueDescription": "The impostor knows the category",
"debateTime": "⏱️ Discussion time",
"noLimit": "No limit",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Start game",
"seeYourWord": "See your word",
"eachPlayerMustSee": "Each player must see their word in secret",
"roundNumber": "Round {round}",
"@roundNumber": {"placeholders": {"round": {"type": "int"}}},
"alreadySeen": "Already seen their word",
"tapToSee": "Tap to see",
"allSeenStartDebate": "Everyone has seen → Start discussion",
"playersRemaining": "{count} players remaining",
"@playersRemaining": {"placeholders": {"count": {"type": "int"}}},
"youAreImpostor": "You are the impostor!",
"yourWordIs": "Your word is:",
"clueCategory": "Clue: {category}",
"@clueCategory": {"placeholders": {"category": {"type": "String"}}},
"holdToSeeWord": "Hold to see your word",
"makeSureNoOneLooks": "Make sure no one else is looking",
"showingWord": "👁️ Showing...",
"holdToSee": "👆 Hold to see",
"seenMyWord": "I've seen my word",
"debateRound": "Discussion - Round {round}",
"@debateRound": {"placeholders": {"round": {"type": "int"}}},
"timeUp": "⏰ Time's up!",
"timeRemaining": "⏱️ Time remaining",
"playersInDebate": "Players in discussion",
"activePlayersInfo": "{active} active • {impostors} hidden impostor(s)",
"@activePlayersInfo": {"placeholders": {"active": {"type": "int"}, "impostors": {"type": "int"}}},
"eliminated": "Eliminated",
"notes": "Notes",
"goToVoting": "Go to voting",
"voting": "🗳️ Voting",
"turnToVote": "Your turn to vote:",
"votesProgress": "Votes: {current}/{total}",
"@votesProgress": {"placeholders": {"current": {"type": "int"}, "total": {"type": "int"}}},
"whoIsImpostor": "Who do you think is the impostor?",
"confirmVote": "Confirm vote",
"votingComplete": "🗳️ Voting complete",
"allVoted": "Everyone has voted!",
"tapToReveal": "Tap to reveal the result",
"revealResult": "Reveal result",
"result": "Result",
"revealing": "Revealing...",
"wasImpostor": "Was the IMPOSTOR! 🎉",
"wasInnocent": "Was INNOCENT 😱",
"votesThisRound": "Votes this round",
"seeEndResult": "See final result",
"impostorGuessWord": "Can the impostor guess the word?",
"nextRound": "Next round",
"impostorGuessTitle": "🎯 Impostor's guess",
"impostorCanGuess": "The eliminated impostor can\ntry to guess the word",
"ifCorrectImpostorsWin": "If correct, the impostors win!",
"guessWordHint": "What do you think the word is?",
"dontGuess": "Don't guess",
"guess": "Guess",
"correctGuess": "Correct guess!",
"theWordWas": "The word was: {word}",
"@theWordWas": {"placeholders": {"word": {"type": "String"}}},
"impostorsWin": "The impostors win!",
"wrongGuess": "Wrong guess!",
"gameContinues": "The game continues...",
"gameOver": "Game over",
"playersWin": "The players win!",
"theSecretWordWas": "🔍 The word was:",
"categoryLabel": "Category: {category}",
"@categoryLabel": {"placeholders": {"category": {"type": "String"}}},
"theImpostorWas": "🎭 The impostor was:",
"theImpostorsWere": "🎭 The impostors were:",
"votingHistory": "📊 Voting history",
"roundElimination": "Round {round}: {name}",
"@roundElimination": {"placeholders": {"round": {"type": "int"}, "name": {"type": "String"}}},
"rematch": "Rematch",
"mainMenu": "Main menu",
"notesTitle": "📝 Notes",
"notesSaved": "Notes saved",
"whoAreYou": "Who are you?",
"selectYourName": "Select your name to view your private notes",
"notesOf": "{name}'s notes",
"@notesOf": {"placeholders": {"name": {"type": "String"}}},
"notesAboutPlayers": "Notes about each player",
"playerNoteHint": "What did they say? Suspicious?",
"freeNote": "Free note",
"freeNoteHint": "Personal notes...",
"rulesTitle": "📖 How to play",
"rulesWhatIsTitle": "🎭 What is The Impostor?",
"rulesWhatIsBody": "A social deduction game for 3-20 players. Everyone receives a secret word... except the impostor! Your mission: figure out who's faking it.",
"rulesHowToPlayTitle": "🔍 How do you play?",
"rulesHowToPlayBody": "1. Roles are dealt: everyone receives the same word, except the impostor(s).\n\n2. Discussion: taking turns, each player describes the word WITHOUT saying it directly. The impostor must pretend they know it.\n\n3. Voting: once the discussion ends, everyone votes on who they think the impostor is.\n\n4. Elimination: the player with the most votes is eliminated and it is revealed whether they were the impostor or not.\n\n5. If they were the impostor, they can try to guess the word. If they get it right, the impostors win!",
"rulesWhoWinsTitle": "🏆 Who wins?",
"rulesWhoWinsBody": "• Players: win by eliminating ALL impostors.\n• Impostors: win if they remain undiscovered until there are equal or fewer regular players than impostors, or if they guess the word when eliminated.",
"rulesTipsPlayersTitle": "💡 Tips for players",
"rulesTipsPlayersBody": "• Give subtle clues that prove you know the word, but not so obvious that the impostor can use them.\n• Watch for vague or generic answers.\n• Use the notes to jot down what everyone says.\n• Don't say the word directly — that helps the impostor!",
"rulesTipsImpostorTitle": "🎭 Tips for the impostor",
"rulesTipsImpostorBody": "• Listen carefully to the others' clues.\n• Try to deduce the word so you can give believable clues.\n• Don't be the first to speak if you're unsure.\n• If you're given the category as a clue, use it to your advantage.\n• Accuse others to divert attention.",
"rulesModesTitle": "📱 Game modes",
"rulesModesBody": "• Single device: everyone shares the device. Each player sees their word by pressing and holding a button.\n\n• Multi-device: each player uses their own device. They connect via Bluetooth/WiFi Direct with no internet needed.",
"rulesExampleTitle": "✏️ Example round",
"rulesExampleBody": "Secret word: \"Pizza\"\n\n• Anna: \"You eat it hot\" ✓\n• Charles: \"It comes in a box\" ✓\n• Eve (impostor): \"It's very popular\" 🤔\n• David: \"It has cheese\" ✓\n\nEve gave a very generic answer... Suspicious!",
"joinGameTitle": "Join game",
"multiDeviceMode": "Multi-device mode",
"scanQrDescription": "Scan the QR code shown by the host to connect to the game via Bluetooth/WiFi Direct.",
"comingSoon": "Coming soon",
"nearbyNotAvailable": "Multi-device connection with Nearby Connections requires physical Android devices.\n\nFor now, use the \"Single device\" mode to play on a shared device.",
"back": "Back",
"yes": "Yes",
"no": "No",
"cancel": "Cancel",
"accept": "Accept",
"next": "Next",
"settingsTitle": "Settings",
"language": "Language",
"soundVolume": "Sound effects volume",
"vibration": "Vibration",
"about": "About",
"version": "Version",
"developer": "Developer",
"licenses": "Licenses"
}

224
lib/l10n/app_es.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "es",
"appTitle": "El Impostor",
"subtitle": "Juego de deducción social",
"loadingWords": "Cargando palabras...",
"playersRange": "3-20 jugadores • Sin internet",
"createGame": "Crear partida",
"joinGame": "Unirse a partida",
"howToPlay": "Cómo jugar",
"settings": "Ajustes",
"gameMode": "Modo de juego",
"singleDevice": "Un solo móvil",
"multiDevice": "Multimóvil",
"category": "Categoría",
"categoryAll": "Todas",
"categoryAnimals": "Animales",
"categoryFood": "Comida",
"categoryCountries": "Países",
"categorySports": "Deportes",
"categoryProfessions": "Profesiones",
"categoryObjects": "Objetos",
"categoryPlaces": "Lugares",
"categoryMovies": "Películas",
"categoryMusic": "Música",
"categoryTechnology": "Tecnología",
"playersCount": "Jugadores ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Nombre del jugador",
"playerAlreadyExists": "Ya existe un jugador con ese nombre",
"maxPlayersReached": "Máximo 20 jugadores",
"minPlayersRequired": "Se necesitan al menos 3 jugadores",
"configuration": "Configuración",
"impostors": "🎭 Impostores",
"impostorClue": "🔍 Pista para impostor",
"impostorClueDescription": "El impostor conoce la categoría",
"debateTime": "⏱️ Tiempo de debate",
"noLimit": "Sin límite",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Iniciar partida",
"seeYourWord": "Ver tu palabra",
"eachPlayerMustSee": "Cada jugador debe ver su palabra en secreto",
"roundNumber": "Ronda {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Ya ha visto su palabra",
"tapToSee": "Pulsa para ver",
"allSeenStartDebate": "Todos han visto → Iniciar debate",
"playersRemaining": "Faltan {count} jugadores",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "¡Eres el impostor!",
"yourWordIs": "Tu palabra es:",
"clueCategory": "Pista: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Mantén pulsado para ver tu palabra",
"makeSureNoOneLooks": "Asegúrate de que nadie más mira",
"showingWord": "👁️ Mostrando...",
"holdToSee": "👆 Mantén pulsado para ver",
"seenMyWord": "He visto mi palabra",
"debateRound": "Debate - Ronda {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ ¡Tiempo agotado!",
"timeRemaining": "⏱️ Tiempo restante",
"playersInDebate": "Jugadores en debate",
"activePlayersInfo": "{active} activos • {impostors} impostor(es) ocultos",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Eliminado",
"notes": "Notas",
"goToVoting": "Ir a votación",
"voting": "🗳️ Votación",
"turnToVote": "Turno de votar:",
"votesProgress": "Votos: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "¿Quién crees que es el impostor?",
"confirmVote": "Confirmar voto",
"votingComplete": "🗳️ Votación completa",
"allVoted": "¡Todos han votado!",
"tapToReveal": "Pulsa para revelar el resultado",
"revealResult": "Revelar resultado",
"result": "Resultado",
"revealing": "Revelando...",
"wasImpostor": "¡Era IMPOSTOR! 🎉",
"wasInnocent": "Era INOCENTE 😱",
"votesThisRound": "Votos de esta ronda",
"seeEndResult": "Ver resultado final",
"impostorGuessWord": "¿El impostor adivina la palabra?",
"nextRound": "Siguiente ronda",
"impostorGuessTitle": "🎯 Adivinanza del impostor",
"impostorCanGuess": "El impostor eliminado puede\nintentar adivinar la palabra",
"ifCorrectImpostorsWin": "Si acierta, ¡los impostores ganan!",
"guessWordHint": "¿Cuál crees que es la palabra?",
"dontGuess": "No intentar",
"guess": "Adivinar",
"correctGuess": "¡Ha acertado!",
"theWordWas": "La palabra era: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "¡Los impostores ganan!",
"wrongGuess": "¡No ha acertado!",
"gameContinues": "La partida continúa...",
"gameOver": "Fin de partida",
"playersWin": "¡Los jugadores ganan!",
"theSecretWordWas": "🔍 La palabra era:",
"categoryLabel": "Categoría: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 El impostor era:",
"theImpostorsWere": "🎭 Los impostores eran:",
"votingHistory": "📊 Historial de votaciones",
"roundElimination": "Ronda {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Revancha",
"mainMenu": "Menú principal",
"notesTitle": "📝 Notas",
"notesSaved": "Notas guardadas",
"whoAreYou": "¿Quién eres?",
"selectYourName": "Selecciona tu nombre para ver tus notas privadas",
"notesOf": "Notas de {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Apuntes sobre cada jugador",
"playerNoteHint": "¿Qué ha dicho? ¿Sospechoso?",
"freeNote": "Nota libre",
"freeNoteHint": "Apuntes personales...",
"rulesTitle": "📖 Cómo jugar",
"rulesWhatIsTitle": "🎭 ¿Qué es El Impostor?",
"rulesWhatIsBody": "Un juego de deducción social para 3-20 jugadores. Todos reciben una palabra secreta... ¡excepto el impostor! Tu misión: descubrir quién finge.",
"rulesHowToPlayTitle": "🔍 ¿Cómo se juega?",
"rulesHowToPlayBody": "1. Se reparten los roles: todos reciben la misma palabra, excepto el/los impostores.\n\n2. Debate: por turnos, cada jugador describe la palabra SIN decirla directamente. El impostor debe fingir que la conoce.\n\n3. Votación: al terminar el debate, todos votan a quién creen que es el impostor.\n\n4. Eliminación: el más votado queda eliminado y se revela si era impostor o no.\n\n5. Si era impostor, puede intentar adivinar la palabra. Si acierta, ¡los impostores ganan!",
"rulesWhoWinsTitle": "🏆 ¿Quién gana?",
"rulesWhoWinsBody": "• Jugadores: ganan si eliminan a TODOS los impostores.\n• Impostores: ganan si no son descubiertos hasta que queden igual o menos jugadores normales que impostores, o si adivinan la palabra al ser eliminados.",
"rulesTipsPlayersTitle": "💡 Consejos para jugadores",
"rulesTipsPlayersBody": "• Da pistas sutiles que demuestren que conoces la palabra, pero no tan obvias que el impostor las use.\n• Observa quién da respuestas vagas o genéricas.\n• Usa las notas para apuntar lo que dice cada uno.\n• No digas la palabra directamente, ¡eso ayuda al impostor!",
"rulesTipsImpostorTitle": "🎭 Consejos para el impostor",
"rulesTipsImpostorBody": "• Escucha atentamente las pistas de los demás.\n• Intenta deducir la palabra para dar pistas creíbles.\n• No seas el primero en hablar si no estás seguro.\n• Si te dan la categoría como pista, úsala a tu favor.\n• Acusa a otros para desviar la atención.",
"rulesModesTitle": "📱 Modos de juego",
"rulesModesBody": "• Un solo móvil: todos comparten el dispositivo. Cada jugador ve su palabra pulsando y manteniendo un botón.\n\n• Multimóvil: cada jugador usa su propio dispositivo. Se conectan por Bluetooth/WiFi Direct sin necesidad de internet.",
"rulesExampleTitle": "✏️ Ejemplo de partida",
"rulesExampleBody": "Palabra secreta: \"Pizza\"\n\n• Ana: \"Se come caliente\" ✓\n• Carlos: \"Viene en una caja\" ✓\n• Eva (impostor): \"Es muy popular\" 🤔\n• David: \"Tiene queso\" ✓\n\nEva dio una respuesta muy genérica... ¡Sospechosa!",
"joinGameTitle": "Unirse a partida",
"multiDeviceMode": "Modo multimóvil",
"scanQrDescription": "Escanea el código QR que muestra el host para conectarte a la partida vía Bluetooth/WiFi Direct.",
"comingSoon": "Próximamente",
"nearbyNotAvailable": "La conexión multimóvil con Nearby Connections requiere dispositivos Android físicos.\n\nPor ahora, usa el modo \"Un solo móvil\" para jugar en un dispositivo compartido.",
"back": "Volver",
"yes": "Sí",
"no": "No",
"cancel": "Cancelar",
"accept": "Aceptar",
"next": "Siguiente",
"settingsTitle": "Ajustes",
"language": "Idioma",
"soundVolume": "Volumen de efectos",
"vibration": "Vibración",
"about": "Acerca de",
"version": "Versión",
"developer": "Desarrollador",
"licenses": "Licencias"
}

224
lib/l10n/app_eu.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "eu",
"appTitle": "Inpostorrea",
"subtitle": "Dedukzio sozialeko jokoa",
"loadingWords": "Hitzak kargatzen...",
"playersRange": "3-20 jokalari • Internetik gabe",
"createGame": "Partida sortu",
"joinGame": "Partidara batu",
"howToPlay": "Nola jolastu",
"settings": "Ezarpenak",
"gameMode": "Joko-modua",
"singleDevice": "Mugikor bakarra",
"multiDevice": "Mugikor anitz",
"category": "Kategoria",
"categoryAll": "Denak",
"categoryAnimals": "Animaliak",
"categoryFood": "Janaria",
"categoryCountries": "Herrialdeak",
"categorySports": "Kirolak",
"categoryProfessions": "Lanbideak",
"categoryObjects": "Objektuak",
"categoryPlaces": "Lekuak",
"categoryMovies": "Filmak",
"categoryMusic": "Musika",
"categoryTechnology": "Teknologia",
"playersCount": "Jokalariak ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Jokalariaren izena",
"playerAlreadyExists": "Izen hori duen jokalari bat badago dagoeneko",
"maxPlayersReached": "Gehienez 20 jokalari",
"minPlayersRequired": "Gutxienez 3 jokalari behar dira",
"configuration": "Konfigurazioa",
"impostors": "🎭 Inpostoreak",
"impostorClue": "🔍 Inpostorearentzako pista",
"impostorClueDescription": "Inpostoreak kategoria ezagutzen du",
"debateTime": "⏱️ Eztabaida-denbora",
"noLimit": "Mugarik gabe",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Partida hasi",
"seeYourWord": "Ikusi zure hitza",
"eachPlayerMustSee": "Jokalari bakoitzak bere hitza ezkutuan ikusi behar du",
"roundNumber": "{round}. txanda",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Bere hitza ikusi du dagoeneko",
"tapToSee": "Sakatu ikusteko",
"allSeenStartDebate": "Denek ikusi dute → Eztabaida hasi",
"playersRemaining": "{count} jokalari falta dira",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Inpostorea zara!",
"yourWordIs": "Zure hitza da:",
"clueCategory": "Pista: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Sakatuta eduki zure hitza ikusteko",
"makeSureNoOneLooks": "Ziurtatu inor gehiago ez dagoela begiratzen",
"showingWord": "👁️ Erakusten...",
"holdToSee": "👆 Sakatuta eduki ikusteko",
"seenMyWord": "Nire hitza ikusi dut",
"debateRound": "Eztabaida - {round}. txanda",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Denbora agortu da!",
"timeRemaining": "⏱️ Geratzen den denbora",
"playersInDebate": "Eztabaidan diren jokalariak",
"activePlayersInfo": "{active} aktibo • {impostors} inpostore ezkutu",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Kanporatua",
"notes": "Oharrak",
"goToVoting": "Bozkatzera joan",
"voting": "🗳️ Bozketa",
"turnToVote": "Bozkatze-txanda:",
"votesProgress": "Botoak: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Nor da inpostorea zure ustez?",
"confirmVote": "Botoa berretsi",
"votingComplete": "🗳️ Bozketa osatua",
"allVoted": "Denek bozka eman dute!",
"tapToReveal": "Sakatu emaitza agertzeko",
"revealResult": "Emaitza agertu",
"result": "Emaitza",
"revealing": "Agertzen...",
"wasImpostor": "INPOSTOREA zen! 🎉",
"wasInnocent": "ERRUGABEA zen 😱",
"votesThisRound": "Txanda honetako botoak",
"seeEndResult": "Azken emaitza ikusi",
"impostorGuessWord": "Inpostoreak hitza asmatzen du?",
"nextRound": "Hurrengo txanda",
"impostorGuessTitle": "🎯 Inpostorearen asmaketa",
"impostorCanGuess": "Kanporatutako inpostoreak\nhitza asmatzen saia daiteke",
"ifCorrectImpostorsWin": "Asmatzen badu, inpostoreek irabazten dute!",
"guessWordHint": "Zein da hitza zure ustez?",
"dontGuess": "Ez saiatu",
"guess": "Asmatu",
"correctGuess": "Asmatu du!",
"theWordWas": "Hitza zen: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Inpostoreek irabazi dute!",
"wrongGuess": "Ez du asmatu!",
"gameContinues": "Partida jarraitzen du...",
"gameOver": "Partidaren amaiera",
"playersWin": "Jokalariek irabazi dute!",
"theSecretWordWas": "🔍 Hitza zen:",
"categoryLabel": "Kategoria: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 Inpostorea zen:",
"theImpostorsWere": "🎭 Inpostoreak ziren:",
"votingHistory": "📊 Bozketen historia",
"roundElimination": "{round}. txanda: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Errebantxa",
"mainMenu": "Menu nagusia",
"notesTitle": "📝 Oharrak",
"notesSaved": "Oharrak gordeta",
"whoAreYou": "Nor zara?",
"selectYourName": "Aukeratu zure izena ohar pribatuak ikusteko",
"notesOf": "{name}-(r)en oharrak",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Jokalari bakoitzari buruzko apunteak",
"playerNoteHint": "Zer esan du? Susmagarria?",
"freeNote": "Ohar librea",
"freeNoteHint": "Apunte pertsonalak...",
"rulesTitle": "📖 Nola jolastu",
"rulesWhatIsTitle": "🎭 Zer da Inpostorrea?",
"rulesWhatIsBody": "3-20 jokalarientzako dedukzio sozialeko jokoa. Denek hitz sekretu bat jasotzen dute... inpostorea izan ezik! Zure misioa: nor ari den itxurak egiten aurkitzea.",
"rulesHowToPlayTitle": "🔍 Nola jolasten da?",
"rulesHowToPlayBody": "1. Rolak banatzen dira: denek hitz bera jasotzen dute, inpostorea/inpostoreak izan ezik.\n\n2. Eztabaida: txandaka, jokalari bakoitzak hitza deskribatzen du zuzenean ESAN gabe. Inpostoreak ezagutzen duela itxurak egin behar du.\n\n3. Bozketa: eztabaida amaitzean, denek bozkatzen dute nor den inpostorea uste duten.\n\n4. Kanporatzea: boto gehien dituena kanporatua geratzen da eta inpostorea zen ala ez agertzen da.\n\n5. Inpostorea bazen, hitza asmatzen saia daiteke. Asmatzen badu, inpostoreek irabazten dute!",
"rulesWhoWinsTitle": "🏆 Nork irabazten du?",
"rulesWhoWinsBody": "• Jokalariak: irabazten dute inpostore GUZTIAK kanporatzen badituzte.\n• Inpostoreak: irabazten dute aurkitu gabe jarraitzen badute jokalari arruntak inpostore adina edo gutxiago diren arte, edo hitza asmatzen badute kanporatu ondoren.",
"rulesTipsPlayersTitle": "💡 Jokalarientzako aholkuak",
"rulesTipsPlayersBody": "• Eman hitza ezagutzen duzula erakusten duten pista sotilak, baina ez hain argiak inpostoreak erabil ditzan.\n• Begiratu nork ematen dituen erantzun lausoak edo generikoak.\n• Erabili oharrak bakoitzak zer esaten duen apuntatzeko.\n• Ez esan hitza zuzenean, horrek inpostoreari laguntzen dio!",
"rulesTipsImpostorTitle": "🎭 Inpostorearentzako aholkuak",
"rulesTipsImpostorBody": "• Entzun arretaz besteen pistak.\n• Saiatu hitza deduzitzen pista sinesgarriak emateko.\n• Ez izan lehena hitz egiten ziur ez bazaude.\n• Kategoria pista gisa ematen badizute, erabili zure alde.\n• Salatu besteak arreta desbideratzeko.",
"rulesModesTitle": "📱 Joko-moduak",
"rulesModesBody": "• Mugikor bakarra: denek gailua partekatzen dute. Jokalari bakoitzak bere hitza ikusten du botoi bat sakatuta edukiz.\n\n• Mugikor anitz: jokalari bakoitzak bere gailua erabiltzen du. Bluetooth/WiFi Direct bidez konektatzen dira internetik behartu gabe.",
"rulesExampleTitle": "✏️ Partida-adibidea",
"rulesExampleBody": "Hitz sekretua: \"Pizza\"\n\n• Ane: \"Beroa jaten da\" ✓\n• Mikel: \"Kutxa batean dator\" ✓\n• Irati (inpostorea): \"Oso ezaguna da\" 🤔\n• Unai: \"Gazta dauka\" ✓\n\nIratik erantzun oso generikoa eman zuen... Susmagarria!",
"joinGameTitle": "Partidara batu",
"multiDeviceMode": "Mugikor anitzeko modua",
"scanQrDescription": "Eskaneatu ostalariak erakusten duen QR kodea partidara Bluetooth/WiFi Direct bidez konektatzeko.",
"comingSoon": "Laster",
"nearbyNotAvailable": "Mugikor anitzeko konexioak Nearby Connections-ekin Android gailu fisikoak behar ditu.\n\nOraingoz, erabili \"Mugikor bakarra\" modua gailu partekatuan jolasteko.",
"back": "Atzera",
"yes": "Bai",
"no": "Ez",
"cancel": "Ezeztatu",
"accept": "Onartu",
"next": "Hurrengoa",
"settingsTitle": "Ezarpenak",
"language": "Hizkuntza",
"soundVolume": "Efektuen bolumena",
"vibration": "Bibrazioa",
"about": "Honi buruz",
"version": "Bertsioa",
"developer": "Garatzailea",
"licenses": "Lizentziak"
}

224
lib/l10n/app_fr.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "fr",
"appTitle": "L'Imposteur",
"subtitle": "Jeu de déduction sociale",
"loadingWords": "Chargement des mots...",
"playersRange": "3-20 joueurs • Sans internet",
"createGame": "Créer une partie",
"joinGame": "Rejoindre une partie",
"howToPlay": "Comment jouer",
"settings": "Paramètres",
"gameMode": "Mode de jeu",
"singleDevice": "Un seul téléphone",
"multiDevice": "Multi-téléphone",
"category": "Catégorie",
"categoryAll": "Toutes",
"categoryAnimals": "Animaux",
"categoryFood": "Nourriture",
"categoryCountries": "Pays",
"categorySports": "Sports",
"categoryProfessions": "Métiers",
"categoryObjects": "Objets",
"categoryPlaces": "Lieux",
"categoryMovies": "Films",
"categoryMusic": "Musique",
"categoryTechnology": "Technologie",
"playersCount": "Joueurs ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Nom du joueur",
"playerAlreadyExists": "Un joueur avec ce nom existe déjà",
"maxPlayersReached": "Maximum 20 joueurs",
"minPlayersRequired": "Il faut au moins 3 joueurs",
"configuration": "Configuration",
"impostors": "🎭 Imposteurs",
"impostorClue": "🔍 Indice pour l'imposteur",
"impostorClueDescription": "L'imposteur connaît la catégorie",
"debateTime": "⏱️ Temps de débat",
"noLimit": "Sans limite",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Lancer la partie",
"seeYourWord": "Voir ton mot",
"eachPlayerMustSee": "Chaque joueur doit voir son mot en secret",
"roundNumber": "Manche {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "A déjà vu son mot",
"tapToSee": "Appuie pour voir",
"allSeenStartDebate": "Tous ont vu → Lancer le débat",
"playersRemaining": "Encore {count} joueurs",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Tu es l'imposteur !",
"yourWordIs": "Ton mot est :",
"clueCategory": "Indice : {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Maintiens appuyé pour voir ton mot",
"makeSureNoOneLooks": "Assure-toi que personne d'autre ne regarde",
"showingWord": "👁️ Affichage...",
"holdToSee": "👆 Maintiens appuyé pour voir",
"seenMyWord": "J'ai vu mon mot",
"debateRound": "Débat - Manche {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Temps écoulé !",
"timeRemaining": "⏱️ Temps restant",
"playersInDebate": "Joueurs en débat",
"activePlayersInfo": "{active} actifs • {impostors} imposteur(s) caché(s)",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Éliminé",
"notes": "Notes",
"goToVoting": "Passer au vote",
"voting": "🗳️ Vote",
"turnToVote": "Au tour de voter :",
"votesProgress": "Votes : {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Qui est l'imposteur selon toi ?",
"confirmVote": "Confirmer le vote",
"votingComplete": "🗳️ Vote terminé",
"allVoted": "Tout le monde a voté !",
"tapToReveal": "Appuie pour révéler le résultat",
"revealResult": "Révéler le résultat",
"result": "Résultat",
"revealing": "Révélation...",
"wasImpostor": "C'était l'IMPOSTEUR ! 🎉",
"wasInnocent": "C'était un INNOCENT 😱",
"votesThisRound": "Votes de cette manche",
"seeEndResult": "Voir le résultat final",
"impostorGuessWord": "L'imposteur devine-t-il le mot ?",
"nextRound": "Manche suivante",
"impostorGuessTitle": "🎯 Devinette de l'imposteur",
"impostorCanGuess": "L'imposteur éliminé peut\ntenter de deviner le mot",
"ifCorrectImpostorsWin": "S'il trouve, les imposteurs gagnent !",
"guessWordHint": "Quel est le mot selon toi ?",
"dontGuess": "Ne pas tenter",
"guess": "Deviner",
"correctGuess": "Il a trouvé !",
"theWordWas": "Le mot était : {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Les imposteurs gagnent !",
"wrongGuess": "Il n'a pas trouvé !",
"gameContinues": "La partie continue...",
"gameOver": "Fin de partie",
"playersWin": "Les joueurs gagnent !",
"theSecretWordWas": "🔍 Le mot était :",
"categoryLabel": "Catégorie : {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 L'imposteur était :",
"theImpostorsWere": "🎭 Les imposteurs étaient :",
"votingHistory": "📊 Historique des votes",
"roundElimination": "Manche {round} : {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Revanche",
"mainMenu": "Menu principal",
"notesTitle": "📝 Notes",
"notesSaved": "Notes sauvegardées",
"whoAreYou": "Qui es-tu ?",
"selectYourName": "Sélectionne ton nom pour voir tes notes privées",
"notesOf": "Notes de {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Notes sur chaque joueur",
"playerNoteHint": "Qu'a-t-il dit ? Suspect ?",
"freeNote": "Note libre",
"freeNoteHint": "Notes personnelles...",
"rulesTitle": "📖 Comment jouer",
"rulesWhatIsTitle": "🎭 Qu'est-ce que L'Imposteur ?",
"rulesWhatIsBody": "Un jeu de déduction sociale pour 3-20 joueurs. Tout le monde reçoit un mot secret... sauf l'imposteur ! Ta mission : découvrir qui bluff.",
"rulesHowToPlayTitle": "🔍 Comment joue-t-on ?",
"rulesHowToPlayBody": "1. Distribution des rôles : tout le monde reçoit le même mot, sauf le(s) imposteur(s).\n\n2. Débat : à tour de rôle, chaque joueur décrit le mot SANS le dire directement. L'imposteur doit faire semblant de le connaître.\n\n3. Vote : à la fin du débat, tout le monde vote pour celui qu'il pense être l'imposteur.\n\n4. Élimination : le plus voté est éliminé et on révèle s'il était imposteur ou non.\n\n5. Si c'était l'imposteur, il peut tenter de deviner le mot. S'il trouve, les imposteurs gagnent !",
"rulesWhoWinsTitle": "🏆 Qui gagne ?",
"rulesWhoWinsBody": "• Joueurs : ils gagnent s'ils éliminent TOUS les imposteurs.\n• Imposteurs : ils gagnent s'ils ne sont pas découverts jusqu'à ce qu'il reste autant ou moins de joueurs normaux que d'imposteurs, ou s'ils devinent le mot en étant éliminés.",
"rulesTipsPlayersTitle": "💡 Conseils pour les joueurs",
"rulesTipsPlayersBody": "• Donne des indices subtils qui prouvent que tu connais le mot, mais pas trop évidents pour que l'imposteur ne les utilise pas.\n• Observe qui donne des réponses vagues ou génériques.\n• Utilise les notes pour noter ce que chacun dit.\n• Ne dis pas le mot directement, ça aide l'imposteur !",
"rulesTipsImpostorTitle": "🎭 Conseils pour l'imposteur",
"rulesTipsImpostorBody": "• Écoute attentivement les indices des autres.\n• Essaie de déduire le mot pour donner des indices crédibles.\n• Ne sois pas le premier à parler si tu n'es pas sûr.\n• Si on te donne la catégorie comme indice, utilise-la à ton avantage.\n• Accuse les autres pour détourner l'attention.",
"rulesModesTitle": "📱 Modes de jeu",
"rulesModesBody": "• Un seul téléphone : tout le monde partage l'appareil. Chaque joueur voit son mot en appuyant et maintenant un bouton.\n\n• Multi-téléphone : chaque joueur utilise son propre appareil. Ils se connectent par Bluetooth/WiFi Direct sans avoir besoin d'internet.",
"rulesExampleTitle": "✏️ Exemple de partie",
"rulesExampleBody": "Mot secret : \"Pizza\"\n\n• Marie : \"Ça se mange chaud\" ✓\n• Lucas : \"Ça arrive dans une boîte\" ✓\n• Julie (imposteur) : \"C'est très populaire\" 🤔\n• Thomas : \"Il y a du fromage\" ✓\n\nJulie a donné une réponse très générique... Suspecte !",
"joinGameTitle": "Rejoindre une partie",
"multiDeviceMode": "Mode multi-téléphone",
"scanQrDescription": "Scanne le code QR affiché par l'hôte pour te connecter à la partie via Bluetooth/WiFi Direct.",
"comingSoon": "Prochainement",
"nearbyNotAvailable": "La connexion multi-téléphone avec Nearby Connections nécessite des appareils Android physiques.\n\nPour l'instant, utilise le mode \"Un seul téléphone\" pour jouer sur un appareil partagé.",
"back": "Retour",
"yes": "Oui",
"no": "Non",
"cancel": "Annuler",
"accept": "Accepter",
"next": "Suivant",
"settingsTitle": "Paramètres",
"language": "Langue",
"soundVolume": "Volume des effets",
"vibration": "Vibration",
"about": "À propos",
"version": "Version",
"developer": "Développeur",
"licenses": "Licences"
}

224
lib/l10n/app_hi.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "hi",
"appTitle": "धोखेबाज़",
"subtitle": "सामाजिक अनुमान का खेल",
"loadingWords": "शब्द लोड हो रहे हैं...",
"playersRange": "3-20 खिलाड़ी • इंटरनेट की ज़रूरत नहीं",
"createGame": "गेम बनाएँ",
"joinGame": "गेम में शामिल हों",
"howToPlay": "कैसे खेलें",
"settings": "सेटिंग्स",
"gameMode": "गेम मोड",
"singleDevice": "एक डिवाइस",
"multiDevice": "मल्टी-डिवाइस",
"category": "श्रेणी",
"categoryAll": "सभी",
"categoryAnimals": "जानवर",
"categoryFood": "खाना",
"categoryCountries": "देश",
"categorySports": "खेल",
"categoryProfessions": "पेशे",
"categoryObjects": "वस्तुएँ",
"categoryPlaces": "स्थान",
"categoryMovies": "फ़िल्में",
"categoryMusic": "संगीत",
"categoryTechnology": "टेक्नोलॉजी",
"playersCount": "खिलाड़ी ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "खिलाड़ी का नाम",
"playerAlreadyExists": "इस नाम का खिलाड़ी पहले से मौजूद है",
"maxPlayersReached": "अधिकतम 20 खिलाड़ी",
"minPlayersRequired": "कम से कम 3 खिलाड़ी ज़रूरी हैं",
"configuration": "कॉन्फ़िगरेशन",
"impostors": "🎭 धोखेबाज़",
"impostorClue": "🔍 धोखेबाज़ के लिए संकेत",
"impostorClueDescription": "धोखेबाज़ को श्रेणी पता होगी",
"debateTime": "⏱️ बहस का समय",
"noLimit": "कोई सीमा नहीं",
"oneMin": "1 मिनट",
"twoMin": "2 मिनट",
"threeMin": "3 मिनट",
"fiveMin": "5 मिनट",
"startGame": "गेम शुरू करें",
"seeYourWord": "अपना शब्द देखें",
"eachPlayerMustSee": "हर खिलाड़ी को अपना शब्द गुपचुप देखना होगा",
"roundNumber": "राउंड {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "अपना शब्द देख चुके हैं",
"tapToSee": "देखने के लिए टैप करें",
"allSeenStartDebate": "सबने देख लिया → बहस शुरू करें",
"playersRemaining": "{count} खिलाड़ी बाकी हैं",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "आप धोखेबाज़ हैं!",
"yourWordIs": "आपका शब्द है:",
"clueCategory": "संकेत: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "अपना शब्द देखने के लिए दबाए रखें",
"makeSureNoOneLooks": "सुनिश्चित करें कि कोई और नहीं देख रहा",
"showingWord": "👁️ दिखा रहे हैं...",
"holdToSee": "👆 देखने के लिए दबाए रखें",
"seenMyWord": "मैंने अपना शब्द देख लिया",
"debateRound": "बहस - राउंड {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ समय समाप्त!",
"timeRemaining": "⏱️ शेष समय",
"playersInDebate": "बहस में खिलाड़ी",
"activePlayersInfo": "{active} सक्रिय • {impostors} धोखेबाज़ छिपे हुए",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "बाहर",
"notes": "नोट्स",
"goToVoting": "वोटिंग पर जाएँ",
"voting": "🗳️ वोटिंग",
"turnToVote": "वोट करने की बारी:",
"votesProgress": "वोट: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "आपको कौन धोखेबाज़ लगता है?",
"confirmVote": "वोट की पुष्टि करें",
"votingComplete": "🗳️ वोटिंग पूरी हुई",
"allVoted": "सबने वोट कर दिया!",
"tapToReveal": "नतीजा देखने के लिए टैप करें",
"revealResult": "नतीजा दिखाएँ",
"result": "नतीजा",
"revealing": "दिखा रहे हैं...",
"wasImpostor": "धोखेबाज़ था! 🎉",
"wasInnocent": "बेगुनाह था 😱",
"votesThisRound": "इस राउंड के वोट",
"seeEndResult": "अंतिम नतीजा देखें",
"impostorGuessWord": "क्या धोखेबाज़ शब्द का अनुमान लगाएगा?",
"nextRound": "अगला राउंड",
"impostorGuessTitle": "🎯 धोखेबाज़ का अनुमान",
"impostorCanGuess": "बाहर किया गया धोखेबाज़\nशब्द का अनुमान लगा सकता है",
"ifCorrectImpostorsWin": "अगर सही अनुमान लगाया, तो धोखेबाज़ जीतते हैं!",
"guessWordHint": "आपके अनुसार शब्द क्या है?",
"dontGuess": "अनुमान न लगाएँ",
"guess": "अनुमान लगाएँ",
"correctGuess": "सही अनुमान!",
"theWordWas": "शब्द था: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "धोखेबाज़ जीत गए!",
"wrongGuess": "गलत अनुमान!",
"gameContinues": "गेम जारी है...",
"gameOver": "गेम ख़त्म",
"playersWin": "खिलाड़ी जीत गए!",
"theSecretWordWas": "🔍 शब्द था:",
"categoryLabel": "श्रेणी: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 धोखेबाज़ था:",
"theImpostorsWere": "🎭 धोखेबाज़ थे:",
"votingHistory": "📊 वोटिंग का इतिहास",
"roundElimination": "राउंड {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "फिर से खेलें",
"mainMenu": "मुख्य मेनू",
"notesTitle": "📝 नोट्स",
"notesSaved": "नोट्स सहेजे गए",
"whoAreYou": "आप कौन हैं?",
"selectYourName": "अपने निजी नोट्स देखने के लिए अपना नाम चुनें",
"notesOf": "{name} के नोट्स",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "हर खिलाड़ी के बारे में नोट्स",
"playerNoteHint": "उसने क्या कहा? शक है?",
"freeNote": "फ्री नोट",
"freeNoteHint": "निजी नोट्स...",
"rulesTitle": "📖 कैसे खेलें",
"rulesWhatIsTitle": "🎭 धोखेबाज़ क्या है?",
"rulesWhatIsBody": "3-20 खिलाड़ियों के लिए एक सामाजिक अनुमान का खेल। सबको एक गुप्त शब्द मिलता है... धोखेबाज़ को छोड़कर! आपका मिशन: पता लगाएँ कि कौन बहाना बना रहा है।",
"rulesHowToPlayTitle": "🔍 कैसे खेलें?",
"rulesHowToPlayBody": "1. भूमिकाएँ बाँटी जाती हैं: सबको एक ही शब्द मिलता है, धोखेबाज़ को छोड़कर।\n\n2. बहस: बारी-बारी से हर खिलाड़ी शब्द का वर्णन करता है, बिना सीधे बताए। धोखेबाज़ को बहाना बनाना होता है कि वह शब्द जानता है।\n\n3. वोटिंग: बहस के बाद सभी वोट करते हैं कि धोखेबाज़ कौन है।\n\n4. बाहर करना: सबसे ज़्यादा वोट पाने वाला बाहर हो जाता है और पता चलता है कि वह धोखेबाज़ था या नहीं।\n\n5. अगर वह धोखेबाज़ था, तो वह शब्द का अनुमान लगा सकता है। सही अनुमान पर धोखेबाज़ जीतते हैं!",
"rulesWhoWinsTitle": "🏆 कौन जीतता है?",
"rulesWhoWinsBody": "• खिलाड़ी: सभी धोखेबाज़ों को बाहर करने पर जीतते हैं।\n• धोखेबाज़: अगर पकड़े नहीं गए और सामान्य खिलाड़ियों की संख्या धोखेबाज़ों के बराबर या कम हो जाए, या बाहर होने पर शब्द सही अनुमान लगा लें, तो जीतते हैं।",
"rulesTipsPlayersTitle": "💡 खिलाड़ियों के लिए सुझाव",
"rulesTipsPlayersBody": "• ऐसे सूक्ष्म संकेत दें जो साबित करें कि आप शब्द जानते हैं, लेकिन इतने स्पष्ट नहीं कि धोखेबाज़ उनका फ़ायदा उठा ले।\n• ध्यान दें कि कौन अस्पष्ट या सामान्य जवाब दे रहा है।\n• हर किसी ने क्या कहा, यह लिखने के लिए नोट्स का उपयोग करें।\n• शब्द सीधे न बताएँ, इससे धोखेबाज़ को फ़ायदा होता है!",
"rulesTipsImpostorTitle": "🎭 धोखेबाज़ के लिए सुझाव",
"rulesTipsImpostorBody": "• दूसरों के संकेत ध्यान से सुनें।\n• विश्वसनीय संकेत देने के लिए शब्द का अनुमान लगाने की कोशिश करें।\n• अगर आपको यकीन नहीं है तो पहले न बोलें।\n• अगर श्रेणी का संकेत मिले, तो उसे अपने फ़ायदे में इस्तेमाल करें।\n• ध्यान भटकाने के लिए दूसरों पर आरोप लगाएँ।",
"rulesModesTitle": "📱 गेम मोड",
"rulesModesBody": "• एक डिवाइस: सभी एक ही डिवाइस शेयर करते हैं। हर खिलाड़ी बटन दबाकर अपना शब्द देखता है।\n\n• मल्टी-डिवाइस: हर खिलाड़ी अपना डिवाइस इस्तेमाल करता है। ब्लूटूथ/WiFi Direct से जुड़ते हैं, इंटरनेट की ज़रूरत नहीं।",
"rulesExampleTitle": "✏️ गेम का उदाहरण",
"rulesExampleBody": "गुप्त शब्द: \"पिज़्ज़ा\"\n\n• आर्यन: \"गरम खाया जाता है\" ✓\n• प्रिया: \"डिब्बे में आता है\" ✓\n• नेहा (धोखेबाज़): \"बहुत लोकप्रिय है\" 🤔\n• राहुल: \"इसमें चीज़ होता है\" ✓\n\nनेहा का जवाब बहुत सामान्य था... शक़ है!",
"joinGameTitle": "गेम में शामिल हों",
"multiDeviceMode": "मल्टी-डिवाइस मोड",
"scanQrDescription": "ब्लूटूथ/WiFi Direct से गेम में जुड़ने के लिए होस्ट का QR कोड स्कैन करें।",
"comingSoon": "जल्द आ रहा है",
"nearbyNotAvailable": "Nearby Connections से मल्टी-डिवाइस कनेक्शन के लिए असली Android डिवाइस चाहिए।\n\nअभी के लिए, शेयर किए गए डिवाइस पर खेलने के लिए \"एक डिवाइस\" मोड का उपयोग करें।",
"back": "वापस",
"yes": "हाँ",
"no": "नहीं",
"cancel": "रद्द करें",
"accept": "स्वीकार करें",
"next": "अगला",
"settingsTitle": "सेटिंग्स",
"language": "भाषा",
"soundVolume": "साउंड इफ़ेक्ट्स की आवाज़",
"vibration": "कंपन",
"about": "ऐप के बारे में",
"version": "संस्करण",
"developer": "डेवलपर",
"licenses": "लाइसेंस"
}

224
lib/l10n/app_it.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "it",
"appTitle": "L'Impostore",
"subtitle": "Gioco di deduzione sociale",
"loadingWords": "Caricamento parole...",
"playersRange": "3-20 giocatori • Senza internet",
"createGame": "Crea partita",
"joinGame": "Unisciti alla partita",
"howToPlay": "Come giocare",
"settings": "Impostazioni",
"gameMode": "Modalità di gioco",
"singleDevice": "Un solo dispositivo",
"multiDevice": "Multi-dispositivo",
"category": "Categoria",
"categoryAll": "Tutte",
"categoryAnimals": "Animali",
"categoryFood": "Cibo",
"categoryCountries": "Paesi",
"categorySports": "Sport",
"categoryProfessions": "Professioni",
"categoryObjects": "Oggetti",
"categoryPlaces": "Luoghi",
"categoryMovies": "Film",
"categoryMusic": "Musica",
"categoryTechnology": "Tecnologia",
"playersCount": "Giocatori ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Nome del giocatore",
"playerAlreadyExists": "Esiste già un giocatore con questo nome",
"maxPlayersReached": "Massimo 20 giocatori",
"minPlayersRequired": "Servono almeno 3 giocatori",
"configuration": "Configurazione",
"impostors": "🎭 Impostori",
"impostorClue": "🔍 Indizio per l'impostore",
"impostorClueDescription": "L'impostore conosce la categoria",
"debateTime": "⏱️ Tempo di discussione",
"noLimit": "Senza limite",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Inizia partita",
"seeYourWord": "Vedi la tua parola",
"eachPlayerMustSee": "Ogni giocatore deve vedere la propria parola in segreto",
"roundNumber": "Round {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Ha già visto la sua parola",
"tapToSee": "Tocca per vedere",
"allSeenStartDebate": "Tutti hanno visto → Inizia discussione",
"playersRemaining": "Mancano {count} giocatori",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Sei l'impostore!",
"yourWordIs": "La tua parola è:",
"clueCategory": "Indizio: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Tieni premuto per vedere la tua parola",
"makeSureNoOneLooks": "Assicurati che nessun altro stia guardando",
"showingWord": "👁️ Mostrando...",
"holdToSee": "👆 Tieni premuto per vedere",
"seenMyWord": "Ho visto la mia parola",
"debateRound": "Discussione - Round {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Tempo scaduto!",
"timeRemaining": "⏱️ Tempo rimanente",
"playersInDebate": "Giocatori in discussione",
"activePlayersInfo": "{active} attivi • {impostors} impostore/i nascosti",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Eliminato",
"notes": "Note",
"goToVoting": "Vai alla votazione",
"voting": "🗳️ Votazione",
"turnToVote": "Turno di votare:",
"votesProgress": "Voti: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Chi pensi sia l'impostore?",
"confirmVote": "Conferma voto",
"votingComplete": "🗳️ Votazione completata",
"allVoted": "Tutti hanno votato!",
"tapToReveal": "Tocca per rivelare il risultato",
"revealResult": "Rivela risultato",
"result": "Risultato",
"revealing": "Rivelando...",
"wasImpostor": "Era un IMPOSTORE! 🎉",
"wasInnocent": "Era INNOCENTE 😱",
"votesThisRound": "Voti di questo round",
"seeEndResult": "Vedi risultato finale",
"impostorGuessWord": "L'impostore indovina la parola?",
"nextRound": "Prossimo round",
"impostorGuessTitle": "🎯 Tentativo dell'impostore",
"impostorCanGuess": "L'impostore eliminato può\nprovare a indovinare la parola",
"ifCorrectImpostorsWin": "Se indovina, gli impostori vincono!",
"guessWordHint": "Qual è secondo te la parola?",
"dontGuess": "Non provare",
"guess": "Indovina",
"correctGuess": "Ha indovinato!",
"theWordWas": "La parola era: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Gli impostori vincono!",
"wrongGuess": "Non ha indovinato!",
"gameContinues": "La partita continua...",
"gameOver": "Fine della partita",
"playersWin": "I giocatori vincono!",
"theSecretWordWas": "🔍 La parola era:",
"categoryLabel": "Categoria: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 L'impostore era:",
"theImpostorsWere": "🎭 Gli impostori erano:",
"votingHistory": "📊 Cronologia delle votazioni",
"roundElimination": "Round {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Rivincita",
"mainMenu": "Menu principale",
"notesTitle": "📝 Note",
"notesSaved": "Note salvate",
"whoAreYou": "Chi sei?",
"selectYourName": "Seleziona il tuo nome per vedere le tue note private",
"notesOf": "Note di {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Appunti su ogni giocatore",
"playerNoteHint": "Cosa ha detto? Sospetto?",
"freeNote": "Nota libera",
"freeNoteHint": "Appunti personali...",
"rulesTitle": "📖 Come giocare",
"rulesWhatIsTitle": "🎭 Cos'è L'Impostore?",
"rulesWhatIsBody": "Un gioco di deduzione sociale per 3-20 giocatori. Tutti ricevono una parola segreta... tranne l'impostore! La tua missione: scoprire chi sta fingendo.",
"rulesHowToPlayTitle": "🔍 Come si gioca?",
"rulesHowToPlayBody": "1. Si assegnano i ruoli: tutti ricevono la stessa parola, tranne l'impostore/gli impostori.\n\n2. Discussione: a turno, ogni giocatore descrive la parola SENZA dirla direttamente. L'impostore deve fingere di conoscerla.\n\n3. Votazione: al termine della discussione, tutti votano chi pensano sia l'impostore.\n\n4. Eliminazione: il più votato viene eliminato e si rivela se era l'impostore o meno.\n\n5. Se era l'impostore, può provare a indovinare la parola. Se indovina, gli impostori vincono!",
"rulesWhoWinsTitle": "🏆 Chi vince?",
"rulesWhoWinsBody": "• Giocatori: vincono se eliminano TUTTI gli impostori.\n• Impostori: vincono se non vengono scoperti finché non restano pari o meno giocatori normali rispetto agli impostori, oppure se indovinano la parola al momento dell'eliminazione.",
"rulesTipsPlayersTitle": "💡 Consigli per i giocatori",
"rulesTipsPlayersBody": "• Dai indizi sottili che dimostrino che conosci la parola, ma non così ovvi da permettere all'impostore di usarli.\n• Osserva chi dà risposte vaghe o generiche.\n• Usa le note per appuntare quello che dice ognuno.\n• Non dire la parola direttamente, questo aiuta l'impostore!",
"rulesTipsImpostorTitle": "🎭 Consigli per l'impostore",
"rulesTipsImpostorBody": "• Ascolta attentamente gli indizi degli altri.\n• Cerca di dedurre la parola per dare indizi credibili.\n• Non essere il primo a parlare se non sei sicuro.\n• Se ti danno la categoria come indizio, usala a tuo vantaggio.\n• Accusa gli altri per deviare l'attenzione.",
"rulesModesTitle": "📱 Modalità di gioco",
"rulesModesBody": "• Un solo dispositivo: tutti condividono il dispositivo. Ogni giocatore vede la propria parola tenendo premuto un pulsante.\n\n• Multi-dispositivo: ogni giocatore usa il proprio dispositivo. Si connettono tramite Bluetooth/WiFi Direct senza bisogno di internet.",
"rulesExampleTitle": "✏️ Esempio di partita",
"rulesExampleBody": "Parola segreta: \"Pizza\"\n\n• Marco: \"Si mangia calda\" ✓\n• Giulia: \"Arriva in una scatola\" ✓\n• Luca (impostore): \"È molto popolare\" 🤔\n• Sofia: \"Ha il formaggio\" ✓\n\nLuca ha dato una risposta molto generica... Sospetto!",
"joinGameTitle": "Unisciti alla partita",
"multiDeviceMode": "Modalità multi-dispositivo",
"scanQrDescription": "Scansiona il codice QR mostrato dall'host per connetterti alla partita tramite Bluetooth/WiFi Direct.",
"comingSoon": "Prossimamente",
"nearbyNotAvailable": "La connessione multi-dispositivo con Nearby Connections richiede dispositivi Android fisici.\n\nPer ora, usa la modalità \"Un solo dispositivo\" per giocare su un dispositivo condiviso.",
"back": "Indietro",
"yes": "Sì",
"no": "No",
"cancel": "Annulla",
"accept": "Accetta",
"next": "Avanti",
"settingsTitle": "Impostazioni",
"language": "Lingua",
"soundVolume": "Volume effetti",
"vibration": "Vibrazione",
"about": "Informazioni",
"version": "Versione",
"developer": "Sviluppatore",
"licenses": "Licenze"
}

224
lib/l10n/app_ja.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "ja",
"appTitle": "インポスター",
"subtitle": "正体推理ゲーム",
"loadingWords": "ワードを読み込み中...",
"playersRange": "3-20人 • インターネット不要",
"createGame": "ゲームを作成",
"joinGame": "ゲームに参加",
"howToPlay": "遊び方",
"settings": "設定",
"gameMode": "ゲームモード",
"singleDevice": "1台で遊ぶ",
"multiDevice": "複数台で遊ぶ",
"category": "カテゴリー",
"categoryAll": "すべて",
"categoryAnimals": "動物",
"categoryFood": "食べ物",
"categoryCountries": "国",
"categorySports": "スポーツ",
"categoryProfessions": "職業",
"categoryObjects": "物",
"categoryPlaces": "場所",
"categoryMovies": "映画",
"categoryMusic": "音楽",
"categoryTechnology": "テクノロジー",
"playersCount": "プレイヤー ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "プレイヤー名",
"playerAlreadyExists": "同じ名前のプレイヤーがすでにいます",
"maxPlayersReached": "最大20人までです",
"minPlayersRequired": "最低3人必要です",
"configuration": "設定",
"impostors": "🎭 インポスター",
"impostorClue": "🔍 インポスターへのヒント",
"impostorClueDescription": "インポスターにカテゴリーが表示されます",
"debateTime": "⏱️ 議論の時間",
"noLimit": "制限なし",
"oneMin": "1分",
"twoMin": "2分",
"threeMin": "3分",
"fiveMin": "5分",
"startGame": "ゲーム開始",
"seeYourWord": "自分のワードを見る",
"eachPlayerMustSee": "各プレイヤーは秘密にワードを確認してください",
"roundNumber": "ラウンド {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "ワードを確認済み",
"tapToSee": "タップして確認",
"allSeenStartDebate": "全員確認済み → 議論を開始",
"playersRemaining": "残り {count} 人",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "あなたはインポスターです!",
"yourWordIs": "あなたのワード:",
"clueCategory": "ヒント: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "長押しでワードを確認",
"makeSureNoOneLooks": "他の人に見られないようにしてください",
"showingWord": "👁️ 表示中...",
"holdToSee": "👆 長押しで確認",
"seenMyWord": "ワードを確認しました",
"debateRound": "議論 - ラウンド {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ 時間切れ!",
"timeRemaining": "⏱️ 残り時間",
"playersInDebate": "議論中のプレイヤー",
"activePlayersInfo": "{active} 人参加中 • {impostors} 人のインポスターが潜伏中",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "脱落",
"notes": "メモ",
"goToVoting": "投票へ進む",
"voting": "🗳️ 投票",
"turnToVote": "投票の番:",
"votesProgress": "投票: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "誰がインポスターだと思いますか?",
"confirmVote": "投票を確定",
"votingComplete": "🗳️ 投票完了",
"allVoted": "全員が投票しました!",
"tapToReveal": "タップして結果を見る",
"revealResult": "結果を発表",
"result": "結果",
"revealing": "発表中...",
"wasImpostor": "インポスターでした! 🎉",
"wasInnocent": "一般市民でした 😱",
"votesThisRound": "このラウンドの投票",
"seeEndResult": "最終結果を見る",
"impostorGuessWord": "インポスターがワードを当てる?",
"nextRound": "次のラウンドへ",
"impostorGuessTitle": "🎯 インポスターの推理",
"impostorCanGuess": "脱落したインポスターは\nワードを当てることができます",
"ifCorrectImpostorsWin": "正解すればインポスターの勝ちです!",
"guessWordHint": "ワードは何だと思いますか?",
"dontGuess": "推理しない",
"guess": "当てる",
"correctGuess": "正解!",
"theWordWas": "ワードは: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "インポスターの勝利!",
"wrongGuess": "不正解!",
"gameContinues": "ゲームは続きます...",
"gameOver": "ゲーム終了",
"playersWin": "プレイヤーの勝利!",
"theSecretWordWas": "🔍 ワードは:",
"categoryLabel": "カテゴリー: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 インポスターは:",
"theImpostorsWere": "🎭 インポスターたちは:",
"votingHistory": "📊 投票の履歴",
"roundElimination": "ラウンド {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "もう一度",
"mainMenu": "メインメニュー",
"notesTitle": "📝 メモ",
"notesSaved": "メモを保存しました",
"whoAreYou": "あなたは誰?",
"selectYourName": "名前を選んで自分のメモを見る",
"notesOf": "{name}のメモ",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "各プレイヤーについてのメモ",
"playerNoteHint": "何を言った?怪しい?",
"freeNote": "フリーメモ",
"freeNoteHint": "個人メモ...",
"rulesTitle": "📖 遊び方",
"rulesWhatIsTitle": "🎭 インポスターとは?",
"rulesWhatIsBody": "3〜20人で遊べる正体推理ゲームです。全員にお題のワードが配られますが…インポスターだけは知りませんあなたの使命誰がなりすましているかを見抜くことです。",
"rulesHowToPlayTitle": "🔍 遊び方は?",
"rulesHowToPlayBody": "1. 役割の配布:全員に同じワードが配られますが、インポスターには配られません。\n\n2. 議論:順番に、各プレイヤーがワードを直接言わずに説明します。インポスターは知っているフリをしなければなりません。\n\n3. 投票:議論が終わったら、全員がインポスターだと思う人に投票します。\n\n4. 脱落:最も票を集めた人が脱落し、インポスターかどうかが明かされます。\n\n5. インポスターだった場合、ワードを当てるチャンスがあります。当たればインポスターの勝ち!",
"rulesWhoWinsTitle": "🏆 誰が勝つ?",
"rulesWhoWinsBody": "• プレイヤー:すべてのインポスターを脱落させれば勝利。\n• インポスター:正体がバレずに一般プレイヤーと同数以下になるまで残れば勝利。また、脱落時にワードを当てても勝利。",
"rulesTipsPlayersTitle": "💡 プレイヤーへのアドバイス",
"rulesTipsPlayersBody": "• ワードを知っていると証明できるさりげないヒントを出しましょう。ただし、インポスターに利用されるほど分かりやすくしないこと。\n• 曖昧で抽象的な回答をする人に注目しましょう。\n• メモを活用して各自の発言を記録しましょう。\n• ワードを直接言ってはいけません。インポスターを助けることになります!",
"rulesTipsImpostorTitle": "🎭 インポスターへのアドバイス",
"rulesTipsImpostorBody": "• 他のプレイヤーのヒントをよく聞きましょう。\n• ワードを推測して、もっともらしいヒントを出しましょう。\n• 自信がなければ最初に話さないようにしましょう。\n• カテゴリーがヒントとして出されたら、それを利用しましょう。\n• 他の人を疑って注意をそらしましょう。",
"rulesModesTitle": "📱 ゲームモード",
"rulesModesBody": "• 1台で遊ぶ端末を全員で共有します。各プレイヤーはボタンを長押しして自分のワードを確認します。\n\n• 複数台で遊ぶ各プレイヤーが自分の端末を使います。Bluetooth/WiFi Directで接続、インターネット不要。",
"rulesExampleTitle": "✏️ ゲームの例",
"rulesExampleBody": "お題のワード:「ピザ」\n\n• さくら:「温かいうちに食べる」 ✓\n• たくや:「箱に入って届く」 ✓\n• ゆい(インポスター):「とても人気がある」 🤔\n• けんと:「チーズがのっている」 ✓\n\nゆいの答えはあまりにも曖昧... 怪しい!",
"joinGameTitle": "ゲームに参加",
"multiDeviceMode": "複数台モード",
"scanQrDescription": "ホストが表示するQRコードをスキャンして、Bluetooth/WiFi Direct経由でゲームに接続します。",
"comingSoon": "近日公開",
"nearbyNotAvailable": "複数台接続のNearby Connectionsには、物理的なAndroid端末が必要です。\n\n現時点では「1台で遊ぶ」モードをご利用ください。",
"back": "戻る",
"yes": "はい",
"no": "いいえ",
"cancel": "キャンセル",
"accept": "OK",
"next": "次へ",
"settingsTitle": "設定",
"language": "言語",
"soundVolume": "効果音の音量",
"vibration": "バイブレーション",
"about": "アプリについて",
"version": "バージョン",
"developer": "開発者",
"licenses": "ライセンス"
}

224
lib/l10n/app_ko.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "ko",
"appTitle": "임포스터",
"subtitle": "사회적 추리 게임",
"loadingWords": "단어 불러오는 중...",
"playersRange": "3-20명 • 인터넷 불필요",
"createGame": "게임 만들기",
"joinGame": "게임 참가",
"howToPlay": "게임 방법",
"settings": "설정",
"gameMode": "게임 모드",
"singleDevice": "기기 하나로",
"multiDevice": "여러 기기로",
"category": "카테고리",
"categoryAll": "전체",
"categoryAnimals": "동물",
"categoryFood": "음식",
"categoryCountries": "나라",
"categorySports": "스포츠",
"categoryProfessions": "직업",
"categoryObjects": "사물",
"categoryPlaces": "장소",
"categoryMovies": "영화",
"categoryMusic": "음악",
"categoryTechnology": "기술",
"playersCount": "플레이어 ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "플레이어 이름",
"playerAlreadyExists": "같은 이름의 플레이어가 이미 있습니다",
"maxPlayersReached": "최대 20명까지 가능합니다",
"minPlayersRequired": "최소 3명이 필요합니다",
"configuration": "설정",
"impostors": "🎭 임포스터",
"impostorClue": "🔍 임포스터 힌트",
"impostorClueDescription": "임포스터가 카테고리를 알 수 있습니다",
"debateTime": "⏱️ 토론 시간",
"noLimit": "제한 없음",
"oneMin": "1분",
"twoMin": "2분",
"threeMin": "3분",
"fiveMin": "5분",
"startGame": "게임 시작",
"seeYourWord": "내 단어 보기",
"eachPlayerMustSee": "각 플레이어는 비밀리에 자신의 단어를 확인하세요",
"roundNumber": "라운드 {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "단어를 이미 확인함",
"tapToSee": "탭하여 확인",
"allSeenStartDebate": "모두 확인 완료 → 토론 시작",
"playersRemaining": "나머지 {count}명",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "당신은 임포스터입니다!",
"yourWordIs": "당신의 단어:",
"clueCategory": "힌트: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "길게 눌러 단어를 확인하세요",
"makeSureNoOneLooks": "아무도 보지 않는지 확인하세요",
"showingWord": "👁️ 표시 중...",
"holdToSee": "👆 길게 눌러 확인",
"seenMyWord": "내 단어를 확인했습니다",
"debateRound": "토론 - 라운드 {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ 시간 종료!",
"timeRemaining": "⏱️ 남은 시간",
"playersInDebate": "토론 중인 플레이어",
"activePlayersInfo": "{active}명 참여 중 • {impostors}명의 임포스터 잠복 중",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "탈락",
"notes": "메모",
"goToVoting": "투표하러 가기",
"voting": "🗳️ 투표",
"turnToVote": "투표할 차례:",
"votesProgress": "투표: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "누가 임포스터라고 생각하나요?",
"confirmVote": "투표 확인",
"votingComplete": "🗳️ 투표 완료",
"allVoted": "모두 투표했습니다!",
"tapToReveal": "탭하여 결과 확인",
"revealResult": "결과 공개",
"result": "결과",
"revealing": "공개 중...",
"wasImpostor": "임포스터였습니다! 🎉",
"wasInnocent": "일반 시민이었습니다 😱",
"votesThisRound": "이번 라운드 투표",
"seeEndResult": "최종 결과 보기",
"impostorGuessWord": "임포스터가 단어를 맞출까요?",
"nextRound": "다음 라운드",
"impostorGuessTitle": "🎯 임포스터의 추측",
"impostorCanGuess": "탈락한 임포스터가\n단어를 맞출 수 있습니다",
"ifCorrectImpostorsWin": "정답이면 임포스터의 승리!",
"guessWordHint": "단어가 무엇이라고 생각하나요?",
"dontGuess": "시도 안 함",
"guess": "맞추기",
"correctGuess": "정답입니다!",
"theWordWas": "단어는: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "임포스터 승리!",
"wrongGuess": "오답입니다!",
"gameContinues": "게임이 계속됩니다...",
"gameOver": "게임 종료",
"playersWin": "플레이어 승리!",
"theSecretWordWas": "🔍 단어는:",
"categoryLabel": "카테고리: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 임포스터는:",
"theImpostorsWere": "🎭 임포스터들은:",
"votingHistory": "📊 투표 기록",
"roundElimination": "라운드 {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "재대결",
"mainMenu": "메인 메뉴",
"notesTitle": "📝 메모",
"notesSaved": "메모가 저장되었습니다",
"whoAreYou": "당신은 누구인가요?",
"selectYourName": "이름을 선택하여 개인 메모를 확인하세요",
"notesOf": "{name}의 메모",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "각 플레이어에 대한 메모",
"playerNoteHint": "뭐라고 했나? 수상한가?",
"freeNote": "자유 메모",
"freeNoteHint": "개인 메모...",
"rulesTitle": "📖 게임 방법",
"rulesWhatIsTitle": "🎭 임포스터란?",
"rulesWhatIsBody": "3~20명이 즐기는 사회적 추리 게임입니다. 모두가 비밀 단어를 받지만... 임포스터만 받지 못합니다! 당신의 임무: 누가 아는 척하는지 찾아내세요.",
"rulesHowToPlayTitle": "🔍 어떻게 하나요?",
"rulesHowToPlayBody": "1. 역할 배분: 모든 플레이어가 같은 단어를 받지만, 임포스터는 받지 못합니다.\n\n2. 토론: 차례대로 각 플레이어가 단어를 직접 말하지 않고 설명합니다. 임포스터는 아는 척해야 합니다.\n\n3. 투표: 토론이 끝나면 모두가 임포스터라고 생각하는 사람에게 투표합니다.\n\n4. 탈락: 가장 많은 표를 받은 사람이 탈락하고, 임포스터였는지 밝혀집니다.\n\n5. 임포스터였다면 단어를 맞출 기회가 있습니다. 맞추면 임포스터 승리!",
"rulesWhoWinsTitle": "🏆 누가 이기나요?",
"rulesWhoWinsBody": "• 플레이어: 모든 임포스터를 탈락시키면 승리.\n• 임포스터: 발각되지 않고 일반 플레이어 수가 임포스터 수 이하가 될 때까지 버티면 승리. 또는 탈락 시 단어를 맞추면 승리.",
"rulesTipsPlayersTitle": "💡 플레이어를 위한 팁",
"rulesTipsPlayersBody": "• 단어를 알고 있다는 것을 증명하는 미묘한 힌트를 주되, 임포스터가 이용할 수 있을 만큼 뻔하게 하지 마세요.\n• 모호하거나 일반적인 답변을 하는 사람을 주시하세요.\n• 메모를 활용하여 각자 한 말을 기록하세요.\n• 단어를 직접 말하지 마세요. 임포스터를 돕는 셈이 됩니다!",
"rulesTipsImpostorTitle": "🎭 임포스터를 위한 팁",
"rulesTipsImpostorBody": "• 다른 플레이어의 힌트를 주의 깊게 들으세요.\n• 단어를 추리하여 그럴듯한 힌트를 주세요.\n• 확신이 없으면 먼저 말하지 마세요.\n• 카테고리가 힌트로 주어졌다면 적극 활용하세요.\n• 다른 사람을 의심하여 주의를 돌리세요.",
"rulesModesTitle": "📱 게임 모드",
"rulesModesBody": "• 기기 하나로: 모두가 한 기기를 공유합니다. 각 플레이어가 버튼을 길게 눌러 자신의 단어를 확인합니다.\n\n• 여러 기기로: 각 플레이어가 자신의 기기를 사용합니다. Bluetooth/WiFi Direct로 연결하며 인터넷이 필요 없습니다.",
"rulesExampleTitle": "✏️ 게임 예시",
"rulesExampleBody": "비밀 단어: \"피자\"\n\n• 수진: \"뜨거울 때 먹어요\" ✓\n• 민수: \"상자에 들어 있어요\" ✓\n• 지은 (임포스터): \"아주 인기 있어요\" 🤔\n• 현우: \"치즈가 올려져 있어요\" ✓\n\n지은이 너무 일반적인 답변을 했네요... 수상해요!",
"joinGameTitle": "게임 참가",
"multiDeviceMode": "여러 기기 모드",
"scanQrDescription": "호스트가 보여주는 QR 코드를 스캔하여 Bluetooth/WiFi Direct로 게임에 접속하세요.",
"comingSoon": "곧 출시",
"nearbyNotAvailable": "여러 기기 연결을 위한 Nearby Connections는 실제 Android 기기가 필요합니다.\n\n현재는 \"기기 하나로\" 모드를 사용하여 하나의 기기에서 플레이하세요.",
"back": "뒤로",
"yes": "예",
"no": "아니오",
"cancel": "취소",
"accept": "확인",
"next": "다음",
"settingsTitle": "설정",
"language": "언어",
"soundVolume": "효과음 볼륨",
"vibration": "진동",
"about": "앱 정보",
"version": "버전",
"developer": "개발자",
"licenses": "라이선스"
}

224
lib/l10n/app_nl.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "nl",
"appTitle": "De Bedrieger",
"subtitle": "Sociaal deductiespel",
"loadingWords": "Woorden laden...",
"playersRange": "3-20 spelers • Zonder internet",
"createGame": "Spel aanmaken",
"joinGame": "Deelnemen aan spel",
"howToPlay": "Hoe te spelen",
"settings": "Instellingen",
"gameMode": "Spelmodus",
"singleDevice": "Eén toestel",
"multiDevice": "Meerdere toestellen",
"category": "Categorie",
"categoryAll": "Alle",
"categoryAnimals": "Dieren",
"categoryFood": "Eten",
"categoryCountries": "Landen",
"categorySports": "Sport",
"categoryProfessions": "Beroepen",
"categoryObjects": "Voorwerpen",
"categoryPlaces": "Plaatsen",
"categoryMovies": "Films",
"categoryMusic": "Muziek",
"categoryTechnology": "Technologie",
"playersCount": "Spelers ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Naam van de speler",
"playerAlreadyExists": "Er bestaat al een speler met die naam",
"maxPlayersReached": "Maximaal 20 spelers",
"minPlayersRequired": "Er zijn minstens 3 spelers nodig",
"configuration": "Configuratie",
"impostors": "🎭 Bedriegers",
"impostorClue": "🔍 Aanwijzing voor bedrieger",
"impostorClueDescription": "De bedrieger kent de categorie",
"debateTime": "⏱️ Debattijd",
"noLimit": "Geen limiet",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Spel starten",
"seeYourWord": "Bekijk je woord",
"eachPlayerMustSee": "Elke speler moet zijn woord in het geheim bekijken",
"roundNumber": "Ronde {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Heeft zijn woord al gezien",
"tapToSee": "Tik om te bekijken",
"allSeenStartDebate": "Iedereen heeft gezien → Start debat",
"playersRemaining": "Nog {count} spelers",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Jij bent de bedrieger!",
"yourWordIs": "Jouw woord is:",
"clueCategory": "Aanwijzing: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Houd ingedrukt om je woord te zien",
"makeSureNoOneLooks": "Zorg dat niemand anders kijkt",
"showingWord": "👁️ Wordt getoond...",
"holdToSee": "👆 Houd ingedrukt om te zien",
"seenMyWord": "Ik heb mijn woord gezien",
"debateRound": "Debat - Ronde {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Tijd is om!",
"timeRemaining": "⏱️ Resterende tijd",
"playersInDebate": "Spelers in debat",
"activePlayersInfo": "{active} actief • {impostors} verborgen bedrieger(s)",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Geëlimineerd",
"notes": "Notities",
"goToVoting": "Naar stemming",
"voting": "🗳️ Stemming",
"turnToVote": "Beurt om te stemmen:",
"votesProgress": "Stemmen: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Wie is volgens jou de bedrieger?",
"confirmVote": "Stem bevestigen",
"votingComplete": "🗳️ Stemming voltooid",
"allVoted": "Iedereen heeft gestemd!",
"tapToReveal": "Tik om het resultaat te onthullen",
"revealResult": "Resultaat onthullen",
"result": "Resultaat",
"revealing": "Onthullen...",
"wasImpostor": "Was de BEDRIEGER! 🎉",
"wasInnocent": "Was ONSCHULDIG 😱",
"votesThisRound": "Stemmen deze ronde",
"seeEndResult": "Eindresultaat bekijken",
"impostorGuessWord": "Raadt de bedrieger het woord?",
"nextRound": "Volgende ronde",
"impostorGuessTitle": "🎯 Gok van de bedrieger",
"impostorCanGuess": "De geëlimineerde bedrieger mag\nproberen het woord te raden",
"ifCorrectImpostorsWin": "Als het klopt, winnen de bedriegers!",
"guessWordHint": "Wat denk je dat het woord is?",
"dontGuess": "Niet proberen",
"guess": "Raden",
"correctGuess": "Goed geraden!",
"theWordWas": "Het woord was: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "De bedriegers winnen!",
"wrongGuess": "Fout geraden!",
"gameContinues": "Het spel gaat verder...",
"gameOver": "Einde van het spel",
"playersWin": "De spelers winnen!",
"theSecretWordWas": "🔍 Het woord was:",
"categoryLabel": "Categorie: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 De bedrieger was:",
"theImpostorsWere": "🎭 De bedriegers waren:",
"votingHistory": "📊 Stemgeschiedenis",
"roundElimination": "Ronde {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Herkansing",
"mainMenu": "Hoofdmenu",
"notesTitle": "📝 Notities",
"notesSaved": "Notities opgeslagen",
"whoAreYou": "Wie ben je?",
"selectYourName": "Selecteer je naam om je privénotities te bekijken",
"notesOf": "Notities van {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Aantekeningen over elke speler",
"playerNoteHint": "Wat heeft hij gezegd? Verdacht?",
"freeNote": "Vrije notitie",
"freeNoteHint": "Persoonlijke aantekeningen...",
"rulesTitle": "📖 Hoe te spelen",
"rulesWhatIsTitle": "🎭 Wat is De Bedrieger?",
"rulesWhatIsBody": "Een sociaal deductiespel voor 3-20 spelers. Iedereen krijgt een geheim woord... behalve de bedrieger! Jouw missie: ontdek wie doet alsof.",
"rulesHowToPlayTitle": "🔍 Hoe speel je?",
"rulesHowToPlayBody": "1. Rollen worden verdeeld: iedereen krijgt hetzelfde woord, behalve de bedrieger(s).\n\n2. Debat: om de beurt beschrijft elke speler het woord ZONDER het direct te zeggen. De bedrieger moet doen alsof hij het kent.\n\n3. Stemming: na het debat stemt iedereen op wie volgens hen de bedrieger is.\n\n4. Eliminatie: de speler met de meeste stemmen wordt geëlimineerd en het wordt onthuld of het de bedrieger was of niet.\n\n5. Als het de bedrieger was, mag hij proberen het woord te raden. Als het klopt, winnen de bedriegers!",
"rulesWhoWinsTitle": "🏆 Wie wint?",
"rulesWhoWinsBody": "• Spelers: winnen als ze ALLE bedriegers elimineren.\n• Bedriegers: winnen als ze niet ontdekt worden totdat er evenveel of minder gewone spelers dan bedriegers over zijn, of als ze het woord raden na eliminatie.",
"rulesTipsPlayersTitle": "💡 Tips voor spelers",
"rulesTipsPlayersBody": "• Geef subtiele hints die laten zien dat je het woord kent, maar niet zo duidelijk dat de bedrieger ze kan gebruiken.\n• Let op wie vage of algemene antwoorden geeft.\n• Gebruik de notities om op te schrijven wat iedereen zegt.\n• Zeg het woord niet direct — dat helpt de bedrieger!",
"rulesTipsImpostorTitle": "🎭 Tips voor de bedrieger",
"rulesTipsImpostorBody": "• Luister goed naar de hints van anderen.\n• Probeer het woord af te leiden om geloofwaardige hints te geven.\n• Spreek niet als eerste als je niet zeker bent.\n• Als je de categorie als hint krijgt, gebruik die in je voordeel.\n• Beschuldig anderen om de aandacht af te leiden.",
"rulesModesTitle": "📱 Spelmodi",
"rulesModesBody": "• Eén toestel: iedereen deelt hetzelfde apparaat. Elke speler ziet zijn woord door een knop ingedrukt te houden.\n\n• Meerdere toestellen: elke speler gebruikt zijn eigen apparaat. Ze verbinden via Bluetooth/WiFi Direct zonder internet.",
"rulesExampleTitle": "✏️ Voorbeeldspel",
"rulesExampleBody": "Geheim woord: \"Pizza\"\n\n• Jan: \"Je eet het warm\" ✓\n• Sanne: \"Het komt in een doos\" ✓\n• Bram (bedrieger): \"Het is heel populair\" 🤔\n• Lisa: \"Het heeft kaas\" ✓\n\nBram gaf een heel vaag antwoord... Verdacht!",
"joinGameTitle": "Deelnemen aan spel",
"multiDeviceMode": "Modus meerdere toestellen",
"scanQrDescription": "Scan de QR-code die de host toont om verbinding te maken met het spel via Bluetooth/WiFi Direct.",
"comingSoon": "Binnenkort",
"nearbyNotAvailable": "De multitoestelverbinding met Nearby Connections vereist fysieke Android-apparaten.\n\nGebruik voorlopig de modus \"Eén toestel\" om op een gedeeld apparaat te spelen.",
"back": "Terug",
"yes": "Ja",
"no": "Nee",
"cancel": "Annuleren",
"accept": "Accepteren",
"next": "Volgende",
"settingsTitle": "Instellingen",
"language": "Taal",
"soundVolume": "Effectvolume",
"vibration": "Trillen",
"about": "Over",
"version": "Versie",
"developer": "Ontwikkelaar",
"licenses": "Licenties"
}

224
lib/l10n/app_pl.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "pl",
"appTitle": "Oszust",
"subtitle": "Gra dedukcji społecznej",
"loadingWords": "Ładowanie słów...",
"playersRange": "3-20 graczy • Bez internetu",
"createGame": "Utwórz grę",
"joinGame": "Dołącz do gry",
"howToPlay": "Jak grać",
"settings": "Ustawienia",
"gameMode": "Tryb gry",
"singleDevice": "Jedno urządzenie",
"multiDevice": "Wiele urządzeń",
"category": "Kategoria",
"categoryAll": "Wszystkie",
"categoryAnimals": "Zwierzęta",
"categoryFood": "Jedzenie",
"categoryCountries": "Kraje",
"categorySports": "Sport",
"categoryProfessions": "Zawody",
"categoryObjects": "Przedmioty",
"categoryPlaces": "Miejsca",
"categoryMovies": "Filmy",
"categoryMusic": "Muzyka",
"categoryTechnology": "Technologia",
"playersCount": "Gracze ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Imię gracza",
"playerAlreadyExists": "Gracz o takim imieniu już istnieje",
"maxPlayersReached": "Maksymalnie 20 graczy",
"minPlayersRequired": "Potrzeba co najmniej 3 graczy",
"configuration": "Konfiguracja",
"impostors": "🎭 Oszuści",
"impostorClue": "🔍 Wskazówka dla oszusta",
"impostorClueDescription": "Oszust zna kategorię",
"debateTime": "⏱️ Czas debaty",
"noLimit": "Bez limitu",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Rozpocznij grę",
"seeYourWord": "Zobacz swoje słowo",
"eachPlayerMustSee": "Każdy gracz musi zobaczyć swoje słowo w tajemnicy",
"roundNumber": "Runda {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Już widział swoje słowo",
"tapToSee": "Dotknij, aby zobaczyć",
"allSeenStartDebate": "Wszyscy widzieli → Rozpocznij debatę",
"playersRemaining": "Pozostało {count} graczy",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Jesteś oszustem!",
"yourWordIs": "Twoje słowo to:",
"clueCategory": "Wskazówka: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Przytrzymaj, aby zobaczyć swoje słowo",
"makeSureNoOneLooks": "Upewnij się, że nikt inny nie patrzy",
"showingWord": "👁️ Pokazuję...",
"holdToSee": "👆 Przytrzymaj, aby zobaczyć",
"seenMyWord": "Widziałem swoje słowo",
"debateRound": "Debata - Runda {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Czas minął!",
"timeRemaining": "⏱️ Pozostały czas",
"playersInDebate": "Gracze w debacie",
"activePlayersInfo": "{active} aktywnych • {impostors} ukrytych oszustów",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Wyeliminowany",
"notes": "Notatki",
"goToVoting": "Przejdź do głosowania",
"voting": "🗳️ Głosowanie",
"turnToVote": "Kolej na głosowanie:",
"votesProgress": "Głosy: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Kto twoim zdaniem jest oszustem?",
"confirmVote": "Potwierdź głos",
"votingComplete": "🗳️ Głosowanie zakończone",
"allVoted": "Wszyscy zagłosowali!",
"tapToReveal": "Dotknij, aby odkryć wynik",
"revealResult": "Odkryj wynik",
"result": "Wynik",
"revealing": "Odkrywam...",
"wasImpostor": "To był OSZUST! 🎉",
"wasInnocent": "Był NIEWINNY 😱",
"votesThisRound": "Głosy w tej rundzie",
"seeEndResult": "Zobacz wynik końcowy",
"impostorGuessWord": "Czy oszust odgadnie słowo?",
"nextRound": "Następna runda",
"impostorGuessTitle": "🎯 Zgadywanie oszusta",
"impostorCanGuess": "Wyeliminowany oszust może\nspróbować odgadnąć słowo",
"ifCorrectImpostorsWin": "Jeśli trafi, oszuści wygrywają!",
"guessWordHint": "Jakie twoim zdaniem jest to słowo?",
"dontGuess": "Nie próbuj",
"guess": "Zgaduj",
"correctGuess": "Trafił!",
"theWordWas": "Słowo brzmiało: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Oszuści wygrywają!",
"wrongGuess": "Nie trafił!",
"gameContinues": "Gra toczy się dalej...",
"gameOver": "Koniec gry",
"playersWin": "Gracze wygrywają!",
"theSecretWordWas": "🔍 Słowo brzmiało:",
"categoryLabel": "Kategoria: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 Oszustem był:",
"theImpostorsWere": "🎭 Oszustami byli:",
"votingHistory": "📊 Historia głosowań",
"roundElimination": "Runda {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Rewanż",
"mainMenu": "Menu główne",
"notesTitle": "📝 Notatki",
"notesSaved": "Notatki zapisane",
"whoAreYou": "Kim jesteś?",
"selectYourName": "Wybierz swoje imię, aby zobaczyć prywatne notatki",
"notesOf": "Notatki gracza {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Zapiski o każdym graczu",
"playerNoteHint": "Co powiedział? Podejrzany?",
"freeNote": "Wolna notatka",
"freeNoteHint": "Osobiste zapiski...",
"rulesTitle": "📖 Jak grać",
"rulesWhatIsTitle": "🎭 Czym jest Oszust?",
"rulesWhatIsBody": "Gra dedukcji społecznej dla 3-20 graczy. Wszyscy otrzymują tajne słowo... oprócz oszusta! Twoja misja: odkryj, kto udaje.",
"rulesHowToPlayTitle": "🔍 Jak się gra?",
"rulesHowToPlayBody": "1. Rozdanie ról: wszyscy otrzymują to samo słowo, oprócz oszusta/oszustów.\n\n2. Debata: po kolei każdy gracz opisuje słowo BEZ wypowiadania go wprost. Oszust musi udawać, że je zna.\n\n3. Głosowanie: po zakończeniu debaty wszyscy głosują na osobę, którą uważają za oszusta.\n\n4. Eliminacja: gracz z największą liczbą głosów zostaje wyeliminowany i ujawnia się, czy był oszustem.\n\n5. Jeśli to był oszust, może spróbować odgadnąć słowo. Jeśli trafi, oszuści wygrywają!",
"rulesWhoWinsTitle": "🏆 Kto wygrywa?",
"rulesWhoWinsBody": "• Gracze: wygrywają, jeśli wyeliminują WSZYSTKICH oszustów.\n• Oszuści: wygrywają, jeśli nie zostaną odkryci, dopóki zwykłych graczy nie będzie tyle samo lub mniej niż oszustów, albo jeśli odgadną słowo po eliminacji.",
"rulesTipsPlayersTitle": "💡 Wskazówki dla graczy",
"rulesTipsPlayersBody": "• Dawaj subtelne wskazówki, które pokażą, że znasz słowo, ale nie na tyle oczywiste, by oszust mógł je wykorzystać.\n• Obserwuj, kto daje niejasne lub ogólnikowe odpowiedzi.\n• Używaj notatek, by zapisywać, co mówi każdy gracz.\n• Nie mów słowa wprost — to pomaga oszustowi!",
"rulesTipsImpostorTitle": "🎭 Wskazówki dla oszusta",
"rulesTipsImpostorBody": "• Uważnie słuchaj wskazówek innych.\n• Spróbuj wydedukować słowo, by dawać wiarygodne wskazówki.\n• Nie mów pierwszy, jeśli nie jesteś pewien.\n• Jeśli dostaniesz kategorię jako wskazówkę, wykorzystaj ją.\n• Oskarżaj innych, by odwrócić uwagę.",
"rulesModesTitle": "📱 Tryby gry",
"rulesModesBody": "• Jedno urządzenie: wszyscy dzielą jedno urządzenie. Każdy gracz widzi swoje słowo, przytrzymując przycisk.\n\n• Wiele urządzeń: każdy gracz używa własnego urządzenia. Łączą się przez Bluetooth/WiFi Direct bez potrzeby internetu.",
"rulesExampleTitle": "✏️ Przykładowa gra",
"rulesExampleBody": "Tajne słowo: \"Pizza\"\n\n• Kasia: \"Je się na ciepło\" ✓\n• Tomek: \"Przychodzi w pudełku\" ✓\n• Ola (oszust): \"Jest bardzo popularna\" 🤔\n• Marek: \"Ma ser\" ✓\n\nOla dała bardzo ogólnikową odpowiedź... Podejrzana!",
"joinGameTitle": "Dołącz do gry",
"multiDeviceMode": "Tryb wielu urządzeń",
"scanQrDescription": "Zeskanuj kod QR wyświetlany przez hosta, aby połączyć się z grą przez Bluetooth/WiFi Direct.",
"comingSoon": "Wkrótce",
"nearbyNotAvailable": "Połączenie wielourządzeniowe z Nearby Connections wymaga fizycznych urządzeń z Androidem.\n\nNa razie użyj trybu \"Jedno urządzenie\", aby grać na wspólnym urządzeniu.",
"back": "Wstecz",
"yes": "Tak",
"no": "Nie",
"cancel": "Anuluj",
"accept": "Akceptuj",
"next": "Dalej",
"settingsTitle": "Ustawienia",
"language": "Język",
"soundVolume": "Głośność efektów",
"vibration": "Wibracje",
"about": "O aplikacji",
"version": "Wersja",
"developer": "Programista",
"licenses": "Licencje"
}

224
lib/l10n/app_pt.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "pt",
"appTitle": "O Impostor",
"subtitle": "Jogo de dedução social",
"loadingWords": "Carregando palavras...",
"playersRange": "3-20 jogadores • Sem internet",
"createGame": "Criar partida",
"joinGame": "Entrar na partida",
"howToPlay": "Como jogar",
"settings": "Configurações",
"gameMode": "Modo de jogo",
"singleDevice": "Um só celular",
"multiDevice": "Multicelular",
"category": "Categoria",
"categoryAll": "Todas",
"categoryAnimals": "Animais",
"categoryFood": "Comida",
"categoryCountries": "Países",
"categorySports": "Esportes",
"categoryProfessions": "Profissões",
"categoryObjects": "Objetos",
"categoryPlaces": "Lugares",
"categoryMovies": "Filmes",
"categoryMusic": "Música",
"categoryTechnology": "Tecnologia",
"playersCount": "Jogadores ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Nome do jogador",
"playerAlreadyExists": "Já existe um jogador com esse nome",
"maxPlayersReached": "Máximo de 20 jogadores",
"minPlayersRequired": "São necessários pelo menos 3 jogadores",
"configuration": "Configuração",
"impostors": "🎭 Impostores",
"impostorClue": "🔍 Dica para o impostor",
"impostorClueDescription": "O impostor conhece a categoria",
"debateTime": "⏱️ Tempo de debate",
"noLimit": "Sem limite",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Iniciar partida",
"seeYourWord": "Ver sua palavra",
"eachPlayerMustSee": "Cada jogador deve ver sua palavra em segredo",
"roundNumber": "Rodada {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Já viu sua palavra",
"tapToSee": "Toque para ver",
"allSeenStartDebate": "Todos viram → Iniciar debate",
"playersRemaining": "Faltam {count} jogadores",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Você é o impostor!",
"yourWordIs": "Sua palavra é:",
"clueCategory": "Dica: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Mantenha pressionado para ver sua palavra",
"makeSureNoOneLooks": "Certifique-se de que ninguém mais está olhando",
"showingWord": "👁️ Mostrando...",
"holdToSee": "👆 Mantenha pressionado para ver",
"seenMyWord": "Já vi minha palavra",
"debateRound": "Debate - Rodada {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Tempo esgotado!",
"timeRemaining": "⏱️ Tempo restante",
"playersInDebate": "Jogadores no debate",
"activePlayersInfo": "{active} ativos • {impostors} impostor(es) ocultos",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Eliminado",
"notes": "Notas",
"goToVoting": "Ir para votação",
"voting": "🗳️ Votação",
"turnToVote": "Vez de votar:",
"votesProgress": "Votos: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Quem você acha que é o impostor?",
"confirmVote": "Confirmar voto",
"votingComplete": "🗳️ Votação completa",
"allVoted": "Todos votaram!",
"tapToReveal": "Toque para revelar o resultado",
"revealResult": "Revelar resultado",
"result": "Resultado",
"revealing": "Revelando...",
"wasImpostor": "Era IMPOSTOR! 🎉",
"wasInnocent": "Era INOCENTE 😱",
"votesThisRound": "Votos desta rodada",
"seeEndResult": "Ver resultado final",
"impostorGuessWord": "O impostor adivinha a palavra?",
"nextRound": "Próxima rodada",
"impostorGuessTitle": "🎯 Palpite do impostor",
"impostorCanGuess": "O impostor eliminado pode\ntentar adivinhar a palavra",
"ifCorrectImpostorsWin": "Se acertar, os impostores vencem!",
"guessWordHint": "Qual você acha que é a palavra?",
"dontGuess": "Não tentar",
"guess": "Adivinhar",
"correctGuess": "Acertou!",
"theWordWas": "A palavra era: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Os impostores vencem!",
"wrongGuess": "Não acertou!",
"gameContinues": "A partida continua...",
"gameOver": "Fim de partida",
"playersWin": "Os jogadores vencem!",
"theSecretWordWas": "🔍 A palavra era:",
"categoryLabel": "Categoria: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 O impostor era:",
"theImpostorsWere": "🎭 Os impostores eram:",
"votingHistory": "📊 Histórico de votações",
"roundElimination": "Rodada {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Revanche",
"mainMenu": "Menu principal",
"notesTitle": "📝 Notas",
"notesSaved": "Notas salvas",
"whoAreYou": "Quem é você?",
"selectYourName": "Selecione seu nome para ver suas notas privadas",
"notesOf": "Notas de {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Anotações sobre cada jogador",
"playerNoteHint": "O que disse? Suspeito?",
"freeNote": "Nota livre",
"freeNoteHint": "Anotações pessoais...",
"rulesTitle": "📖 Como jogar",
"rulesWhatIsTitle": "🎭 O que é O Impostor?",
"rulesWhatIsBody": "Um jogo de dedução social para 3-20 jogadores. Todos recebem uma palavra secreta... exceto o impostor! Sua missão: descobrir quem está fingindo.",
"rulesHowToPlayTitle": "🔍 Como se joga?",
"rulesHowToPlayBody": "1. Os papéis são distribuídos: todos recebem a mesma palavra, exceto o(s) impostor(es).\n\n2. Debate: por turnos, cada jogador descreve a palavra SEM dizê-la diretamente. O impostor deve fingir que a conhece.\n\n3. Votação: ao terminar o debate, todos votam em quem acham que é o impostor.\n\n4. Eliminação: o mais votado é eliminado e revela-se se era impostor ou não.\n\n5. Se era impostor, pode tentar adivinhar a palavra. Se acertar, os impostores vencem!",
"rulesWhoWinsTitle": "🏆 Quem ganha?",
"rulesWhoWinsBody": "• Jogadores: vencem se eliminarem TODOS os impostores.\n• Impostores: vencem se não forem descobertos até que restem igual ou menos jogadores normais que impostores, ou se adivinharem a palavra ao serem eliminados.",
"rulesTipsPlayersTitle": "💡 Dicas para jogadores",
"rulesTipsPlayersBody": "• Dê dicas sutis que provem que você conhece a palavra, mas não tão óbvias que o impostor as use.\n• Observe quem dá respostas vagas ou genéricas.\n• Use as notas para anotar o que cada um diz.\n• Não diga a palavra diretamente, isso ajuda o impostor!",
"rulesTipsImpostorTitle": "🎭 Dicas para o impostor",
"rulesTipsImpostorBody": "• Ouça atentamente as dicas dos outros.\n• Tente deduzir a palavra para dar dicas convincentes.\n• Não seja o primeiro a falar se não tiver certeza.\n• Se receberem a categoria como dica, use a seu favor.\n• Acuse outros para desviar a atenção.",
"rulesModesTitle": "📱 Modos de jogo",
"rulesModesBody": "• Um só celular: todos compartilham o dispositivo. Cada jogador vê sua palavra pressionando e segurando um botão.\n\n• Multicelular: cada jogador usa seu próprio dispositivo. Conectam-se por Bluetooth/WiFi Direct sem necessidade de internet.",
"rulesExampleTitle": "✏️ Exemplo de partida",
"rulesExampleBody": "Palavra secreta: \"Pizza\"\n\n• João: \"Se come quente\" ✓\n• Maria: \"Vem numa caixa\" ✓\n• Pedro (impostor): \"É muito popular\" 🤔\n• Ana: \"Tem queijo\" ✓\n\nPedro deu uma resposta muito genérica... Suspeito!",
"joinGameTitle": "Entrar na partida",
"multiDeviceMode": "Modo multicelular",
"scanQrDescription": "Escaneie o código QR exibido pelo anfitrião para se conectar à partida via Bluetooth/WiFi Direct.",
"comingSoon": "Em breve",
"nearbyNotAvailable": "A conexão multicelular com Nearby Connections requer dispositivos Android físicos.\n\nPor enquanto, use o modo \"Um só celular\" para jogar em um dispositivo compartilhado.",
"back": "Voltar",
"yes": "Sim",
"no": "Não",
"cancel": "Cancelar",
"accept": "Aceitar",
"next": "Próximo",
"settingsTitle": "Configurações",
"language": "Idioma",
"soundVolume": "Volume dos efeitos",
"vibration": "Vibração",
"about": "Sobre",
"version": "Versão",
"developer": "Desenvolvedor",
"licenses": "Licenças"
}

224
lib/l10n/app_ru.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "ru",
"appTitle": "Самозванец",
"subtitle": "Социальная игра на дедукцию",
"loadingWords": "Загрузка слов...",
"playersRange": "3-20 игроков • Без интернета",
"createGame": "Создать игру",
"joinGame": "Присоединиться к игре",
"howToPlay": "Как играть",
"settings": "Настройки",
"gameMode": "Режим игры",
"singleDevice": "Одно устройство",
"multiDevice": "Несколько устройств",
"category": "Категория",
"categoryAll": "Все",
"categoryAnimals": "Животные",
"categoryFood": "Еда",
"categoryCountries": "Страны",
"categorySports": "Спорт",
"categoryProfessions": "Профессии",
"categoryObjects": "Предметы",
"categoryPlaces": "Места",
"categoryMovies": "Фильмы",
"categoryMusic": "Музыка",
"categoryTechnology": "Технологии",
"playersCount": "Игроки ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Имя игрока",
"playerAlreadyExists": "Игрок с таким именем уже существует",
"maxPlayersReached": "Максимум 20 игроков",
"minPlayersRequired": "Нужно минимум 3 игрока",
"configuration": "Конфигурация",
"impostors": "🎭 Самозванцы",
"impostorClue": "🔍 Подсказка для самозванца",
"impostorClueDescription": "Самозванец знает категорию",
"debateTime": "⏱️ Время обсуждения",
"noLimit": "Без ограничений",
"oneMin": "1 мин",
"twoMin": "2 мин",
"threeMin": "3 мин",
"fiveMin": "5 мин",
"startGame": "Начать игру",
"seeYourWord": "Посмотри своё слово",
"eachPlayerMustSee": "Каждый игрок должен тайно посмотреть своё слово",
"roundNumber": "Раунд {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Уже видел своё слово",
"tapToSee": "Нажми, чтобы увидеть",
"allSeenStartDebate": "Все увидели → Начать обсуждение",
"playersRemaining": "Осталось {count} игроков",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Ты самозванец!",
"yourWordIs": "Твоё слово:",
"clueCategory": "Подсказка: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Удерживай, чтобы увидеть своё слово",
"makeSureNoOneLooks": "Убедись, что никто не подсматривает",
"showingWord": "👁️ Показываю...",
"holdToSee": "👆 Удерживай, чтобы увидеть",
"seenMyWord": "Я увидел своё слово",
"debateRound": "Обсуждение - Раунд {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Время вышло!",
"timeRemaining": "⏱️ Оставшееся время",
"playersInDebate": "Игроки в обсуждении",
"activePlayersInfo": "{active} активных • {impostors} скрытый(-х) самозванец(-ев)",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Выбыл",
"notes": "Заметки",
"goToVoting": "Перейти к голосованию",
"voting": "🗳️ Голосование",
"turnToVote": "Твоя очередь голосовать:",
"votesProgress": "Голоса: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Кто, по-твоему, самозванец?",
"confirmVote": "Подтвердить голос",
"votingComplete": "🗳️ Голосование завершено",
"allVoted": "Все проголосовали!",
"tapToReveal": "Нажми, чтобы узнать результат",
"revealResult": "Показать результат",
"result": "Результат",
"revealing": "Раскрываем...",
"wasImpostor": "Был САМОЗВАНЦЕМ! 🎉",
"wasInnocent": "Был НЕВИНОВЕН 😱",
"votesThisRound": "Голоса этого раунда",
"seeEndResult": "Увидеть итоговый результат",
"impostorGuessWord": "Самозванец угадает слово?",
"nextRound": "Следующий раунд",
"impostorGuessTitle": "🎯 Догадка самозванца",
"impostorCanGuess": "Выбывший самозванец может\nпопытаться угадать слово",
"ifCorrectImpostorsWin": "Если угадает — самозванцы побеждают!",
"guessWordHint": "Как ты думаешь, какое слово?",
"dontGuess": "Не пытаться",
"guess": "Угадать",
"correctGuess": "Угадал!",
"theWordWas": "Слово было: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Самозванцы побеждают!",
"wrongGuess": "Не угадал!",
"gameContinues": "Игра продолжается...",
"gameOver": "Конец игры",
"playersWin": "Игроки побеждают!",
"theSecretWordWas": "🔍 Загаданное слово:",
"categoryLabel": "Категория: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 Самозванцем был:",
"theImpostorsWere": "🎭 Самозванцами были:",
"votingHistory": "📊 История голосований",
"roundElimination": "Раунд {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Реванш",
"mainMenu": "Главное меню",
"notesTitle": "📝 Заметки",
"notesSaved": "Заметки сохранены",
"whoAreYou": "Кто ты?",
"selectYourName": "Выбери своё имя, чтобы увидеть свои личные заметки",
"notesOf": "Заметки {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Записи о каждом игроке",
"playerNoteHint": "Что он сказал? Подозрительно?",
"freeNote": "Свободная заметка",
"freeNoteHint": "Личные записи...",
"rulesTitle": "📖 Как играть",
"rulesWhatIsTitle": "🎭 Что такое «Самозванец»?",
"rulesWhatIsBody": "Социальная игра на дедукцию для 3-20 игроков. Все получают секретное слово... кроме самозванца! Твоя задача: вычислить, кто притворяется.",
"rulesHowToPlayTitle": "🔍 Как играть?",
"rulesHowToPlayBody": "1. Раздача ролей: все получают одно и то же слово, кроме самозванца(-ев).\n\n2. Обсуждение: по очереди каждый игрок описывает слово, НЕ называя его напрямую. Самозванец должен притворяться, что знает его.\n\n3. Голосование: после обсуждения все голосуют за того, кого считают самозванцем.\n\n4. Исключение: игрок, набравший больше всего голосов, выбывает, и выясняется, был ли он самозванцем.\n\n5. Если это был самозванец, он может попытаться угадать слово. Если угадает — самозванцы побеждают!",
"rulesWhoWinsTitle": "🏆 Кто побеждает?",
"rulesWhoWinsBody": "• Игроки: побеждают, если вычислят ВСЕХ самозванцев.\n• Самозванцы: побеждают, если остаются нераскрытыми, пока обычных игроков не станет столько же или меньше, чем самозванцев, или если угадают слово при выбывании.",
"rulesTipsPlayersTitle": "💡 Советы для игроков",
"rulesTipsPlayersBody": "• Давай тонкие подсказки, доказывающие, что ты знаешь слово, но не настолько очевидные, чтобы самозванец мог ими воспользоваться.\n• Следи за тем, кто даёт расплывчатые или общие ответы.\n• Используй заметки, чтобы записывать сказанное каждым.\n• Не называй слово напрямую — это поможет самозванцу!",
"rulesTipsImpostorTitle": "🎭 Советы для самозванца",
"rulesTipsImpostorBody": "• Внимательно слушай подсказки остальных.\n• Попытайся вычислить слово, чтобы давать правдоподобные подсказки.\n• Не говори первым, если не уверен.\n• Если тебе дали категорию как подсказку, используй это в свою пользу.\n• Обвиняй других, чтобы отвлечь внимание.",
"rulesModesTitle": "📱 Режимы игры",
"rulesModesBody": "• Одно устройство: все передают телефон по кругу. Каждый игрок видит своё слово, нажав и удерживая кнопку.\n\n• Несколько устройств: каждый игрок использует собственное устройство. Подключение через Bluetooth/WiFi Direct без интернета.",
"rulesExampleTitle": "✏️ Пример раунда",
"rulesExampleBody": "Секретное слово: «Пицца»\n\n• Аня: «Её едят горячей» ✓\n• Кирилл: «Приходит в коробке» ✓\n• Лена (самозванец): «Очень популярная» 🤔\n• Дима: «С сыром» ✓\n\nЛена дала слишком общий ответ... Подозрительно!",
"joinGameTitle": "Присоединиться к игре",
"multiDeviceMode": "Режим нескольких устройств",
"scanQrDescription": "Отсканируй QR-код, который показывает хост, чтобы подключиться к игре через Bluetooth/WiFi Direct.",
"comingSoon": "Скоро",
"nearbyNotAvailable": "Подключение нескольких устройств через Nearby Connections требует физических Android-устройств.\n\nПока что используй режим «Одно устройство» для игры на общем телефоне.",
"back": "Назад",
"yes": "Да",
"no": "Нет",
"cancel": "Отмена",
"accept": "Принять",
"next": "Далее",
"settingsTitle": "Настройки",
"language": "Язык",
"soundVolume": "Громкость эффектов",
"vibration": "Вибрация",
"about": "О приложении",
"version": "Версия",
"developer": "Разработчик",
"licenses": "Лицензии"
}

224
lib/l10n/app_tr.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "tr",
"appTitle": "Sahtekar",
"subtitle": "Sosyal çıkarım oyunu",
"loadingWords": "Kelimeler yükleniyor...",
"playersRange": "3-20 oyuncu • İnternet gerektirmez",
"createGame": "Oyun oluştur",
"joinGame": "Oyuna katıl",
"howToPlay": "Nasıl oynanır",
"settings": "Ayarlar",
"gameMode": "Oyun modu",
"singleDevice": "Tek cihaz",
"multiDevice": "Çoklu cihaz",
"category": "Kategori",
"categoryAll": "Tümü",
"categoryAnimals": "Hayvanlar",
"categoryFood": "Yiyecekler",
"categoryCountries": "Ülkeler",
"categorySports": "Sporlar",
"categoryProfessions": "Meslekler",
"categoryObjects": "Nesneler",
"categoryPlaces": "Yerler",
"categoryMovies": "Filmler",
"categoryMusic": "Müzik",
"categoryTechnology": "Teknoloji",
"playersCount": "Oyuncular ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Oyuncu adı",
"playerAlreadyExists": "Bu isimde bir oyuncu zaten var",
"maxPlayersReached": "En fazla 20 oyuncu",
"minPlayersRequired": "En az 3 oyuncu gerekli",
"configuration": "Yapılandırma",
"impostors": "🎭 Sahtekarlar",
"impostorClue": "🔍 Sahtekar için ipucu",
"impostorClueDescription": "Sahtekar kategoriyi bilir",
"debateTime": "⏱️ Tartışma süresi",
"noLimit": "Sınırsız",
"oneMin": "1 dk",
"twoMin": "2 dk",
"threeMin": "3 dk",
"fiveMin": "5 dk",
"startGame": "Oyunu başlat",
"seeYourWord": "Kelimeni gör",
"eachPlayerMustSee": "Her oyuncu kelimesini gizlice görmelidir",
"roundNumber": "Tur {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Kelimesini zaten gördü",
"tapToSee": "Görmek için dokun",
"allSeenStartDebate": "Herkes gördü → Tartışmayı başlat",
"playersRemaining": "{count} oyuncu kaldı",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Sen sahtekarsın!",
"yourWordIs": "Kelimen:",
"clueCategory": "İpucu: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Kelimeni görmek için basılı tut",
"makeSureNoOneLooks": "Kimsenin bakmadığından emin ol",
"showingWord": "👁️ Gösteriliyor...",
"holdToSee": "👆 Görmek için basılı tut",
"seenMyWord": "Kelimemi gördüm",
"debateRound": "Tartışma - Tur {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Süre doldu!",
"timeRemaining": "⏱️ Kalan süre",
"playersInDebate": "Tartışmadaki oyuncular",
"activePlayersInfo": "{active} aktif • {impostors} gizli sahtekar",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Elendi",
"notes": "Notlar",
"goToVoting": "Oylamaya geç",
"voting": "🗳️ Oylama",
"turnToVote": "Oy verme sırası:",
"votesProgress": "Oylar: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Sahtekarın kim olduğunu düşünüyorsun?",
"confirmVote": "Oyu onayla",
"votingComplete": "🗳️ Oylama tamamlandı",
"allVoted": "Herkes oy verdi!",
"tapToReveal": "Sonucu görmek için dokun",
"revealResult": "Sonucu göster",
"result": "Sonuç",
"revealing": "Gösteriliyor...",
"wasImpostor": "SAHTEKAR'dı! 🎉",
"wasInnocent": "MASUM'du 😱",
"votesThisRound": "Bu turun oyları",
"seeEndResult": "Nihai sonucu gör",
"impostorGuessWord": "Sahtekar kelimeyi tahmin edecek mi?",
"nextRound": "Sonraki tur",
"impostorGuessTitle": "🎯 Sahtekarın tahmini",
"impostorCanGuess": "Elenen sahtekar\nkelimeyi tahmin etmeyi deneyebilir",
"ifCorrectImpostorsWin": "Doğru tahmin ederse sahtekarlar kazanır!",
"guessWordHint": "Kelime ne olabilir?",
"dontGuess": "Tahmin etme",
"guess": "Tahmin et",
"correctGuess": "Doğru tahmin!",
"theWordWas": "Kelime şuydu: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Sahtekarlar kazandı!",
"wrongGuess": "Yanlış tahmin!",
"gameContinues": "Oyun devam ediyor...",
"gameOver": "Oyun bitti",
"playersWin": "Oyuncular kazandı!",
"theSecretWordWas": "🔍 Kelime şuydu:",
"categoryLabel": "Kategori: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 Sahtekar şuydu:",
"theImpostorsWere": "🎭 Sahtekarlar şunlardı:",
"votingHistory": "📊 Oylama geçmişi",
"roundElimination": "Tur {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Rövanş",
"mainMenu": "Ana menü",
"notesTitle": "📝 Notlar",
"notesSaved": "Notlar kaydedildi",
"whoAreYou": "Sen kimsin?",
"selectYourName": "Özel notlarını görmek için adını seç",
"notesOf": "{name} adlı oyuncunun notları",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Her oyuncu hakkında notlar",
"playerNoteHint": "Ne dedi? Şüpheli mi?",
"freeNote": "Serbest not",
"freeNoteHint": "Kişisel notlar...",
"rulesTitle": "📖 Nasıl oynanır",
"rulesWhatIsTitle": "🎭 Sahtekar nedir?",
"rulesWhatIsBody": "3-20 oyuncu için sosyal bir çıkarım oyunu. Herkes gizli bir kelime alır... sahtekar hariç! Görevin: kimin numaraya yattığını bul.",
"rulesHowToPlayTitle": "🔍 Nasıl oynanır?",
"rulesHowToPlayBody": "1. Roller dağıtılır: sahtekar(lar) hariç herkes aynı kelimeyi alır.\n\n2. Tartışma: sırayla her oyuncu kelimeyi doğrudan söylemeden tarif eder. Sahtekar biliyormuş gibi yapmalıdır.\n\n3. Oylama: tartışma bitince herkes sahtekar olduğunu düşündüğü kişiye oy verir.\n\n4. Eleme: en çok oy alan elenir ve sahtekar olup olmadığııklanır.\n\n5. Sahtekar idiyse kelimeyi tahmin etmeyi deneyebilir. Doğru tahmin ederse sahtekarlar kazanır!",
"rulesWhoWinsTitle": "🏆 Kim kazanır?",
"rulesWhoWinsBody": "• Oyuncular: TÜM sahtekarları elerse kazanır.\n• Sahtekarlar: keşfedilmeden normal oyuncu sayısı sahtekar sayısına eşit veya altına düşerse kazanır; ya da elenince kelimeyi doğru tahmin ederlerse kazanır.",
"rulesTipsPlayersTitle": "💡 Oyuncular için ipuçları",
"rulesTipsPlayersBody": "• Kelimeyi bildiğini kanıtlayan ince ipuçları ver, ama sahtekarın kullanabileceği kadar açık olmasın.\n• Kimin belirsiz veya genel cevaplar verdiğini gözlemle.\n• Herkesin ne dediğini yazmak için notları kullan.\n• Kelimeyi doğrudan söyleme, bu sahtekara yardım eder!",
"rulesTipsImpostorTitle": "🎭 Sahtekar için ipuçları",
"rulesTipsImpostorBody": "• Diğerlerinin ipuçlarını dikkatle dinle.\n• İnandırıcı ipuçları vermek için kelimeyi çıkarmaya çalış.\n• Emin değilsen ilk konuşan olma.\n• Kategori ipucu verildiyse bunu avantajına kullan.\n• Dikkati dağıtmak için başkalarını suçla.",
"rulesModesTitle": "📱 Oyun modları",
"rulesModesBody": "• Tek cihaz: herkes aynı cihazı paylaşır. Her oyuncu bir düğmeye basılı tutarak kelimesini görür.\n\n• Çoklu cihaz: her oyuncu kendi cihazını kullanır. Bluetooth/WiFi Direct ile bağlanılır, internet gerekmez.",
"rulesExampleTitle": "✏️ Örnek oyun",
"rulesExampleBody": "Gizli kelime: \"Pizza\"\n\n• Ali: \"Sıcak yenir\" ✓\n• Ayşe: \"Kutu içinde gelir\" ✓\n• Zeynep (sahtekar): \"Çok popüler\" 🤔\n• Mehmet: \"Üstünde peynir var\" ✓\n\nZeynep çok genel bir cevap verdi... Şüpheli!",
"joinGameTitle": "Oyuna katıl",
"multiDeviceMode": "Çoklu cihaz modu",
"scanQrDescription": "Bluetooth/WiFi Direct ile oyuna bağlanmak için sunucunun gösterdiği QR kodunu tara.",
"comingSoon": "Yakında",
"nearbyNotAvailable": "Nearby Connections ile çoklu cihaz bağlantısı fiziksel Android cihazları gerektirir.\n\nŞimdilik paylaşılan bir cihazda oynamak için \"Tek cihaz\" modunu kullanın.",
"back": "Geri",
"yes": "Evet",
"no": "Hayır",
"cancel": "İptal",
"accept": "Kabul et",
"next": "Sonraki",
"settingsTitle": "Ayarlar",
"language": "Dil",
"soundVolume": "Efekt ses düzeyi",
"vibration": "Titreşim",
"about": "Hakkında",
"version": "Sürüm",
"developer": "Geliştirici",
"licenses": "Lisanslar"
}

224
lib/l10n/app_zh.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "zh",
"appTitle": "冒牌者",
"subtitle": "社交推理游戏",
"loadingWords": "正在加载词汇...",
"playersRange": "3-20名玩家 • 无需联网",
"createGame": "创建游戏",
"joinGame": "加入游戏",
"howToPlay": "玩法介绍",
"settings": "设置",
"gameMode": "游戏模式",
"singleDevice": "单设备",
"multiDevice": "多设备",
"category": "分类",
"categoryAll": "全部",
"categoryAnimals": "动物",
"categoryFood": "食物",
"categoryCountries": "国家",
"categorySports": "运动",
"categoryProfessions": "职业",
"categoryObjects": "物品",
"categoryPlaces": "地点",
"categoryMovies": "电影",
"categoryMusic": "音乐",
"categoryTechnology": "科技",
"playersCount": "玩家 ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "玩家名称",
"playerAlreadyExists": "已存在同名玩家",
"maxPlayersReached": "最多20名玩家",
"minPlayersRequired": "至少需要3名玩家",
"configuration": "配置",
"impostors": "🎭 冒牌者",
"impostorClue": "🔍 给冒牌者的提示",
"impostorClueDescription": "冒牌者可以知道分类",
"debateTime": "⏱️ 讨论时间",
"noLimit": "不限时",
"oneMin": "1分钟",
"twoMin": "2分钟",
"threeMin": "3分钟",
"fiveMin": "5分钟",
"startGame": "开始游戏",
"seeYourWord": "查看你的词语",
"eachPlayerMustSee": "每位玩家需要秘密查看自己的词语",
"roundNumber": "第 {round} 轮",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "已查看词语",
"tapToSee": "点击查看",
"allSeenStartDebate": "全员已查看 → 开始讨论",
"playersRemaining": "还剩 {count} 位玩家",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "你是冒牌者!",
"yourWordIs": "你的词语是:",
"clueCategory": "提示:{category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "长按查看你的词语",
"makeSureNoOneLooks": "确保没有其他人在看",
"showingWord": "👁️ 显示中...",
"holdToSee": "👆 长按查看",
"seenMyWord": "我已看过词语",
"debateRound": "讨论 - 第 {round} 轮",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ 时间到!",
"timeRemaining": "⏱️ 剩余时间",
"playersInDebate": "参与讨论的玩家",
"activePlayersInfo": "{active} 名在场 • {impostors} 名冒牌者潜伏中",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "已淘汰",
"notes": "笔记",
"goToVoting": "前往投票",
"voting": "🗳️ 投票",
"turnToVote": "轮到你投票:",
"votesProgress": "投票:{current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "你认为谁是冒牌者?",
"confirmVote": "确认投票",
"votingComplete": "🗳️ 投票结束",
"allVoted": "所有人已投票!",
"tapToReveal": "点击揭晓结果",
"revealResult": "揭晓结果",
"result": "结果",
"revealing": "揭晓中...",
"wasImpostor": "是冒牌者! 🎉",
"wasInnocent": "是无辜的 😱",
"votesThisRound": "本轮投票情况",
"seeEndResult": "查看最终结果",
"impostorGuessWord": "冒牌者要猜词吗?",
"nextRound": "下一轮",
"impostorGuessTitle": "🎯 冒牌者猜词",
"impostorCanGuess": "被淘汰的冒牌者可以\n尝试猜出词语",
"ifCorrectImpostorsWin": "如果猜对,冒牌者获胜!",
"guessWordHint": "你认为词语是什么?",
"dontGuess": "不猜",
"guess": "猜词",
"correctGuess": "猜对了!",
"theWordWas": "词语是:{word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "冒牌者获胜!",
"wrongGuess": "猜错了!",
"gameContinues": "游戏继续...",
"gameOver": "游戏结束",
"playersWin": "玩家获胜!",
"theSecretWordWas": "🔍 词语是:",
"categoryLabel": "分类:{category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 冒牌者是:",
"theImpostorsWere": "🎭 冒牌者们是:",
"votingHistory": "📊 投票历史",
"roundElimination": "第 {round} 轮:{name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "再来一局",
"mainMenu": "主菜单",
"notesTitle": "📝 笔记",
"notesSaved": "笔记已保存",
"whoAreYou": "你是谁?",
"selectYourName": "选择你的名字查看个人笔记",
"notesOf": "{name}的笔记",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "关于每位玩家的记录",
"playerNoteHint": "他说了什么?可疑吗?",
"freeNote": "自由笔记",
"freeNoteHint": "个人记录...",
"rulesTitle": "📖 玩法介绍",
"rulesWhatIsTitle": "🎭 什么是冒牌者?",
"rulesWhatIsBody": "一款3-20人的社交推理游戏。每个人都会收到一个秘密词语......除了冒牌者!你的任务:找出谁在假装。",
"rulesHowToPlayTitle": "🔍 怎么玩?",
"rulesHowToPlayBody": "1. 分配角色:所有人收到相同的词语,但冒牌者除外。\n\n2. 讨论:轮流发言,每位玩家描述词语但不能直接说出来。冒牌者必须假装知道词语。\n\n3. 投票:讨论结束后,所有人投票选出他们认为的冒牌者。\n\n4. 淘汰:得票最多的玩家被淘汰,并揭晓其是否为冒牌者。\n\n5. 如果是冒牌者,可以尝试猜出词语。猜对则冒牌者获胜!",
"rulesWhoWinsTitle": "🏆 谁能赢?",
"rulesWhoWinsBody": "• 玩家:淘汰所有冒牌者即可获胜。\n• 冒牌者:如果未被识破,坚持到普通玩家人数等于或少于冒牌者人数即可获胜;或者在被淘汰时猜对词语也能获胜。",
"rulesTipsPlayersTitle": "💡 给玩家的建议",
"rulesTipsPlayersBody": "• 给出能证明你知道词语的微妙提示,但不要太明显以至于被冒牌者利用。\n• 留意那些给出模糊或笼统回答的人。\n• 利用笔记记录每个人说的话。\n• 不要直接说出词语,那会帮到冒牌者!",
"rulesTipsImpostorTitle": "🎭 给冒牌者的建议",
"rulesTipsImpostorBody": "• 仔细聆听其他人的提示。\n• 尝试推断词语,以便给出可信的提示。\n• 如果没有把握,不要第一个发言。\n• 如果给了你分类提示,好好利用它。\n• 指控别人来转移注意力。",
"rulesModesTitle": "📱 游戏模式",
"rulesModesBody": "• 单设备:所有人共享一台设备。每位玩家通过长按按钮查看自己的词语。\n\n• 多设备:每位玩家使用自己的设备。通过蓝牙/WiFi Direct连接无需联网。",
"rulesExampleTitle": "✏️ 游戏示例",
"rulesExampleBody": "秘密词语:\"披萨\"\n\n• 小明:\"趁热吃的\" ✓\n• 小红:\"装在盒子里的\" ✓\n• 小丽(冒牌者):\"非常受欢迎\" 🤔\n• 小刚:\"上面有芝士\" ✓\n\n小丽的回答太笼统了......可疑!",
"joinGameTitle": "加入游戏",
"multiDeviceMode": "多设备模式",
"scanQrDescription": "扫描房主显示的二维码,通过蓝牙/WiFi Direct连接到游戏。",
"comingSoon": "即将推出",
"nearbyNotAvailable": "多设备连接的Nearby Connections功能需要实体Android设备。\n\n目前请使用\"单设备\"模式,在一台共享设备上进行游戏。",
"back": "返回",
"yes": "是",
"no": "否",
"cancel": "取消",
"accept": "确定",
"next": "下一步",
"settingsTitle": "设置",
"language": "语言",
"soundVolume": "音效音量",
"vibration": "振动",
"about": "关于",
"version": "版本",
"developer": "开发者",
"licenses": "许可证"
}

224
lib/l10n/app_zh_TW.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "zh_TW",
"appTitle": "冒牌者",
"subtitle": "社交推理遊戲",
"loadingWords": "正在載入詞彙...",
"playersRange": "3-20 位玩家 • 無需網路",
"createGame": "建立遊戲",
"joinGame": "加入遊戲",
"howToPlay": "遊戲規則",
"settings": "設定",
"gameMode": "遊戲模式",
"singleDevice": "單機模式",
"multiDevice": "多機模式",
"category": "類別",
"categoryAll": "全部",
"categoryAnimals": "動物",
"categoryFood": "食物",
"categoryCountries": "國家",
"categorySports": "運動",
"categoryProfessions": "職業",
"categoryObjects": "物品",
"categoryPlaces": "地點",
"categoryMovies": "電影",
"categoryMusic": "音樂",
"categoryTechnology": "科技",
"playersCount": "玩家 ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "玩家名稱",
"playerAlreadyExists": "已有同名玩家",
"maxPlayersReached": "最多 20 位玩家",
"minPlayersRequired": "至少需要 3 位玩家",
"configuration": "設定",
"impostors": "🎭 冒牌者",
"impostorClue": "🔍 冒牌者提示",
"impostorClueDescription": "冒牌者可以知道類別",
"debateTime": "⏱️ 討論時間",
"noLimit": "無限制",
"oneMin": "1 分鐘",
"twoMin": "2 分鐘",
"threeMin": "3 分鐘",
"fiveMin": "5 分鐘",
"startGame": "開始遊戲",
"seeYourWord": "查看你的詞彙",
"eachPlayerMustSee": "每位玩家必須私下查看自己的詞彙",
"roundNumber": "第 {round} 回合",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "已查看過詞彙",
"tapToSee": "點擊查看",
"allSeenStartDebate": "全員已查看 → 開始討論",
"playersRemaining": "還有 {count} 位玩家未查看",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "你是冒牌者!",
"yourWordIs": "你的詞彙是:",
"clueCategory": "提示:{category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "長按查看你的詞彙",
"makeSureNoOneLooks": "請確認沒有其他人在看",
"showingWord": "👁️ 顯示中...",
"holdToSee": "👆 長按查看",
"seenMyWord": "我已看過詞彙",
"debateRound": "討論 - 第 {round} 回合",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ 時間到!",
"timeRemaining": "⏱️ 剩餘時間",
"playersInDebate": "參與討論的玩家",
"activePlayersInfo": "{active} 位在場 • {impostors} 位冒牌者潛伏中",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "已淘汰",
"notes": "筆記",
"goToVoting": "前往投票",
"voting": "🗳️ 投票",
"turnToVote": "輪到你投票:",
"votesProgress": "票數:{current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "你認為誰是冒牌者?",
"confirmVote": "確認投票",
"votingComplete": "🗳️ 投票完成",
"allVoted": "所有人都已投票!",
"tapToReveal": "點擊揭曉結果",
"revealResult": "揭曉結果",
"result": "結果",
"revealing": "揭曉中...",
"wasImpostor": "是冒牌者! 🎉",
"wasInnocent": "是無辜的 😱",
"votesThisRound": "本回合票數",
"seeEndResult": "查看最終結果",
"impostorGuessWord": "冒牌者要猜詞彙嗎?",
"nextRound": "下一回合",
"impostorGuessTitle": "🎯 冒牌者猜詞",
"impostorCanGuess": "被淘汰的冒牌者可以\n嘗試猜出正確詞彙",
"ifCorrectImpostorsWin": "猜對的話,冒牌者就贏了!",
"guessWordHint": "你覺得詞彙是什麼?",
"dontGuess": "放棄猜測",
"guess": "猜測",
"correctGuess": "猜對了!",
"theWordWas": "正確詞彙是:{word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "冒牌者獲勝!",
"wrongGuess": "猜錯了!",
"gameContinues": "遊戲繼續...",
"gameOver": "遊戲結束",
"playersWin": "玩家們獲勝!",
"theSecretWordWas": "🔍 正確詞彙是:",
"categoryLabel": "類別:{category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 冒牌者是:",
"theImpostorsWere": "🎭 冒牌者們是:",
"votingHistory": "📊 投票紀錄",
"roundElimination": "第 {round} 回合:{name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "再來一局",
"mainMenu": "主選單",
"notesTitle": "📝 筆記",
"notesSaved": "筆記已儲存",
"whoAreYou": "你是誰?",
"selectYourName": "選擇你的名字以查看個人筆記",
"notesOf": "{name} 的筆記",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "關於每位玩家的紀錄",
"playerNoteHint": "他說了什麼?可疑嗎?",
"freeNote": "自由筆記",
"freeNoteHint": "個人筆記...",
"rulesTitle": "📖 遊戲規則",
"rulesWhatIsTitle": "🎭 什麼是冒牌者?",
"rulesWhatIsBody": "一款適合 3-20 位玩家的社交推理遊戲。每個人都會收到一個秘密詞彙……除了冒牌者!你的任務:找出誰在假裝。",
"rulesHowToPlayTitle": "🔍 怎麼玩?",
"rulesHowToPlayBody": "1. 分配角色:所有人獲得相同的詞彙,冒牌者除外。\n\n2. 討論:玩家輪流描述該詞彙,但不能直接說出來。冒牌者必須假裝知道這個詞。\n\n3. 投票:討論結束後,所有人投票選出誰是冒牌者。\n\n4. 淘汰:得票最多的人被淘汰,並揭曉其身份。\n\n5. 如果被淘汰者是冒牌者,可以嘗試猜出詞彙。猜對的話,冒牌者獲勝!",
"rulesWhoWinsTitle": "🏆 誰會贏?",
"rulesWhoWinsBody": "• 玩家:淘汰所有冒牌者即可獲勝。\n• 冒牌者:如果未被發現且剩餘普通玩家人數等於或少於冒牌者人數,則獲勝;或者被淘汰時猜對詞彙也可獲勝。",
"rulesTipsPlayersTitle": "💡 玩家攻略",
"rulesTipsPlayersBody": "• 給出巧妙的提示來證明你知道詞彙,但不要太明顯讓冒牌者利用。\n• 注意誰給出了模糊或籠統的回答。\n• 使用筆記功能記錄每個人說了什麼。\n• 不要直接說出詞彙,那會幫到冒牌者!",
"rulesTipsImpostorTitle": "🎭 冒牌者攻略",
"rulesTipsImpostorBody": "• 仔細聆聽其他人的提示。\n• 嘗試推斷出詞彙,才能給出可信的描述。\n• 如果沒把握,不要第一個發言。\n• 如果獲得了類別提示,善加利用。\n• 指控他人以轉移注意力。",
"rulesModesTitle": "📱 遊戲模式",
"rulesModesBody": "• 單機模式:所有人共用一台裝置。每位玩家長按按鈕查看自己的詞彙。\n\n• 多機模式每位玩家使用自己的裝置透過藍牙WiFi Direct 連線,無需網路。",
"rulesExampleTitle": "✏️ 遊戲範例",
"rulesExampleBody": "秘密詞彙:「披薩」\n\n• 小明:「要趁熱吃」 ✓\n• 小華:「裝在盒子裡」 ✓\n• 小美(冒牌者):「很受歡迎」 🤔\n• 小強:「上面有起司」 ✓\n\n小美的回答太籠統了……有嫌疑",
"joinGameTitle": "加入遊戲",
"multiDeviceMode": "多機模式",
"scanQrDescription": "掃描主機顯示的 QR 碼透過藍牙WiFi Direct 加入遊戲。",
"comingSoon": "即將推出",
"nearbyNotAvailable": "多機連線功能需要 Android 實體裝置搭配 Nearby Connections。\n\n目前請使用「單機模式」在共用裝置上進行遊戲。",
"back": "返回",
"yes": "是",
"no": "否",
"cancel": "取消",
"accept": "確定",
"next": "下一步",
"settingsTitle": "設定",
"language": "語言",
"soundVolume": "音效音量",
"vibration": "震動",
"about": "關於",
"version": "版本",
"developer": "開發者",
"licenses": "授權條款"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,473 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Arabic (`ar`).
class AppLocalizationsAr extends AppLocalizations {
AppLocalizationsAr([String locale = 'ar']) : super(locale);
@override
String get appTitle => 'المنتحل';
@override
String get subtitle => 'لعبة تخمين اجتماعية';
@override
String get loadingWords => 'جارٍ تحميل الكلمات...';
@override
String get playersRange => '3-20 لاعبًا • بدون إنترنت';
@override
String get createGame => 'إنشاء لعبة';
@override
String get joinGame => 'الانضمام إلى لعبة';
@override
String get howToPlay => 'كيفية اللعب';
@override
String get settings => 'الإعدادات';
@override
String get gameMode => 'وضع اللعب';
@override
String get singleDevice => 'جهاز واحد';
@override
String get multiDevice => 'أجهزة متعددة';
@override
String get category => 'الفئة';
@override
String get categoryAll => 'الكل';
@override
String get categoryAnimals => 'حيوانات';
@override
String get categoryFood => 'طعام';
@override
String get categoryCountries => 'دول';
@override
String get categorySports => 'رياضة';
@override
String get categoryProfessions => 'مهن';
@override
String get categoryObjects => 'أشياء';
@override
String get categoryPlaces => 'أماكن';
@override
String get categoryMovies => 'أفلام';
@override
String get categoryMusic => 'موسيقى';
@override
String get categoryTechnology => 'تكنولوجيا';
@override
String playersCount(int count) {
return 'اللاعبون ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'اسم اللاعب';
@override
String get playerAlreadyExists => 'يوجد لاعب بهذا الاسم بالفعل';
@override
String get maxPlayersReached => 'الحد الأقصى 20 لاعبًا';
@override
String get minPlayersRequired => 'يلزم 3 لاعبين على الأقل';
@override
String get configuration => 'الإعدادات';
@override
String get impostors => '🎭 المنتحلون';
@override
String get impostorClue => '🔍 تلميح للمنتحل';
@override
String get impostorClueDescription => 'المنتحل يعرف الفئة';
@override
String get debateTime => '⏱️ وقت النقاش';
@override
String get noLimit => 'بلا حد';
@override
String get oneMin => '1 د';
@override
String get twoMin => '2 د';
@override
String get threeMin => '3 د';
@override
String get fiveMin => '5 د';
@override
String get startGame => 'بدء اللعبة';
@override
String get seeYourWord => 'اعرف كلمتك';
@override
String get eachPlayerMustSee => 'يجب على كل لاعب رؤية كلمته بسرية';
@override
String roundNumber(int round) {
return 'الجولة $round';
}
@override
String get alreadySeen => 'شاهد كلمته بالفعل';
@override
String get tapToSee => 'اضغط للعرض';
@override
String get allSeenStartDebate => 'الجميع شاهد ← بدء النقاش';
@override
String playersRemaining(int count) {
return 'متبقٍّ $count لاعبين';
}
@override
String get youAreImpostor => 'أنت المنتحل!';
@override
String get yourWordIs => 'كلمتك هي:';
@override
String clueCategory(String category) {
return 'تلميح: $category';
}
@override
String get holdToSeeWord => 'اضغط مطولًا لرؤية كلمتك';
@override
String get makeSureNoOneLooks => 'تأكد أن لا أحد ينظر';
@override
String get showingWord => '👁️ جارٍ العرض...';
@override
String get holdToSee => '👆 اضغط مطولًا للعرض';
@override
String get seenMyWord => 'رأيت كلمتي';
@override
String debateRound(int round) {
return 'النقاش - الجولة $round';
}
@override
String get timeUp => '⏰ انتهى الوقت!';
@override
String get timeRemaining => '⏱️ الوقت المتبقي';
@override
String get playersInDebate => 'اللاعبون في النقاش';
@override
String activePlayersInfo(int active, int impostors) {
return '$active نشطون • $impostors منتحل(ون) مختبئون';
}
@override
String get eliminated => 'تم إقصاؤه';
@override
String get notes => 'ملاحظات';
@override
String get goToVoting => 'الانتقال للتصويت';
@override
String get voting => '🗳️ التصويت';
@override
String get turnToVote => 'دورك للتصويت:';
@override
String votesProgress(int current, int total) {
return 'الأصوات: $current/$total';
}
@override
String get whoIsImpostor => 'من تعتقد أنه المنتحل؟';
@override
String get confirmVote => 'تأكيد التصويت';
@override
String get votingComplete => '🗳️ اكتمل التصويت';
@override
String get allVoted => 'صوّت الجميع!';
@override
String get tapToReveal => 'اضغط لكشف النتيجة';
@override
String get revealResult => 'كشف النتيجة';
@override
String get result => 'النتيجة';
@override
String get revealing => 'جارٍ الكشف...';
@override
String get wasImpostor => 'كان المنتحل! 🎉';
@override
String get wasInnocent => 'كان بريئًا 😱';
@override
String get votesThisRound => 'أصوات هذه الجولة';
@override
String get seeEndResult => 'عرض النتيجة النهائية';
@override
String get impostorGuessWord => 'هل يخمّن المنتحل الكلمة؟';
@override
String get nextRound => 'الجولة التالية';
@override
String get impostorGuessTitle => '🎯 تخمين المنتحل';
@override
String get impostorCanGuess => 'يمكن للمنتحل المُقصى\nمحاولة تخمين الكلمة';
@override
String get ifCorrectImpostorsWin => 'إذا أصاب، يفوز المنتحلون!';
@override
String get guessWordHint => 'ما الكلمة برأيك؟';
@override
String get dontGuess => 'عدم المحاولة';
@override
String get guess => 'تخمين';
@override
String get correctGuess => 'تخمين صحيح!';
@override
String theWordWas(String word) {
return 'الكلمة كانت: $word';
}
@override
String get impostorsWin => 'فاز المنتحلون!';
@override
String get wrongGuess => 'تخمين خاطئ!';
@override
String get gameContinues => 'اللعبة مستمرة...';
@override
String get gameOver => 'انتهت اللعبة';
@override
String get playersWin => 'فاز اللاعبون!';
@override
String get theSecretWordWas => '🔍 الكلمة كانت:';
@override
String categoryLabel(String category) {
return 'الفئة: $category';
}
@override
String get theImpostorWas => '🎭 المنتحل كان:';
@override
String get theImpostorsWere => '🎭 المنتحلون كانوا:';
@override
String get votingHistory => '📊 سجل التصويت';
@override
String roundElimination(int round, String name) {
return 'الجولة $round: $name';
}
@override
String get rematch => 'إعادة المباراة';
@override
String get mainMenu => 'القائمة الرئيسية';
@override
String get notesTitle => '📝 ملاحظات';
@override
String get notesSaved => 'تم حفظ الملاحظات';
@override
String get whoAreYou => 'من أنت؟';
@override
String get selectYourName => 'اختر اسمك لعرض ملاحظاتك الخاصة';
@override
String notesOf(String name) {
return 'ملاحظات $name';
}
@override
String get notesAboutPlayers => 'ملاحظات عن كل لاعب';
@override
String get playerNoteHint => 'ماذا قال؟ هل هو مشبوه؟';
@override
String get freeNote => 'ملاحظة حرة';
@override
String get freeNoteHint => 'ملاحظات شخصية...';
@override
String get rulesTitle => '📖 كيفية اللعب';
@override
String get rulesWhatIsTitle => '🎭 ما هو المنتحل؟';
@override
String get rulesWhatIsBody =>
'لعبة تخمين اجتماعية لـ 3-20 لاعبًا. الجميع يحصل على كلمة سرية... ما عدا المنتحل! مهمتك: اكتشف من يتظاهر.';
@override
String get rulesHowToPlayTitle => '🔍 كيف تُلعب؟';
@override
String get rulesHowToPlayBody =>
'1. توزيع الأدوار: الجميع يحصل على نفس الكلمة، ما عدا المنتحل(ين).\n\n2. النقاش: بالتناوب، كل لاعب يصف الكلمة دون ذكرها مباشرة. على المنتحل التظاهر بمعرفتها.\n\n3. التصويت: بعد انتهاء النقاش، يصوّت الجميع على من يعتقدون أنه المنتحل.\n\n4. الإقصاء: الأكثر حصولًا على الأصوات يُقصى ويُكشف ما إذا كان منتحلًا أم لا.\n\n5. إذا كان منتحلًا، يمكنه محاولة تخمين الكلمة. إذا أصاب، يفوز المنتحلون!';
@override
String get rulesWhoWinsTitle => '🏆 من يفوز؟';
@override
String get rulesWhoWinsBody =>
'• اللاعبون: يفوزون بإقصاء جميع المنتحلين.\n• المنتحلون: يفوزون إذا لم يُكتشفوا حتى يتساوى أو يقل عدد اللاعبين العاديين عن عدد المنتحلين، أو إذا خمّنوا الكلمة عند إقصائهم.';
@override
String get rulesTipsPlayersTitle => '💡 نصائح للاعبين';
@override
String get rulesTipsPlayersBody =>
'• أعطِ تلميحات ذكية تُثبت معرفتك بالكلمة، لكن ليست واضحة جدًا ليستغلها المنتحل.\n• راقب من يعطي إجابات غامضة أو عامة.\n• استخدم الملاحظات لتدوين ما يقوله كل شخص.\n• لا تقل الكلمة مباشرة، فهذا يساعد المنتحل!';
@override
String get rulesTipsImpostorTitle => '🎭 نصائح للمنتحل';
@override
String get rulesTipsImpostorBody =>
'• استمع بانتباه لتلميحات الآخرين.\n• حاول استنتاج الكلمة لتقديم تلميحات مقنعة.\n• لا تكن أول من يتحدث إن لم تكن متأكدًا.\n• إذا حصلت على تلميح الفئة، استغله لصالحك.\n• اتّهم الآخرين لصرف الانتباه عنك.';
@override
String get rulesModesTitle => '📱 أوضاع اللعب';
@override
String get rulesModesBody =>
'• جهاز واحد: الجميع يشارك نفس الجهاز. كل لاعب يرى كلمته بالضغط المطول على الزر.\n\n• أجهزة متعددة: كل لاعب يستخدم جهازه الخاص. يتم الاتصال عبر بلوتوث/WiFi Direct بدون حاجة للإنترنت.';
@override
String get rulesExampleTitle => '✏️ مثال على لعبة';
@override
String get rulesExampleBody =>
'الكلمة السرية: \"بيتزا\"\n\n• أحمد: \"تُؤكل ساخنة\"\n• فاطمة: \"تأتي في صندوق\"\n• ليلى (المنتحل): \"شيء شائع جدًا\" 🤔\n• خالد: \"عليها جبنة\"\n\nإجابة ليلى كانت عامة جدًا... مشبوهة!';
@override
String get joinGameTitle => 'الانضمام إلى لعبة';
@override
String get multiDeviceMode => 'وضع الأجهزة المتعددة';
@override
String get scanQrDescription =>
'امسح رمز QR الذي يعرضه المضيف للاتصال باللعبة عبر بلوتوث/WiFi Direct.';
@override
String get comingSoon => 'قريبًا';
@override
String get nearbyNotAvailable =>
'اتصال الأجهزة المتعددة عبر Nearby Connections يتطلب أجهزة أندرويد فعلية.\n\nحاليًا، استخدم وضع \"جهاز واحد\" للعب على جهاز مشترك.';
@override
String get back => 'رجوع';
@override
String get yes => 'نعم';
@override
String get no => 'لا';
@override
String get cancel => 'إلغاء';
@override
String get accept => 'قبول';
@override
String get next => 'التالي';
@override
String get settingsTitle => 'الإعدادات';
@override
String get language => 'اللغة';
@override
String get soundVolume => 'مستوى المؤثرات الصوتية';
@override
String get vibration => 'الاهتزاز';
@override
String get about => 'حول التطبيق';
@override
String get version => 'الإصدار';
@override
String get developer => 'المطوّر';
@override
String get licenses => 'التراخيص';
}

View File

@@ -0,0 +1,476 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Catalan Valencian (`ca`).
class AppLocalizationsCa extends AppLocalizations {
AppLocalizationsCa([String locale = 'ca']) : super(locale);
@override
String get appTitle => 'L\'Impostor';
@override
String get subtitle => 'Joc de deducció social';
@override
String get loadingWords => 'Carregant paraules...';
@override
String get playersRange => '3-20 jugadors • Sense internet';
@override
String get createGame => 'Crear partida';
@override
String get joinGame => 'Unir-se a partida';
@override
String get howToPlay => 'Com jugar';
@override
String get settings => 'Configuració';
@override
String get gameMode => 'Mode de joc';
@override
String get singleDevice => 'Un sol mòbil';
@override
String get multiDevice => 'Multimòbil';
@override
String get category => 'Categoria';
@override
String get categoryAll => 'Totes';
@override
String get categoryAnimals => 'Animals';
@override
String get categoryFood => 'Menjar';
@override
String get categoryCountries => 'Països';
@override
String get categorySports => 'Esports';
@override
String get categoryProfessions => 'Professions';
@override
String get categoryObjects => 'Objectes';
@override
String get categoryPlaces => 'Llocs';
@override
String get categoryMovies => 'Pel·lícules';
@override
String get categoryMusic => 'Música';
@override
String get categoryTechnology => 'Tecnologia';
@override
String playersCount(int count) {
return 'Jugadors ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Nom del jugador';
@override
String get playerAlreadyExists => 'Ja existeix un jugador amb aquest nom';
@override
String get maxPlayersReached => 'Màxim 20 jugadors';
@override
String get minPlayersRequired => 'Calen almenys 3 jugadors';
@override
String get configuration => 'Configuració';
@override
String get impostors => '🎭 Impostors';
@override
String get impostorClue => '🔍 Pista per a l\'impostor';
@override
String get impostorClueDescription => 'L\'impostor coneix la categoria';
@override
String get debateTime => '⏱️ Temps de debat';
@override
String get noLimit => 'Sense límit';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Iniciar partida';
@override
String get seeYourWord => 'Veure la teva paraula';
@override
String get eachPlayerMustSee =>
'Cada jugador ha de veure la seva paraula en secret';
@override
String roundNumber(int round) {
return 'Ronda $round';
}
@override
String get alreadySeen => 'Ja ha vist la seva paraula';
@override
String get tapToSee => 'Toca per veure';
@override
String get allSeenStartDebate => 'Tots han vist → Iniciar debat';
@override
String playersRemaining(int count) {
return 'Falten $count jugadors';
}
@override
String get youAreImpostor => 'Ets l\'impostor!';
@override
String get yourWordIs => 'La teva paraula és:';
@override
String clueCategory(String category) {
return 'Pista: $category';
}
@override
String get holdToSeeWord => 'Mantén premut per veure la teva paraula';
@override
String get makeSureNoOneLooks => 'Assegura\'t que ningú més mira';
@override
String get showingWord => '👁️ Mostrant...';
@override
String get holdToSee => '👆 Mantén premut per veure';
@override
String get seenMyWord => 'He vist la meva paraula';
@override
String debateRound(int round) {
return 'Debat - Ronda $round';
}
@override
String get timeUp => '⏰ Temps esgotat!';
@override
String get timeRemaining => '⏱️ Temps restant';
@override
String get playersInDebate => 'Jugadors en debat';
@override
String activePlayersInfo(int active, int impostors) {
return '$active actius • $impostors impostor(s) ocults';
}
@override
String get eliminated => 'Eliminat';
@override
String get notes => 'Notes';
@override
String get goToVoting => 'Anar a votació';
@override
String get voting => '🗳️ Votació';
@override
String get turnToVote => 'Torn de votar:';
@override
String votesProgress(int current, int total) {
return 'Vots: $current/$total';
}
@override
String get whoIsImpostor => 'Qui creus que és l\'impostor?';
@override
String get confirmVote => 'Confirmar vot';
@override
String get votingComplete => '🗳️ Votació completa';
@override
String get allVoted => 'Tots han votat!';
@override
String get tapToReveal => 'Toca per revelar el resultat';
@override
String get revealResult => 'Revelar resultat';
@override
String get result => 'Resultat';
@override
String get revealing => 'Revelant...';
@override
String get wasImpostor => 'Era IMPOSTOR! 🎉';
@override
String get wasInnocent => 'Era INNOCENT 😱';
@override
String get votesThisRound => 'Vots d\'aquesta ronda';
@override
String get seeEndResult => 'Veure resultat final';
@override
String get impostorGuessWord => 'L\'impostor endevina la paraula?';
@override
String get nextRound => 'Següent ronda';
@override
String get impostorGuessTitle => '🎯 Endevinalla de l\'impostor';
@override
String get impostorCanGuess =>
'L\'impostor eliminat pot\nintentar endevinar la paraula';
@override
String get ifCorrectImpostorsWin => 'Si encerta, els impostors guanyen!';
@override
String get guessWordHint => 'Quina creus que és la paraula?';
@override
String get dontGuess => 'No intentar';
@override
String get guess => 'Endevinar';
@override
String get correctGuess => 'Ha encertat!';
@override
String theWordWas(String word) {
return 'La paraula era: $word';
}
@override
String get impostorsWin => 'Els impostors guanyen!';
@override
String get wrongGuess => 'No ha encertat!';
@override
String get gameContinues => 'La partida continua...';
@override
String get gameOver => 'Fi de partida';
@override
String get playersWin => 'Els jugadors guanyen!';
@override
String get theSecretWordWas => '🔍 La paraula era:';
@override
String categoryLabel(String category) {
return 'Categoria: $category';
}
@override
String get theImpostorWas => '🎭 L\'impostor era:';
@override
String get theImpostorsWere => '🎭 Els impostors eren:';
@override
String get votingHistory => '📊 Historial de votacions';
@override
String roundElimination(int round, String name) {
return 'Ronda $round: $name';
}
@override
String get rematch => 'Revenja';
@override
String get mainMenu => 'Menú principal';
@override
String get notesTitle => '📝 Notes';
@override
String get notesSaved => 'Notes desades';
@override
String get whoAreYou => 'Qui ets?';
@override
String get selectYourName =>
'Selecciona el teu nom per veure les teves notes privades';
@override
String notesOf(String name) {
return 'Notes de $name';
}
@override
String get notesAboutPlayers => 'Apunts sobre cada jugador';
@override
String get playerNoteHint => 'Què ha dit? Sospitós?';
@override
String get freeNote => 'Nota lliure';
@override
String get freeNoteHint => 'Apunts personals...';
@override
String get rulesTitle => '📖 Com jugar';
@override
String get rulesWhatIsTitle => '🎭 Què és L\'Impostor?';
@override
String get rulesWhatIsBody =>
'Un joc de deducció social per a 3-20 jugadors. Tots reben una paraula secreta... excepte l\'impostor! La teva missió: descobrir qui fingeix.';
@override
String get rulesHowToPlayTitle => '🔍 Com es juga?';
@override
String get rulesHowToPlayBody =>
'1. Es reparteixen els rols: tots reben la mateixa paraula, excepte l\'impostor/els impostors.\n\n2. Debat: per torns, cada jugador descriu la paraula SENSE dir-la directament. L\'impostor ha de fingir que la coneix.\n\n3. Votació: en acabar el debat, tots voten qui creuen que és l\'impostor.\n\n4. Eliminació: el més votat queda eliminat i es revela si era impostor o no.\n\n5. Si era impostor, pot intentar endevinar la paraula. Si encerta, els impostors guanyen!';
@override
String get rulesWhoWinsTitle => '🏆 Qui guanya?';
@override
String get rulesWhoWinsBody =>
'• Jugadors: guanyen si eliminen TOTS els impostors.\n• Impostors: guanyen si no són descoberts fins que quedin igual o menys jugadors normals que impostors, o si endevinen la paraula en ser eliminats.';
@override
String get rulesTipsPlayersTitle => '💡 Consells per als jugadors';
@override
String get rulesTipsPlayersBody =>
'• Dona pistes subtils que demostrin que coneixes la paraula, però no tan evidents que l\'impostor les pugui fer servir.\n• Observa qui dona respostes vagues o genèriques.\n• Fes servir les notes per apuntar el que diu cadascú.\n• No diguis la paraula directament, això ajuda l\'impostor!';
@override
String get rulesTipsImpostorTitle => '🎭 Consells per a l\'impostor';
@override
String get rulesTipsImpostorBody =>
'• Escolta atentament les pistes dels altres.\n• Intenta deduir la paraula per donar pistes creïbles.\n• No siguis el primer a parlar si no n\'estàs segur.\n• Si et donen la categoria com a pista, aprofita-la.\n• Acusa els altres per desviar l\'atenció.';
@override
String get rulesModesTitle => '📱 Modes de joc';
@override
String get rulesModesBody =>
'• Un sol mòbil: tots comparteixen el dispositiu. Cada jugador veu la seva paraula prement i mantenint un botó.\n\n• Multimòbil: cada jugador fa servir el seu propi dispositiu. Es connecten per Bluetooth/WiFi Direct sense necessitat d\'internet.';
@override
String get rulesExampleTitle => '✏️ Exemple de partida';
@override
String get rulesExampleBody =>
'Paraula secreta: \"Pizza\"\n\n• Laia: \"Es menja calenta\"\n• Jordi: \"Ve en una capsa\"\n• Marta (impostor): \"És molt popular\" 🤔\n• Pau: \"Té formatge\"\n\nLa Marta va donar una resposta molt genèrica... Sospitosa!';
@override
String get joinGameTitle => 'Unir-se a partida';
@override
String get multiDeviceMode => 'Mode multimòbil';
@override
String get scanQrDescription =>
'Escaneja el codi QR que mostra l\'amfitrió per connectar-te a la partida via Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Properament';
@override
String get nearbyNotAvailable =>
'La connexió multimòbil amb Nearby Connections requereix dispositius Android físics.\n\nDe moment, fes servir el mode \"Un sol mòbil\" per jugar en un dispositiu compartit.';
@override
String get back => 'Tornar';
@override
String get yes => '';
@override
String get no => 'No';
@override
String get cancel => 'Cancel·lar';
@override
String get accept => 'Acceptar';
@override
String get next => 'Següent';
@override
String get settingsTitle => 'Configuració';
@override
String get language => 'Idioma';
@override
String get soundVolume => 'Volum d\'efectes';
@override
String get vibration => 'Vibració';
@override
String get about => 'Quant a';
@override
String get version => 'Versió';
@override
String get developer => 'Desenvolupador';
@override
String get licenses => 'Llicències';
}

View File

@@ -0,0 +1,479 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for German (`de`).
class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale);
@override
String get appTitle => 'Der Hochstapler';
@override
String get subtitle => 'Soziales Deduktionsspiel';
@override
String get loadingWords => 'Wörter werden geladen...';
@override
String get playersRange => '3-20 Spieler • Ohne Internet';
@override
String get createGame => 'Spiel erstellen';
@override
String get joinGame => 'Spiel beitreten';
@override
String get howToPlay => 'Spielanleitung';
@override
String get settings => 'Einstellungen';
@override
String get gameMode => 'Spielmodus';
@override
String get singleDevice => 'Ein Gerät';
@override
String get multiDevice => 'Mehrere Geräte';
@override
String get category => 'Kategorie';
@override
String get categoryAll => 'Alle';
@override
String get categoryAnimals => 'Tiere';
@override
String get categoryFood => 'Essen';
@override
String get categoryCountries => 'Länder';
@override
String get categorySports => 'Sport';
@override
String get categoryProfessions => 'Berufe';
@override
String get categoryObjects => 'Gegenstände';
@override
String get categoryPlaces => 'Orte';
@override
String get categoryMovies => 'Filme';
@override
String get categoryMusic => 'Musik';
@override
String get categoryTechnology => 'Technologie';
@override
String playersCount(int count) {
return 'Spieler ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Name des Spielers';
@override
String get playerAlreadyExists =>
'Ein Spieler mit diesem Namen existiert bereits';
@override
String get maxPlayersReached => 'Maximal 20 Spieler';
@override
String get minPlayersRequired => 'Mindestens 3 Spieler erforderlich';
@override
String get configuration => 'Konfiguration';
@override
String get impostors => '🎭 Hochstapler';
@override
String get impostorClue => '🔍 Hinweis für den Hochstapler';
@override
String get impostorClueDescription => 'Der Hochstapler kennt die Kategorie';
@override
String get debateTime => '⏱️ Diskussionszeit';
@override
String get noLimit => 'Kein Limit';
@override
String get oneMin => '1 Min';
@override
String get twoMin => '2 Min';
@override
String get threeMin => '3 Min';
@override
String get fiveMin => '5 Min';
@override
String get startGame => 'Spiel starten';
@override
String get seeYourWord => 'Dein Wort ansehen';
@override
String get eachPlayerMustSee =>
'Jeder Spieler muss sein Wort im Geheimen ansehen';
@override
String roundNumber(int round) {
return 'Runde $round';
}
@override
String get alreadySeen => 'Hat sein Wort bereits gesehen';
@override
String get tapToSee => 'Tippen zum Ansehen';
@override
String get allSeenStartDebate => 'Alle haben gesehen → Diskussion starten';
@override
String playersRemaining(int count) {
return 'Noch $count Spieler übrig';
}
@override
String get youAreImpostor => 'Du bist der Hochstapler!';
@override
String get yourWordIs => 'Dein Wort ist:';
@override
String clueCategory(String category) {
return 'Hinweis: $category';
}
@override
String get holdToSeeWord => 'Gedrückt halten, um dein Wort zu sehen';
@override
String get makeSureNoOneLooks =>
'Stelle sicher, dass niemand anderes hinschaut';
@override
String get showingWord => '👁️ Wird angezeigt...';
@override
String get holdToSee => '👆 Gedrückt halten zum Ansehen';
@override
String get seenMyWord => 'Ich habe mein Wort gesehen';
@override
String debateRound(int round) {
return 'Diskussion - Runde $round';
}
@override
String get timeUp => '⏰ Zeit abgelaufen!';
@override
String get timeRemaining => '⏱️ Verbleibende Zeit';
@override
String get playersInDebate => 'Spieler in der Diskussion';
@override
String activePlayersInfo(int active, int impostors) {
return '$active aktiv • $impostors versteckte(r) Hochstapler';
}
@override
String get eliminated => 'Ausgeschieden';
@override
String get notes => 'Notizen';
@override
String get goToVoting => 'Zur Abstimmung';
@override
String get voting => '🗳️ Abstimmung';
@override
String get turnToVote => 'Jetzt abstimmen:';
@override
String votesProgress(int current, int total) {
return 'Stimmen: $current/$total';
}
@override
String get whoIsImpostor => 'Wer ist deiner Meinung nach der Hochstapler?';
@override
String get confirmVote => 'Stimme bestätigen';
@override
String get votingComplete => '🗳️ Abstimmung abgeschlossen';
@override
String get allVoted => 'Alle haben abgestimmt!';
@override
String get tapToReveal => 'Tippen, um das Ergebnis aufzudecken';
@override
String get revealResult => 'Ergebnis aufdecken';
@override
String get result => 'Ergebnis';
@override
String get revealing => 'Wird aufgedeckt...';
@override
String get wasImpostor => 'War ein HOCHSTAPLER! 🎉';
@override
String get wasInnocent => 'War UNSCHULDIG 😱';
@override
String get votesThisRound => 'Stimmen dieser Runde';
@override
String get seeEndResult => 'Endergebnis anzeigen';
@override
String get impostorGuessWord => 'Errät der Hochstapler das Wort?';
@override
String get nextRound => 'Nächste Runde';
@override
String get impostorGuessTitle => '🎯 Tipp des Hochstaplers';
@override
String get impostorCanGuess =>
'Der ausgeschiedene Hochstapler kann\nversuchen, das Wort zu erraten';
@override
String get ifCorrectImpostorsWin =>
'Bei richtigem Tipp gewinnen die Hochstapler!';
@override
String get guessWordHint => 'Was glaubst du, ist das Wort?';
@override
String get dontGuess => 'Nicht versuchen';
@override
String get guess => 'Raten';
@override
String get correctGuess => 'Richtig geraten!';
@override
String theWordWas(String word) {
return 'Das Wort war: $word';
}
@override
String get impostorsWin => 'Die Hochstapler gewinnen!';
@override
String get wrongGuess => 'Falsch geraten!';
@override
String get gameContinues => 'Das Spiel geht weiter...';
@override
String get gameOver => 'Spielende';
@override
String get playersWin => 'Die Spieler gewinnen!';
@override
String get theSecretWordWas => '🔍 Das Wort war:';
@override
String categoryLabel(String category) {
return 'Kategorie: $category';
}
@override
String get theImpostorWas => '🎭 Der Hochstapler war:';
@override
String get theImpostorsWere => '🎭 Die Hochstapler waren:';
@override
String get votingHistory => '📊 Abstimmungsverlauf';
@override
String roundElimination(int round, String name) {
return 'Runde $round: $name';
}
@override
String get rematch => 'Revanche';
@override
String get mainMenu => 'Hauptmenü';
@override
String get notesTitle => '📝 Notizen';
@override
String get notesSaved => 'Notizen gespeichert';
@override
String get whoAreYou => 'Wer bist du?';
@override
String get selectYourName =>
'Wähle deinen Namen, um deine privaten Notizen zu sehen';
@override
String notesOf(String name) {
return 'Notizen von $name';
}
@override
String get notesAboutPlayers => 'Notizen zu jedem Spieler';
@override
String get playerNoteHint => 'Was hat er/sie gesagt? Verdächtig?';
@override
String get freeNote => 'Freie Notiz';
@override
String get freeNoteHint => 'Persönliche Notizen...';
@override
String get rulesTitle => '📖 Spielanleitung';
@override
String get rulesWhatIsTitle => '🎭 Was ist Der Hochstapler?';
@override
String get rulesWhatIsBody =>
'Ein soziales Deduktionsspiel für 3-20 Spieler. Alle erhalten ein geheimes Wort... außer der Hochstapler! Deine Mission: herausfinden, wer blufft.';
@override
String get rulesHowToPlayTitle => '🔍 Wie wird gespielt?';
@override
String get rulesHowToPlayBody =>
'1. Die Rollen werden verteilt: Alle erhalten dasselbe Wort, außer der/die Hochstapler.\n\n2. Diskussion: Reihum beschreibt jeder Spieler das Wort, OHNE es direkt zu sagen. Der Hochstapler muss so tun, als ob er es kennt.\n\n3. Abstimmung: Nach der Diskussion stimmen alle ab, wer ihrer Meinung nach der Hochstapler ist.\n\n4. Ausscheiden: Der Spieler mit den meisten Stimmen scheidet aus und es wird aufgedeckt, ob er der Hochstapler war oder nicht.\n\n5. War es der Hochstapler, darf er versuchen, das Wort zu erraten. Bei richtigem Tipp gewinnen die Hochstapler!';
@override
String get rulesWhoWinsTitle => '🏆 Wer gewinnt?';
@override
String get rulesWhoWinsBody =>
'• Spieler: gewinnen, wenn sie ALLE Hochstapler entlarven.\n• Hochstapler: gewinnen, wenn sie nicht entdeckt werden, bis gleich viele oder weniger normale Spieler als Hochstapler übrig sind, oder wenn sie beim Ausscheiden das Wort erraten.';
@override
String get rulesTipsPlayersTitle => '💡 Tipps für Spieler';
@override
String get rulesTipsPlayersBody =>
'• Gib subtile Hinweise, die zeigen, dass du das Wort kennst, aber nicht so offensichtlich, dass der Hochstapler sie nutzen kann.\n• Achte darauf, wer vage oder allgemeine Antworten gibt.\n• Nutze die Notizen, um aufzuschreiben, was jeder sagt.\n• Sage das Wort nicht direkt, das hilft dem Hochstapler!';
@override
String get rulesTipsImpostorTitle => '🎭 Tipps für den Hochstapler';
@override
String get rulesTipsImpostorBody =>
'• Höre aufmerksam auf die Hinweise der anderen.\n• Versuche das Wort zu erraten, um glaubwürdige Hinweise zu geben.\n• Sprich nicht als Erster, wenn du dir unsicher bist.\n• Wenn du die Kategorie als Hinweis bekommst, nutze sie zu deinem Vorteil.\n• Beschuldige andere, um die Aufmerksamkeit abzulenken.';
@override
String get rulesModesTitle => '📱 Spielmodi';
@override
String get rulesModesBody =>
'• Ein Gerät: Alle teilen sich das Gerät. Jeder Spieler sieht sein Wort, indem er einen Button gedrückt hält.\n\n• Mehrere Geräte: Jeder Spieler nutzt sein eigenes Gerät. Die Verbindung erfolgt über Bluetooth/WiFi Direct ohne Internetzugang.';
@override
String get rulesExampleTitle => '✏️ Beispielrunde';
@override
String get rulesExampleBody =>
'Geheimes Wort: \"Pizza\"\n\n• Lisa: \"Man isst es warm\"\n• Max: \"Kommt in einer Schachtel\"\n• Nina (Hochstapler): \"Ist sehr beliebt\" 🤔\n• Felix: \"Hat Käse drauf\"\n\nNina gab eine sehr allgemeine Antwort... Verdächtig!';
@override
String get joinGameTitle => 'Spiel beitreten';
@override
String get multiDeviceMode => 'Mehrere-Geräte-Modus';
@override
String get scanQrDescription =>
'Scanne den QR-Code des Hosts, um der Partie über Bluetooth/WiFi Direct beizutreten.';
@override
String get comingSoon => 'Demnächst';
@override
String get nearbyNotAvailable =>
'Die Mehrgeräte-Verbindung mit Nearby Connections erfordert physische Android-Geräte.\n\nVerwende vorerst den Modus \"Ein Gerät\", um auf einem gemeinsamen Gerät zu spielen.';
@override
String get back => 'Zurück';
@override
String get yes => 'Ja';
@override
String get no => 'Nein';
@override
String get cancel => 'Abbrechen';
@override
String get accept => 'Akzeptieren';
@override
String get next => 'Weiter';
@override
String get settingsTitle => 'Einstellungen';
@override
String get language => 'Sprache';
@override
String get soundVolume => 'Effektlautstärke';
@override
String get vibration => 'Vibration';
@override
String get about => 'Über';
@override
String get version => 'Version';
@override
String get developer => 'Entwickler';
@override
String get licenses => 'Lizenzen';
}

View File

@@ -0,0 +1,474 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get appTitle => 'The Impostor';
@override
String get subtitle => 'Social deduction game';
@override
String get loadingWords => 'Loading words...';
@override
String get playersRange => '3-20 players • No internet needed';
@override
String get createGame => 'Create game';
@override
String get joinGame => 'Join game';
@override
String get howToPlay => 'How to play';
@override
String get settings => 'Settings';
@override
String get gameMode => 'Game mode';
@override
String get singleDevice => 'Single device';
@override
String get multiDevice => 'Multi-device';
@override
String get category => 'Category';
@override
String get categoryAll => 'All';
@override
String get categoryAnimals => 'Animals';
@override
String get categoryFood => 'Food';
@override
String get categoryCountries => 'Countries';
@override
String get categorySports => 'Sports';
@override
String get categoryProfessions => 'Professions';
@override
String get categoryObjects => 'Objects';
@override
String get categoryPlaces => 'Places';
@override
String get categoryMovies => 'Movies';
@override
String get categoryMusic => 'Music';
@override
String get categoryTechnology => 'Technology';
@override
String playersCount(int count) {
return 'Players ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Player name';
@override
String get playerAlreadyExists => 'A player with that name already exists';
@override
String get maxPlayersReached => 'Maximum 20 players';
@override
String get minPlayersRequired => 'At least 3 players are needed';
@override
String get configuration => 'Configuration';
@override
String get impostors => '🎭 Impostors';
@override
String get impostorClue => '🔍 Clue for impostor';
@override
String get impostorClueDescription => 'The impostor knows the category';
@override
String get debateTime => '⏱️ Discussion time';
@override
String get noLimit => 'No limit';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Start game';
@override
String get seeYourWord => 'See your word';
@override
String get eachPlayerMustSee => 'Each player must see their word in secret';
@override
String roundNumber(int round) {
return 'Round $round';
}
@override
String get alreadySeen => 'Already seen their word';
@override
String get tapToSee => 'Tap to see';
@override
String get allSeenStartDebate => 'Everyone has seen → Start discussion';
@override
String playersRemaining(int count) {
return '$count players remaining';
}
@override
String get youAreImpostor => 'You are the impostor!';
@override
String get yourWordIs => 'Your word is:';
@override
String clueCategory(String category) {
return 'Clue: $category';
}
@override
String get holdToSeeWord => 'Hold to see your word';
@override
String get makeSureNoOneLooks => 'Make sure no one else is looking';
@override
String get showingWord => '👁️ Showing...';
@override
String get holdToSee => '👆 Hold to see';
@override
String get seenMyWord => 'I\'ve seen my word';
@override
String debateRound(int round) {
return 'Discussion - Round $round';
}
@override
String get timeUp => '⏰ Time\'s up!';
@override
String get timeRemaining => '⏱️ Time remaining';
@override
String get playersInDebate => 'Players in discussion';
@override
String activePlayersInfo(int active, int impostors) {
return '$active active • $impostors hidden impostor(s)';
}
@override
String get eliminated => 'Eliminated';
@override
String get notes => 'Notes';
@override
String get goToVoting => 'Go to voting';
@override
String get voting => '🗳️ Voting';
@override
String get turnToVote => 'Your turn to vote:';
@override
String votesProgress(int current, int total) {
return 'Votes: $current/$total';
}
@override
String get whoIsImpostor => 'Who do you think is the impostor?';
@override
String get confirmVote => 'Confirm vote';
@override
String get votingComplete => '🗳️ Voting complete';
@override
String get allVoted => 'Everyone has voted!';
@override
String get tapToReveal => 'Tap to reveal the result';
@override
String get revealResult => 'Reveal result';
@override
String get result => 'Result';
@override
String get revealing => 'Revealing...';
@override
String get wasImpostor => 'Was the IMPOSTOR! 🎉';
@override
String get wasInnocent => 'Was INNOCENT 😱';
@override
String get votesThisRound => 'Votes this round';
@override
String get seeEndResult => 'See final result';
@override
String get impostorGuessWord => 'Can the impostor guess the word?';
@override
String get nextRound => 'Next round';
@override
String get impostorGuessTitle => '🎯 Impostor\'s guess';
@override
String get impostorCanGuess =>
'The eliminated impostor can\ntry to guess the word';
@override
String get ifCorrectImpostorsWin => 'If correct, the impostors win!';
@override
String get guessWordHint => 'What do you think the word is?';
@override
String get dontGuess => 'Don\'t guess';
@override
String get guess => 'Guess';
@override
String get correctGuess => 'Correct guess!';
@override
String theWordWas(String word) {
return 'The word was: $word';
}
@override
String get impostorsWin => 'The impostors win!';
@override
String get wrongGuess => 'Wrong guess!';
@override
String get gameContinues => 'The game continues...';
@override
String get gameOver => 'Game over';
@override
String get playersWin => 'The players win!';
@override
String get theSecretWordWas => '🔍 The word was:';
@override
String categoryLabel(String category) {
return 'Category: $category';
}
@override
String get theImpostorWas => '🎭 The impostor was:';
@override
String get theImpostorsWere => '🎭 The impostors were:';
@override
String get votingHistory => '📊 Voting history';
@override
String roundElimination(int round, String name) {
return 'Round $round: $name';
}
@override
String get rematch => 'Rematch';
@override
String get mainMenu => 'Main menu';
@override
String get notesTitle => '📝 Notes';
@override
String get notesSaved => 'Notes saved';
@override
String get whoAreYou => 'Who are you?';
@override
String get selectYourName => 'Select your name to view your private notes';
@override
String notesOf(String name) {
return '$name\'s notes';
}
@override
String get notesAboutPlayers => 'Notes about each player';
@override
String get playerNoteHint => 'What did they say? Suspicious?';
@override
String get freeNote => 'Free note';
@override
String get freeNoteHint => 'Personal notes...';
@override
String get rulesTitle => '📖 How to play';
@override
String get rulesWhatIsTitle => '🎭 What is The Impostor?';
@override
String get rulesWhatIsBody =>
'A social deduction game for 3-20 players. Everyone receives a secret word... except the impostor! Your mission: figure out who\'s faking it.';
@override
String get rulesHowToPlayTitle => '🔍 How do you play?';
@override
String get rulesHowToPlayBody =>
'1. Roles are dealt: everyone receives the same word, except the impostor(s).\n\n2. Discussion: taking turns, each player describes the word WITHOUT saying it directly. The impostor must pretend they know it.\n\n3. Voting: once the discussion ends, everyone votes on who they think the impostor is.\n\n4. Elimination: the player with the most votes is eliminated and it is revealed whether they were the impostor or not.\n\n5. If they were the impostor, they can try to guess the word. If they get it right, the impostors win!';
@override
String get rulesWhoWinsTitle => '🏆 Who wins?';
@override
String get rulesWhoWinsBody =>
'• Players: win by eliminating ALL impostors.\n• Impostors: win if they remain undiscovered until there are equal or fewer regular players than impostors, or if they guess the word when eliminated.';
@override
String get rulesTipsPlayersTitle => '💡 Tips for players';
@override
String get rulesTipsPlayersBody =>
'• Give subtle clues that prove you know the word, but not so obvious that the impostor can use them.\n• Watch for vague or generic answers.\n• Use the notes to jot down what everyone says.\n• Don\'t say the word directly — that helps the impostor!';
@override
String get rulesTipsImpostorTitle => '🎭 Tips for the impostor';
@override
String get rulesTipsImpostorBody =>
'• Listen carefully to the others\' clues.\n• Try to deduce the word so you can give believable clues.\n• Don\'t be the first to speak if you\'re unsure.\n• If you\'re given the category as a clue, use it to your advantage.\n• Accuse others to divert attention.';
@override
String get rulesModesTitle => '📱 Game modes';
@override
String get rulesModesBody =>
'• Single device: everyone shares the device. Each player sees their word by pressing and holding a button.\n\n• Multi-device: each player uses their own device. They connect via Bluetooth/WiFi Direct with no internet needed.';
@override
String get rulesExampleTitle => '✏️ Example round';
@override
String get rulesExampleBody =>
'Secret word: \"Pizza\"\n\n• Anna: \"You eat it hot\"\n• Charles: \"It comes in a box\"\n• Eve (impostor): \"It\'s very popular\" 🤔\n• David: \"It has cheese\"\n\nEve gave a very generic answer... Suspicious!';
@override
String get joinGameTitle => 'Join game';
@override
String get multiDeviceMode => 'Multi-device mode';
@override
String get scanQrDescription =>
'Scan the QR code shown by the host to connect to the game via Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Coming soon';
@override
String get nearbyNotAvailable =>
'Multi-device connection with Nearby Connections requires physical Android devices.\n\nFor now, use the \"Single device\" mode to play on a shared device.';
@override
String get back => 'Back';
@override
String get yes => 'Yes';
@override
String get no => 'No';
@override
String get cancel => 'Cancel';
@override
String get accept => 'Accept';
@override
String get next => 'Next';
@override
String get settingsTitle => 'Settings';
@override
String get language => 'Language';
@override
String get soundVolume => 'Sound effects volume';
@override
String get vibration => 'Vibration';
@override
String get about => 'About';
@override
String get version => 'Version';
@override
String get developer => 'Developer';
@override
String get licenses => 'Licenses';
}

View File

@@ -0,0 +1,475 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Spanish Castilian (`es`).
class AppLocalizationsEs extends AppLocalizations {
AppLocalizationsEs([String locale = 'es']) : super(locale);
@override
String get appTitle => 'El Impostor';
@override
String get subtitle => 'Juego de deducción social';
@override
String get loadingWords => 'Cargando palabras...';
@override
String get playersRange => '3-20 jugadores • Sin internet';
@override
String get createGame => 'Crear partida';
@override
String get joinGame => 'Unirse a partida';
@override
String get howToPlay => 'Cómo jugar';
@override
String get settings => 'Ajustes';
@override
String get gameMode => 'Modo de juego';
@override
String get singleDevice => 'Un solo móvil';
@override
String get multiDevice => 'Multimóvil';
@override
String get category => 'Categoría';
@override
String get categoryAll => 'Todas';
@override
String get categoryAnimals => 'Animales';
@override
String get categoryFood => 'Comida';
@override
String get categoryCountries => 'Países';
@override
String get categorySports => 'Deportes';
@override
String get categoryProfessions => 'Profesiones';
@override
String get categoryObjects => 'Objetos';
@override
String get categoryPlaces => 'Lugares';
@override
String get categoryMovies => 'Películas';
@override
String get categoryMusic => 'Música';
@override
String get categoryTechnology => 'Tecnología';
@override
String playersCount(int count) {
return 'Jugadores ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Nombre del jugador';
@override
String get playerAlreadyExists => 'Ya existe un jugador con ese nombre';
@override
String get maxPlayersReached => 'Máximo 20 jugadores';
@override
String get minPlayersRequired => 'Se necesitan al menos 3 jugadores';
@override
String get configuration => 'Configuración';
@override
String get impostors => '🎭 Impostores';
@override
String get impostorClue => '🔍 Pista para impostor';
@override
String get impostorClueDescription => 'El impostor conoce la categoría';
@override
String get debateTime => '⏱️ Tiempo de debate';
@override
String get noLimit => 'Sin límite';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Iniciar partida';
@override
String get seeYourWord => 'Ver tu palabra';
@override
String get eachPlayerMustSee => 'Cada jugador debe ver su palabra en secreto';
@override
String roundNumber(int round) {
return 'Ronda $round';
}
@override
String get alreadySeen => 'Ya ha visto su palabra';
@override
String get tapToSee => 'Pulsa para ver';
@override
String get allSeenStartDebate => 'Todos han visto → Iniciar debate';
@override
String playersRemaining(int count) {
return 'Faltan $count jugadores';
}
@override
String get youAreImpostor => '¡Eres el impostor!';
@override
String get yourWordIs => 'Tu palabra es:';
@override
String clueCategory(String category) {
return 'Pista: $category';
}
@override
String get holdToSeeWord => 'Mantén pulsado para ver tu palabra';
@override
String get makeSureNoOneLooks => 'Asegúrate de que nadie más mira';
@override
String get showingWord => '👁️ Mostrando...';
@override
String get holdToSee => '👆 Mantén pulsado para ver';
@override
String get seenMyWord => 'He visto mi palabra';
@override
String debateRound(int round) {
return 'Debate - Ronda $round';
}
@override
String get timeUp => '⏰ ¡Tiempo agotado!';
@override
String get timeRemaining => '⏱️ Tiempo restante';
@override
String get playersInDebate => 'Jugadores en debate';
@override
String activePlayersInfo(int active, int impostors) {
return '$active activos • $impostors impostor(es) ocultos';
}
@override
String get eliminated => 'Eliminado';
@override
String get notes => 'Notas';
@override
String get goToVoting => 'Ir a votación';
@override
String get voting => '🗳️ Votación';
@override
String get turnToVote => 'Turno de votar:';
@override
String votesProgress(int current, int total) {
return 'Votos: $current/$total';
}
@override
String get whoIsImpostor => '¿Quién crees que es el impostor?';
@override
String get confirmVote => 'Confirmar voto';
@override
String get votingComplete => '🗳️ Votación completa';
@override
String get allVoted => '¡Todos han votado!';
@override
String get tapToReveal => 'Pulsa para revelar el resultado';
@override
String get revealResult => 'Revelar resultado';
@override
String get result => 'Resultado';
@override
String get revealing => 'Revelando...';
@override
String get wasImpostor => '¡Era IMPOSTOR! 🎉';
@override
String get wasInnocent => 'Era INOCENTE 😱';
@override
String get votesThisRound => 'Votos de esta ronda';
@override
String get seeEndResult => 'Ver resultado final';
@override
String get impostorGuessWord => '¿El impostor adivina la palabra?';
@override
String get nextRound => 'Siguiente ronda';
@override
String get impostorGuessTitle => '🎯 Adivinanza del impostor';
@override
String get impostorCanGuess =>
'El impostor eliminado puede\nintentar adivinar la palabra';
@override
String get ifCorrectImpostorsWin => 'Si acierta, ¡los impostores ganan!';
@override
String get guessWordHint => '¿Cuál crees que es la palabra?';
@override
String get dontGuess => 'No intentar';
@override
String get guess => 'Adivinar';
@override
String get correctGuess => '¡Ha acertado!';
@override
String theWordWas(String word) {
return 'La palabra era: $word';
}
@override
String get impostorsWin => '¡Los impostores ganan!';
@override
String get wrongGuess => '¡No ha acertado!';
@override
String get gameContinues => 'La partida continúa...';
@override
String get gameOver => 'Fin de partida';
@override
String get playersWin => '¡Los jugadores ganan!';
@override
String get theSecretWordWas => '🔍 La palabra era:';
@override
String categoryLabel(String category) {
return 'Categoría: $category';
}
@override
String get theImpostorWas => '🎭 El impostor era:';
@override
String get theImpostorsWere => '🎭 Los impostores eran:';
@override
String get votingHistory => '📊 Historial de votaciones';
@override
String roundElimination(int round, String name) {
return 'Ronda $round: $name';
}
@override
String get rematch => 'Revancha';
@override
String get mainMenu => 'Menú principal';
@override
String get notesTitle => '📝 Notas';
@override
String get notesSaved => 'Notas guardadas';
@override
String get whoAreYou => '¿Quién eres?';
@override
String get selectYourName =>
'Selecciona tu nombre para ver tus notas privadas';
@override
String notesOf(String name) {
return 'Notas de $name';
}
@override
String get notesAboutPlayers => 'Apuntes sobre cada jugador';
@override
String get playerNoteHint => '¿Qué ha dicho? ¿Sospechoso?';
@override
String get freeNote => 'Nota libre';
@override
String get freeNoteHint => 'Apuntes personales...';
@override
String get rulesTitle => '📖 Cómo jugar';
@override
String get rulesWhatIsTitle => '🎭 ¿Qué es El Impostor?';
@override
String get rulesWhatIsBody =>
'Un juego de deducción social para 3-20 jugadores. Todos reciben una palabra secreta... ¡excepto el impostor! Tu misión: descubrir quién finge.';
@override
String get rulesHowToPlayTitle => '🔍 ¿Cómo se juega?';
@override
String get rulesHowToPlayBody =>
'1. Se reparten los roles: todos reciben la misma palabra, excepto el/los impostores.\n\n2. Debate: por turnos, cada jugador describe la palabra SIN decirla directamente. El impostor debe fingir que la conoce.\n\n3. Votación: al terminar el debate, todos votan a quién creen que es el impostor.\n\n4. Eliminación: el más votado queda eliminado y se revela si era impostor o no.\n\n5. Si era impostor, puede intentar adivinar la palabra. Si acierta, ¡los impostores ganan!';
@override
String get rulesWhoWinsTitle => '🏆 ¿Quién gana?';
@override
String get rulesWhoWinsBody =>
'• Jugadores: ganan si eliminan a TODOS los impostores.\n• Impostores: ganan si no son descubiertos hasta que queden igual o menos jugadores normales que impostores, o si adivinan la palabra al ser eliminados.';
@override
String get rulesTipsPlayersTitle => '💡 Consejos para jugadores';
@override
String get rulesTipsPlayersBody =>
'• Da pistas sutiles que demuestren que conoces la palabra, pero no tan obvias que el impostor las use.\n• Observa quién da respuestas vagas o genéricas.\n• Usa las notas para apuntar lo que dice cada uno.\n• No digas la palabra directamente, ¡eso ayuda al impostor!';
@override
String get rulesTipsImpostorTitle => '🎭 Consejos para el impostor';
@override
String get rulesTipsImpostorBody =>
'• Escucha atentamente las pistas de los demás.\n• Intenta deducir la palabra para dar pistas creíbles.\n• No seas el primero en hablar si no estás seguro.\n• Si te dan la categoría como pista, úsala a tu favor.\n• Acusa a otros para desviar la atención.';
@override
String get rulesModesTitle => '📱 Modos de juego';
@override
String get rulesModesBody =>
'• Un solo móvil: todos comparten el dispositivo. Cada jugador ve su palabra pulsando y manteniendo un botón.\n\n• Multimóvil: cada jugador usa su propio dispositivo. Se conectan por Bluetooth/WiFi Direct sin necesidad de internet.';
@override
String get rulesExampleTitle => '✏️ Ejemplo de partida';
@override
String get rulesExampleBody =>
'Palabra secreta: \"Pizza\"\n\n• Ana: \"Se come caliente\"\n• Carlos: \"Viene en una caja\"\n• Eva (impostor): \"Es muy popular\" 🤔\n• David: \"Tiene queso\"\n\nEva dio una respuesta muy genérica... ¡Sospechosa!';
@override
String get joinGameTitle => 'Unirse a partida';
@override
String get multiDeviceMode => 'Modo multimóvil';
@override
String get scanQrDescription =>
'Escanea el código QR que muestra el host para conectarte a la partida vía Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Próximamente';
@override
String get nearbyNotAvailable =>
'La conexión multimóvil con Nearby Connections requiere dispositivos Android físicos.\n\nPor ahora, usa el modo \"Un solo móvil\" para jugar en un dispositivo compartido.';
@override
String get back => 'Volver';
@override
String get yes => '';
@override
String get no => 'No';
@override
String get cancel => 'Cancelar';
@override
String get accept => 'Aceptar';
@override
String get next => 'Siguiente';
@override
String get settingsTitle => 'Ajustes';
@override
String get language => 'Idioma';
@override
String get soundVolume => 'Volumen de efectos';
@override
String get vibration => 'Vibración';
@override
String get about => 'Acerca de';
@override
String get version => 'Versión';
@override
String get developer => 'Desarrollador';
@override
String get licenses => 'Licencias';
}

View File

@@ -0,0 +1,478 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Basque (`eu`).
class AppLocalizationsEu extends AppLocalizations {
AppLocalizationsEu([String locale = 'eu']) : super(locale);
@override
String get appTitle => 'Inpostorrea';
@override
String get subtitle => 'Dedukzio sozialeko jokoa';
@override
String get loadingWords => 'Hitzak kargatzen...';
@override
String get playersRange => '3-20 jokalari • Internetik gabe';
@override
String get createGame => 'Partida sortu';
@override
String get joinGame => 'Partidara batu';
@override
String get howToPlay => 'Nola jolastu';
@override
String get settings => 'Ezarpenak';
@override
String get gameMode => 'Joko-modua';
@override
String get singleDevice => 'Mugikor bakarra';
@override
String get multiDevice => 'Mugikor anitz';
@override
String get category => 'Kategoria';
@override
String get categoryAll => 'Denak';
@override
String get categoryAnimals => 'Animaliak';
@override
String get categoryFood => 'Janaria';
@override
String get categoryCountries => 'Herrialdeak';
@override
String get categorySports => 'Kirolak';
@override
String get categoryProfessions => 'Lanbideak';
@override
String get categoryObjects => 'Objektuak';
@override
String get categoryPlaces => 'Lekuak';
@override
String get categoryMovies => 'Filmak';
@override
String get categoryMusic => 'Musika';
@override
String get categoryTechnology => 'Teknologia';
@override
String playersCount(int count) {
return 'Jokalariak ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Jokalariaren izena';
@override
String get playerAlreadyExists =>
'Izen hori duen jokalari bat badago dagoeneko';
@override
String get maxPlayersReached => 'Gehienez 20 jokalari';
@override
String get minPlayersRequired => 'Gutxienez 3 jokalari behar dira';
@override
String get configuration => 'Konfigurazioa';
@override
String get impostors => '🎭 Inpostoreak';
@override
String get impostorClue => '🔍 Inpostorearentzako pista';
@override
String get impostorClueDescription => 'Inpostoreak kategoria ezagutzen du';
@override
String get debateTime => '⏱️ Eztabaida-denbora';
@override
String get noLimit => 'Mugarik gabe';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Partida hasi';
@override
String get seeYourWord => 'Ikusi zure hitza';
@override
String get eachPlayerMustSee =>
'Jokalari bakoitzak bere hitza ezkutuan ikusi behar du';
@override
String roundNumber(int round) {
return '$round. txanda';
}
@override
String get alreadySeen => 'Bere hitza ikusi du dagoeneko';
@override
String get tapToSee => 'Sakatu ikusteko';
@override
String get allSeenStartDebate => 'Denek ikusi dute → Eztabaida hasi';
@override
String playersRemaining(int count) {
return '$count jokalari falta dira';
}
@override
String get youAreImpostor => 'Inpostorea zara!';
@override
String get yourWordIs => 'Zure hitza da:';
@override
String clueCategory(String category) {
return 'Pista: $category';
}
@override
String get holdToSeeWord => 'Sakatuta eduki zure hitza ikusteko';
@override
String get makeSureNoOneLooks =>
'Ziurtatu inor gehiago ez dagoela begiratzen';
@override
String get showingWord => '👁️ Erakusten...';
@override
String get holdToSee => '👆 Sakatuta eduki ikusteko';
@override
String get seenMyWord => 'Nire hitza ikusi dut';
@override
String debateRound(int round) {
return 'Eztabaida - $round. txanda';
}
@override
String get timeUp => '⏰ Denbora agortu da!';
@override
String get timeRemaining => '⏱️ Geratzen den denbora';
@override
String get playersInDebate => 'Eztabaidan diren jokalariak';
@override
String activePlayersInfo(int active, int impostors) {
return '$active aktibo • $impostors inpostore ezkutu';
}
@override
String get eliminated => 'Kanporatua';
@override
String get notes => 'Oharrak';
@override
String get goToVoting => 'Bozkatzera joan';
@override
String get voting => '🗳️ Bozketa';
@override
String get turnToVote => 'Bozkatze-txanda:';
@override
String votesProgress(int current, int total) {
return 'Botoak: $current/$total';
}
@override
String get whoIsImpostor => 'Nor da inpostorea zure ustez?';
@override
String get confirmVote => 'Botoa berretsi';
@override
String get votingComplete => '🗳️ Bozketa osatua';
@override
String get allVoted => 'Denek bozka eman dute!';
@override
String get tapToReveal => 'Sakatu emaitza agertzeko';
@override
String get revealResult => 'Emaitza agertu';
@override
String get result => 'Emaitza';
@override
String get revealing => 'Agertzen...';
@override
String get wasImpostor => 'INPOSTOREA zen! 🎉';
@override
String get wasInnocent => 'ERRUGABEA zen 😱';
@override
String get votesThisRound => 'Txanda honetako botoak';
@override
String get seeEndResult => 'Azken emaitza ikusi';
@override
String get impostorGuessWord => 'Inpostoreak hitza asmatzen du?';
@override
String get nextRound => 'Hurrengo txanda';
@override
String get impostorGuessTitle => '🎯 Inpostorearen asmaketa';
@override
String get impostorCanGuess =>
'Kanporatutako inpostoreak\nhitza asmatzen saia daiteke';
@override
String get ifCorrectImpostorsWin =>
'Asmatzen badu, inpostoreek irabazten dute!';
@override
String get guessWordHint => 'Zein da hitza zure ustez?';
@override
String get dontGuess => 'Ez saiatu';
@override
String get guess => 'Asmatu';
@override
String get correctGuess => 'Asmatu du!';
@override
String theWordWas(String word) {
return 'Hitza zen: $word';
}
@override
String get impostorsWin => 'Inpostoreek irabazi dute!';
@override
String get wrongGuess => 'Ez du asmatu!';
@override
String get gameContinues => 'Partida jarraitzen du...';
@override
String get gameOver => 'Partidaren amaiera';
@override
String get playersWin => 'Jokalariek irabazi dute!';
@override
String get theSecretWordWas => '🔍 Hitza zen:';
@override
String categoryLabel(String category) {
return 'Kategoria: $category';
}
@override
String get theImpostorWas => '🎭 Inpostorea zen:';
@override
String get theImpostorsWere => '🎭 Inpostoreak ziren:';
@override
String get votingHistory => '📊 Bozketen historia';
@override
String roundElimination(int round, String name) {
return '$round. txanda: $name';
}
@override
String get rematch => 'Errebantxa';
@override
String get mainMenu => 'Menu nagusia';
@override
String get notesTitle => '📝 Oharrak';
@override
String get notesSaved => 'Oharrak gordeta';
@override
String get whoAreYou => 'Nor zara?';
@override
String get selectYourName => 'Aukeratu zure izena ohar pribatuak ikusteko';
@override
String notesOf(String name) {
return '$name-(r)en oharrak';
}
@override
String get notesAboutPlayers => 'Jokalari bakoitzari buruzko apunteak';
@override
String get playerNoteHint => 'Zer esan du? Susmagarria?';
@override
String get freeNote => 'Ohar librea';
@override
String get freeNoteHint => 'Apunte pertsonalak...';
@override
String get rulesTitle => '📖 Nola jolastu';
@override
String get rulesWhatIsTitle => '🎭 Zer da Inpostorrea?';
@override
String get rulesWhatIsBody =>
'3-20 jokalarientzako dedukzio sozialeko jokoa. Denek hitz sekretu bat jasotzen dute... inpostorea izan ezik! Zure misioa: nor ari den itxurak egiten aurkitzea.';
@override
String get rulesHowToPlayTitle => '🔍 Nola jolasten da?';
@override
String get rulesHowToPlayBody =>
'1. Rolak banatzen dira: denek hitz bera jasotzen dute, inpostorea/inpostoreak izan ezik.\n\n2. Eztabaida: txandaka, jokalari bakoitzak hitza deskribatzen du zuzenean ESAN gabe. Inpostoreak ezagutzen duela itxurak egin behar du.\n\n3. Bozketa: eztabaida amaitzean, denek bozkatzen dute nor den inpostorea uste duten.\n\n4. Kanporatzea: boto gehien dituena kanporatua geratzen da eta inpostorea zen ala ez agertzen da.\n\n5. Inpostorea bazen, hitza asmatzen saia daiteke. Asmatzen badu, inpostoreek irabazten dute!';
@override
String get rulesWhoWinsTitle => '🏆 Nork irabazten du?';
@override
String get rulesWhoWinsBody =>
'• Jokalariak: irabazten dute inpostore GUZTIAK kanporatzen badituzte.\n• Inpostoreak: irabazten dute aurkitu gabe jarraitzen badute jokalari arruntak inpostore adina edo gutxiago diren arte, edo hitza asmatzen badute kanporatu ondoren.';
@override
String get rulesTipsPlayersTitle => '💡 Jokalarientzako aholkuak';
@override
String get rulesTipsPlayersBody =>
'• Eman hitza ezagutzen duzula erakusten duten pista sotilak, baina ez hain argiak inpostoreak erabil ditzan.\n• Begiratu nork ematen dituen erantzun lausoak edo generikoak.\n• Erabili oharrak bakoitzak zer esaten duen apuntatzeko.\n• Ez esan hitza zuzenean, horrek inpostoreari laguntzen dio!';
@override
String get rulesTipsImpostorTitle => '🎭 Inpostorearentzako aholkuak';
@override
String get rulesTipsImpostorBody =>
'• Entzun arretaz besteen pistak.\n• Saiatu hitza deduzitzen pista sinesgarriak emateko.\n• Ez izan lehena hitz egiten ziur ez bazaude.\n• Kategoria pista gisa ematen badizute, erabili zure alde.\n• Salatu besteak arreta desbideratzeko.';
@override
String get rulesModesTitle => '📱 Joko-moduak';
@override
String get rulesModesBody =>
'• Mugikor bakarra: denek gailua partekatzen dute. Jokalari bakoitzak bere hitza ikusten du botoi bat sakatuta edukiz.\n\n• Mugikor anitz: jokalari bakoitzak bere gailua erabiltzen du. Bluetooth/WiFi Direct bidez konektatzen dira internetik behartu gabe.';
@override
String get rulesExampleTitle => '✏️ Partida-adibidea';
@override
String get rulesExampleBody =>
'Hitz sekretua: \"Pizza\"\n\n• Ane: \"Beroa jaten da\"\n• Mikel: \"Kutxa batean dator\"\n• Irati (inpostorea): \"Oso ezaguna da\" 🤔\n• Unai: \"Gazta dauka\"\n\nIratik erantzun oso generikoa eman zuen... Susmagarria!';
@override
String get joinGameTitle => 'Partidara batu';
@override
String get multiDeviceMode => 'Mugikor anitzeko modua';
@override
String get scanQrDescription =>
'Eskaneatu ostalariak erakusten duen QR kodea partidara Bluetooth/WiFi Direct bidez konektatzeko.';
@override
String get comingSoon => 'Laster';
@override
String get nearbyNotAvailable =>
'Mugikor anitzeko konexioak Nearby Connections-ekin Android gailu fisikoak behar ditu.\n\nOraingoz, erabili \"Mugikor bakarra\" modua gailu partekatuan jolasteko.';
@override
String get back => 'Atzera';
@override
String get yes => 'Bai';
@override
String get no => 'Ez';
@override
String get cancel => 'Ezeztatu';
@override
String get accept => 'Onartu';
@override
String get next => 'Hurrengoa';
@override
String get settingsTitle => 'Ezarpenak';
@override
String get language => 'Hizkuntza';
@override
String get soundVolume => 'Efektuen bolumena';
@override
String get vibration => 'Bibrazioa';
@override
String get about => 'Honi buruz';
@override
String get version => 'Bertsioa';
@override
String get developer => 'Garatzailea';
@override
String get licenses => 'Lizentziak';
}

View File

@@ -0,0 +1,476 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for French (`fr`).
class AppLocalizationsFr extends AppLocalizations {
AppLocalizationsFr([String locale = 'fr']) : super(locale);
@override
String get appTitle => 'L\'Imposteur';
@override
String get subtitle => 'Jeu de déduction sociale';
@override
String get loadingWords => 'Chargement des mots...';
@override
String get playersRange => '3-20 joueurs • Sans internet';
@override
String get createGame => 'Créer une partie';
@override
String get joinGame => 'Rejoindre une partie';
@override
String get howToPlay => 'Comment jouer';
@override
String get settings => 'Paramètres';
@override
String get gameMode => 'Mode de jeu';
@override
String get singleDevice => 'Un seul téléphone';
@override
String get multiDevice => 'Multi-téléphone';
@override
String get category => 'Catégorie';
@override
String get categoryAll => 'Toutes';
@override
String get categoryAnimals => 'Animaux';
@override
String get categoryFood => 'Nourriture';
@override
String get categoryCountries => 'Pays';
@override
String get categorySports => 'Sports';
@override
String get categoryProfessions => 'Métiers';
@override
String get categoryObjects => 'Objets';
@override
String get categoryPlaces => 'Lieux';
@override
String get categoryMovies => 'Films';
@override
String get categoryMusic => 'Musique';
@override
String get categoryTechnology => 'Technologie';
@override
String playersCount(int count) {
return 'Joueurs ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Nom du joueur';
@override
String get playerAlreadyExists => 'Un joueur avec ce nom existe déjà';
@override
String get maxPlayersReached => 'Maximum 20 joueurs';
@override
String get minPlayersRequired => 'Il faut au moins 3 joueurs';
@override
String get configuration => 'Configuration';
@override
String get impostors => '🎭 Imposteurs';
@override
String get impostorClue => '🔍 Indice pour l\'imposteur';
@override
String get impostorClueDescription => 'L\'imposteur connaît la catégorie';
@override
String get debateTime => '⏱️ Temps de débat';
@override
String get noLimit => 'Sans limite';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Lancer la partie';
@override
String get seeYourWord => 'Voir ton mot';
@override
String get eachPlayerMustSee => 'Chaque joueur doit voir son mot en secret';
@override
String roundNumber(int round) {
return 'Manche $round';
}
@override
String get alreadySeen => 'A déjà vu son mot';
@override
String get tapToSee => 'Appuie pour voir';
@override
String get allSeenStartDebate => 'Tous ont vu → Lancer le débat';
@override
String playersRemaining(int count) {
return 'Encore $count joueurs';
}
@override
String get youAreImpostor => 'Tu es l\'imposteur !';
@override
String get yourWordIs => 'Ton mot est :';
@override
String clueCategory(String category) {
return 'Indice : $category';
}
@override
String get holdToSeeWord => 'Maintiens appuyé pour voir ton mot';
@override
String get makeSureNoOneLooks =>
'Assure-toi que personne d\'autre ne regarde';
@override
String get showingWord => '👁️ Affichage...';
@override
String get holdToSee => '👆 Maintiens appuyé pour voir';
@override
String get seenMyWord => 'J\'ai vu mon mot';
@override
String debateRound(int round) {
return 'Débat - Manche $round';
}
@override
String get timeUp => '⏰ Temps écoulé !';
@override
String get timeRemaining => '⏱️ Temps restant';
@override
String get playersInDebate => 'Joueurs en débat';
@override
String activePlayersInfo(int active, int impostors) {
return '$active actifs • $impostors imposteur(s) caché(s)';
}
@override
String get eliminated => 'Éliminé';
@override
String get notes => 'Notes';
@override
String get goToVoting => 'Passer au vote';
@override
String get voting => '🗳️ Vote';
@override
String get turnToVote => 'Au tour de voter :';
@override
String votesProgress(int current, int total) {
return 'Votes : $current/$total';
}
@override
String get whoIsImpostor => 'Qui est l\'imposteur selon toi ?';
@override
String get confirmVote => 'Confirmer le vote';
@override
String get votingComplete => '🗳️ Vote terminé';
@override
String get allVoted => 'Tout le monde a voté !';
@override
String get tapToReveal => 'Appuie pour révéler le résultat';
@override
String get revealResult => 'Révéler le résultat';
@override
String get result => 'Résultat';
@override
String get revealing => 'Révélation...';
@override
String get wasImpostor => 'C\'était l\'IMPOSTEUR ! 🎉';
@override
String get wasInnocent => 'C\'était un INNOCENT 😱';
@override
String get votesThisRound => 'Votes de cette manche';
@override
String get seeEndResult => 'Voir le résultat final';
@override
String get impostorGuessWord => 'L\'imposteur devine-t-il le mot ?';
@override
String get nextRound => 'Manche suivante';
@override
String get impostorGuessTitle => '🎯 Devinette de l\'imposteur';
@override
String get impostorCanGuess =>
'L\'imposteur éliminé peut\ntenter de deviner le mot';
@override
String get ifCorrectImpostorsWin => 'S\'il trouve, les imposteurs gagnent !';
@override
String get guessWordHint => 'Quel est le mot selon toi ?';
@override
String get dontGuess => 'Ne pas tenter';
@override
String get guess => 'Deviner';
@override
String get correctGuess => 'Il a trouvé !';
@override
String theWordWas(String word) {
return 'Le mot était : $word';
}
@override
String get impostorsWin => 'Les imposteurs gagnent !';
@override
String get wrongGuess => 'Il n\'a pas trouvé !';
@override
String get gameContinues => 'La partie continue...';
@override
String get gameOver => 'Fin de partie';
@override
String get playersWin => 'Les joueurs gagnent !';
@override
String get theSecretWordWas => '🔍 Le mot était :';
@override
String categoryLabel(String category) {
return 'Catégorie : $category';
}
@override
String get theImpostorWas => '🎭 L\'imposteur était :';
@override
String get theImpostorsWere => '🎭 Les imposteurs étaient :';
@override
String get votingHistory => '📊 Historique des votes';
@override
String roundElimination(int round, String name) {
return 'Manche $round : $name';
}
@override
String get rematch => 'Revanche';
@override
String get mainMenu => 'Menu principal';
@override
String get notesTitle => '📝 Notes';
@override
String get notesSaved => 'Notes sauvegardées';
@override
String get whoAreYou => 'Qui es-tu ?';
@override
String get selectYourName =>
'Sélectionne ton nom pour voir tes notes privées';
@override
String notesOf(String name) {
return 'Notes de $name';
}
@override
String get notesAboutPlayers => 'Notes sur chaque joueur';
@override
String get playerNoteHint => 'Qu\'a-t-il dit ? Suspect ?';
@override
String get freeNote => 'Note libre';
@override
String get freeNoteHint => 'Notes personnelles...';
@override
String get rulesTitle => '📖 Comment jouer';
@override
String get rulesWhatIsTitle => '🎭 Qu\'est-ce que L\'Imposteur ?';
@override
String get rulesWhatIsBody =>
'Un jeu de déduction sociale pour 3-20 joueurs. Tout le monde reçoit un mot secret... sauf l\'imposteur ! Ta mission : découvrir qui bluff.';
@override
String get rulesHowToPlayTitle => '🔍 Comment joue-t-on ?';
@override
String get rulesHowToPlayBody =>
'1. Distribution des rôles : tout le monde reçoit le même mot, sauf le(s) imposteur(s).\n\n2. Débat : à tour de rôle, chaque joueur décrit le mot SANS le dire directement. L\'imposteur doit faire semblant de le connaître.\n\n3. Vote : à la fin du débat, tout le monde vote pour celui qu\'il pense être l\'imposteur.\n\n4. Élimination : le plus voté est éliminé et on révèle s\'il était imposteur ou non.\n\n5. Si c\'était l\'imposteur, il peut tenter de deviner le mot. S\'il trouve, les imposteurs gagnent !';
@override
String get rulesWhoWinsTitle => '🏆 Qui gagne ?';
@override
String get rulesWhoWinsBody =>
'• Joueurs : ils gagnent s\'ils éliminent TOUS les imposteurs.\n• Imposteurs : ils gagnent s\'ils ne sont pas découverts jusqu\'à ce qu\'il reste autant ou moins de joueurs normaux que d\'imposteurs, ou s\'ils devinent le mot en étant éliminés.';
@override
String get rulesTipsPlayersTitle => '💡 Conseils pour les joueurs';
@override
String get rulesTipsPlayersBody =>
'• Donne des indices subtils qui prouvent que tu connais le mot, mais pas trop évidents pour que l\'imposteur ne les utilise pas.\n• Observe qui donne des réponses vagues ou génériques.\n• Utilise les notes pour noter ce que chacun dit.\n• Ne dis pas le mot directement, ça aide l\'imposteur !';
@override
String get rulesTipsImpostorTitle => '🎭 Conseils pour l\'imposteur';
@override
String get rulesTipsImpostorBody =>
'• Écoute attentivement les indices des autres.\n• Essaie de déduire le mot pour donner des indices crédibles.\n• Ne sois pas le premier à parler si tu n\'es pas sûr.\n• Si on te donne la catégorie comme indice, utilise-la à ton avantage.\n• Accuse les autres pour détourner l\'attention.';
@override
String get rulesModesTitle => '📱 Modes de jeu';
@override
String get rulesModesBody =>
'• Un seul téléphone : tout le monde partage l\'appareil. Chaque joueur voit son mot en appuyant et maintenant un bouton.\n\n• Multi-téléphone : chaque joueur utilise son propre appareil. Ils se connectent par Bluetooth/WiFi Direct sans avoir besoin d\'internet.';
@override
String get rulesExampleTitle => '✏️ Exemple de partie';
@override
String get rulesExampleBody =>
'Mot secret : \"Pizza\"\n\n• Marie : \"Ça se mange chaud\"\n• Lucas : \"Ça arrive dans une boîte\"\n• Julie (imposteur) : \"C\'est très populaire\" 🤔\n• Thomas : \"Il y a du fromage\"\n\nJulie a donné une réponse très générique... Suspecte !';
@override
String get joinGameTitle => 'Rejoindre une partie';
@override
String get multiDeviceMode => 'Mode multi-téléphone';
@override
String get scanQrDescription =>
'Scanne le code QR affiché par l\'hôte pour te connecter à la partie via Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Prochainement';
@override
String get nearbyNotAvailable =>
'La connexion multi-téléphone avec Nearby Connections nécessite des appareils Android physiques.\n\nPour l\'instant, utilise le mode \"Un seul téléphone\" pour jouer sur un appareil partagé.';
@override
String get back => 'Retour';
@override
String get yes => 'Oui';
@override
String get no => 'Non';
@override
String get cancel => 'Annuler';
@override
String get accept => 'Accepter';
@override
String get next => 'Suivant';
@override
String get settingsTitle => 'Paramètres';
@override
String get language => 'Langue';
@override
String get soundVolume => 'Volume des effets';
@override
String get vibration => 'Vibration';
@override
String get about => 'À propos';
@override
String get version => 'Version';
@override
String get developer => 'Développeur';
@override
String get licenses => 'Licences';
}

View File

@@ -0,0 +1,475 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Hindi (`hi`).
class AppLocalizationsHi extends AppLocalizations {
AppLocalizationsHi([String locale = 'hi']) : super(locale);
@override
String get appTitle => 'धोखेबाज़';
@override
String get subtitle => 'सामाजिक अनुमान का खेल';
@override
String get loadingWords => 'शब्द लोड हो रहे हैं...';
@override
String get playersRange => '3-20 खिलाड़ी • इंटरनेट की ज़रूरत नहीं';
@override
String get createGame => 'गेम बनाएँ';
@override
String get joinGame => 'गेम में शामिल हों';
@override
String get howToPlay => 'कैसे खेलें';
@override
String get settings => 'सेटिंग्स';
@override
String get gameMode => 'गेम मोड';
@override
String get singleDevice => 'एक डिवाइस';
@override
String get multiDevice => 'मल्टी-डिवाइस';
@override
String get category => 'श्रेणी';
@override
String get categoryAll => 'सभी';
@override
String get categoryAnimals => 'जानवर';
@override
String get categoryFood => 'खाना';
@override
String get categoryCountries => 'देश';
@override
String get categorySports => 'खेल';
@override
String get categoryProfessions => 'पेशे';
@override
String get categoryObjects => 'वस्तुएँ';
@override
String get categoryPlaces => 'स्थान';
@override
String get categoryMovies => 'फ़िल्में';
@override
String get categoryMusic => 'संगीत';
@override
String get categoryTechnology => 'टेक्नोलॉजी';
@override
String playersCount(int count) {
return 'खिलाड़ी ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'खिलाड़ी का नाम';
@override
String get playerAlreadyExists => 'इस नाम का खिलाड़ी पहले से मौजूद है';
@override
String get maxPlayersReached => 'अधिकतम 20 खिलाड़ी';
@override
String get minPlayersRequired => 'कम से कम 3 खिलाड़ी ज़रूरी हैं';
@override
String get configuration => 'कॉन्फ़िगरेशन';
@override
String get impostors => '🎭 धोखेबाज़';
@override
String get impostorClue => '🔍 धोखेबाज़ के लिए संकेत';
@override
String get impostorClueDescription => 'धोखेबाज़ को श्रेणी पता होगी';
@override
String get debateTime => '⏱️ बहस का समय';
@override
String get noLimit => 'कोई सीमा नहीं';
@override
String get oneMin => '1 मिनट';
@override
String get twoMin => '2 मिनट';
@override
String get threeMin => '3 मिनट';
@override
String get fiveMin => '5 मिनट';
@override
String get startGame => 'गेम शुरू करें';
@override
String get seeYourWord => 'अपना शब्द देखें';
@override
String get eachPlayerMustSee => 'हर खिलाड़ी को अपना शब्द गुपचुप देखना होगा';
@override
String roundNumber(int round) {
return 'राउंड $round';
}
@override
String get alreadySeen => 'अपना शब्द देख चुके हैं';
@override
String get tapToSee => 'देखने के लिए टैप करें';
@override
String get allSeenStartDebate => 'सबने देख लिया → बहस शुरू करें';
@override
String playersRemaining(int count) {
return '$count खिलाड़ी बाकी हैं';
}
@override
String get youAreImpostor => 'आप धोखेबाज़ हैं!';
@override
String get yourWordIs => 'आपका शब्द है:';
@override
String clueCategory(String category) {
return 'संकेत: $category';
}
@override
String get holdToSeeWord => 'अपना शब्द देखने के लिए दबाए रखें';
@override
String get makeSureNoOneLooks => 'सुनिश्चित करें कि कोई और नहीं देख रहा';
@override
String get showingWord => '👁️ दिखा रहे हैं...';
@override
String get holdToSee => '👆 देखने के लिए दबाए रखें';
@override
String get seenMyWord => 'मैंने अपना शब्द देख लिया';
@override
String debateRound(int round) {
return 'बहस - राउंड $round';
}
@override
String get timeUp => '⏰ समय समाप्त!';
@override
String get timeRemaining => '⏱️ शेष समय';
@override
String get playersInDebate => 'बहस में खिलाड़ी';
@override
String activePlayersInfo(int active, int impostors) {
return '$active सक्रिय • $impostors धोखेबाज़ छिपे हुए';
}
@override
String get eliminated => 'बाहर';
@override
String get notes => 'नोट्स';
@override
String get goToVoting => 'वोटिंग पर जाएँ';
@override
String get voting => '🗳️ वोटिंग';
@override
String get turnToVote => 'वोट करने की बारी:';
@override
String votesProgress(int current, int total) {
return 'वोट: $current/$total';
}
@override
String get whoIsImpostor => 'आपको कौन धोखेबाज़ लगता है?';
@override
String get confirmVote => 'वोट की पुष्टि करें';
@override
String get votingComplete => '🗳️ वोटिंग पूरी हुई';
@override
String get allVoted => 'सबने वोट कर दिया!';
@override
String get tapToReveal => 'नतीजा देखने के लिए टैप करें';
@override
String get revealResult => 'नतीजा दिखाएँ';
@override
String get result => 'नतीजा';
@override
String get revealing => 'दिखा रहे हैं...';
@override
String get wasImpostor => 'धोखेबाज़ था! 🎉';
@override
String get wasInnocent => 'बेगुनाह था 😱';
@override
String get votesThisRound => 'इस राउंड के वोट';
@override
String get seeEndResult => 'अंतिम नतीजा देखें';
@override
String get impostorGuessWord => 'क्या धोखेबाज़ शब्द का अनुमान लगाएगा?';
@override
String get nextRound => 'अगला राउंड';
@override
String get impostorGuessTitle => '🎯 धोखेबाज़ का अनुमान';
@override
String get impostorCanGuess =>
'बाहर किया गया धोखेबाज़\nशब्द का अनुमान लगा सकता है';
@override
String get ifCorrectImpostorsWin =>
'अगर सही अनुमान लगाया, तो धोखेबाज़ जीतते हैं!';
@override
String get guessWordHint => 'आपके अनुसार शब्द क्या है?';
@override
String get dontGuess => 'अनुमान न लगाएँ';
@override
String get guess => 'अनुमान लगाएँ';
@override
String get correctGuess => 'सही अनुमान!';
@override
String theWordWas(String word) {
return 'शब्द था: $word';
}
@override
String get impostorsWin => 'धोखेबाज़ जीत गए!';
@override
String get wrongGuess => 'गलत अनुमान!';
@override
String get gameContinues => 'गेम जारी है...';
@override
String get gameOver => 'गेम ख़त्म';
@override
String get playersWin => 'खिलाड़ी जीत गए!';
@override
String get theSecretWordWas => '🔍 शब्द था:';
@override
String categoryLabel(String category) {
return 'श्रेणी: $category';
}
@override
String get theImpostorWas => '🎭 धोखेबाज़ था:';
@override
String get theImpostorsWere => '🎭 धोखेबाज़ थे:';
@override
String get votingHistory => '📊 वोटिंग का इतिहास';
@override
String roundElimination(int round, String name) {
return 'राउंड $round: $name';
}
@override
String get rematch => 'फिर से खेलें';
@override
String get mainMenu => 'मुख्य मेनू';
@override
String get notesTitle => '📝 नोट्स';
@override
String get notesSaved => 'नोट्स सहेजे गए';
@override
String get whoAreYou => 'आप कौन हैं?';
@override
String get selectYourName => 'अपने निजी नोट्स देखने के लिए अपना नाम चुनें';
@override
String notesOf(String name) {
return '$name के नोट्स';
}
@override
String get notesAboutPlayers => 'हर खिलाड़ी के बारे में नोट्स';
@override
String get playerNoteHint => 'उसने क्या कहा? शक है?';
@override
String get freeNote => 'फ्री नोट';
@override
String get freeNoteHint => 'निजी नोट्स...';
@override
String get rulesTitle => '📖 कैसे खेलें';
@override
String get rulesWhatIsTitle => '🎭 धोखेबाज़ क्या है?';
@override
String get rulesWhatIsBody =>
'3-20 खिलाड़ियों के लिए एक सामाजिक अनुमान का खेल। सबको एक गुप्त शब्द मिलता है... धोखेबाज़ को छोड़कर! आपका मिशन: पता लगाएँ कि कौन बहाना बना रहा है।';
@override
String get rulesHowToPlayTitle => '🔍 कैसे खेलें?';
@override
String get rulesHowToPlayBody =>
'1. भूमिकाएँ बाँटी जाती हैं: सबको एक ही शब्द मिलता है, धोखेबाज़ को छोड़कर।\n\n2. बहस: बारी-बारी से हर खिलाड़ी शब्द का वर्णन करता है, बिना सीधे बताए। धोखेबाज़ को बहाना बनाना होता है कि वह शब्द जानता है।\n\n3. वोटिंग: बहस के बाद सभी वोट करते हैं कि धोखेबाज़ कौन है।\n\n4. बाहर करना: सबसे ज़्यादा वोट पाने वाला बाहर हो जाता है और पता चलता है कि वह धोखेबाज़ था या नहीं।\n\n5. अगर वह धोखेबाज़ था, तो वह शब्द का अनुमान लगा सकता है। सही अनुमान पर धोखेबाज़ जीतते हैं!';
@override
String get rulesWhoWinsTitle => '🏆 कौन जीतता है?';
@override
String get rulesWhoWinsBody =>
'• खिलाड़ी: सभी धोखेबाज़ों को बाहर करने पर जीतते हैं।\n• धोखेबाज़: अगर पकड़े नहीं गए और सामान्य खिलाड़ियों की संख्या धोखेबाज़ों के बराबर या कम हो जाए, या बाहर होने पर शब्द सही अनुमान लगा लें, तो जीतते हैं।';
@override
String get rulesTipsPlayersTitle => '💡 खिलाड़ियों के लिए सुझाव';
@override
String get rulesTipsPlayersBody =>
'• ऐसे सूक्ष्म संकेत दें जो साबित करें कि आप शब्द जानते हैं, लेकिन इतने स्पष्ट नहीं कि धोखेबाज़ उनका फ़ायदा उठा ले।\n• ध्यान दें कि कौन अस्पष्ट या सामान्य जवाब दे रहा है।\n• हर किसी ने क्या कहा, यह लिखने के लिए नोट्स का उपयोग करें।\n• शब्द सीधे न बताएँ, इससे धोखेबाज़ को फ़ायदा होता है!';
@override
String get rulesTipsImpostorTitle => '🎭 धोखेबाज़ के लिए सुझाव';
@override
String get rulesTipsImpostorBody =>
'• दूसरों के संकेत ध्यान से सुनें।\n• विश्वसनीय संकेत देने के लिए शब्द का अनुमान लगाने की कोशिश करें।\n• अगर आपको यकीन नहीं है तो पहले न बोलें।\n• अगर श्रेणी का संकेत मिले, तो उसे अपने फ़ायदे में इस्तेमाल करें।\n• ध्यान भटकाने के लिए दूसरों पर आरोप लगाएँ।';
@override
String get rulesModesTitle => '📱 गेम मोड';
@override
String get rulesModesBody =>
'• एक डिवाइस: सभी एक ही डिवाइस शेयर करते हैं। हर खिलाड़ी बटन दबाकर अपना शब्द देखता है।\n\n• मल्टी-डिवाइस: हर खिलाड़ी अपना डिवाइस इस्तेमाल करता है। ब्लूटूथ/WiFi Direct से जुड़ते हैं, इंटरनेट की ज़रूरत नहीं।';
@override
String get rulesExampleTitle => '✏️ गेम का उदाहरण';
@override
String get rulesExampleBody =>
'गुप्त शब्द: \"पिज़्ज़ा\"\n\n• आर्यन: \"गरम खाया जाता है\"\n• प्रिया: \"डिब्बे में आता है\"\n• नेहा (धोखेबाज़): \"बहुत लोकप्रिय है\" 🤔\n• राहुल: \"इसमें चीज़ होता है\"\n\nनेहा का जवाब बहुत सामान्य था... शक़ है!';
@override
String get joinGameTitle => 'गेम में शामिल हों';
@override
String get multiDeviceMode => 'मल्टी-डिवाइस मोड';
@override
String get scanQrDescription =>
'ब्लूटूथ/WiFi Direct से गेम में जुड़ने के लिए होस्ट का QR कोड स्कैन करें।';
@override
String get comingSoon => 'जल्द आ रहा है';
@override
String get nearbyNotAvailable =>
'Nearby Connections से मल्टी-डिवाइस कनेक्शन के लिए असली Android डिवाइस चाहिए।\n\nअभी के लिए, शेयर किए गए डिवाइस पर खेलने के लिए \"एक डिवाइस\" मोड का उपयोग करें।';
@override
String get back => 'वापस';
@override
String get yes => 'हाँ';
@override
String get no => 'नहीं';
@override
String get cancel => 'रद्द करें';
@override
String get accept => 'स्वीकार करें';
@override
String get next => 'अगला';
@override
String get settingsTitle => 'सेटिंग्स';
@override
String get language => 'भाषा';
@override
String get soundVolume => 'साउंड इफ़ेक्ट्स की आवाज़';
@override
String get vibration => 'कंपन';
@override
String get about => 'ऐप के बारे में';
@override
String get version => 'संस्करण';
@override
String get developer => 'डेवलपर';
@override
String get licenses => 'लाइसेंस';
}

View File

@@ -0,0 +1,476 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Italian (`it`).
class AppLocalizationsIt extends AppLocalizations {
AppLocalizationsIt([String locale = 'it']) : super(locale);
@override
String get appTitle => 'L\'Impostore';
@override
String get subtitle => 'Gioco di deduzione sociale';
@override
String get loadingWords => 'Caricamento parole...';
@override
String get playersRange => '3-20 giocatori • Senza internet';
@override
String get createGame => 'Crea partita';
@override
String get joinGame => 'Unisciti alla partita';
@override
String get howToPlay => 'Come giocare';
@override
String get settings => 'Impostazioni';
@override
String get gameMode => 'Modalità di gioco';
@override
String get singleDevice => 'Un solo dispositivo';
@override
String get multiDevice => 'Multi-dispositivo';
@override
String get category => 'Categoria';
@override
String get categoryAll => 'Tutte';
@override
String get categoryAnimals => 'Animali';
@override
String get categoryFood => 'Cibo';
@override
String get categoryCountries => 'Paesi';
@override
String get categorySports => 'Sport';
@override
String get categoryProfessions => 'Professioni';
@override
String get categoryObjects => 'Oggetti';
@override
String get categoryPlaces => 'Luoghi';
@override
String get categoryMovies => 'Film';
@override
String get categoryMusic => 'Musica';
@override
String get categoryTechnology => 'Tecnologia';
@override
String playersCount(int count) {
return 'Giocatori ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Nome del giocatore';
@override
String get playerAlreadyExists => 'Esiste già un giocatore con questo nome';
@override
String get maxPlayersReached => 'Massimo 20 giocatori';
@override
String get minPlayersRequired => 'Servono almeno 3 giocatori';
@override
String get configuration => 'Configurazione';
@override
String get impostors => '🎭 Impostori';
@override
String get impostorClue => '🔍 Indizio per l\'impostore';
@override
String get impostorClueDescription => 'L\'impostore conosce la categoria';
@override
String get debateTime => '⏱️ Tempo di discussione';
@override
String get noLimit => 'Senza limite';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Inizia partita';
@override
String get seeYourWord => 'Vedi la tua parola';
@override
String get eachPlayerMustSee =>
'Ogni giocatore deve vedere la propria parola in segreto';
@override
String roundNumber(int round) {
return 'Round $round';
}
@override
String get alreadySeen => 'Ha già visto la sua parola';
@override
String get tapToSee => 'Tocca per vedere';
@override
String get allSeenStartDebate => 'Tutti hanno visto → Inizia discussione';
@override
String playersRemaining(int count) {
return 'Mancano $count giocatori';
}
@override
String get youAreImpostor => 'Sei l\'impostore!';
@override
String get yourWordIs => 'La tua parola è:';
@override
String clueCategory(String category) {
return 'Indizio: $category';
}
@override
String get holdToSeeWord => 'Tieni premuto per vedere la tua parola';
@override
String get makeSureNoOneLooks => 'Assicurati che nessun altro stia guardando';
@override
String get showingWord => '👁️ Mostrando...';
@override
String get holdToSee => '👆 Tieni premuto per vedere';
@override
String get seenMyWord => 'Ho visto la mia parola';
@override
String debateRound(int round) {
return 'Discussione - Round $round';
}
@override
String get timeUp => '⏰ Tempo scaduto!';
@override
String get timeRemaining => '⏱️ Tempo rimanente';
@override
String get playersInDebate => 'Giocatori in discussione';
@override
String activePlayersInfo(int active, int impostors) {
return '$active attivi • $impostors impostore/i nascosti';
}
@override
String get eliminated => 'Eliminato';
@override
String get notes => 'Note';
@override
String get goToVoting => 'Vai alla votazione';
@override
String get voting => '🗳️ Votazione';
@override
String get turnToVote => 'Turno di votare:';
@override
String votesProgress(int current, int total) {
return 'Voti: $current/$total';
}
@override
String get whoIsImpostor => 'Chi pensi sia l\'impostore?';
@override
String get confirmVote => 'Conferma voto';
@override
String get votingComplete => '🗳️ Votazione completata';
@override
String get allVoted => 'Tutti hanno votato!';
@override
String get tapToReveal => 'Tocca per rivelare il risultato';
@override
String get revealResult => 'Rivela risultato';
@override
String get result => 'Risultato';
@override
String get revealing => 'Rivelando...';
@override
String get wasImpostor => 'Era un IMPOSTORE! 🎉';
@override
String get wasInnocent => 'Era INNOCENTE 😱';
@override
String get votesThisRound => 'Voti di questo round';
@override
String get seeEndResult => 'Vedi risultato finale';
@override
String get impostorGuessWord => 'L\'impostore indovina la parola?';
@override
String get nextRound => 'Prossimo round';
@override
String get impostorGuessTitle => '🎯 Tentativo dell\'impostore';
@override
String get impostorCanGuess =>
'L\'impostore eliminato può\nprovare a indovinare la parola';
@override
String get ifCorrectImpostorsWin => 'Se indovina, gli impostori vincono!';
@override
String get guessWordHint => 'Qual è secondo te la parola?';
@override
String get dontGuess => 'Non provare';
@override
String get guess => 'Indovina';
@override
String get correctGuess => 'Ha indovinato!';
@override
String theWordWas(String word) {
return 'La parola era: $word';
}
@override
String get impostorsWin => 'Gli impostori vincono!';
@override
String get wrongGuess => 'Non ha indovinato!';
@override
String get gameContinues => 'La partita continua...';
@override
String get gameOver => 'Fine della partita';
@override
String get playersWin => 'I giocatori vincono!';
@override
String get theSecretWordWas => '🔍 La parola era:';
@override
String categoryLabel(String category) {
return 'Categoria: $category';
}
@override
String get theImpostorWas => '🎭 L\'impostore era:';
@override
String get theImpostorsWere => '🎭 Gli impostori erano:';
@override
String get votingHistory => '📊 Cronologia delle votazioni';
@override
String roundElimination(int round, String name) {
return 'Round $round: $name';
}
@override
String get rematch => 'Rivincita';
@override
String get mainMenu => 'Menu principale';
@override
String get notesTitle => '📝 Note';
@override
String get notesSaved => 'Note salvate';
@override
String get whoAreYou => 'Chi sei?';
@override
String get selectYourName =>
'Seleziona il tuo nome per vedere le tue note private';
@override
String notesOf(String name) {
return 'Note di $name';
}
@override
String get notesAboutPlayers => 'Appunti su ogni giocatore';
@override
String get playerNoteHint => 'Cosa ha detto? Sospetto?';
@override
String get freeNote => 'Nota libera';
@override
String get freeNoteHint => 'Appunti personali...';
@override
String get rulesTitle => '📖 Come giocare';
@override
String get rulesWhatIsTitle => '🎭 Cos\'è L\'Impostore?';
@override
String get rulesWhatIsBody =>
'Un gioco di deduzione sociale per 3-20 giocatori. Tutti ricevono una parola segreta... tranne l\'impostore! La tua missione: scoprire chi sta fingendo.';
@override
String get rulesHowToPlayTitle => '🔍 Come si gioca?';
@override
String get rulesHowToPlayBody =>
'1. Si assegnano i ruoli: tutti ricevono la stessa parola, tranne l\'impostore/gli impostori.\n\n2. Discussione: a turno, ogni giocatore descrive la parola SENZA dirla direttamente. L\'impostore deve fingere di conoscerla.\n\n3. Votazione: al termine della discussione, tutti votano chi pensano sia l\'impostore.\n\n4. Eliminazione: il più votato viene eliminato e si rivela se era l\'impostore o meno.\n\n5. Se era l\'impostore, può provare a indovinare la parola. Se indovina, gli impostori vincono!';
@override
String get rulesWhoWinsTitle => '🏆 Chi vince?';
@override
String get rulesWhoWinsBody =>
'• Giocatori: vincono se eliminano TUTTI gli impostori.\n• Impostori: vincono se non vengono scoperti finché non restano pari o meno giocatori normali rispetto agli impostori, oppure se indovinano la parola al momento dell\'eliminazione.';
@override
String get rulesTipsPlayersTitle => '💡 Consigli per i giocatori';
@override
String get rulesTipsPlayersBody =>
'• Dai indizi sottili che dimostrino che conosci la parola, ma non così ovvi da permettere all\'impostore di usarli.\n• Osserva chi dà risposte vaghe o generiche.\n• Usa le note per appuntare quello che dice ognuno.\n• Non dire la parola direttamente, questo aiuta l\'impostore!';
@override
String get rulesTipsImpostorTitle => '🎭 Consigli per l\'impostore';
@override
String get rulesTipsImpostorBody =>
'• Ascolta attentamente gli indizi degli altri.\n• Cerca di dedurre la parola per dare indizi credibili.\n• Non essere il primo a parlare se non sei sicuro.\n• Se ti danno la categoria come indizio, usala a tuo vantaggio.\n• Accusa gli altri per deviare l\'attenzione.';
@override
String get rulesModesTitle => '📱 Modalità di gioco';
@override
String get rulesModesBody =>
'• Un solo dispositivo: tutti condividono il dispositivo. Ogni giocatore vede la propria parola tenendo premuto un pulsante.\n\n• Multi-dispositivo: ogni giocatore usa il proprio dispositivo. Si connettono tramite Bluetooth/WiFi Direct senza bisogno di internet.';
@override
String get rulesExampleTitle => '✏️ Esempio di partita';
@override
String get rulesExampleBody =>
'Parola segreta: \"Pizza\"\n\n• Marco: \"Si mangia calda\"\n• Giulia: \"Arriva in una scatola\"\n• Luca (impostore): \"È molto popolare\" 🤔\n• Sofia: \"Ha il formaggio\"\n\nLuca ha dato una risposta molto generica... Sospetto!';
@override
String get joinGameTitle => 'Unisciti alla partita';
@override
String get multiDeviceMode => 'Modalità multi-dispositivo';
@override
String get scanQrDescription =>
'Scansiona il codice QR mostrato dall\'host per connetterti alla partita tramite Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Prossimamente';
@override
String get nearbyNotAvailable =>
'La connessione multi-dispositivo con Nearby Connections richiede dispositivi Android fisici.\n\nPer ora, usa la modalità \"Un solo dispositivo\" per giocare su un dispositivo condiviso.';
@override
String get back => 'Indietro';
@override
String get yes => '';
@override
String get no => 'No';
@override
String get cancel => 'Annulla';
@override
String get accept => 'Accetta';
@override
String get next => 'Avanti';
@override
String get settingsTitle => 'Impostazioni';
@override
String get language => 'Lingua';
@override
String get soundVolume => 'Volume effetti';
@override
String get vibration => 'Vibrazione';
@override
String get about => 'Informazioni';
@override
String get version => 'Versione';
@override
String get developer => 'Sviluppatore';
@override
String get licenses => 'Licenze';
}

View File

@@ -0,0 +1,473 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Japanese (`ja`).
class AppLocalizationsJa extends AppLocalizations {
AppLocalizationsJa([String locale = 'ja']) : super(locale);
@override
String get appTitle => 'インポスター';
@override
String get subtitle => '正体推理ゲーム';
@override
String get loadingWords => 'ワードを読み込み中...';
@override
String get playersRange => '3-20人 • インターネット不要';
@override
String get createGame => 'ゲームを作成';
@override
String get joinGame => 'ゲームに参加';
@override
String get howToPlay => '遊び方';
@override
String get settings => '設定';
@override
String get gameMode => 'ゲームモード';
@override
String get singleDevice => '1台で遊ぶ';
@override
String get multiDevice => '複数台で遊ぶ';
@override
String get category => 'カテゴリー';
@override
String get categoryAll => 'すべて';
@override
String get categoryAnimals => '動物';
@override
String get categoryFood => '食べ物';
@override
String get categoryCountries => '';
@override
String get categorySports => 'スポーツ';
@override
String get categoryProfessions => '職業';
@override
String get categoryObjects => '';
@override
String get categoryPlaces => '場所';
@override
String get categoryMovies => '映画';
@override
String get categoryMusic => '音楽';
@override
String get categoryTechnology => 'テクノロジー';
@override
String playersCount(int count) {
return 'プレイヤー ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'プレイヤー名';
@override
String get playerAlreadyExists => '同じ名前のプレイヤーがすでにいます';
@override
String get maxPlayersReached => '最大20人までです';
@override
String get minPlayersRequired => '最低3人必要です';
@override
String get configuration => '設定';
@override
String get impostors => '🎭 インポスター';
@override
String get impostorClue => '🔍 インポスターへのヒント';
@override
String get impostorClueDescription => 'インポスターにカテゴリーが表示されます';
@override
String get debateTime => '⏱️ 議論の時間';
@override
String get noLimit => '制限なし';
@override
String get oneMin => '1分';
@override
String get twoMin => '2分';
@override
String get threeMin => '3分';
@override
String get fiveMin => '5分';
@override
String get startGame => 'ゲーム開始';
@override
String get seeYourWord => '自分のワードを見る';
@override
String get eachPlayerMustSee => '各プレイヤーは秘密にワードを確認してください';
@override
String roundNumber(int round) {
return 'ラウンド $round';
}
@override
String get alreadySeen => 'ワードを確認済み';
@override
String get tapToSee => 'タップして確認';
@override
String get allSeenStartDebate => '全員確認済み → 議論を開始';
@override
String playersRemaining(int count) {
return '残り $count';
}
@override
String get youAreImpostor => 'あなたはインポスターです!';
@override
String get yourWordIs => 'あなたのワード:';
@override
String clueCategory(String category) {
return 'ヒント: $category';
}
@override
String get holdToSeeWord => '長押しでワードを確認';
@override
String get makeSureNoOneLooks => '他の人に見られないようにしてください';
@override
String get showingWord => '👁️ 表示中...';
@override
String get holdToSee => '👆 長押しで確認';
@override
String get seenMyWord => 'ワードを確認しました';
@override
String debateRound(int round) {
return '議論 - ラウンド $round';
}
@override
String get timeUp => '⏰ 時間切れ!';
@override
String get timeRemaining => '⏱️ 残り時間';
@override
String get playersInDebate => '議論中のプレイヤー';
@override
String activePlayersInfo(int active, int impostors) {
return '$active 人参加中 • $impostors 人のインポスターが潜伏中';
}
@override
String get eliminated => '脱落';
@override
String get notes => 'メモ';
@override
String get goToVoting => '投票へ進む';
@override
String get voting => '🗳️ 投票';
@override
String get turnToVote => '投票の番:';
@override
String votesProgress(int current, int total) {
return '投票: $current/$total';
}
@override
String get whoIsImpostor => '誰がインポスターだと思いますか?';
@override
String get confirmVote => '投票を確定';
@override
String get votingComplete => '🗳️ 投票完了';
@override
String get allVoted => '全員が投票しました!';
@override
String get tapToReveal => 'タップして結果を見る';
@override
String get revealResult => '結果を発表';
@override
String get result => '結果';
@override
String get revealing => '発表中...';
@override
String get wasImpostor => 'インポスターでした! 🎉';
@override
String get wasInnocent => '一般市民でした 😱';
@override
String get votesThisRound => 'このラウンドの投票';
@override
String get seeEndResult => '最終結果を見る';
@override
String get impostorGuessWord => 'インポスターがワードを当てる?';
@override
String get nextRound => '次のラウンドへ';
@override
String get impostorGuessTitle => '🎯 インポスターの推理';
@override
String get impostorCanGuess => '脱落したインポスターは\nワードを当てることができます';
@override
String get ifCorrectImpostorsWin => '正解すればインポスターの勝ちです!';
@override
String get guessWordHint => 'ワードは何だと思いますか?';
@override
String get dontGuess => '推理しない';
@override
String get guess => '当てる';
@override
String get correctGuess => '正解!';
@override
String theWordWas(String word) {
return 'ワードは: $word';
}
@override
String get impostorsWin => 'インポスターの勝利!';
@override
String get wrongGuess => '不正解!';
@override
String get gameContinues => 'ゲームは続きます...';
@override
String get gameOver => 'ゲーム終了';
@override
String get playersWin => 'プレイヤーの勝利!';
@override
String get theSecretWordWas => '🔍 ワードは:';
@override
String categoryLabel(String category) {
return 'カテゴリー: $category';
}
@override
String get theImpostorWas => '🎭 インポスターは:';
@override
String get theImpostorsWere => '🎭 インポスターたちは:';
@override
String get votingHistory => '📊 投票の履歴';
@override
String roundElimination(int round, String name) {
return 'ラウンド $round: $name';
}
@override
String get rematch => 'もう一度';
@override
String get mainMenu => 'メインメニュー';
@override
String get notesTitle => '📝 メモ';
@override
String get notesSaved => 'メモを保存しました';
@override
String get whoAreYou => 'あなたは誰?';
@override
String get selectYourName => '名前を選んで自分のメモを見る';
@override
String notesOf(String name) {
return '$nameのメモ';
}
@override
String get notesAboutPlayers => '各プレイヤーについてのメモ';
@override
String get playerNoteHint => '何を言った?怪しい?';
@override
String get freeNote => 'フリーメモ';
@override
String get freeNoteHint => '個人メモ...';
@override
String get rulesTitle => '📖 遊び方';
@override
String get rulesWhatIsTitle => '🎭 インポスターとは?';
@override
String get rulesWhatIsBody =>
'3〜20人で遊べる正体推理ゲームです。全員にお題のワードが配られますが…インポスターだけは知りませんあなたの使命誰がなりすましているかを見抜くことです。';
@override
String get rulesHowToPlayTitle => '🔍 遊び方は?';
@override
String get rulesHowToPlayBody =>
'1. 役割の配布:全員に同じワードが配られますが、インポスターには配られません。\n\n2. 議論:順番に、各プレイヤーがワードを直接言わずに説明します。インポスターは知っているフリをしなければなりません。\n\n3. 投票:議論が終わったら、全員がインポスターだと思う人に投票します。\n\n4. 脱落:最も票を集めた人が脱落し、インポスターかどうかが明かされます。\n\n5. インポスターだった場合、ワードを当てるチャンスがあります。当たればインポスターの勝ち!';
@override
String get rulesWhoWinsTitle => '🏆 誰が勝つ?';
@override
String get rulesWhoWinsBody =>
'• プレイヤー:すべてのインポスターを脱落させれば勝利。\n• インポスター:正体がバレずに一般プレイヤーと同数以下になるまで残れば勝利。また、脱落時にワードを当てても勝利。';
@override
String get rulesTipsPlayersTitle => '💡 プレイヤーへのアドバイス';
@override
String get rulesTipsPlayersBody =>
'• ワードを知っていると証明できるさりげないヒントを出しましょう。ただし、インポスターに利用されるほど分かりやすくしないこと。\n• 曖昧で抽象的な回答をする人に注目しましょう。\n• メモを活用して各自の発言を記録しましょう。\n• ワードを直接言ってはいけません。インポスターを助けることになります!';
@override
String get rulesTipsImpostorTitle => '🎭 インポスターへのアドバイス';
@override
String get rulesTipsImpostorBody =>
'• 他のプレイヤーのヒントをよく聞きましょう。\n• ワードを推測して、もっともらしいヒントを出しましょう。\n• 自信がなければ最初に話さないようにしましょう。\n• カテゴリーがヒントとして出されたら、それを利用しましょう。\n• 他の人を疑って注意をそらしましょう。';
@override
String get rulesModesTitle => '📱 ゲームモード';
@override
String get rulesModesBody =>
'• 1台で遊ぶ端末を全員で共有します。各プレイヤーはボタンを長押しして自分のワードを確認します。\n\n• 複数台で遊ぶ各プレイヤーが自分の端末を使います。Bluetooth/WiFi Directで接続、インターネット不要。';
@override
String get rulesExampleTitle => '✏️ ゲームの例';
@override
String get rulesExampleBody =>
'お題のワード:「ピザ」\n\n• さくら:「温かいうちに食べる」 ✓\n• たくや:「箱に入って届く」 ✓\n• ゆい(インポスター):「とても人気がある」 🤔\n• けんと:「チーズがのっている」 ✓\n\nゆいの答えはあまりにも曖昧... 怪しい!';
@override
String get joinGameTitle => 'ゲームに参加';
@override
String get multiDeviceMode => '複数台モード';
@override
String get scanQrDescription =>
'ホストが表示するQRコードをスキャンして、Bluetooth/WiFi Direct経由でゲームに接続します。';
@override
String get comingSoon => '近日公開';
@override
String get nearbyNotAvailable =>
'複数台接続のNearby Connectionsには、物理的なAndroid端末が必要です。\n\n現時点では「1台で遊ぶ」モードをご利用ください。';
@override
String get back => '戻る';
@override
String get yes => 'はい';
@override
String get no => 'いいえ';
@override
String get cancel => 'キャンセル';
@override
String get accept => 'OK';
@override
String get next => '次へ';
@override
String get settingsTitle => '設定';
@override
String get language => '言語';
@override
String get soundVolume => '効果音の音量';
@override
String get vibration => 'バイブレーション';
@override
String get about => 'アプリについて';
@override
String get version => 'バージョン';
@override
String get developer => '開発者';
@override
String get licenses => 'ライセンス';
}

View File

@@ -0,0 +1,473 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Korean (`ko`).
class AppLocalizationsKo extends AppLocalizations {
AppLocalizationsKo([String locale = 'ko']) : super(locale);
@override
String get appTitle => '임포스터';
@override
String get subtitle => '사회적 추리 게임';
@override
String get loadingWords => '단어 불러오는 중...';
@override
String get playersRange => '3-20명 • 인터넷 불필요';
@override
String get createGame => '게임 만들기';
@override
String get joinGame => '게임 참가';
@override
String get howToPlay => '게임 방법';
@override
String get settings => '설정';
@override
String get gameMode => '게임 모드';
@override
String get singleDevice => '기기 하나로';
@override
String get multiDevice => '여러 기기로';
@override
String get category => '카테고리';
@override
String get categoryAll => '전체';
@override
String get categoryAnimals => '동물';
@override
String get categoryFood => '음식';
@override
String get categoryCountries => '나라';
@override
String get categorySports => '스포츠';
@override
String get categoryProfessions => '직업';
@override
String get categoryObjects => '사물';
@override
String get categoryPlaces => '장소';
@override
String get categoryMovies => '영화';
@override
String get categoryMusic => '음악';
@override
String get categoryTechnology => '기술';
@override
String playersCount(int count) {
return '플레이어 ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => '플레이어 이름';
@override
String get playerAlreadyExists => '같은 이름의 플레이어가 이미 있습니다';
@override
String get maxPlayersReached => '최대 20명까지 가능합니다';
@override
String get minPlayersRequired => '최소 3명이 필요합니다';
@override
String get configuration => '설정';
@override
String get impostors => '🎭 임포스터';
@override
String get impostorClue => '🔍 임포스터 힌트';
@override
String get impostorClueDescription => '임포스터가 카테고리를 알 수 있습니다';
@override
String get debateTime => '⏱️ 토론 시간';
@override
String get noLimit => '제한 없음';
@override
String get oneMin => '1분';
@override
String get twoMin => '2분';
@override
String get threeMin => '3분';
@override
String get fiveMin => '5분';
@override
String get startGame => '게임 시작';
@override
String get seeYourWord => '내 단어 보기';
@override
String get eachPlayerMustSee => '각 플레이어는 비밀리에 자신의 단어를 확인하세요';
@override
String roundNumber(int round) {
return '라운드 $round';
}
@override
String get alreadySeen => '단어를 이미 확인함';
@override
String get tapToSee => '탭하여 확인';
@override
String get allSeenStartDebate => '모두 확인 완료 → 토론 시작';
@override
String playersRemaining(int count) {
return '나머지 $count명';
}
@override
String get youAreImpostor => '당신은 임포스터입니다!';
@override
String get yourWordIs => '당신의 단어:';
@override
String clueCategory(String category) {
return '힌트: $category';
}
@override
String get holdToSeeWord => '길게 눌러 단어를 확인하세요';
@override
String get makeSureNoOneLooks => '아무도 보지 않는지 확인하세요';
@override
String get showingWord => '👁️ 표시 중...';
@override
String get holdToSee => '👆 길게 눌러 확인';
@override
String get seenMyWord => '내 단어를 확인했습니다';
@override
String debateRound(int round) {
return '토론 - 라운드 $round';
}
@override
String get timeUp => '⏰ 시간 종료!';
@override
String get timeRemaining => '⏱️ 남은 시간';
@override
String get playersInDebate => '토론 중인 플레이어';
@override
String activePlayersInfo(int active, int impostors) {
return '$active명 참여 중 • $impostors명의 임포스터 잠복 중';
}
@override
String get eliminated => '탈락';
@override
String get notes => '메모';
@override
String get goToVoting => '투표하러 가기';
@override
String get voting => '🗳️ 투표';
@override
String get turnToVote => '투표할 차례:';
@override
String votesProgress(int current, int total) {
return '투표: $current/$total';
}
@override
String get whoIsImpostor => '누가 임포스터라고 생각하나요?';
@override
String get confirmVote => '투표 확인';
@override
String get votingComplete => '🗳️ 투표 완료';
@override
String get allVoted => '모두 투표했습니다!';
@override
String get tapToReveal => '탭하여 결과 확인';
@override
String get revealResult => '결과 공개';
@override
String get result => '결과';
@override
String get revealing => '공개 중...';
@override
String get wasImpostor => '임포스터였습니다! 🎉';
@override
String get wasInnocent => '일반 시민이었습니다 😱';
@override
String get votesThisRound => '이번 라운드 투표';
@override
String get seeEndResult => '최종 결과 보기';
@override
String get impostorGuessWord => '임포스터가 단어를 맞출까요?';
@override
String get nextRound => '다음 라운드';
@override
String get impostorGuessTitle => '🎯 임포스터의 추측';
@override
String get impostorCanGuess => '탈락한 임포스터가\n단어를 맞출 수 있습니다';
@override
String get ifCorrectImpostorsWin => '정답이면 임포스터의 승리!';
@override
String get guessWordHint => '단어가 무엇이라고 생각하나요?';
@override
String get dontGuess => '시도 안 함';
@override
String get guess => '맞추기';
@override
String get correctGuess => '정답입니다!';
@override
String theWordWas(String word) {
return '단어는: $word';
}
@override
String get impostorsWin => '임포스터 승리!';
@override
String get wrongGuess => '오답입니다!';
@override
String get gameContinues => '게임이 계속됩니다...';
@override
String get gameOver => '게임 종료';
@override
String get playersWin => '플레이어 승리!';
@override
String get theSecretWordWas => '🔍 단어는:';
@override
String categoryLabel(String category) {
return '카테고리: $category';
}
@override
String get theImpostorWas => '🎭 임포스터는:';
@override
String get theImpostorsWere => '🎭 임포스터들은:';
@override
String get votingHistory => '📊 투표 기록';
@override
String roundElimination(int round, String name) {
return '라운드 $round: $name';
}
@override
String get rematch => '재대결';
@override
String get mainMenu => '메인 메뉴';
@override
String get notesTitle => '📝 메모';
@override
String get notesSaved => '메모가 저장되었습니다';
@override
String get whoAreYou => '당신은 누구인가요?';
@override
String get selectYourName => '이름을 선택하여 개인 메모를 확인하세요';
@override
String notesOf(String name) {
return '$name의 메모';
}
@override
String get notesAboutPlayers => '각 플레이어에 대한 메모';
@override
String get playerNoteHint => '뭐라고 했나? 수상한가?';
@override
String get freeNote => '자유 메모';
@override
String get freeNoteHint => '개인 메모...';
@override
String get rulesTitle => '📖 게임 방법';
@override
String get rulesWhatIsTitle => '🎭 임포스터란?';
@override
String get rulesWhatIsBody =>
'3~20명이 즐기는 사회적 추리 게임입니다. 모두가 비밀 단어를 받지만... 임포스터만 받지 못합니다! 당신의 임무: 누가 아는 척하는지 찾아내세요.';
@override
String get rulesHowToPlayTitle => '🔍 어떻게 하나요?';
@override
String get rulesHowToPlayBody =>
'1. 역할 배분: 모든 플레이어가 같은 단어를 받지만, 임포스터는 받지 못합니다.\n\n2. 토론: 차례대로 각 플레이어가 단어를 직접 말하지 않고 설명합니다. 임포스터는 아는 척해야 합니다.\n\n3. 투표: 토론이 끝나면 모두가 임포스터라고 생각하는 사람에게 투표합니다.\n\n4. 탈락: 가장 많은 표를 받은 사람이 탈락하고, 임포스터였는지 밝혀집니다.\n\n5. 임포스터였다면 단어를 맞출 기회가 있습니다. 맞추면 임포스터 승리!';
@override
String get rulesWhoWinsTitle => '🏆 누가 이기나요?';
@override
String get rulesWhoWinsBody =>
'• 플레이어: 모든 임포스터를 탈락시키면 승리.\n• 임포스터: 발각되지 않고 일반 플레이어 수가 임포스터 수 이하가 될 때까지 버티면 승리. 또는 탈락 시 단어를 맞추면 승리.';
@override
String get rulesTipsPlayersTitle => '💡 플레이어를 위한 팁';
@override
String get rulesTipsPlayersBody =>
'• 단어를 알고 있다는 것을 증명하는 미묘한 힌트를 주되, 임포스터가 이용할 수 있을 만큼 뻔하게 하지 마세요.\n• 모호하거나 일반적인 답변을 하는 사람을 주시하세요.\n• 메모를 활용하여 각자 한 말을 기록하세요.\n• 단어를 직접 말하지 마세요. 임포스터를 돕는 셈이 됩니다!';
@override
String get rulesTipsImpostorTitle => '🎭 임포스터를 위한 팁';
@override
String get rulesTipsImpostorBody =>
'• 다른 플레이어의 힌트를 주의 깊게 들으세요.\n• 단어를 추리하여 그럴듯한 힌트를 주세요.\n• 확신이 없으면 먼저 말하지 마세요.\n• 카테고리가 힌트로 주어졌다면 적극 활용하세요.\n• 다른 사람을 의심하여 주의를 돌리세요.';
@override
String get rulesModesTitle => '📱 게임 모드';
@override
String get rulesModesBody =>
'• 기기 하나로: 모두가 한 기기를 공유합니다. 각 플레이어가 버튼을 길게 눌러 자신의 단어를 확인합니다.\n\n• 여러 기기로: 각 플레이어가 자신의 기기를 사용합니다. Bluetooth/WiFi Direct로 연결하며 인터넷이 필요 없습니다.';
@override
String get rulesExampleTitle => '✏️ 게임 예시';
@override
String get rulesExampleBody =>
'비밀 단어: \"피자\"\n\n• 수진: \"뜨거울 때 먹어요\"\n• 민수: \"상자에 들어 있어요\"\n• 지은 (임포스터): \"아주 인기 있어요\" 🤔\n• 현우: \"치즈가 올려져 있어요\"\n\n지은이 너무 일반적인 답변을 했네요... 수상해요!';
@override
String get joinGameTitle => '게임 참가';
@override
String get multiDeviceMode => '여러 기기 모드';
@override
String get scanQrDescription =>
'호스트가 보여주는 QR 코드를 스캔하여 Bluetooth/WiFi Direct로 게임에 접속하세요.';
@override
String get comingSoon => '곧 출시';
@override
String get nearbyNotAvailable =>
'여러 기기 연결을 위한 Nearby Connections는 실제 Android 기기가 필요합니다.\n\n현재는 \"기기 하나로\" 모드를 사용하여 하나의 기기에서 플레이하세요.';
@override
String get back => '뒤로';
@override
String get yes => '';
@override
String get no => '아니오';
@override
String get cancel => '취소';
@override
String get accept => '확인';
@override
String get next => '다음';
@override
String get settingsTitle => '설정';
@override
String get language => '언어';
@override
String get soundVolume => '효과음 볼륨';
@override
String get vibration => '진동';
@override
String get about => '앱 정보';
@override
String get version => '버전';
@override
String get developer => '개발자';
@override
String get licenses => '라이선스';
}

View File

@@ -0,0 +1,476 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Dutch Flemish (`nl`).
class AppLocalizationsNl extends AppLocalizations {
AppLocalizationsNl([String locale = 'nl']) : super(locale);
@override
String get appTitle => 'De Bedrieger';
@override
String get subtitle => 'Sociaal deductiespel';
@override
String get loadingWords => 'Woorden laden...';
@override
String get playersRange => '3-20 spelers • Zonder internet';
@override
String get createGame => 'Spel aanmaken';
@override
String get joinGame => 'Deelnemen aan spel';
@override
String get howToPlay => 'Hoe te spelen';
@override
String get settings => 'Instellingen';
@override
String get gameMode => 'Spelmodus';
@override
String get singleDevice => 'Eén toestel';
@override
String get multiDevice => 'Meerdere toestellen';
@override
String get category => 'Categorie';
@override
String get categoryAll => 'Alle';
@override
String get categoryAnimals => 'Dieren';
@override
String get categoryFood => 'Eten';
@override
String get categoryCountries => 'Landen';
@override
String get categorySports => 'Sport';
@override
String get categoryProfessions => 'Beroepen';
@override
String get categoryObjects => 'Voorwerpen';
@override
String get categoryPlaces => 'Plaatsen';
@override
String get categoryMovies => 'Films';
@override
String get categoryMusic => 'Muziek';
@override
String get categoryTechnology => 'Technologie';
@override
String playersCount(int count) {
return 'Spelers ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Naam van de speler';
@override
String get playerAlreadyExists => 'Er bestaat al een speler met die naam';
@override
String get maxPlayersReached => 'Maximaal 20 spelers';
@override
String get minPlayersRequired => 'Er zijn minstens 3 spelers nodig';
@override
String get configuration => 'Configuratie';
@override
String get impostors => '🎭 Bedriegers';
@override
String get impostorClue => '🔍 Aanwijzing voor bedrieger';
@override
String get impostorClueDescription => 'De bedrieger kent de categorie';
@override
String get debateTime => '⏱️ Debattijd';
@override
String get noLimit => 'Geen limiet';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Spel starten';
@override
String get seeYourWord => 'Bekijk je woord';
@override
String get eachPlayerMustSee =>
'Elke speler moet zijn woord in het geheim bekijken';
@override
String roundNumber(int round) {
return 'Ronde $round';
}
@override
String get alreadySeen => 'Heeft zijn woord al gezien';
@override
String get tapToSee => 'Tik om te bekijken';
@override
String get allSeenStartDebate => 'Iedereen heeft gezien → Start debat';
@override
String playersRemaining(int count) {
return 'Nog $count spelers';
}
@override
String get youAreImpostor => 'Jij bent de bedrieger!';
@override
String get yourWordIs => 'Jouw woord is:';
@override
String clueCategory(String category) {
return 'Aanwijzing: $category';
}
@override
String get holdToSeeWord => 'Houd ingedrukt om je woord te zien';
@override
String get makeSureNoOneLooks => 'Zorg dat niemand anders kijkt';
@override
String get showingWord => '👁️ Wordt getoond...';
@override
String get holdToSee => '👆 Houd ingedrukt om te zien';
@override
String get seenMyWord => 'Ik heb mijn woord gezien';
@override
String debateRound(int round) {
return 'Debat - Ronde $round';
}
@override
String get timeUp => '⏰ Tijd is om!';
@override
String get timeRemaining => '⏱️ Resterende tijd';
@override
String get playersInDebate => 'Spelers in debat';
@override
String activePlayersInfo(int active, int impostors) {
return '$active actief • $impostors verborgen bedrieger(s)';
}
@override
String get eliminated => 'Geëlimineerd';
@override
String get notes => 'Notities';
@override
String get goToVoting => 'Naar stemming';
@override
String get voting => '🗳️ Stemming';
@override
String get turnToVote => 'Beurt om te stemmen:';
@override
String votesProgress(int current, int total) {
return 'Stemmen: $current/$total';
}
@override
String get whoIsImpostor => 'Wie is volgens jou de bedrieger?';
@override
String get confirmVote => 'Stem bevestigen';
@override
String get votingComplete => '🗳️ Stemming voltooid';
@override
String get allVoted => 'Iedereen heeft gestemd!';
@override
String get tapToReveal => 'Tik om het resultaat te onthullen';
@override
String get revealResult => 'Resultaat onthullen';
@override
String get result => 'Resultaat';
@override
String get revealing => 'Onthullen...';
@override
String get wasImpostor => 'Was de BEDRIEGER! 🎉';
@override
String get wasInnocent => 'Was ONSCHULDIG 😱';
@override
String get votesThisRound => 'Stemmen deze ronde';
@override
String get seeEndResult => 'Eindresultaat bekijken';
@override
String get impostorGuessWord => 'Raadt de bedrieger het woord?';
@override
String get nextRound => 'Volgende ronde';
@override
String get impostorGuessTitle => '🎯 Gok van de bedrieger';
@override
String get impostorCanGuess =>
'De geëlimineerde bedrieger mag\nproberen het woord te raden';
@override
String get ifCorrectImpostorsWin => 'Als het klopt, winnen de bedriegers!';
@override
String get guessWordHint => 'Wat denk je dat het woord is?';
@override
String get dontGuess => 'Niet proberen';
@override
String get guess => 'Raden';
@override
String get correctGuess => 'Goed geraden!';
@override
String theWordWas(String word) {
return 'Het woord was: $word';
}
@override
String get impostorsWin => 'De bedriegers winnen!';
@override
String get wrongGuess => 'Fout geraden!';
@override
String get gameContinues => 'Het spel gaat verder...';
@override
String get gameOver => 'Einde van het spel';
@override
String get playersWin => 'De spelers winnen!';
@override
String get theSecretWordWas => '🔍 Het woord was:';
@override
String categoryLabel(String category) {
return 'Categorie: $category';
}
@override
String get theImpostorWas => '🎭 De bedrieger was:';
@override
String get theImpostorsWere => '🎭 De bedriegers waren:';
@override
String get votingHistory => '📊 Stemgeschiedenis';
@override
String roundElimination(int round, String name) {
return 'Ronde $round: $name';
}
@override
String get rematch => 'Herkansing';
@override
String get mainMenu => 'Hoofdmenu';
@override
String get notesTitle => '📝 Notities';
@override
String get notesSaved => 'Notities opgeslagen';
@override
String get whoAreYou => 'Wie ben je?';
@override
String get selectYourName =>
'Selecteer je naam om je privénotities te bekijken';
@override
String notesOf(String name) {
return 'Notities van $name';
}
@override
String get notesAboutPlayers => 'Aantekeningen over elke speler';
@override
String get playerNoteHint => 'Wat heeft hij gezegd? Verdacht?';
@override
String get freeNote => 'Vrije notitie';
@override
String get freeNoteHint => 'Persoonlijke aantekeningen...';
@override
String get rulesTitle => '📖 Hoe te spelen';
@override
String get rulesWhatIsTitle => '🎭 Wat is De Bedrieger?';
@override
String get rulesWhatIsBody =>
'Een sociaal deductiespel voor 3-20 spelers. Iedereen krijgt een geheim woord... behalve de bedrieger! Jouw missie: ontdek wie doet alsof.';
@override
String get rulesHowToPlayTitle => '🔍 Hoe speel je?';
@override
String get rulesHowToPlayBody =>
'1. Rollen worden verdeeld: iedereen krijgt hetzelfde woord, behalve de bedrieger(s).\n\n2. Debat: om de beurt beschrijft elke speler het woord ZONDER het direct te zeggen. De bedrieger moet doen alsof hij het kent.\n\n3. Stemming: na het debat stemt iedereen op wie volgens hen de bedrieger is.\n\n4. Eliminatie: de speler met de meeste stemmen wordt geëlimineerd en het wordt onthuld of het de bedrieger was of niet.\n\n5. Als het de bedrieger was, mag hij proberen het woord te raden. Als het klopt, winnen de bedriegers!';
@override
String get rulesWhoWinsTitle => '🏆 Wie wint?';
@override
String get rulesWhoWinsBody =>
'• Spelers: winnen als ze ALLE bedriegers elimineren.\n• Bedriegers: winnen als ze niet ontdekt worden totdat er evenveel of minder gewone spelers dan bedriegers over zijn, of als ze het woord raden na eliminatie.';
@override
String get rulesTipsPlayersTitle => '💡 Tips voor spelers';
@override
String get rulesTipsPlayersBody =>
'• Geef subtiele hints die laten zien dat je het woord kent, maar niet zo duidelijk dat de bedrieger ze kan gebruiken.\n• Let op wie vage of algemene antwoorden geeft.\n• Gebruik de notities om op te schrijven wat iedereen zegt.\n• Zeg het woord niet direct — dat helpt de bedrieger!';
@override
String get rulesTipsImpostorTitle => '🎭 Tips voor de bedrieger';
@override
String get rulesTipsImpostorBody =>
'• Luister goed naar de hints van anderen.\n• Probeer het woord af te leiden om geloofwaardige hints te geven.\n• Spreek niet als eerste als je niet zeker bent.\n• Als je de categorie als hint krijgt, gebruik die in je voordeel.\n• Beschuldig anderen om de aandacht af te leiden.';
@override
String get rulesModesTitle => '📱 Spelmodi';
@override
String get rulesModesBody =>
'• Eén toestel: iedereen deelt hetzelfde apparaat. Elke speler ziet zijn woord door een knop ingedrukt te houden.\n\n• Meerdere toestellen: elke speler gebruikt zijn eigen apparaat. Ze verbinden via Bluetooth/WiFi Direct zonder internet.';
@override
String get rulesExampleTitle => '✏️ Voorbeeldspel';
@override
String get rulesExampleBody =>
'Geheim woord: \"Pizza\"\n\n• Jan: \"Je eet het warm\"\n• Sanne: \"Het komt in een doos\"\n• Bram (bedrieger): \"Het is heel populair\" 🤔\n• Lisa: \"Het heeft kaas\"\n\nBram gaf een heel vaag antwoord... Verdacht!';
@override
String get joinGameTitle => 'Deelnemen aan spel';
@override
String get multiDeviceMode => 'Modus meerdere toestellen';
@override
String get scanQrDescription =>
'Scan de QR-code die de host toont om verbinding te maken met het spel via Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Binnenkort';
@override
String get nearbyNotAvailable =>
'De multitoestelverbinding met Nearby Connections vereist fysieke Android-apparaten.\n\nGebruik voorlopig de modus \"Eén toestel\" om op een gedeeld apparaat te spelen.';
@override
String get back => 'Terug';
@override
String get yes => 'Ja';
@override
String get no => 'Nee';
@override
String get cancel => 'Annuleren';
@override
String get accept => 'Accepteren';
@override
String get next => 'Volgende';
@override
String get settingsTitle => 'Instellingen';
@override
String get language => 'Taal';
@override
String get soundVolume => 'Effectvolume';
@override
String get vibration => 'Trillen';
@override
String get about => 'Over';
@override
String get version => 'Versie';
@override
String get developer => 'Ontwikkelaar';
@override
String get licenses => 'Licenties';
}

View File

@@ -0,0 +1,476 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Polish (`pl`).
class AppLocalizationsPl extends AppLocalizations {
AppLocalizationsPl([String locale = 'pl']) : super(locale);
@override
String get appTitle => 'Oszust';
@override
String get subtitle => 'Gra dedukcji społecznej';
@override
String get loadingWords => 'Ładowanie słów...';
@override
String get playersRange => '3-20 graczy • Bez internetu';
@override
String get createGame => 'Utwórz grę';
@override
String get joinGame => 'Dołącz do gry';
@override
String get howToPlay => 'Jak grać';
@override
String get settings => 'Ustawienia';
@override
String get gameMode => 'Tryb gry';
@override
String get singleDevice => 'Jedno urządzenie';
@override
String get multiDevice => 'Wiele urządzeń';
@override
String get category => 'Kategoria';
@override
String get categoryAll => 'Wszystkie';
@override
String get categoryAnimals => 'Zwierzęta';
@override
String get categoryFood => 'Jedzenie';
@override
String get categoryCountries => 'Kraje';
@override
String get categorySports => 'Sport';
@override
String get categoryProfessions => 'Zawody';
@override
String get categoryObjects => 'Przedmioty';
@override
String get categoryPlaces => 'Miejsca';
@override
String get categoryMovies => 'Filmy';
@override
String get categoryMusic => 'Muzyka';
@override
String get categoryTechnology => 'Technologia';
@override
String playersCount(int count) {
return 'Gracze ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Imię gracza';
@override
String get playerAlreadyExists => 'Gracz o takim imieniu już istnieje';
@override
String get maxPlayersReached => 'Maksymalnie 20 graczy';
@override
String get minPlayersRequired => 'Potrzeba co najmniej 3 graczy';
@override
String get configuration => 'Konfiguracja';
@override
String get impostors => '🎭 Oszuści';
@override
String get impostorClue => '🔍 Wskazówka dla oszusta';
@override
String get impostorClueDescription => 'Oszust zna kategorię';
@override
String get debateTime => '⏱️ Czas debaty';
@override
String get noLimit => 'Bez limitu';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Rozpocznij grę';
@override
String get seeYourWord => 'Zobacz swoje słowo';
@override
String get eachPlayerMustSee =>
'Każdy gracz musi zobaczyć swoje słowo w tajemnicy';
@override
String roundNumber(int round) {
return 'Runda $round';
}
@override
String get alreadySeen => 'Już widział swoje słowo';
@override
String get tapToSee => 'Dotknij, aby zobaczyć';
@override
String get allSeenStartDebate => 'Wszyscy widzieli → Rozpocznij debatę';
@override
String playersRemaining(int count) {
return 'Pozostało $count graczy';
}
@override
String get youAreImpostor => 'Jesteś oszustem!';
@override
String get yourWordIs => 'Twoje słowo to:';
@override
String clueCategory(String category) {
return 'Wskazówka: $category';
}
@override
String get holdToSeeWord => 'Przytrzymaj, aby zobaczyć swoje słowo';
@override
String get makeSureNoOneLooks => 'Upewnij się, że nikt inny nie patrzy';
@override
String get showingWord => '👁️ Pokazuję...';
@override
String get holdToSee => '👆 Przytrzymaj, aby zobaczyć';
@override
String get seenMyWord => 'Widziałem swoje słowo';
@override
String debateRound(int round) {
return 'Debata - Runda $round';
}
@override
String get timeUp => '⏰ Czas minął!';
@override
String get timeRemaining => '⏱️ Pozostały czas';
@override
String get playersInDebate => 'Gracze w debacie';
@override
String activePlayersInfo(int active, int impostors) {
return '$active aktywnych • $impostors ukrytych oszustów';
}
@override
String get eliminated => 'Wyeliminowany';
@override
String get notes => 'Notatki';
@override
String get goToVoting => 'Przejdź do głosowania';
@override
String get voting => '🗳️ Głosowanie';
@override
String get turnToVote => 'Kolej na głosowanie:';
@override
String votesProgress(int current, int total) {
return 'Głosy: $current/$total';
}
@override
String get whoIsImpostor => 'Kto twoim zdaniem jest oszustem?';
@override
String get confirmVote => 'Potwierdź głos';
@override
String get votingComplete => '🗳️ Głosowanie zakończone';
@override
String get allVoted => 'Wszyscy zagłosowali!';
@override
String get tapToReveal => 'Dotknij, aby odkryć wynik';
@override
String get revealResult => 'Odkryj wynik';
@override
String get result => 'Wynik';
@override
String get revealing => 'Odkrywam...';
@override
String get wasImpostor => 'To był OSZUST! 🎉';
@override
String get wasInnocent => 'Był NIEWINNY 😱';
@override
String get votesThisRound => 'Głosy w tej rundzie';
@override
String get seeEndResult => 'Zobacz wynik końcowy';
@override
String get impostorGuessWord => 'Czy oszust odgadnie słowo?';
@override
String get nextRound => 'Następna runda';
@override
String get impostorGuessTitle => '🎯 Zgadywanie oszusta';
@override
String get impostorCanGuess =>
'Wyeliminowany oszust może\nspróbować odgadnąć słowo';
@override
String get ifCorrectImpostorsWin => 'Jeśli trafi, oszuści wygrywają!';
@override
String get guessWordHint => 'Jakie twoim zdaniem jest to słowo?';
@override
String get dontGuess => 'Nie próbuj';
@override
String get guess => 'Zgaduj';
@override
String get correctGuess => 'Trafił!';
@override
String theWordWas(String word) {
return 'Słowo brzmiało: $word';
}
@override
String get impostorsWin => 'Oszuści wygrywają!';
@override
String get wrongGuess => 'Nie trafił!';
@override
String get gameContinues => 'Gra toczy się dalej...';
@override
String get gameOver => 'Koniec gry';
@override
String get playersWin => 'Gracze wygrywają!';
@override
String get theSecretWordWas => '🔍 Słowo brzmiało:';
@override
String categoryLabel(String category) {
return 'Kategoria: $category';
}
@override
String get theImpostorWas => '🎭 Oszustem był:';
@override
String get theImpostorsWere => '🎭 Oszustami byli:';
@override
String get votingHistory => '📊 Historia głosowań';
@override
String roundElimination(int round, String name) {
return 'Runda $round: $name';
}
@override
String get rematch => 'Rewanż';
@override
String get mainMenu => 'Menu główne';
@override
String get notesTitle => '📝 Notatki';
@override
String get notesSaved => 'Notatki zapisane';
@override
String get whoAreYou => 'Kim jesteś?';
@override
String get selectYourName =>
'Wybierz swoje imię, aby zobaczyć prywatne notatki';
@override
String notesOf(String name) {
return 'Notatki gracza $name';
}
@override
String get notesAboutPlayers => 'Zapiski o każdym graczu';
@override
String get playerNoteHint => 'Co powiedział? Podejrzany?';
@override
String get freeNote => 'Wolna notatka';
@override
String get freeNoteHint => 'Osobiste zapiski...';
@override
String get rulesTitle => '📖 Jak grać';
@override
String get rulesWhatIsTitle => '🎭 Czym jest Oszust?';
@override
String get rulesWhatIsBody =>
'Gra dedukcji społecznej dla 3-20 graczy. Wszyscy otrzymują tajne słowo... oprócz oszusta! Twoja misja: odkryj, kto udaje.';
@override
String get rulesHowToPlayTitle => '🔍 Jak się gra?';
@override
String get rulesHowToPlayBody =>
'1. Rozdanie ról: wszyscy otrzymują to samo słowo, oprócz oszusta/oszustów.\n\n2. Debata: po kolei każdy gracz opisuje słowo BEZ wypowiadania go wprost. Oszust musi udawać, że je zna.\n\n3. Głosowanie: po zakończeniu debaty wszyscy głosują na osobę, którą uważają za oszusta.\n\n4. Eliminacja: gracz z największą liczbą głosów zostaje wyeliminowany i ujawnia się, czy był oszustem.\n\n5. Jeśli to był oszust, może spróbować odgadnąć słowo. Jeśli trafi, oszuści wygrywają!';
@override
String get rulesWhoWinsTitle => '🏆 Kto wygrywa?';
@override
String get rulesWhoWinsBody =>
'• Gracze: wygrywają, jeśli wyeliminują WSZYSTKICH oszustów.\n• Oszuści: wygrywają, jeśli nie zostaną odkryci, dopóki zwykłych graczy nie będzie tyle samo lub mniej niż oszustów, albo jeśli odgadną słowo po eliminacji.';
@override
String get rulesTipsPlayersTitle => '💡 Wskazówki dla graczy';
@override
String get rulesTipsPlayersBody =>
'• Dawaj subtelne wskazówki, które pokażą, że znasz słowo, ale nie na tyle oczywiste, by oszust mógł je wykorzystać.\n• Obserwuj, kto daje niejasne lub ogólnikowe odpowiedzi.\n• Używaj notatek, by zapisywać, co mówi każdy gracz.\n• Nie mów słowa wprost — to pomaga oszustowi!';
@override
String get rulesTipsImpostorTitle => '🎭 Wskazówki dla oszusta';
@override
String get rulesTipsImpostorBody =>
'• Uważnie słuchaj wskazówek innych.\n• Spróbuj wydedukować słowo, by dawać wiarygodne wskazówki.\n• Nie mów pierwszy, jeśli nie jesteś pewien.\n• Jeśli dostaniesz kategorię jako wskazówkę, wykorzystaj ją.\n• Oskarżaj innych, by odwrócić uwagę.';
@override
String get rulesModesTitle => '📱 Tryby gry';
@override
String get rulesModesBody =>
'• Jedno urządzenie: wszyscy dzielą jedno urządzenie. Każdy gracz widzi swoje słowo, przytrzymując przycisk.\n\n• Wiele urządzeń: każdy gracz używa własnego urządzenia. Łączą się przez Bluetooth/WiFi Direct bez potrzeby internetu.';
@override
String get rulesExampleTitle => '✏️ Przykładowa gra';
@override
String get rulesExampleBody =>
'Tajne słowo: \"Pizza\"\n\n• Kasia: \"Je się na ciepło\"\n• Tomek: \"Przychodzi w pudełku\"\n• Ola (oszust): \"Jest bardzo popularna\" 🤔\n• Marek: \"Ma ser\"\n\nOla dała bardzo ogólnikową odpowiedź... Podejrzana!';
@override
String get joinGameTitle => 'Dołącz do gry';
@override
String get multiDeviceMode => 'Tryb wielu urządzeń';
@override
String get scanQrDescription =>
'Zeskanuj kod QR wyświetlany przez hosta, aby połączyć się z grą przez Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Wkrótce';
@override
String get nearbyNotAvailable =>
'Połączenie wielourządzeniowe z Nearby Connections wymaga fizycznych urządzeń z Androidem.\n\nNa razie użyj trybu \"Jedno urządzenie\", aby grać na wspólnym urządzeniu.';
@override
String get back => 'Wstecz';
@override
String get yes => 'Tak';
@override
String get no => 'Nie';
@override
String get cancel => 'Anuluj';
@override
String get accept => 'Akceptuj';
@override
String get next => 'Dalej';
@override
String get settingsTitle => 'Ustawienia';
@override
String get language => 'Język';
@override
String get soundVolume => 'Głośność efektów';
@override
String get vibration => 'Wibracje';
@override
String get about => 'O aplikacji';
@override
String get version => 'Wersja';
@override
String get developer => 'Programista';
@override
String get licenses => 'Licencje';
}

View File

@@ -0,0 +1,477 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Portuguese (`pt`).
class AppLocalizationsPt extends AppLocalizations {
AppLocalizationsPt([String locale = 'pt']) : super(locale);
@override
String get appTitle => 'O Impostor';
@override
String get subtitle => 'Jogo de dedução social';
@override
String get loadingWords => 'Carregando palavras...';
@override
String get playersRange => '3-20 jogadores • Sem internet';
@override
String get createGame => 'Criar partida';
@override
String get joinGame => 'Entrar na partida';
@override
String get howToPlay => 'Como jogar';
@override
String get settings => 'Configurações';
@override
String get gameMode => 'Modo de jogo';
@override
String get singleDevice => 'Um só celular';
@override
String get multiDevice => 'Multicelular';
@override
String get category => 'Categoria';
@override
String get categoryAll => 'Todas';
@override
String get categoryAnimals => 'Animais';
@override
String get categoryFood => 'Comida';
@override
String get categoryCountries => 'Países';
@override
String get categorySports => 'Esportes';
@override
String get categoryProfessions => 'Profissões';
@override
String get categoryObjects => 'Objetos';
@override
String get categoryPlaces => 'Lugares';
@override
String get categoryMovies => 'Filmes';
@override
String get categoryMusic => 'Música';
@override
String get categoryTechnology => 'Tecnologia';
@override
String playersCount(int count) {
return 'Jogadores ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Nome do jogador';
@override
String get playerAlreadyExists => 'Já existe um jogador com esse nome';
@override
String get maxPlayersReached => 'Máximo de 20 jogadores';
@override
String get minPlayersRequired => 'São necessários pelo menos 3 jogadores';
@override
String get configuration => 'Configuração';
@override
String get impostors => '🎭 Impostores';
@override
String get impostorClue => '🔍 Dica para o impostor';
@override
String get impostorClueDescription => 'O impostor conhece a categoria';
@override
String get debateTime => '⏱️ Tempo de debate';
@override
String get noLimit => 'Sem limite';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Iniciar partida';
@override
String get seeYourWord => 'Ver sua palavra';
@override
String get eachPlayerMustSee =>
'Cada jogador deve ver sua palavra em segredo';
@override
String roundNumber(int round) {
return 'Rodada $round';
}
@override
String get alreadySeen => 'Já viu sua palavra';
@override
String get tapToSee => 'Toque para ver';
@override
String get allSeenStartDebate => 'Todos viram → Iniciar debate';
@override
String playersRemaining(int count) {
return 'Faltam $count jogadores';
}
@override
String get youAreImpostor => 'Você é o impostor!';
@override
String get yourWordIs => 'Sua palavra é:';
@override
String clueCategory(String category) {
return 'Dica: $category';
}
@override
String get holdToSeeWord => 'Mantenha pressionado para ver sua palavra';
@override
String get makeSureNoOneLooks =>
'Certifique-se de que ninguém mais está olhando';
@override
String get showingWord => '👁️ Mostrando...';
@override
String get holdToSee => '👆 Mantenha pressionado para ver';
@override
String get seenMyWord => 'Já vi minha palavra';
@override
String debateRound(int round) {
return 'Debate - Rodada $round';
}
@override
String get timeUp => '⏰ Tempo esgotado!';
@override
String get timeRemaining => '⏱️ Tempo restante';
@override
String get playersInDebate => 'Jogadores no debate';
@override
String activePlayersInfo(int active, int impostors) {
return '$active ativos • $impostors impostor(es) ocultos';
}
@override
String get eliminated => 'Eliminado';
@override
String get notes => 'Notas';
@override
String get goToVoting => 'Ir para votação';
@override
String get voting => '🗳️ Votação';
@override
String get turnToVote => 'Vez de votar:';
@override
String votesProgress(int current, int total) {
return 'Votos: $current/$total';
}
@override
String get whoIsImpostor => 'Quem você acha que é o impostor?';
@override
String get confirmVote => 'Confirmar voto';
@override
String get votingComplete => '🗳️ Votação completa';
@override
String get allVoted => 'Todos votaram!';
@override
String get tapToReveal => 'Toque para revelar o resultado';
@override
String get revealResult => 'Revelar resultado';
@override
String get result => 'Resultado';
@override
String get revealing => 'Revelando...';
@override
String get wasImpostor => 'Era IMPOSTOR! 🎉';
@override
String get wasInnocent => 'Era INOCENTE 😱';
@override
String get votesThisRound => 'Votos desta rodada';
@override
String get seeEndResult => 'Ver resultado final';
@override
String get impostorGuessWord => 'O impostor adivinha a palavra?';
@override
String get nextRound => 'Próxima rodada';
@override
String get impostorGuessTitle => '🎯 Palpite do impostor';
@override
String get impostorCanGuess =>
'O impostor eliminado pode\ntentar adivinhar a palavra';
@override
String get ifCorrectImpostorsWin => 'Se acertar, os impostores vencem!';
@override
String get guessWordHint => 'Qual você acha que é a palavra?';
@override
String get dontGuess => 'Não tentar';
@override
String get guess => 'Adivinhar';
@override
String get correctGuess => 'Acertou!';
@override
String theWordWas(String word) {
return 'A palavra era: $word';
}
@override
String get impostorsWin => 'Os impostores vencem!';
@override
String get wrongGuess => 'Não acertou!';
@override
String get gameContinues => 'A partida continua...';
@override
String get gameOver => 'Fim de partida';
@override
String get playersWin => 'Os jogadores vencem!';
@override
String get theSecretWordWas => '🔍 A palavra era:';
@override
String categoryLabel(String category) {
return 'Categoria: $category';
}
@override
String get theImpostorWas => '🎭 O impostor era:';
@override
String get theImpostorsWere => '🎭 Os impostores eram:';
@override
String get votingHistory => '📊 Histórico de votações';
@override
String roundElimination(int round, String name) {
return 'Rodada $round: $name';
}
@override
String get rematch => 'Revanche';
@override
String get mainMenu => 'Menu principal';
@override
String get notesTitle => '📝 Notas';
@override
String get notesSaved => 'Notas salvas';
@override
String get whoAreYou => 'Quem é você?';
@override
String get selectYourName =>
'Selecione seu nome para ver suas notas privadas';
@override
String notesOf(String name) {
return 'Notas de $name';
}
@override
String get notesAboutPlayers => 'Anotações sobre cada jogador';
@override
String get playerNoteHint => 'O que disse? Suspeito?';
@override
String get freeNote => 'Nota livre';
@override
String get freeNoteHint => 'Anotações pessoais...';
@override
String get rulesTitle => '📖 Como jogar';
@override
String get rulesWhatIsTitle => '🎭 O que é O Impostor?';
@override
String get rulesWhatIsBody =>
'Um jogo de dedução social para 3-20 jogadores. Todos recebem uma palavra secreta... exceto o impostor! Sua missão: descobrir quem está fingindo.';
@override
String get rulesHowToPlayTitle => '🔍 Como se joga?';
@override
String get rulesHowToPlayBody =>
'1. Os papéis são distribuídos: todos recebem a mesma palavra, exceto o(s) impostor(es).\n\n2. Debate: por turnos, cada jogador descreve a palavra SEM dizê-la diretamente. O impostor deve fingir que a conhece.\n\n3. Votação: ao terminar o debate, todos votam em quem acham que é o impostor.\n\n4. Eliminação: o mais votado é eliminado e revela-se se era impostor ou não.\n\n5. Se era impostor, pode tentar adivinhar a palavra. Se acertar, os impostores vencem!';
@override
String get rulesWhoWinsTitle => '🏆 Quem ganha?';
@override
String get rulesWhoWinsBody =>
'• Jogadores: vencem se eliminarem TODOS os impostores.\n• Impostores: vencem se não forem descobertos até que restem igual ou menos jogadores normais que impostores, ou se adivinharem a palavra ao serem eliminados.';
@override
String get rulesTipsPlayersTitle => '💡 Dicas para jogadores';
@override
String get rulesTipsPlayersBody =>
'• Dê dicas sutis que provem que você conhece a palavra, mas não tão óbvias que o impostor as use.\n• Observe quem dá respostas vagas ou genéricas.\n• Use as notas para anotar o que cada um diz.\n• Não diga a palavra diretamente, isso ajuda o impostor!';
@override
String get rulesTipsImpostorTitle => '🎭 Dicas para o impostor';
@override
String get rulesTipsImpostorBody =>
'• Ouça atentamente as dicas dos outros.\n• Tente deduzir a palavra para dar dicas convincentes.\n• Não seja o primeiro a falar se não tiver certeza.\n• Se receberem a categoria como dica, use a seu favor.\n• Acuse outros para desviar a atenção.';
@override
String get rulesModesTitle => '📱 Modos de jogo';
@override
String get rulesModesBody =>
'• Um só celular: todos compartilham o dispositivo. Cada jogador vê sua palavra pressionando e segurando um botão.\n\n• Multicelular: cada jogador usa seu próprio dispositivo. Conectam-se por Bluetooth/WiFi Direct sem necessidade de internet.';
@override
String get rulesExampleTitle => '✏️ Exemplo de partida';
@override
String get rulesExampleBody =>
'Palavra secreta: \"Pizza\"\n\n• João: \"Se come quente\"\n• Maria: \"Vem numa caixa\"\n• Pedro (impostor): \"É muito popular\" 🤔\n• Ana: \"Tem queijo\"\n\nPedro deu uma resposta muito genérica... Suspeito!';
@override
String get joinGameTitle => 'Entrar na partida';
@override
String get multiDeviceMode => 'Modo multicelular';
@override
String get scanQrDescription =>
'Escaneie o código QR exibido pelo anfitrião para se conectar à partida via Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Em breve';
@override
String get nearbyNotAvailable =>
'A conexão multicelular com Nearby Connections requer dispositivos Android físicos.\n\nPor enquanto, use o modo \"Um só celular\" para jogar em um dispositivo compartilhado.';
@override
String get back => 'Voltar';
@override
String get yes => 'Sim';
@override
String get no => 'Não';
@override
String get cancel => 'Cancelar';
@override
String get accept => 'Aceitar';
@override
String get next => 'Próximo';
@override
String get settingsTitle => 'Configurações';
@override
String get language => 'Idioma';
@override
String get soundVolume => 'Volume dos efeitos';
@override
String get vibration => 'Vibração';
@override
String get about => 'Sobre';
@override
String get version => 'Versão';
@override
String get developer => 'Desenvolvedor';
@override
String get licenses => 'Licenças';
}

View File

@@ -0,0 +1,476 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Russian (`ru`).
class AppLocalizationsRu extends AppLocalizations {
AppLocalizationsRu([String locale = 'ru']) : super(locale);
@override
String get appTitle => 'Самозванец';
@override
String get subtitle => 'Социальная игра на дедукцию';
@override
String get loadingWords => 'Загрузка слов...';
@override
String get playersRange => '3-20 игроков • Без интернета';
@override
String get createGame => 'Создать игру';
@override
String get joinGame => 'Присоединиться к игре';
@override
String get howToPlay => 'Как играть';
@override
String get settings => 'Настройки';
@override
String get gameMode => 'Режим игры';
@override
String get singleDevice => 'Одно устройство';
@override
String get multiDevice => 'Несколько устройств';
@override
String get category => 'Категория';
@override
String get categoryAll => 'Все';
@override
String get categoryAnimals => 'Животные';
@override
String get categoryFood => 'Еда';
@override
String get categoryCountries => 'Страны';
@override
String get categorySports => 'Спорт';
@override
String get categoryProfessions => 'Профессии';
@override
String get categoryObjects => 'Предметы';
@override
String get categoryPlaces => 'Места';
@override
String get categoryMovies => 'Фильмы';
@override
String get categoryMusic => 'Музыка';
@override
String get categoryTechnology => 'Технологии';
@override
String playersCount(int count) {
return 'Игроки ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Имя игрока';
@override
String get playerAlreadyExists => 'Игрок с таким именем уже существует';
@override
String get maxPlayersReached => 'Максимум 20 игроков';
@override
String get minPlayersRequired => 'Нужно минимум 3 игрока';
@override
String get configuration => 'Конфигурация';
@override
String get impostors => '🎭 Самозванцы';
@override
String get impostorClue => '🔍 Подсказка для самозванца';
@override
String get impostorClueDescription => 'Самозванец знает категорию';
@override
String get debateTime => '⏱️ Время обсуждения';
@override
String get noLimit => 'Без ограничений';
@override
String get oneMin => '1 мин';
@override
String get twoMin => '2 мин';
@override
String get threeMin => '3 мин';
@override
String get fiveMin => '5 мин';
@override
String get startGame => 'Начать игру';
@override
String get seeYourWord => 'Посмотри своё слово';
@override
String get eachPlayerMustSee =>
'Каждый игрок должен тайно посмотреть своё слово';
@override
String roundNumber(int round) {
return 'Раунд $round';
}
@override
String get alreadySeen => 'Уже видел своё слово';
@override
String get tapToSee => 'Нажми, чтобы увидеть';
@override
String get allSeenStartDebate => 'Все увидели → Начать обсуждение';
@override
String playersRemaining(int count) {
return 'Осталось $count игроков';
}
@override
String get youAreImpostor => 'Ты самозванец!';
@override
String get yourWordIs => 'Твоё слово:';
@override
String clueCategory(String category) {
return 'Подсказка: $category';
}
@override
String get holdToSeeWord => 'Удерживай, чтобы увидеть своё слово';
@override
String get makeSureNoOneLooks => 'Убедись, что никто не подсматривает';
@override
String get showingWord => '👁️ Показываю...';
@override
String get holdToSee => '👆 Удерживай, чтобы увидеть';
@override
String get seenMyWord => 'Я увидел своё слово';
@override
String debateRound(int round) {
return 'Обсуждение - Раунд $round';
}
@override
String get timeUp => '⏰ Время вышло!';
@override
String get timeRemaining => '⏱️ Оставшееся время';
@override
String get playersInDebate => 'Игроки в обсуждении';
@override
String activePlayersInfo(int active, int impostors) {
return '$active активных • $impostors скрытый(-х) самозванец(-ев)';
}
@override
String get eliminated => 'Выбыл';
@override
String get notes => 'Заметки';
@override
String get goToVoting => 'Перейти к голосованию';
@override
String get voting => '🗳️ Голосование';
@override
String get turnToVote => 'Твоя очередь голосовать:';
@override
String votesProgress(int current, int total) {
return 'Голоса: $current/$total';
}
@override
String get whoIsImpostor => 'Кто, по-твоему, самозванец?';
@override
String get confirmVote => 'Подтвердить голос';
@override
String get votingComplete => '🗳️ Голосование завершено';
@override
String get allVoted => 'Все проголосовали!';
@override
String get tapToReveal => 'Нажми, чтобы узнать результат';
@override
String get revealResult => 'Показать результат';
@override
String get result => 'Результат';
@override
String get revealing => 'Раскрываем...';
@override
String get wasImpostor => 'Был САМОЗВАНЦЕМ! 🎉';
@override
String get wasInnocent => 'Был НЕВИНОВЕН 😱';
@override
String get votesThisRound => 'Голоса этого раунда';
@override
String get seeEndResult => 'Увидеть итоговый результат';
@override
String get impostorGuessWord => 'Самозванец угадает слово?';
@override
String get nextRound => 'Следующий раунд';
@override
String get impostorGuessTitle => '🎯 Догадка самозванца';
@override
String get impostorCanGuess =>
'Выбывший самозванец может\nпопытаться угадать слово';
@override
String get ifCorrectImpostorsWin => 'Если угадает — самозванцы побеждают!';
@override
String get guessWordHint => 'Как ты думаешь, какое слово?';
@override
String get dontGuess => 'Не пытаться';
@override
String get guess => 'Угадать';
@override
String get correctGuess => 'Угадал!';
@override
String theWordWas(String word) {
return 'Слово было: $word';
}
@override
String get impostorsWin => 'Самозванцы побеждают!';
@override
String get wrongGuess => 'Не угадал!';
@override
String get gameContinues => 'Игра продолжается...';
@override
String get gameOver => 'Конец игры';
@override
String get playersWin => 'Игроки побеждают!';
@override
String get theSecretWordWas => '🔍 Загаданное слово:';
@override
String categoryLabel(String category) {
return 'Категория: $category';
}
@override
String get theImpostorWas => '🎭 Самозванцем был:';
@override
String get theImpostorsWere => '🎭 Самозванцами были:';
@override
String get votingHistory => '📊 История голосований';
@override
String roundElimination(int round, String name) {
return 'Раунд $round: $name';
}
@override
String get rematch => 'Реванш';
@override
String get mainMenu => 'Главное меню';
@override
String get notesTitle => '📝 Заметки';
@override
String get notesSaved => 'Заметки сохранены';
@override
String get whoAreYou => 'Кто ты?';
@override
String get selectYourName =>
'Выбери своё имя, чтобы увидеть свои личные заметки';
@override
String notesOf(String name) {
return 'Заметки $name';
}
@override
String get notesAboutPlayers => 'Записи о каждом игроке';
@override
String get playerNoteHint => 'Что он сказал? Подозрительно?';
@override
String get freeNote => 'Свободная заметка';
@override
String get freeNoteHint => 'Личные записи...';
@override
String get rulesTitle => '📖 Как играть';
@override
String get rulesWhatIsTitle => '🎭 Что такое «Самозванец»?';
@override
String get rulesWhatIsBody =>
'Социальная игра на дедукцию для 3-20 игроков. Все получают секретное слово... кроме самозванца! Твоя задача: вычислить, кто притворяется.';
@override
String get rulesHowToPlayTitle => '🔍 Как играть?';
@override
String get rulesHowToPlayBody =>
'1. Раздача ролей: все получают одно и то же слово, кроме самозванца(-ев).\n\n2. Обсуждение: по очереди каждый игрок описывает слово, НЕ называя его напрямую. Самозванец должен притворяться, что знает его.\n\n3. Голосование: после обсуждения все голосуют за того, кого считают самозванцем.\n\n4. Исключение: игрок, набравший больше всего голосов, выбывает, и выясняется, был ли он самозванцем.\n\n5. Если это был самозванец, он может попытаться угадать слово. Если угадает — самозванцы побеждают!';
@override
String get rulesWhoWinsTitle => '🏆 Кто побеждает?';
@override
String get rulesWhoWinsBody =>
'• Игроки: побеждают, если вычислят ВСЕХ самозванцев.\n• Самозванцы: побеждают, если остаются нераскрытыми, пока обычных игроков не станет столько же или меньше, чем самозванцев, или если угадают слово при выбывании.';
@override
String get rulesTipsPlayersTitle => '💡 Советы для игроков';
@override
String get rulesTipsPlayersBody =>
'• Давай тонкие подсказки, доказывающие, что ты знаешь слово, но не настолько очевидные, чтобы самозванец мог ими воспользоваться.\n• Следи за тем, кто даёт расплывчатые или общие ответы.\n• Используй заметки, чтобы записывать сказанное каждым.\nНе называй слово напрямую — это поможет самозванцу!';
@override
String get rulesTipsImpostorTitle => '🎭 Советы для самозванца';
@override
String get rulesTipsImpostorBody =>
'• Внимательно слушай подсказки остальных.\n• Попытайся вычислить слово, чтобы давать правдоподобные подсказки.\nНе говори первым, если не уверен.\n• Если тебе дали категорию как подсказку, используй это в свою пользу.\n• Обвиняй других, чтобы отвлечь внимание.';
@override
String get rulesModesTitle => '📱 Режимы игры';
@override
String get rulesModesBody =>
'• Одно устройство: все передают телефон по кругу. Каждый игрок видит своё слово, нажав и удерживая кнопку.\n\n• Несколько устройств: каждый игрок использует собственное устройство. Подключение через Bluetooth/WiFi Direct без интернета.';
@override
String get rulesExampleTitle => '✏️ Пример раунда';
@override
String get rulesExampleBody =>
'Секретное слово: «Пицца»\n\n• Аня: «Её едят горячей» ✓\n• Кирилл: «Приходит в коробке» ✓\n• Лена (самозванец): «Очень популярная» 🤔\n• Дима: «С сыром» ✓\n\nЛена дала слишком общий ответ... Подозрительно!';
@override
String get joinGameTitle => 'Присоединиться к игре';
@override
String get multiDeviceMode => 'Режим нескольких устройств';
@override
String get scanQrDescription =>
'Отсканируй QR-код, который показывает хост, чтобы подключиться к игре через Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Скоро';
@override
String get nearbyNotAvailable =>
'Подключение нескольких устройств через Nearby Connections требует физических Android-устройств.\n\nПока что используй режим «Одно устройство» для игры на общем телефоне.';
@override
String get back => 'Назад';
@override
String get yes => 'Да';
@override
String get no => 'Нет';
@override
String get cancel => 'Отмена';
@override
String get accept => 'Принять';
@override
String get next => 'Далее';
@override
String get settingsTitle => 'Настройки';
@override
String get language => 'Язык';
@override
String get soundVolume => 'Громкость эффектов';
@override
String get vibration => 'Вибрация';
@override
String get about => 'О приложении';
@override
String get version => 'Версия';
@override
String get developer => 'Разработчик';
@override
String get licenses => 'Лицензии';
}

View File

@@ -0,0 +1,475 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Turkish (`tr`).
class AppLocalizationsTr extends AppLocalizations {
AppLocalizationsTr([String locale = 'tr']) : super(locale);
@override
String get appTitle => 'Sahtekar';
@override
String get subtitle => 'Sosyal çıkarım oyunu';
@override
String get loadingWords => 'Kelimeler yükleniyor...';
@override
String get playersRange => '3-20 oyuncu • İnternet gerektirmez';
@override
String get createGame => 'Oyun oluştur';
@override
String get joinGame => 'Oyuna katıl';
@override
String get howToPlay => 'Nasıl oynanır';
@override
String get settings => 'Ayarlar';
@override
String get gameMode => 'Oyun modu';
@override
String get singleDevice => 'Tek cihaz';
@override
String get multiDevice => 'Çoklu cihaz';
@override
String get category => 'Kategori';
@override
String get categoryAll => 'Tümü';
@override
String get categoryAnimals => 'Hayvanlar';
@override
String get categoryFood => 'Yiyecekler';
@override
String get categoryCountries => 'Ülkeler';
@override
String get categorySports => 'Sporlar';
@override
String get categoryProfessions => 'Meslekler';
@override
String get categoryObjects => 'Nesneler';
@override
String get categoryPlaces => 'Yerler';
@override
String get categoryMovies => 'Filmler';
@override
String get categoryMusic => 'Müzik';
@override
String get categoryTechnology => 'Teknoloji';
@override
String playersCount(int count) {
return 'Oyuncular ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Oyuncu adı';
@override
String get playerAlreadyExists => 'Bu isimde bir oyuncu zaten var';
@override
String get maxPlayersReached => 'En fazla 20 oyuncu';
@override
String get minPlayersRequired => 'En az 3 oyuncu gerekli';
@override
String get configuration => 'Yapılandırma';
@override
String get impostors => '🎭 Sahtekarlar';
@override
String get impostorClue => '🔍 Sahtekar için ipucu';
@override
String get impostorClueDescription => 'Sahtekar kategoriyi bilir';
@override
String get debateTime => '⏱️ Tartışma süresi';
@override
String get noLimit => 'Sınırsız';
@override
String get oneMin => '1 dk';
@override
String get twoMin => '2 dk';
@override
String get threeMin => '3 dk';
@override
String get fiveMin => '5 dk';
@override
String get startGame => 'Oyunu başlat';
@override
String get seeYourWord => 'Kelimeni gör';
@override
String get eachPlayerMustSee => 'Her oyuncu kelimesini gizlice görmelidir';
@override
String roundNumber(int round) {
return 'Tur $round';
}
@override
String get alreadySeen => 'Kelimesini zaten gördü';
@override
String get tapToSee => 'Görmek için dokun';
@override
String get allSeenStartDebate => 'Herkes gördü → Tartışmayı başlat';
@override
String playersRemaining(int count) {
return '$count oyuncu kaldı';
}
@override
String get youAreImpostor => 'Sen sahtekarsın!';
@override
String get yourWordIs => 'Kelimen:';
@override
String clueCategory(String category) {
return 'İpucu: $category';
}
@override
String get holdToSeeWord => 'Kelimeni görmek için basılı tut';
@override
String get makeSureNoOneLooks => 'Kimsenin bakmadığından emin ol';
@override
String get showingWord => '👁️ Gösteriliyor...';
@override
String get holdToSee => '👆 Görmek için basılı tut';
@override
String get seenMyWord => 'Kelimemi gördüm';
@override
String debateRound(int round) {
return 'Tartışma - Tur $round';
}
@override
String get timeUp => '⏰ Süre doldu!';
@override
String get timeRemaining => '⏱️ Kalan süre';
@override
String get playersInDebate => 'Tartışmadaki oyuncular';
@override
String activePlayersInfo(int active, int impostors) {
return '$active aktif • $impostors gizli sahtekar';
}
@override
String get eliminated => 'Elendi';
@override
String get notes => 'Notlar';
@override
String get goToVoting => 'Oylamaya geç';
@override
String get voting => '🗳️ Oylama';
@override
String get turnToVote => 'Oy verme sırası:';
@override
String votesProgress(int current, int total) {
return 'Oylar: $current/$total';
}
@override
String get whoIsImpostor => 'Sahtekarın kim olduğunu düşünüyorsun?';
@override
String get confirmVote => 'Oyu onayla';
@override
String get votingComplete => '🗳️ Oylama tamamlandı';
@override
String get allVoted => 'Herkes oy verdi!';
@override
String get tapToReveal => 'Sonucu görmek için dokun';
@override
String get revealResult => 'Sonucu göster';
@override
String get result => 'Sonuç';
@override
String get revealing => 'Gösteriliyor...';
@override
String get wasImpostor => 'SAHTEKAR\'dı! 🎉';
@override
String get wasInnocent => 'MASUM\'du 😱';
@override
String get votesThisRound => 'Bu turun oyları';
@override
String get seeEndResult => 'Nihai sonucu gör';
@override
String get impostorGuessWord => 'Sahtekar kelimeyi tahmin edecek mi?';
@override
String get nextRound => 'Sonraki tur';
@override
String get impostorGuessTitle => '🎯 Sahtekarın tahmini';
@override
String get impostorCanGuess =>
'Elenen sahtekar\nkelimeyi tahmin etmeyi deneyebilir';
@override
String get ifCorrectImpostorsWin =>
'Doğru tahmin ederse sahtekarlar kazanır!';
@override
String get guessWordHint => 'Kelime ne olabilir?';
@override
String get dontGuess => 'Tahmin etme';
@override
String get guess => 'Tahmin et';
@override
String get correctGuess => 'Doğru tahmin!';
@override
String theWordWas(String word) {
return 'Kelime şuydu: $word';
}
@override
String get impostorsWin => 'Sahtekarlar kazandı!';
@override
String get wrongGuess => 'Yanlış tahmin!';
@override
String get gameContinues => 'Oyun devam ediyor...';
@override
String get gameOver => 'Oyun bitti';
@override
String get playersWin => 'Oyuncular kazandı!';
@override
String get theSecretWordWas => '🔍 Kelime şuydu:';
@override
String categoryLabel(String category) {
return 'Kategori: $category';
}
@override
String get theImpostorWas => '🎭 Sahtekar şuydu:';
@override
String get theImpostorsWere => '🎭 Sahtekarlar şunlardı:';
@override
String get votingHistory => '📊 Oylama geçmişi';
@override
String roundElimination(int round, String name) {
return 'Tur $round: $name';
}
@override
String get rematch => 'Rövanş';
@override
String get mainMenu => 'Ana menü';
@override
String get notesTitle => '📝 Notlar';
@override
String get notesSaved => 'Notlar kaydedildi';
@override
String get whoAreYou => 'Sen kimsin?';
@override
String get selectYourName => 'Özel notlarını görmek için adını seç';
@override
String notesOf(String name) {
return '$name adlı oyuncunun notları';
}
@override
String get notesAboutPlayers => 'Her oyuncu hakkında notlar';
@override
String get playerNoteHint => 'Ne dedi? Şüpheli mi?';
@override
String get freeNote => 'Serbest not';
@override
String get freeNoteHint => 'Kişisel notlar...';
@override
String get rulesTitle => '📖 Nasıl oynanır';
@override
String get rulesWhatIsTitle => '🎭 Sahtekar nedir?';
@override
String get rulesWhatIsBody =>
'3-20 oyuncu için sosyal bir çıkarım oyunu. Herkes gizli bir kelime alır... sahtekar hariç! Görevin: kimin numaraya yattığını bul.';
@override
String get rulesHowToPlayTitle => '🔍 Nasıl oynanır?';
@override
String get rulesHowToPlayBody =>
'1. Roller dağıtılır: sahtekar(lar) hariç herkes aynı kelimeyi alır.\n\n2. Tartışma: sırayla her oyuncu kelimeyi doğrudan söylemeden tarif eder. Sahtekar biliyormuş gibi yapmalıdır.\n\n3. Oylama: tartışma bitince herkes sahtekar olduğunu düşündüğü kişiye oy verir.\n\n4. Eleme: en çok oy alan elenir ve sahtekar olup olmadığııklanır.\n\n5. Sahtekar idiyse kelimeyi tahmin etmeyi deneyebilir. Doğru tahmin ederse sahtekarlar kazanır!';
@override
String get rulesWhoWinsTitle => '🏆 Kim kazanır?';
@override
String get rulesWhoWinsBody =>
'• Oyuncular: TÜM sahtekarları elerse kazanır.\n• Sahtekarlar: keşfedilmeden normal oyuncu sayısı sahtekar sayısına eşit veya altına düşerse kazanır; ya da elenince kelimeyi doğru tahmin ederlerse kazanır.';
@override
String get rulesTipsPlayersTitle => '💡 Oyuncular için ipuçları';
@override
String get rulesTipsPlayersBody =>
'• Kelimeyi bildiğini kanıtlayan ince ipuçları ver, ama sahtekarın kullanabileceği kadar açık olmasın.\n• Kimin belirsiz veya genel cevaplar verdiğini gözlemle.\n• Herkesin ne dediğini yazmak için notları kullan.\n• Kelimeyi doğrudan söyleme, bu sahtekara yardım eder!';
@override
String get rulesTipsImpostorTitle => '🎭 Sahtekar için ipuçları';
@override
String get rulesTipsImpostorBody =>
'• Diğerlerinin ipuçlarını dikkatle dinle.\n• İnandırıcı ipuçları vermek için kelimeyi çıkarmaya çalış.\n• Emin değilsen ilk konuşan olma.\n• Kategori ipucu verildiyse bunu avantajına kullan.\n• Dikkati dağıtmak için başkalarını suçla.';
@override
String get rulesModesTitle => '📱 Oyun modları';
@override
String get rulesModesBody =>
'• Tek cihaz: herkes aynı cihazı paylaşır. Her oyuncu bir düğmeye basılı tutarak kelimesini görür.\n\n• Çoklu cihaz: her oyuncu kendi cihazını kullanır. Bluetooth/WiFi Direct ile bağlanılır, internet gerekmez.';
@override
String get rulesExampleTitle => '✏️ Örnek oyun';
@override
String get rulesExampleBody =>
'Gizli kelime: \"Pizza\"\n\n• Ali: \"Sıcak yenir\"\n• Ayşe: \"Kutu içinde gelir\"\n• Zeynep (sahtekar): \"Çok popüler\" 🤔\n• Mehmet: \"Üstünde peynir var\"\n\nZeynep çok genel bir cevap verdi... Şüpheli!';
@override
String get joinGameTitle => 'Oyuna katıl';
@override
String get multiDeviceMode => 'Çoklu cihaz modu';
@override
String get scanQrDescription =>
'Bluetooth/WiFi Direct ile oyuna bağlanmak için sunucunun gösterdiği QR kodunu tara.';
@override
String get comingSoon => 'Yakında';
@override
String get nearbyNotAvailable =>
'Nearby Connections ile çoklu cihaz bağlantısı fiziksel Android cihazları gerektirir.\n\nŞimdilik paylaşılan bir cihazda oynamak için \"Tek cihaz\" modunu kullanın.';
@override
String get back => 'Geri';
@override
String get yes => 'Evet';
@override
String get no => 'Hayır';
@override
String get cancel => 'İptal';
@override
String get accept => 'Kabul et';
@override
String get next => 'Sonraki';
@override
String get settingsTitle => 'Ayarlar';
@override
String get language => 'Dil';
@override
String get soundVolume => 'Efekt ses düzeyi';
@override
String get vibration => 'Titreşim';
@override
String get about => 'Hakkında';
@override
String get version => 'Sürüm';
@override
String get developer => 'Geliştirici';
@override
String get licenses => 'Lisanslar';
}

View File

@@ -0,0 +1,939 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Chinese (`zh`).
class AppLocalizationsZh extends AppLocalizations {
AppLocalizationsZh([String locale = 'zh']) : super(locale);
@override
String get appTitle => '冒牌者';
@override
String get subtitle => '社交推理游戏';
@override
String get loadingWords => '正在加载词汇...';
@override
String get playersRange => '3-20名玩家 • 无需联网';
@override
String get createGame => '创建游戏';
@override
String get joinGame => '加入游戏';
@override
String get howToPlay => '玩法介绍';
@override
String get settings => '设置';
@override
String get gameMode => '游戏模式';
@override
String get singleDevice => '单设备';
@override
String get multiDevice => '多设备';
@override
String get category => '分类';
@override
String get categoryAll => '全部';
@override
String get categoryAnimals => '动物';
@override
String get categoryFood => '食物';
@override
String get categoryCountries => '国家';
@override
String get categorySports => '运动';
@override
String get categoryProfessions => '职业';
@override
String get categoryObjects => '物品';
@override
String get categoryPlaces => '地点';
@override
String get categoryMovies => '电影';
@override
String get categoryMusic => '音乐';
@override
String get categoryTechnology => '科技';
@override
String playersCount(int count) {
return '玩家 ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => '玩家名称';
@override
String get playerAlreadyExists => '已存在同名玩家';
@override
String get maxPlayersReached => '最多20名玩家';
@override
String get minPlayersRequired => '至少需要3名玩家';
@override
String get configuration => '配置';
@override
String get impostors => '🎭 冒牌者';
@override
String get impostorClue => '🔍 给冒牌者的提示';
@override
String get impostorClueDescription => '冒牌者可以知道分类';
@override
String get debateTime => '⏱️ 讨论时间';
@override
String get noLimit => '不限时';
@override
String get oneMin => '1分钟';
@override
String get twoMin => '2分钟';
@override
String get threeMin => '3分钟';
@override
String get fiveMin => '5分钟';
@override
String get startGame => '开始游戏';
@override
String get seeYourWord => '查看你的词语';
@override
String get eachPlayerMustSee => '每位玩家需要秘密查看自己的词语';
@override
String roundNumber(int round) {
return '$round';
}
@override
String get alreadySeen => '已查看词语';
@override
String get tapToSee => '点击查看';
@override
String get allSeenStartDebate => '全员已查看 → 开始讨论';
@override
String playersRemaining(int count) {
return '还剩 $count 位玩家';
}
@override
String get youAreImpostor => '你是冒牌者!';
@override
String get yourWordIs => '你的词语是:';
@override
String clueCategory(String category) {
return '提示:$category';
}
@override
String get holdToSeeWord => '长按查看你的词语';
@override
String get makeSureNoOneLooks => '确保没有其他人在看';
@override
String get showingWord => '👁️ 显示中...';
@override
String get holdToSee => '👆 长按查看';
@override
String get seenMyWord => '我已看过词语';
@override
String debateRound(int round) {
return '讨论 - 第 $round';
}
@override
String get timeUp => '⏰ 时间到!';
@override
String get timeRemaining => '⏱️ 剩余时间';
@override
String get playersInDebate => '参与讨论的玩家';
@override
String activePlayersInfo(int active, int impostors) {
return '$active 名在场 • $impostors 名冒牌者潜伏中';
}
@override
String get eliminated => '已淘汰';
@override
String get notes => '笔记';
@override
String get goToVoting => '前往投票';
@override
String get voting => '🗳️ 投票';
@override
String get turnToVote => '轮到你投票:';
@override
String votesProgress(int current, int total) {
return '投票:$current/$total';
}
@override
String get whoIsImpostor => '你认为谁是冒牌者?';
@override
String get confirmVote => '确认投票';
@override
String get votingComplete => '🗳️ 投票结束';
@override
String get allVoted => '所有人已投票!';
@override
String get tapToReveal => '点击揭晓结果';
@override
String get revealResult => '揭晓结果';
@override
String get result => '结果';
@override
String get revealing => '揭晓中...';
@override
String get wasImpostor => '是冒牌者! 🎉';
@override
String get wasInnocent => '是无辜的 😱';
@override
String get votesThisRound => '本轮投票情况';
@override
String get seeEndResult => '查看最终结果';
@override
String get impostorGuessWord => '冒牌者要猜词吗?';
@override
String get nextRound => '下一轮';
@override
String get impostorGuessTitle => '🎯 冒牌者猜词';
@override
String get impostorCanGuess => '被淘汰的冒牌者可以\n尝试猜出词语';
@override
String get ifCorrectImpostorsWin => '如果猜对,冒牌者获胜!';
@override
String get guessWordHint => '你认为词语是什么?';
@override
String get dontGuess => '不猜';
@override
String get guess => '猜词';
@override
String get correctGuess => '猜对了!';
@override
String theWordWas(String word) {
return '词语是:$word';
}
@override
String get impostorsWin => '冒牌者获胜!';
@override
String get wrongGuess => '猜错了!';
@override
String get gameContinues => '游戏继续...';
@override
String get gameOver => '游戏结束';
@override
String get playersWin => '玩家获胜!';
@override
String get theSecretWordWas => '🔍 词语是:';
@override
String categoryLabel(String category) {
return '分类:$category';
}
@override
String get theImpostorWas => '🎭 冒牌者是:';
@override
String get theImpostorsWere => '🎭 冒牌者们是:';
@override
String get votingHistory => '📊 投票历史';
@override
String roundElimination(int round, String name) {
return '$round 轮:$name';
}
@override
String get rematch => '再来一局';
@override
String get mainMenu => '主菜单';
@override
String get notesTitle => '📝 笔记';
@override
String get notesSaved => '笔记已保存';
@override
String get whoAreYou => '你是谁?';
@override
String get selectYourName => '选择你的名字查看个人笔记';
@override
String notesOf(String name) {
return '$name的笔记';
}
@override
String get notesAboutPlayers => '关于每位玩家的记录';
@override
String get playerNoteHint => '他说了什么?可疑吗?';
@override
String get freeNote => '自由笔记';
@override
String get freeNoteHint => '个人记录...';
@override
String get rulesTitle => '📖 玩法介绍';
@override
String get rulesWhatIsTitle => '🎭 什么是冒牌者?';
@override
String get rulesWhatIsBody =>
'一款3-20人的社交推理游戏。每个人都会收到一个秘密词语......除了冒牌者!你的任务:找出谁在假装。';
@override
String get rulesHowToPlayTitle => '🔍 怎么玩?';
@override
String get rulesHowToPlayBody =>
'1. 分配角色:所有人收到相同的词语,但冒牌者除外。\n\n2. 讨论:轮流发言,每位玩家描述词语但不能直接说出来。冒牌者必须假装知道词语。\n\n3. 投票:讨论结束后,所有人投票选出他们认为的冒牌者。\n\n4. 淘汰:得票最多的玩家被淘汰,并揭晓其是否为冒牌者。\n\n5. 如果是冒牌者,可以尝试猜出词语。猜对则冒牌者获胜!';
@override
String get rulesWhoWinsTitle => '🏆 谁能赢?';
@override
String get rulesWhoWinsBody =>
'• 玩家:淘汰所有冒牌者即可获胜。\n• 冒牌者:如果未被识破,坚持到普通玩家人数等于或少于冒牌者人数即可获胜;或者在被淘汰时猜对词语也能获胜。';
@override
String get rulesTipsPlayersTitle => '💡 给玩家的建议';
@override
String get rulesTipsPlayersBody =>
'• 给出能证明你知道词语的微妙提示,但不要太明显以至于被冒牌者利用。\n• 留意那些给出模糊或笼统回答的人。\n• 利用笔记记录每个人说的话。\n• 不要直接说出词语,那会帮到冒牌者!';
@override
String get rulesTipsImpostorTitle => '🎭 给冒牌者的建议';
@override
String get rulesTipsImpostorBody =>
'• 仔细聆听其他人的提示。\n• 尝试推断词语,以便给出可信的提示。\n• 如果没有把握,不要第一个发言。\n• 如果给了你分类提示,好好利用它。\n• 指控别人来转移注意力。';
@override
String get rulesModesTitle => '📱 游戏模式';
@override
String get rulesModesBody =>
'• 单设备:所有人共享一台设备。每位玩家通过长按按钮查看自己的词语。\n\n• 多设备:每位玩家使用自己的设备。通过蓝牙/WiFi Direct连接无需联网。';
@override
String get rulesExampleTitle => '✏️ 游戏示例';
@override
String get rulesExampleBody =>
'秘密词语:\"披萨\"\n\n• 小明:\"趁热吃的\"\n• 小红:\"装在盒子里的\"\n• 小丽(冒牌者):\"非常受欢迎\" 🤔\n• 小刚:\"上面有芝士\"\n\n小丽的回答太笼统了......可疑!';
@override
String get joinGameTitle => '加入游戏';
@override
String get multiDeviceMode => '多设备模式';
@override
String get scanQrDescription => '扫描房主显示的二维码,通过蓝牙/WiFi Direct连接到游戏。';
@override
String get comingSoon => '即将推出';
@override
String get nearbyNotAvailable =>
'多设备连接的Nearby Connections功能需要实体Android设备。\n\n目前请使用\"单设备\"模式,在一台共享设备上进行游戏。';
@override
String get back => '返回';
@override
String get yes => '';
@override
String get no => '';
@override
String get cancel => '取消';
@override
String get accept => '确定';
@override
String get next => '下一步';
@override
String get settingsTitle => '设置';
@override
String get language => '语言';
@override
String get soundVolume => '音效音量';
@override
String get vibration => '振动';
@override
String get about => '关于';
@override
String get version => '版本';
@override
String get developer => '开发者';
@override
String get licenses => '许可证';
}
/// The translations for Chinese, as used in Taiwan (`zh_TW`).
class AppLocalizationsZhTw extends AppLocalizationsZh {
AppLocalizationsZhTw() : super('zh_TW');
@override
String get appTitle => '冒牌者';
@override
String get subtitle => '社交推理遊戲';
@override
String get loadingWords => '正在載入詞彙...';
@override
String get playersRange => '3-20 位玩家 • 無需網路';
@override
String get createGame => '建立遊戲';
@override
String get joinGame => '加入遊戲';
@override
String get howToPlay => '遊戲規則';
@override
String get settings => '設定';
@override
String get gameMode => '遊戲模式';
@override
String get singleDevice => '單機模式';
@override
String get multiDevice => '多機模式';
@override
String get category => '類別';
@override
String get categoryAll => '全部';
@override
String get categoryAnimals => '動物';
@override
String get categoryFood => '食物';
@override
String get categoryCountries => '國家';
@override
String get categorySports => '運動';
@override
String get categoryProfessions => '職業';
@override
String get categoryObjects => '物品';
@override
String get categoryPlaces => '地點';
@override
String get categoryMovies => '電影';
@override
String get categoryMusic => '音樂';
@override
String get categoryTechnology => '科技';
@override
String playersCount(int count) {
return '玩家 ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => '玩家名稱';
@override
String get playerAlreadyExists => '已有同名玩家';
@override
String get maxPlayersReached => '最多 20 位玩家';
@override
String get minPlayersRequired => '至少需要 3 位玩家';
@override
String get configuration => '設定';
@override
String get impostors => '🎭 冒牌者';
@override
String get impostorClue => '🔍 冒牌者提示';
@override
String get impostorClueDescription => '冒牌者可以知道類別';
@override
String get debateTime => '⏱️ 討論時間';
@override
String get noLimit => '無限制';
@override
String get oneMin => '1 分鐘';
@override
String get twoMin => '2 分鐘';
@override
String get threeMin => '3 分鐘';
@override
String get fiveMin => '5 分鐘';
@override
String get startGame => '開始遊戲';
@override
String get seeYourWord => '查看你的詞彙';
@override
String get eachPlayerMustSee => '每位玩家必須私下查看自己的詞彙';
@override
String roundNumber(int round) {
return '$round 回合';
}
@override
String get alreadySeen => '已查看過詞彙';
@override
String get tapToSee => '點擊查看';
@override
String get allSeenStartDebate => '全員已查看 → 開始討論';
@override
String playersRemaining(int count) {
return '還有 $count 位玩家未查看';
}
@override
String get youAreImpostor => '你是冒牌者!';
@override
String get yourWordIs => '你的詞彙是:';
@override
String clueCategory(String category) {
return '提示:$category';
}
@override
String get holdToSeeWord => '長按查看你的詞彙';
@override
String get makeSureNoOneLooks => '請確認沒有其他人在看';
@override
String get showingWord => '👁️ 顯示中...';
@override
String get holdToSee => '👆 長按查看';
@override
String get seenMyWord => '我已看過詞彙';
@override
String debateRound(int round) {
return '討論 - 第 $round 回合';
}
@override
String get timeUp => '⏰ 時間到!';
@override
String get timeRemaining => '⏱️ 剩餘時間';
@override
String get playersInDebate => '參與討論的玩家';
@override
String activePlayersInfo(int active, int impostors) {
return '$active 位在場 • $impostors 位冒牌者潛伏中';
}
@override
String get eliminated => '已淘汰';
@override
String get notes => '筆記';
@override
String get goToVoting => '前往投票';
@override
String get voting => '🗳️ 投票';
@override
String get turnToVote => '輪到你投票:';
@override
String votesProgress(int current, int total) {
return '票數:$current/$total';
}
@override
String get whoIsImpostor => '你認為誰是冒牌者?';
@override
String get confirmVote => '確認投票';
@override
String get votingComplete => '🗳️ 投票完成';
@override
String get allVoted => '所有人都已投票!';
@override
String get tapToReveal => '點擊揭曉結果';
@override
String get revealResult => '揭曉結果';
@override
String get result => '結果';
@override
String get revealing => '揭曉中...';
@override
String get wasImpostor => '是冒牌者! 🎉';
@override
String get wasInnocent => '是無辜的 😱';
@override
String get votesThisRound => '本回合票數';
@override
String get seeEndResult => '查看最終結果';
@override
String get impostorGuessWord => '冒牌者要猜詞彙嗎?';
@override
String get nextRound => '下一回合';
@override
String get impostorGuessTitle => '🎯 冒牌者猜詞';
@override
String get impostorCanGuess => '被淘汰的冒牌者可以\n嘗試猜出正確詞彙';
@override
String get ifCorrectImpostorsWin => '猜對的話,冒牌者就贏了!';
@override
String get guessWordHint => '你覺得詞彙是什麼?';
@override
String get dontGuess => '放棄猜測';
@override
String get guess => '猜測';
@override
String get correctGuess => '猜對了!';
@override
String theWordWas(String word) {
return '正確詞彙是:$word';
}
@override
String get impostorsWin => '冒牌者獲勝!';
@override
String get wrongGuess => '猜錯了!';
@override
String get gameContinues => '遊戲繼續...';
@override
String get gameOver => '遊戲結束';
@override
String get playersWin => '玩家們獲勝!';
@override
String get theSecretWordWas => '🔍 正確詞彙是:';
@override
String categoryLabel(String category) {
return '類別:$category';
}
@override
String get theImpostorWas => '🎭 冒牌者是:';
@override
String get theImpostorsWere => '🎭 冒牌者們是:';
@override
String get votingHistory => '📊 投票紀錄';
@override
String roundElimination(int round, String name) {
return '$round 回合:$name';
}
@override
String get rematch => '再來一局';
@override
String get mainMenu => '主選單';
@override
String get notesTitle => '📝 筆記';
@override
String get notesSaved => '筆記已儲存';
@override
String get whoAreYou => '你是誰?';
@override
String get selectYourName => '選擇你的名字以查看個人筆記';
@override
String notesOf(String name) {
return '$name 的筆記';
}
@override
String get notesAboutPlayers => '關於每位玩家的紀錄';
@override
String get playerNoteHint => '他說了什麼?可疑嗎?';
@override
String get freeNote => '自由筆記';
@override
String get freeNoteHint => '個人筆記...';
@override
String get rulesTitle => '📖 遊戲規則';
@override
String get rulesWhatIsTitle => '🎭 什麼是冒牌者?';
@override
String get rulesWhatIsBody =>
'一款適合 3-20 位玩家的社交推理遊戲。每個人都會收到一個秘密詞彙……除了冒牌者!你的任務:找出誰在假裝。';
@override
String get rulesHowToPlayTitle => '🔍 怎麼玩?';
@override
String get rulesHowToPlayBody =>
'1. 分配角色:所有人獲得相同的詞彙,冒牌者除外。\n\n2. 討論:玩家輪流描述該詞彙,但不能直接說出來。冒牌者必須假裝知道這個詞。\n\n3. 投票:討論結束後,所有人投票選出誰是冒牌者。\n\n4. 淘汰:得票最多的人被淘汰,並揭曉其身份。\n\n5. 如果被淘汰者是冒牌者,可以嘗試猜出詞彙。猜對的話,冒牌者獲勝!';
@override
String get rulesWhoWinsTitle => '🏆 誰會贏?';
@override
String get rulesWhoWinsBody =>
'• 玩家:淘汰所有冒牌者即可獲勝。\n• 冒牌者:如果未被發現且剩餘普通玩家人數等於或少於冒牌者人數,則獲勝;或者被淘汰時猜對詞彙也可獲勝。';
@override
String get rulesTipsPlayersTitle => '💡 玩家攻略';
@override
String get rulesTipsPlayersBody =>
'• 給出巧妙的提示來證明你知道詞彙,但不要太明顯讓冒牌者利用。\n• 注意誰給出了模糊或籠統的回答。\n• 使用筆記功能記錄每個人說了什麼。\n• 不要直接說出詞彙,那會幫到冒牌者!';
@override
String get rulesTipsImpostorTitle => '🎭 冒牌者攻略';
@override
String get rulesTipsImpostorBody =>
'• 仔細聆聽其他人的提示。\n• 嘗試推斷出詞彙,才能給出可信的描述。\n• 如果沒把握,不要第一個發言。\n• 如果獲得了類別提示,善加利用。\n• 指控他人以轉移注意力。';
@override
String get rulesModesTitle => '📱 遊戲模式';
@override
String get rulesModesBody =>
'• 單機模式:所有人共用一台裝置。每位玩家長按按鈕查看自己的詞彙。\n\n• 多機模式每位玩家使用自己的裝置透過藍牙WiFi Direct 連線,無需網路。';
@override
String get rulesExampleTitle => '✏️ 遊戲範例';
@override
String get rulesExampleBody =>
'秘密詞彙:「披薩」\n\n• 小明:「要趁熱吃」 ✓\n• 小華:「裝在盒子裡」 ✓\n• 小美(冒牌者):「很受歡迎」 🤔\n• 小強:「上面有起司」 ✓\n\n小美的回答太籠統了……有嫌疑!';
@override
String get joinGameTitle => '加入遊戲';
@override
String get multiDeviceMode => '多機模式';
@override
String get scanQrDescription => '掃描主機顯示的 QR 碼透過藍牙WiFi Direct 加入遊戲。';
@override
String get comingSoon => '即將推出';
@override
String get nearbyNotAvailable =>
'多機連線功能需要 Android 實體裝置搭配 Nearby Connections。\n\n目前請使用「單機模式」在共用裝置上進行遊戲。';
@override
String get back => '返回';
@override
String get yes => '';
@override
String get no => '';
@override
String get cancel => '取消';
@override
String get accept => '確定';
@override
String get next => '下一步';
@override
String get settingsTitle => '設定';
@override
String get language => '語言';
@override
String get soundVolume => '音效音量';
@override
String get vibration => '震動';
@override
String get about => '關於';
@override
String get version => '版本';
@override
String get developer => '開發者';
@override
String get licenses => '授權條款';
}

View File

@@ -1,7 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import 'estado/estado_juego.dart';
import 'servicios/servicio_idioma.dart';
import 'tema/tema_app.dart';
import 'pantallas/pantalla_principal.dart';
@@ -23,13 +26,32 @@ class ElImpostorApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => EstadoJuego()..cargarBanco(),
child: MaterialApp(
),
ChangeNotifierProvider(
create: (_) => ServicioIdioma()..cargar(),
),
],
child: Consumer<ServicioIdioma>(
builder: (context, servicioIdioma, _) {
return MaterialApp(
title: 'El Impostor',
theme: TemaApp.obtenerTema(),
debugShowCheckedModeBanner: false,
locale: servicioIdioma.locale,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: ServicioIdioma.localesSoportados,
home: const PantallaCarga(),
);
},
),
);
}
@@ -41,6 +63,7 @@ class PantallaCarga extends StatelessWidget {
@override
Widget build(BuildContext context) {
final estado = context.watch<EstadoJuego>();
final l10n = AppLocalizations.of(context);
if (estado.cargando || estado.banco == null) {
return Scaffold(
@@ -51,14 +74,14 @@ class PantallaCarga extends StatelessWidget {
const Text('🎭', style: TextStyle(fontSize: 72)),
const SizedBox(height: 24),
Text(
'El Impostor',
l10n?.appTitle ?? 'El Impostor',
style: Theme.of(context).textTheme.headlineLarge,
),
const SizedBox(height: 16),
const CircularProgressIndicator(color: TemaApp.colorAcento),
const SizedBox(height: 12),
Text(
'Cargando palabras...',
l10n?.loadingWords ?? 'Cargando palabras...',
style: Theme.of(context).textTheme.bodyMedium,
),
],

View File

@@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:math';
import 'package:flutter/services.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
/// Categorías disponibles en el banco de palabras
class BancoPalabras {
@@ -8,19 +9,34 @@ class BancoPalabras {
BancoPalabras(this.categorias);
static BancoPalabras? _instancia;
static final Map<String, BancoPalabras> _instancias = {};
static Future<BancoPalabras> cargar({String idioma = 'es'}) async {
if (_instancias.containsKey(idioma)) return _instancias[idioma]!;
// Intentar cargar el banco del idioma solicitado, fallback a castellano
String jsonStr;
try {
final archivo = idioma == 'es'
? 'assets/palabras.json'
: 'assets/palabras_$idioma.json';
jsonStr = await rootBundle.loadString(archivo);
} catch (_) {
// Fallback a castellano si no existe el banco para ese idioma
if (idioma != 'es') {
return cargar(idioma: 'es');
}
rethrow;
}
static Future<BancoPalabras> cargar() async {
if (_instancia != null) return _instancia!;
final jsonStr = await rootBundle.loadString('assets/palabras.json');
final data = json.decode(jsonStr) as Map<String, dynamic>;
final cats = data['categorias'] as Map<String, dynamic>;
final mapa = <String, List<String>>{};
for (final entrada in cats.entries) {
mapa[entrada.key] = List<String>.from(entrada.value);
}
_instancia = BancoPalabras(mapa);
return _instancia!;
_instancias[idioma] = BancoPalabras(mapa);
return _instancias[idioma]!;
}
List<String> get nombresCategorias => categorias.keys.toList();
@@ -44,7 +60,25 @@ class BancoPalabras {
return null;
}
static String nombreBonitoCategoria(String clave) {
/// Devuelve el nombre localizado de la categoría usando AppLocalizations
static String nombreBonitoCategoria(String clave, [AppLocalizations? l10n]) {
if (l10n != null) {
final nombres = {
'todas': l10n.categoryAll,
'animales': l10n.categoryAnimals,
'comida': l10n.categoryFood,
'paises': l10n.categoryCountries,
'deportes': l10n.categorySports,
'profesiones': l10n.categoryProfessions,
'objetos': l10n.categoryObjects,
'lugares': l10n.categoryPlaces,
'peliculas': l10n.categoryMovies,
'musica': l10n.categoryMusic,
'tecnologia': l10n.categoryTechnology,
};
return nombres[clave] ?? clave;
}
// Fallback a castellano si no hay l10n
const nombres = {
'todas': 'Todas',
'animales': 'Animales',

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../tema/tema_app.dart';
@@ -30,13 +31,14 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final estado = context.watch<EstadoJuego>();
final partida = estado.partida;
if (partida == null) return const SizedBox.shrink();
return Scaffold(
appBar: AppBar(
title: const Text('🎯 Adivinanza del impostor'),
title: Text(l10n.impostorGuessTitle),
automaticallyImplyLeading: false,
),
body: Center(
@@ -48,13 +50,13 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
const Text('🎭', style: TextStyle(fontSize: 64)),
const SizedBox(height: 16),
Text(
'El impostor eliminado puede\nintentar adivinar la palabra',
l10n.impostorCanGuess,
style: Theme.of(context).textTheme.titleLarge,
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
'Si acierta, ¡los impostores ganan!',
l10n.ifCorrectImpostorsWin,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: TemaApp.colorNaranja,
),
@@ -64,9 +66,9 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
if (_acierto == null) ...[
TextField(
controller: _controlador,
decoration: const InputDecoration(
hintText: '¿Cuál crees que es la palabra?',
prefixIcon: Icon(Icons.search),
decoration: InputDecoration(
hintText: l10n.guessWordHint,
prefixIcon: const Icon(Icons.search),
),
textCapitalization: TextCapitalization.sentences,
textAlign: TextAlign.center,
@@ -98,7 +100,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
);
}
},
child: const Text('No intentar'),
child: Text(l10n.dontGuess),
),
),
const SizedBox(width: 12),
@@ -109,7 +111,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
? _intentarAdivinar
: null,
icon: const Icon(Icons.send),
label: const Text('Adivinar'),
label: Text(l10n.guess),
),
),
],
@@ -130,7 +132,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
const Text('🎭🎉', style: TextStyle(fontSize: 48)),
const SizedBox(height: 12),
Text(
'¡Ha acertado!',
l10n.correctGuess,
style: Theme.of(context)
.textTheme
.headlineMedium
@@ -138,12 +140,12 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
),
const SizedBox(height: 8),
Text(
'La palabra era: ${partida.palabraSecreta}',
l10n.theWordWas(partida.palabraSecreta),
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 8),
Text(
'¡Los impostores ganan!',
l10n.impostorsWin,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: TemaApp.colorNaranja,
),
@@ -165,7 +167,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
);
},
icon: const Icon(Icons.emoji_events),
label: const Text('Ver resultado final'),
label: Text(l10n.seeEndResult),
),
),
],
@@ -184,7 +186,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
const Text('', style: TextStyle(fontSize: 48)),
const SizedBox(height: 12),
Text(
'¡No ha acertado!',
l10n.wrongGuess,
style: Theme.of(context)
.textTheme
.headlineMedium
@@ -192,7 +194,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
),
const SizedBox(height: 8),
Text(
'La partida continúa...',
l10n.gameContinues,
style: Theme.of(context).textTheme.bodyLarge,
),
],
@@ -223,7 +225,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
}
},
icon: const Icon(Icons.skip_next),
label: const Text('Siguiente ronda'),
label: Text(l10n.nextRound),
),
),
],

View File

@@ -0,0 +1,182 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../servicios/servicio_idioma.dart';
import '../tema/tema_app.dart';
class PantallaAjustes extends StatefulWidget {
const PantallaAjustes({super.key});
@override
State<PantallaAjustes> createState() => _PantallaAjustesState();
}
class _PantallaAjustesState extends State<PantallaAjustes> {
double _volumen = 0.7;
bool _vibracion = true;
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final servicioIdioma = context.watch<ServicioIdioma>();
return Scaffold(
appBar: AppBar(title: Text(l10n.settingsTitle)),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Selector de idioma
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(l10n.language,
style: Theme.of(context).textTheme.titleLarge),
const SizedBox(height: 12),
// Opción automática (sistema)
_opcionIdioma(
context,
bandera: '🌐',
nombre: 'Auto (${_nombreIdiomaDelSistema()})',
codigo: 'sistema',
seleccionado: servicioIdioma.codigoActual == 'sistema',
onTap: () => servicioIdioma.cambiarIdioma('sistema'),
),
const Divider(height: 1),
// Lista de idiomas
...ServicioIdioma.idiomasSoportados.entries.map((entrada) {
return _opcionIdioma(
context,
bandera: entrada.value.bandera,
nombre: entrada.value.nombre,
codigo: entrada.key,
seleccionado:
servicioIdioma.codigoActual == entrada.key,
onTap: () =>
servicioIdioma.cambiarIdioma(entrada.key),
);
}),
],
),
),
),
const SizedBox(height: 12),
// Volumen de efectos de sonido
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(l10n.soundVolume,
style: Theme.of(context).textTheme.titleLarge),
const SizedBox(height: 8),
Slider(
value: _volumen,
onChanged: (v) => setState(() => _volumen = v),
activeColor: TemaApp.colorAcento,
inactiveColor: TemaApp.colorTarjeta,
),
],
),
),
),
const SizedBox(height: 12),
// Vibración
Card(
child: SwitchListTile(
title: Text(l10n.vibration),
value: _vibracion,
onChanged: (v) => setState(() => _vibracion = v),
contentPadding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
),
),
const SizedBox(height: 12),
// Acerca de
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(l10n.about,
style: Theme.of(context).textTheme.titleLarge),
const SizedBox(height: 12),
_filaInfo(context, l10n.version, '1.0.0'),
const SizedBox(height: 8),
_filaInfo(context, l10n.developer, 'FreeTTimeLab'),
const SizedBox(height: 8),
SizedBox(
width: double.infinity,
child: OutlinedButton(
onPressed: () {
showLicensePage(
context: context,
applicationName: 'El Impostor',
applicationVersion: '1.0.0',
);
},
child: Text(l10n.licenses),
),
),
],
),
),
),
const SizedBox(height: 16),
],
),
),
);
}
Widget _opcionIdioma(
BuildContext context, {
required String bandera,
required String nombre,
required String codigo,
required bool seleccionado,
required VoidCallback onTap,
}) {
return ListTile(
leading: Text(bandera, style: const TextStyle(fontSize: 24)),
title: Text(nombre),
trailing: seleccionado
? const Icon(Icons.check_circle, color: TemaApp.colorAcento)
: null,
onTap: onTap,
dense: true,
selected: seleccionado,
selectedTileColor: TemaApp.colorAcento.withValues(alpha: 0.1),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
);
}
Widget _filaInfo(BuildContext context, String etiqueta, String valor) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(etiqueta, style: Theme.of(context).textTheme.bodyMedium),
Text(valor, style: Theme.of(context).textTheme.bodyLarge),
],
);
}
String _nombreIdiomaDelSistema() {
final locale = WidgetsBinding.instance.platformDispatcher.locale;
final codigo = locale.countryCode != null && locale.countryCode!.isNotEmpty
? '${locale.languageCode}_${locale.countryCode}'
: locale.languageCode;
final info = ServicioIdioma.idiomasSoportados[codigo] ??
ServicioIdioma.idiomasSoportados[locale.languageCode];
return info?.nombre ?? locale.languageCode;
}
}

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../modelos/palabra.dart';
@@ -23,22 +24,25 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
final _controladorNombre = TextEditingController();
final _opcionesTiempo = <int?>[null, 60, 120, 180, 300];
final _etiquetasTiempo = ['Sin límite', '1 min', '2 min', '3 min', '5 min'];
int get _maxImpostores => (_jugadores.length / 3).floor().clamp(1, 4);
List<String> _etiquetasTiempo(AppLocalizations l10n) =>
[l10n.noLimit, l10n.oneMin, l10n.twoMin, l10n.threeMin, l10n.fiveMin];
void _agregarJugador() {
final l10n = AppLocalizations.of(context)!;
final nombre = _controladorNombre.text.trim();
if (nombre.isEmpty) return;
if (_jugadores.contains(nombre)) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Ya existe un jugador con ese nombre')),
SnackBar(content: Text(l10n.playerAlreadyExists)),
);
return;
}
if (_jugadores.length >= 20) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Máximo 20 jugadores')),
SnackBar(content: Text(l10n.maxPlayersReached)),
);
return;
}
@@ -61,9 +65,10 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
}
void _iniciarPartida() {
final l10n = AppLocalizations.of(context)!;
if (_jugadores.length < 3) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Se necesitan al menos 3 jugadores')),
SnackBar(content: Text(l10n.minPlayersRequired)),
);
return;
}
@@ -94,11 +99,13 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final estado = context.watch<EstadoJuego>();
final categorias = ['todas', ...?estado.banco?.nombresCategorias];
final etiquetas = _etiquetasTiempo(l10n);
return Scaffold(
appBar: AppBar(title: const Text('Crear partida')),
appBar: AppBar(title: Text(l10n.createGame)),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
@@ -111,20 +118,20 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Modo de juego',
Text(l10n.gameMode,
style: Theme.of(context).textTheme.titleLarge),
const SizedBox(height: 12),
SegmentedButton<bool>(
segments: const [
segments: [
ButtonSegment(
value: false,
label: Text('Un solo móvil'),
icon: Icon(Icons.phone_android),
label: Text(l10n.singleDevice),
icon: const Icon(Icons.phone_android),
),
ButtonSegment(
value: true,
label: Text('Multimóvil'),
icon: Icon(Icons.devices),
label: Text(l10n.multiDevice),
icon: const Icon(Icons.devices),
),
],
selected: {_modoMultimovil},
@@ -145,7 +152,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Categoría',
Text(l10n.category,
style: Theme.of(context).textTheme.titleLarge),
const SizedBox(height: 12),
SizedBox(
@@ -158,7 +165,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
items: categorias.map((c) {
return DropdownMenuItem(
value: c,
child: Text(BancoPalabras.nombreBonitoCategoria(c)),
child: Text(BancoPalabras.nombreBonitoCategoria(c, l10n)),
);
}).toList(),
onChanged: (v) => setState(() => _categoria = v!),
@@ -180,9 +187,9 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Jugadores (${_jugadores.length})',
Text(l10n.playersCount(_jugadores.length),
style: Theme.of(context).textTheme.titleLarge),
Text('3-20',
Text(l10n.playersRangeHint,
style: Theme.of(context).textTheme.bodyMedium),
],
),
@@ -192,9 +199,9 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
Expanded(
child: TextField(
controller: _controladorNombre,
decoration: const InputDecoration(
hintText: 'Nombre del jugador',
prefixIcon: Icon(Icons.person_add),
decoration: InputDecoration(
hintText: l10n.playerNameHint,
prefixIcon: const Icon(Icons.person_add),
),
textCapitalization: TextCapitalization.words,
onSubmitted: (_) => _agregarJugador(),
@@ -237,7 +244,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Configuración',
Text(l10n.configuration,
style: Theme.of(context).textTheme.titleLarge),
const SizedBox(height: 12),
@@ -245,7 +252,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('🎭 Impostores'),
Text(l10n.impostors),
Row(
children: [
IconButton(
@@ -271,9 +278,8 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
// Pista para impostor
SwitchListTile(
title: const Text('🔍 Pista para impostor'),
subtitle: const Text(
'El impostor conoce la categoría'),
title: Text(l10n.impostorClue),
subtitle: Text(l10n.impostorClueDescription),
value: _pistaImpostor,
onChanged: (v) =>
setState(() => _pistaImpostor = v),
@@ -284,14 +290,14 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('⏱️ Tiempo de debate'),
Text(l10n.debateTime),
DropdownButton<int?>(
value: _tiempoDebate,
items: List.generate(
_opcionesTiempo.length,
(i) => DropdownMenuItem(
value: _opcionesTiempo[i],
child: Text(_etiquetasTiempo[i]),
child: Text(etiquetas[i]),
),
),
onChanged: (v) =>
@@ -312,7 +318,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
child: ElevatedButton.icon(
onPressed: _jugadores.length >= 3 ? _iniciarPartida : null,
icon: const Icon(Icons.play_arrow),
label: const Text('Iniciar partida'),
label: Text(l10n.startGame),
style: ElevatedButton.styleFrom(
textStyle: const TextStyle(
fontSize: 18,

View File

@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../tema/tema_app.dart';
@@ -59,6 +60,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final estado = context.watch<EstadoJuego>();
final partida = estado.partida;
if (partida == null) return const SizedBox.shrink();
@@ -70,7 +72,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
return Scaffold(
appBar: AppBar(
title: Text('Debate - Ronda ${partida.rondaActual}'),
title: Text(l10n.debateRound(partida.rondaActual)),
automaticallyImplyLeading: false,
),
body: Padding(
@@ -94,7 +96,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
child: Column(
children: [
Text(
_tiempoAgotado ? '⏰ ¡Tiempo agotado!' : '⏱️ Tiempo restante',
_tiempoAgotado ? l10n.timeUp : l10n.timeRemaining,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: _tiempoAgotado
? TemaApp.colorAcento
@@ -141,12 +143,12 @@ class _PantallaDebateState extends State<PantallaDebate> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Jugadores en debate',
l10n.playersInDebate,
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 4),
Text(
'${partida.jugadoresActivos.length} activos • ${partida.impostoresActivos.length} impostor(es) ocultos',
l10n.activePlayersInfo(partida.jugadoresActivos.length, partida.impostoresActivos.length),
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 12),
@@ -178,7 +180,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
),
),
subtitle: j.eliminado
? const Text('Eliminado')
? Text(l10n.eliminated)
: null,
dense: true,
);
@@ -206,7 +208,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
);
},
icon: const Text('📝', style: TextStyle(fontSize: 18)),
label: const Text('Notas'),
label: Text(l10n.notes),
),
),
const SizedBox(width: 12),
@@ -215,7 +217,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
child: ElevatedButton.icon(
onPressed: _irAVotacion,
icon: const Text('🗳️', style: TextStyle(fontSize: 18)),
label: const Text('Ir a votación'),
label: Text(l10n.goToVoting),
),
),
],

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../modelos/palabra.dart';
@@ -11,6 +12,7 @@ class PantallaFinPartida extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final estado = context.watch<EstadoJuego>();
final partida = estado.partida;
if (partida == null) return const SizedBox.shrink();
@@ -21,7 +23,7 @@ class PantallaFinPartida extends StatelessWidget {
return Scaffold(
appBar: AppBar(
title: const Text('Fin de partida'),
title: Text(l10n.gameOver),
automaticallyImplyLeading: false,
),
body: SingleChildScrollView(
@@ -56,8 +58,8 @@ class PantallaFinPartida extends StatelessWidget {
const SizedBox(height: 16),
Text(
ganaronJugadores
? '¡Los jugadores ganan!'
: '¡Los impostores ganan!',
? l10n.playersWin
: l10n.impostorsWin,
style: Theme.of(context)
.textTheme
.headlineMedium
@@ -79,7 +81,7 @@ class PantallaFinPartida extends StatelessWidget {
padding: const EdgeInsets.all(20),
child: Column(
children: [
Text('🔍 La palabra era:',
Text(l10n.theSecretWordWas,
style: Theme.of(context).textTheme.titleMedium),
const SizedBox(height: 8),
Text(
@@ -94,7 +96,7 @@ class PantallaFinPartida extends StatelessWidget {
),
const SizedBox(height: 4),
Text(
'Categoría: ${BancoPalabras.nombreBonitoCategoria(partida.categoriaReal)}',
l10n.categoryLabel(BancoPalabras.nombreBonitoCategoria(partida.categoriaReal, l10n)),
style: Theme.of(context).textTheme.bodyMedium,
),
],
@@ -110,7 +112,7 @@ class PantallaFinPartida extends StatelessWidget {
child: Column(
children: [
Text(
'🎭 ${impostores.length == 1 ? 'El impostor era:' : 'Los impostores eran:'}',
impostores.length == 1 ? l10n.theImpostorWas : l10n.theImpostorsWere,
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 8),
@@ -119,8 +121,8 @@ class PantallaFinPartida extends StatelessWidget {
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('🎭 ',
style: const TextStyle(fontSize: 18)),
const Text('🎭 ',
style: TextStyle(fontSize: 18)),
Text(
j.nombre,
style: Theme.of(context)
@@ -150,7 +152,7 @@ class PantallaFinPartida extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('📊 Historial de votaciones',
Text(l10n.votingHistory,
style: Theme.of(context).textTheme.titleMedium),
const SizedBox(height: 12),
...partida.historialVotaciones
@@ -165,7 +167,7 @@ class PantallaFinPartida extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Ronda $ronda: ${resultado.eliminadoNombre} ${resultado.eraImpostor ? '🎭' : '😇'}',
'${l10n.roundElimination(ronda, resultado.eliminadoNombre)} ${resultado.eraImpostor ? '🎭' : '😇'}',
style: TextStyle(
fontWeight: FontWeight.bold,
color: resultado.eraImpostor
@@ -210,7 +212,7 @@ class PantallaFinPartida extends StatelessWidget {
);
},
icon: const Icon(Icons.replay),
label: const Text('Revancha'),
label: Text(l10n.rematch),
),
),
const SizedBox(height: 12),
@@ -229,7 +231,7 @@ class PantallaFinPartida extends StatelessWidget {
);
},
icon: const Icon(Icons.home),
label: const Text('Menú principal'),
label: Text(l10n.mainMenu),
),
),
const SizedBox(height: 16),

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../servicios/servicio_notas.dart';
@@ -57,6 +58,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final estado = context.watch<EstadoJuego>();
final partida = estado.partida;
if (partida == null) return const SizedBox.shrink();
@@ -68,7 +70,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
return Scaffold(
appBar: AppBar(
title: const Text('📝 Notas'),
title: Text(l10n.notesTitle),
actions: [
if (_jugadorSeleccionadoId != null)
IconButton(
@@ -77,7 +79,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
await _guardarNotas();
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Notas guardadas')),
SnackBar(content: Text(l10n.notesSaved)),
);
}
},
@@ -91,18 +93,20 @@ class _PantallaNotasState extends State<PantallaNotas> {
}
Widget _construirSelectorJugador(dynamic partida) {
final l10n = AppLocalizations.of(context)!;
return Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'¿Quién eres?',
l10n.whoAreYou,
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 8),
Text(
'Selecciona tu nombre para ver tus notas privadas',
l10n.selectYourName,
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 16),
@@ -142,6 +146,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
return const Center(child: CircularProgressIndicator());
}
final l10n = AppLocalizations.of(context)!;
final jugadorActual = partida.jugadores
.firstWhere((j) => j.id == _jugadorSeleccionadoId);
@@ -167,7 +172,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
},
),
Text(
'Notas de ${jugadorActual.nombre}',
l10n.notesOf(jugadorActual.nombre),
style: Theme.of(context).textTheme.titleLarge,
),
],
@@ -176,7 +181,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
// Notas por jugador
Text(
'Apuntes sobre cada jugador',
l10n.notesAboutPlayers,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: TemaApp.colorTextoSecundario,
),
@@ -190,7 +195,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
decoration: InputDecoration(
labelText: j.nombre,
prefixIcon: const Icon(Icons.person, size: 20),
hintText: '¿Qué ha dicho? ¿Sospechoso?',
hintText: l10n.playerNoteHint,
),
maxLines: 2,
minLines: 1,
@@ -200,7 +205,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
const SizedBox(height: 16),
Text(
'Nota libre',
l10n.freeNote,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: TemaApp.colorTextoSecundario,
),
@@ -208,9 +213,9 @@ class _PantallaNotasState extends State<PantallaNotas> {
const SizedBox(height: 8),
TextField(
controller: _controladorNotaLibre,
decoration: const InputDecoration(
hintText: 'Apuntes personales...',
prefixIcon: Icon(Icons.note, size: 20),
decoration: InputDecoration(
hintText: l10n.freeNoteHint,
prefixIcon: const Icon(Icons.note, size: 20),
),
maxLines: 5,
minLines: 3,

View File

@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import '../tema/tema_app.dart';
import 'pantalla_ajustes.dart';
import 'pantalla_crear_partida.dart';
import 'pantalla_reglas.dart';
import 'pantalla_unirse.dart';
@@ -9,6 +11,8 @@ class PantallaPrincipal extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
body: SafeArea(
child: Center(
@@ -47,7 +51,7 @@ class PantallaPrincipal extends StatelessWidget {
// Título
Text(
'El Impostor',
l10n.appTitle,
style: Theme.of(context).textTheme.headlineLarge?.copyWith(
fontSize: 36,
letterSpacing: 1.2,
@@ -55,7 +59,7 @@ class PantallaPrincipal extends StatelessWidget {
),
const SizedBox(height: 8),
Text(
'Juego de deducción social',
l10n.subtitle,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontSize: 16,
),
@@ -75,7 +79,7 @@ class PantallaPrincipal extends StatelessWidget {
);
},
icon: const Text('🎮', style: TextStyle(fontSize: 20)),
label: const Text('Crear partida'),
label: Text(l10n.createGame),
),
),
const SizedBox(height: 16),
@@ -92,7 +96,7 @@ class PantallaPrincipal extends StatelessWidget {
);
},
icon: const Text('📱', style: TextStyle(fontSize: 20)),
label: const Text('Unirse a partida'),
label: Text(l10n.joinGame),
),
),
const SizedBox(height: 16),
@@ -109,13 +113,30 @@ class PantallaPrincipal extends StatelessWidget {
);
},
icon: const Text('📖', style: TextStyle(fontSize: 20)),
label: const Text('Cómo jugar'),
label: Text(l10n.howToPlay),
),
),
const SizedBox(height: 16),
SizedBox(
width: double.infinity,
child: OutlinedButton.icon(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const PantallaAjustes(),
),
);
},
icon: const Icon(Icons.settings, size: 20),
label: Text(l10n.settings),
),
),
const SizedBox(height: 48),
Text(
'3-20 jugadores • Sin internet',
l10n.playersRange,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontSize: 12,
),

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import '../tema/tema_app.dart';
class PantallaReglas extends StatelessWidget {
@@ -6,78 +7,22 @@ class PantallaReglas extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: const Text('📖 Cómo jugar')),
appBar: AppBar(title: Text(l10n.rulesTitle)),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_seccion(
context,
'🎭 ¿Qué es El Impostor?',
'Un juego de deducción social para 3-20 jugadores. '
'Todos reciben una palabra secreta... ¡excepto el impostor! '
'Tu misión: descubrir quién finge.',
),
_seccion(
context,
'🔍 ¿Cómo se juega?',
'1. Se reparten los roles: todos reciben la misma palabra, '
'excepto el/los impostores.\n\n'
'2. Debate: por turnos, cada jugador describe la palabra '
'SIN decirla directamente. El impostor debe fingir que la conoce.\n\n'
'3. Votación: al terminar el debate, todos votan a quién '
'creen que es el impostor.\n\n'
'4. Eliminación: el más votado queda eliminado y se revela '
'si era impostor o no.\n\n'
'5. Si era impostor, puede intentar adivinar la palabra. '
'Si acierta, ¡los impostores ganan!',
),
_seccion(
context,
'🏆 ¿Quién gana?',
'• Jugadores: ganan si eliminan a TODOS los impostores.\n'
'• Impostores: ganan si no son descubiertos hasta que '
'queden igual o menos jugadores normales que impostores, '
'o si adivinan la palabra al ser eliminados.',
),
_seccion(
context,
'💡 Consejos para jugadores',
'• Da pistas sutiles que demuestren que conoces la palabra, '
'pero no tan obvias que el impostor las use.\n'
'• Observa quién da respuestas vagas o genéricas.\n'
'• Usa las notas para apuntar lo que dice cada uno.\n'
'• No digas la palabra directamente, ¡eso ayuda al impostor!',
),
_seccion(
context,
'🎭 Consejos para el impostor',
'• Escucha atentamente las pistas de los demás.\n'
'• Intenta deducir la palabra para dar pistas creíbles.\n'
'• No seas el primero en hablar si no estás seguro.\n'
'• Si te dan la categoría como pista, úsala a tu favor.\n'
'• Acusa a otros para desviar la atención.',
),
_seccion(
context,
'📱 Modos de juego',
'• Un solo móvil: todos comparten el dispositivo. '
'Cada jugador ve su palabra pulsando y manteniendo un botón.\n\n'
'• Multimóvil: cada jugador usa su propio dispositivo. '
'Se conectan por Bluetooth/WiFi Direct sin necesidad de internet.',
),
_ejemplo(
context,
'✏️ Ejemplo de partida',
'Palabra secreta: "Pizza"\n\n'
'• Ana: "Se come caliente" ✓\n'
'• Carlos: "Viene en una caja" ✓\n'
'• Eva (impostor): "Es muy popular" 🤔\n'
'• David: "Tiene queso" ✓\n\n'
'Eva dio una respuesta muy genérica... ¡Sospechosa!',
),
_seccion(context, l10n.rulesWhatIsTitle, l10n.rulesWhatIsBody),
_seccion(context, l10n.rulesHowToPlayTitle, l10n.rulesHowToPlayBody),
_seccion(context, l10n.rulesWhoWinsTitle, l10n.rulesWhoWinsBody),
_seccion(context, l10n.rulesTipsPlayersTitle, l10n.rulesTipsPlayersBody),
_seccion(context, l10n.rulesTipsImpostorTitle, l10n.rulesTipsImpostorBody),
_seccion(context, l10n.rulesModesTitle, l10n.rulesModesBody),
_ejemplo(context, l10n.rulesExampleTitle, l10n.rulesExampleBody),
const SizedBox(height: 32),
],
),

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../modelos/partida.dart';
@@ -52,12 +53,13 @@ class _PantallaResultadoState extends State<PantallaResultado>
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final estado = context.read<EstadoJuego>();
final partida = estado.partida;
return Scaffold(
appBar: AppBar(
title: const Text('Resultado'),
title: Text(l10n.result),
automaticallyImplyLeading: false,
),
body: Center(
@@ -71,7 +73,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
const Text('🥁', style: TextStyle(fontSize: 64)),
const SizedBox(height: 16),
Text(
'Revelando...',
l10n.revealing,
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 24),
@@ -113,8 +115,8 @@ class _PantallaResultadoState extends State<PantallaResultado>
),
child: Text(
widget.resultado.eraImpostor
? '¡Era IMPOSTOR! 🎉'
: 'Era INOCENTE 😱',
? l10n.wasImpostor
: l10n.wasInnocent,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
@@ -133,7 +135,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Votos de esta ronda',
Text(l10n.votesThisRound,
style: Theme.of(context)
.textTheme
.titleMedium),
@@ -177,6 +179,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
}
Widget _construirBotones(BuildContext context, EstadoJuego estado) {
final l10n = AppLocalizations.of(context)!;
final partida = estado.partida;
if (partida == null) return const SizedBox.shrink();
@@ -195,7 +198,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
);
},
icon: const Icon(Icons.emoji_events),
label: const Text('Ver resultado final'),
label: Text(l10n.seeEndResult),
),
);
}
@@ -217,7 +220,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
);
},
icon: const Text('🎯', style: TextStyle(fontSize: 18)),
label: const Text('¿El impostor adivina la palabra?'),
label: Text(l10n.impostorGuessWord),
),
),
const SizedBox(height: 12),
@@ -227,7 +230,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
child: ElevatedButton.icon(
onPressed: () => _siguienteRonda(context, estado),
icon: const Icon(Icons.skip_next),
label: const Text('Siguiente ronda'),
label: Text(l10n.nextRound),
),
),
],
@@ -240,7 +243,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
child: ElevatedButton.icon(
onPressed: () => _siguienteRonda(context, estado),
icon: const Icon(Icons.skip_next),
label: const Text('Siguiente ronda'),
label: Text(l10n.nextRound),
),
);
}

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import '../tema/tema_app.dart';
class PantallaUnirse extends StatelessWidget {
@@ -6,8 +7,10 @@ class PantallaUnirse extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: const Text('Unirse a partida')),
appBar: AppBar(title: Text(l10n.joinGameTitle)),
body: Center(
child: Padding(
padding: const EdgeInsets.all(32),
@@ -17,13 +20,12 @@ class PantallaUnirse extends StatelessWidget {
const Text('📱', style: TextStyle(fontSize: 64)),
const SizedBox(height: 24),
Text(
'Modo multimóvil',
l10n.multiDeviceMode,
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 16),
Text(
'Escanea el código QR que muestra el host '
'para conectarte a la partida vía Bluetooth/WiFi Direct.',
l10n.scanQrDescription,
style: Theme.of(context).textTheme.bodyLarge,
textAlign: TextAlign.center,
),
@@ -41,17 +43,14 @@ class PantallaUnirse extends StatelessWidget {
const Text('🚧', style: TextStyle(fontSize: 32)),
const SizedBox(height: 8),
Text(
'Próximamente',
l10n.comingSoon,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
color: TemaApp.colorNaranja,
),
),
const SizedBox(height: 8),
Text(
'La conexión multimóvil con Nearby Connections '
'requiere dispositivos Android físicos.\n\n'
'Por ahora, usa el modo "Un solo móvil" '
'para jugar en un dispositivo compartido.',
l10n.nearbyNotAvailable,
style: Theme.of(context).textTheme.bodyMedium,
textAlign: TextAlign.center,
),
@@ -64,7 +63,7 @@ class PantallaUnirse extends StatelessWidget {
child: OutlinedButton.icon(
onPressed: () => Navigator.pop(context),
icon: const Icon(Icons.arrow_back),
label: const Text('Volver'),
label: Text(l10n.back),
),
),
],

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../modelos/palabra.dart';
@@ -17,6 +18,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final estado = context.watch<EstadoJuego>();
final partida = estado.partida;
if (partida == null) return const SizedBox.shrink();
@@ -26,7 +28,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
return Scaffold(
appBar: AppBar(
title: const Text('Ver tu palabra'),
title: Text(l10n.seeYourWord),
automaticallyImplyLeading: false,
),
body: Padding(
@@ -34,13 +36,13 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
child: Column(
children: [
Text(
'Cada jugador debe ver su palabra en secreto',
l10n.eachPlayerMustSee,
style: Theme.of(context).textTheme.bodyMedium,
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
'Ronda ${partida.rondaActual}',
l10n.roundNumber(partida.rondaActual),
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: TemaApp.colorNaranja,
),
@@ -69,7 +71,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
),
title: Text(jugador.nombre),
subtitle: Text(
haVisto ? 'Ya ha visto su palabra' : 'Pulsa para ver',
haVisto ? l10n.alreadySeen : l10n.tapToSee,
),
trailing: haVisto
? const Icon(Icons.check_circle,
@@ -102,8 +104,8 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
: null,
icon: const Icon(Icons.forum),
label: Text(todosHanVisto
? 'Todos han visto → Iniciar debate'
: 'Faltan ${partida.jugadores.length - _hanVisto.length} jugadores'),
? l10n.allSeenStartDebate
: l10n.playersRemaining(partida.jugadores.length - _hanVisto.length)),
),
),
],
@@ -163,6 +165,8 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(widget.nombre)),
body: Center(
@@ -208,8 +212,8 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
const SizedBox(height: 16),
Text(
widget.esImpostor
? '¡Eres el impostor!'
: 'Tu palabra es:',
? l10n.youAreImpostor
: l10n.yourWordIs,
style: Theme.of(context)
.textTheme
.titleLarge
@@ -236,7 +240,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
if (widget.esImpostor && widget.pistaActiva) ...[
const SizedBox(height: 12),
Text(
'Pista: ${BancoPalabras.nombreBonitoCategoria(widget.categoria)}',
l10n.clueCategory(BancoPalabras.nombreBonitoCategoria(widget.categoria, l10n)),
style: Theme.of(context)
.textTheme
.bodyLarge
@@ -252,13 +256,13 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
const Text('🔒', style: TextStyle(fontSize: 48)),
const SizedBox(height: 16),
Text(
'Mantén pulsado para ver tu palabra',
l10n.holdToSeeWord,
style: Theme.of(context).textTheme.titleMedium,
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
'Asegúrate de que nadie más mira',
l10n.makeSureNoOneLooks,
style: Theme.of(context).textTheme.bodyMedium,
),
],
@@ -291,8 +295,8 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
child: Center(
child: Text(
_manteniendo
? '👁️ Mostrando...'
: '👆 Mantén pulsado para ver',
? l10n.showingWord
: l10n.holdToSee,
style: const TextStyle(
color: Colors.white,
fontSize: 18,
@@ -313,7 +317,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
Navigator.pop(context);
},
icon: const Icon(Icons.check),
label: const Text('He visto mi palabra'),
label: Text(l10n.seenMyWord),
),
),
],

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:el_impostor/l10n/generated/app_localizations.dart';
import 'package:provider/provider.dart';
import '../estado/estado_juego.dart';
import '../tema/tema_app.dart';
@@ -48,12 +49,13 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
return _construirTodosVotaron(context, estado);
}
final l10n = AppLocalizations.of(context)!;
final votanteActual = sinVotar.isNotEmpty ? sinVotar[0] : activos[0];
final puedenRecibir = activos.where((j) => j.id != votanteActual.id).toList();
return Scaffold(
appBar: AppBar(
title: const Text('🗳️ Votación'),
title: Text(l10n.voting),
automaticallyImplyLeading: false,
),
body: Padding(
@@ -71,7 +73,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
child: Column(
children: [
Text(
'Turno de votar:',
l10n.turnToVote,
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 4),
@@ -83,7 +85,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
),
const SizedBox(height: 8),
Text(
'Votos: ${estado.votos.length}/${activos.length}',
l10n.votesProgress(estado.votos.length, activos.length),
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 4),
@@ -102,7 +104,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
const SizedBox(height: 16),
Text(
'¿Quién crees que es el impostor?',
l10n.whoIsImpostor,
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 12),
@@ -155,7 +157,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
}
: null,
icon: const Icon(Icons.how_to_vote),
label: const Text('Confirmar voto'),
label: Text(l10n.confirmVote),
),
),
],
@@ -165,9 +167,11 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
}
Widget _construirTodosVotaron(BuildContext context, EstadoJuego estado) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(
title: const Text('🗳️ Votación completa'),
title: Text(l10n.votingComplete),
automaticallyImplyLeading: false,
),
body: Center(
@@ -179,12 +183,12 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
const Text('🗳️', style: TextStyle(fontSize: 64)),
const SizedBox(height: 24),
Text(
'¡Todos han votado!',
l10n.allVoted,
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 16),
Text(
'Pulsa para revelar el resultado',
l10n.tapToReveal,
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 32),
@@ -205,7 +209,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
}
},
icon: const Icon(Icons.visibility),
label: const Text('Revelar resultado'),
label: Text(l10n.revealResult),
),
),
],

View File

@@ -0,0 +1,83 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
/// Servicio para gestionar el idioma de la app
class ServicioIdioma extends ChangeNotifier {
static const _claveIdioma = 'idioma_app';
Locale? _locale;
Locale? get locale => _locale;
/// Idiomas soportados con su bandera y nombre nativo
static const idiomasSoportados = <String, ({String bandera, String nombre})>{
'es': (bandera: '🇪🇸', nombre: 'Español'),
'en': (bandera: '🇬🇧', nombre: 'English'),
'fr': (bandera: '🇫🇷', nombre: 'Français'),
'pt': (bandera: '🇧🇷', nombre: 'Português'),
'de': (bandera: '🇩🇪', nombre: 'Deutsch'),
'it': (bandera: '🇮🇹', nombre: 'Italiano'),
'ru': (bandera: '🇷🇺', nombre: 'Русский'),
'ja': (bandera: '🇯🇵', nombre: '日本語'),
'ko': (bandera: '🇰🇷', nombre: '한국어'),
'zh': (bandera: '🇨🇳', nombre: '简体中文'),
'zh_TW': (bandera: '🇹🇼', nombre: '繁體中文'),
'ar': (bandera: '🇸🇦', nombre: 'العربية'),
'hi': (bandera: '🇮🇳', nombre: 'हिन्दी'),
'tr': (bandera: '🇹🇷', nombre: 'Türkçe'),
'pl': (bandera: '🇵🇱', nombre: 'Polski'),
'nl': (bandera: '🇳🇱', nombre: 'Nederlands'),
'ca': (bandera: '🏴', nombre: 'Català'),
'eu': (bandera: '🏴', nombre: 'Euskara'),
};
static List<Locale> get localesSoportados => idiomasSoportados.keys.map((k) {
if (k.contains('_')) {
final partes = k.split('_');
return Locale(partes[0], partes[1]);
}
return Locale(k);
}).toList();
/// Carga el idioma guardado en preferencias
Future<void> cargar() async {
final prefs = await SharedPreferences.getInstance();
final codigo = prefs.getString(_claveIdioma);
if (codigo != null) {
if (codigo.contains('_')) {
final partes = codigo.split('_');
_locale = Locale(partes[0], partes[1]);
} else {
_locale = Locale(codigo);
}
}
// Si no hay preferencia guardada, _locale queda null → se usa el del sistema
notifyListeners();
}
/// Cambia el idioma y lo persiste
Future<void> cambiarIdioma(String codigoIdioma) async {
final prefs = await SharedPreferences.getInstance();
if (codigoIdioma == 'sistema') {
await prefs.remove(_claveIdioma);
_locale = null;
} else {
await prefs.setString(_claveIdioma, codigoIdioma);
if (codigoIdioma.contains('_')) {
final partes = codigoIdioma.split('_');
_locale = Locale(partes[0], partes[1]);
} else {
_locale = Locale(codigoIdioma);
}
}
notifyListeners();
}
/// Devuelve el código de idioma actual (o 'sistema' si usa el del dispositivo)
String get codigoActual {
if (_locale == null) return 'sistema';
if (_locale!.countryCode != null && _locale!.countryCode!.isNotEmpty) {
return '${_locale!.languageCode}_${_locale!.countryCode}';
}
return _locale!.languageCode;
}
}

View File

@@ -94,6 +94,11 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.0.0"
flutter_localizations:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -144,6 +149,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.1.2"
intl:
dependency: "direct main"
description:
name: intl
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
url: "https://pub.dev"
source: hosted
version: "0.20.2"
leak_tracker:
dependency: transitive
description:

View File

@@ -9,6 +9,9 @@ environment:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
provider: ^6.1.2
shared_preferences: ^2.3.4
qr_flutter: ^4.1.0
@@ -22,6 +25,9 @@ dev_dependencies:
flutter_lints: ^6.0.0
flutter:
generate: true
uses-material-design: true
assets:
- assets/palabras.json
- assets/palabras_en.json
- assets/palabras_fr.json