#!/usr/bin/env dart
// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// This simulates a translation process, reading the messages generated from
/// extract_message.dart for the files sample_with_messages.dart and
/// part_of_sample_with_messages.dart and writing out hard-coded translations
/// for German and French locales.

import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:args/args.dart';

/// A list of the French translations that we will produce.
var french = {
  "types": r"{a}, {b}, {c}",
  "multiLine": "Cette message prend plusiers lignes.",
  "message2": r"Un autre message avec un seul paramètre {x}",
  "alwaysTranslated": "Cette chaîne est toujours traduit",
  "message1": "Il s'agit d'un message",
  "leadingQuotes": "\"Soi-disant\"",
  "trickyInterpolation": r"L'interpolation est délicate "
      r"quand elle se termine une phrase comme {s}.",
  "message3": "Caractères qui doivent être échapper, par exemple barres \\ "
      "dollars \${ (les accolades sont ok), et xml/html réservés <& et "
      "des citations \" "
      "avec quelques paramètres ainsi {a}, {b}, et {c}",
  "YouveGotMessages_method": "Cela vient d'une méthode",
  "nonLambda": "Cette méthode n'est pas un lambda",
  "staticMessage": "Cela vient d'une méthode statique",
  "notAlwaysTranslated": "Ce manque certaines traductions",
  "thisNameIsNotInTheOriginal": "Could this lead to something malicious?",
  "originalNotInBMP": "Anciens caractères grecs jeux du pendu: 𐅆𐅇.",
  "escapable": "Escapes: \n\r\f\b\t\v.",
  "sameContentsDifferentName": "Bonjour tout le monde",
  "differentNameSameContents": "Bonjour tout le monde",
  "rentToBePaid": "loyer",
  "rentAsVerb": "louer",
  "plurals": "{num,plural, =0{Est-ce que nulle est pluriel?}=1{C'est singulier}"
      "other{C'est pluriel ({num}).}}",
  "whereTheyWentMessage": "{gender,select, male{{name} est allé à sa {place}}"
      "female{{name} est allée à sa {place}}other{{name}"
      " est allé à sa {place}}}",
  // Gratuitously different translation for testing. Ignoring gender of place.
  "nestedMessage": "{combinedGender,select, "
      "other{"
      "{number,plural, "
      "=0{Personne n'avait allé à la {place}}"
      "=1{{names} était allé à la {place}}"
      "other{{names} étaient allés à la {place}}"
      "}"
      "}"
      "female{"
      "{number,plural, "
      "=1{{names} était allée à la {place}}"
      "other{{names} étaient allées à la {place}}"
      "}"
      "}"
      "}",
  "outerPlural": "{n,plural, =0{rien}=1{un}other{quelques-uns}}",
  "outerGender": "{g,select, male {homme} female {femme} other {autre}}",
  "pluralThatFailsParsing": "{noOfThings,plural, "
      "=1{1 chose:}other{{noOfThings} choses:}}",
  "nestedOuter": "{number,plural, other{"
      "{gen,select, male{{number} homme}other{{number} autre}}}}",
  "outerSelect": "{currency,select, CDN{{amount} dollars Canadiens}"
      "other{{amount} certaine devise ou autre.}}}",
  "nestedSelect": "{currency,select, CDN{{amount,plural, "
      "=1{{amount} dollar Canadien}"
      "other{{amount} dollars Canadiens}}}"
      "other{N'importe quoi}"
  "}}",
  "literalDollar": "Cinq sous est US\$0.05"
};

/// A list of the German translations that we will produce.
var german = {
  "types": r"{a}, {b}, {c}",
  "multiLine": "Dieser String erstreckt sich über mehrere Zeilen erstrecken.",
  "message2": r"Eine weitere Meldung mit dem Parameter {x}",
  "alwaysTranslated": "Diese Zeichenkette wird immer übersetzt",
  "message1": "Dies ist eine Nachricht",
  "leadingQuotes": "\"Sogenannt\"",
  "trickyInterpolation": r"Interpolation ist schwierig, wenn es einen Satz "
      "wie dieser endet {s}.",
  "message3": "Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar "
      "\${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und "
      "Zitate \" Parameter {a}, {b} und {c}",
  "YouveGotMessages_method": "Dies ergibt sich aus einer Methode",
  "nonLambda": "Diese Methode ist nicht eine Lambda",
  "staticMessage": "Dies ergibt sich aus einer statischen Methode",
  "thisNameIsNotInTheOriginal": "Could this lead to something malicious?",
  "originalNotInBMP": "Antike griechische Galgenmännchen Zeichen: 𐅆𐅇",
  "escapable": "Escapes: \n\r\f\b\t\v.",
  "sameContentsDifferentName": "Hallo Welt",
  "differentNameSameContents": "Hallo Welt",
  "rentToBePaid": "Miete",
  "rentAsVerb": "mieten",
  "plurals": "{num,plural, =0{Ist Null Plural?}=1{Dies ist einmalig}"
      "other{Dies ist Plural ({num}).}}",
  "whereTheyWentMessage": "{gender,select, male{{name} ging zu seinem {place}}"
      "female{{name} ging zu ihrem {place}}other{{name} ging zu seinem {place}}}",
  //Note that we're only using the gender of the people. The gender of the
  //place also matters, but we're not dealing with that here.
  "nestedMessage": "{combinedGender,select, "
      "other{"
      "{number,plural, "
      "=0{Niemand ging zu {place}}"
      "=1{{names} ging zum {place}}"
      "other{{names} gingen zum {place}}"
      "}"
      "}"
      "female{"
      "{number,plural, "
      "=1{{names} ging in dem {place}}"
      "other{{names} gingen zum {place}}"
      "}"
      "}"
      "}",
  "outerPlural": "{n,plural, =0{Null}=1{ein}other{einige}}",
  "outerGender": "{g,select, male{Mann}female{Frau}other{andere}}",
  "pluralThatFailsParsing": "{noOfThings,plural, "
      "=1{eins:}other{{noOfThings} Dinge:}}",
  "nestedOuter": "{number,plural, other{"
      "{gen,select, male{{number} Mann}other{{number} andere}}}}",
  "outerSelect": "{currency,select, CDN{{amount} Kanadischen dollar}"
      "other{{amount} einige Währung oder anderen.}}}",
  "nestedSelect": "{currency,select, CDN{{amount,plural, "
      "=1{{amount} Kanadischer dollar}"
      "other{{amount} Kanadischen dollar}}}"
      "other{whatever}"
      "}",
  "literalDollar": "Fünf Cent US \$ 0.05"
};

/// The output directory for translated files.
String targetDir;

/// Generate a translated json version from [originals] in [locale] looking
/// up the translations in [translations].
void translate(Map originals, String locale, Map translations) {
  var translated = {"_locale": locale};
  originals.forEach((name, text) {
    translated[name] = translations[name];
  });
  var file = new File(path.join(targetDir, 'translation_$locale.arb'));
  file.writeAsStringSync(JSON.encode(translated));
}

main(List<String> args) {
  if (args.length == 0) {
    print('Usage: make_hardcoded_translation [--output-dir=<dir>] '
        '[originalFile.arb]');
    exit(0);
  }
  var parser = new ArgParser();
  parser.addOption("output-dir",
      defaultsTo: '.', callback: (value) => targetDir = value);
  parser.parse(args);

  var fileArgs = args.where((x) => x.contains('.arb'));

  var messages = JSON.decode(new File(fileArgs.first).readAsStringSync());
  translate(messages, "fr", french);
  translate(messages, "de_DE", german);
}
