#!/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}",
  "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}"
      "}}"
};

/** 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}",
  "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}"
      "}"
};

/** 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);
}
