Repository: darkskyapp/forecast-io-translations
Pull request #160 (2017-11-28 13:54:52)

Add Romanian Translation
New translation submodule for Romanian
New test file for Romanian

ironwallaby: This looks great! Thank you for the translation, we'll release this into the API when we do our next production deploy.

Patch:
diff --git a/lib/lang/ro.js b/lib/lang/ro.js
new file mode 100644
index 0000000..2e76721
--- /dev/null
+++ b/lib/lang/ro.js
@@ -0,0 +1,174 @@
+function join_with_shared_prefix(a, b, joiner) {
+  var i = 0,
+      j;
+
+  while(i !== a.length &&
+        i !== b.length &&
+        a.charCodeAt(i) === b.charCodeAt(i))
+    ++i;
+
+  while(i && a.charCodeAt(i - 1) !== 32)
+    --i;
+
+  return a.slice(0, i) + a.slice(i) + joiner + b.slice(i);
+}
+
+function strip_prefix(period) {
+  return period.slice(0, 9) === "overnight" ? period.slice(4) :
+         period.slice(0, 7) ===   "in the " ? period.slice(7) :
+                                              period;
+}
+
+module.exports = require("../template")({
+  "clear": "senin",
+  "no-precipitation": "fără precipitații",
+  "mixed-precipitation": "precipitații mixte",
+  "possible-very-light-precipitation": "posibile precipitații foarte slabe",
+  "very-light-precipitation": "precipitații foarte slabe",
+  "possible-light-precipitation": "posibile precipitații slabe",
+  "light-precipitation": "precipitații slabe",
+  "medium-precipitation": "precipitații",
+  "heavy-precipitation": "precipitații abundente",
+  "possible-very-light-rain": "posibil burniță",
+  "very-light-rain": "burniță",
+  "possible-light-rain": "posibil ploaie ușoară",
+  "light-rain": "ploaie ușoară",
+  "medium-rain": "ploaie",
+  "heavy-rain": "ploaie torențială",
+  "possible-very-light-sleet": "posibil lapoviță",
+  "very-light-sleet": "lapoviță",
+  "possible-light-sleet": "posibil lapoviță",
+  "light-sleet": "lapoviță",
+  "medium-sleet": "lapoviță",
+  "heavy-sleet": "lapoviță și ninsoare",
+  "possible-very-light-snow": "posibil ninsoare slabă",
+  "very-light-snow": "ninsoare slabă",
+  "possible-light-snow": "posibil ninsoare slabă",
+  "light-snow": "ninsoare slabă",
+  "medium-snow": "ninsoare",
+  "heavy-snow": "ninsoare puternică",
+  "possible-thunderstorm": "posibil furtună",
+  "thunderstorm": "furtună",
+  "light-wind": "vânt ușor",
+  "medium-wind": "bate vântul",
+  "heavy-wind": "vânt puternic",
+  "low-humidity": "umiditate scăzută",
+  "high-humidity": "umiditate ridicată",
+  "fog": "ceață",
+  "light-clouds": "parțial noros",
+  "medium-clouds": "predominant noros",
+  "heavy-clouds": "noros",
+  "today-morning": "dimineață",
+  "later-today-morning": "mai târziu în această dimineață",
+  "today-afternoon": "după-amiază",
+  "later-today-afternoon": "mai târziu în această după-amiază",
+  "today-evening": "diseară",
+  "later-today-evening": "mai târziu în această seară",
+  "today-night": "la noapte",
+  "later-today-night": "la noapte",
+  "tomorrow-morning": "mâine dimineață",
+  "tomorrow-afternoon": "maine după-amiază",
+  "tomorrow-evening": "mâine seară",
+  "tomorrow-night": "mâine noapte",
+  "morning": "dimineață",
+  "afternoon": "după-masă",
+  "evening": "seara",
+  "night": "la noapte",
+  "today": "azi",
+  "tomorrow": "mâine",
+  "sunday": "duminică",
+  "monday": "luni",
+  "tuesday": "marți",
+  "wednesday": "miercuri",
+  "thursday": "joi",
+  "friday": "vineri",
+  "saturday": "sâmbătă",
+  "next-sunday": "duminica viitoare",
+  "next-monday": "lunea viitoare",
+  "next-tuesday": "marțea viitoare",
+  "next-wednesday": "miercurea viitoare",
+  "next-thursday": "joia viitoare",
+  "next-friday": "vinerea viitoare",
+  "next-saturday": "sâmbăta viitoare",
+  "minutes": function(min) {
+    /* Special formatting for Romanian numbering.
+     * Working correctly only up to 100.
+     */
+    if (min == 1) {
+      return "1 minut";
+    } else if (min != 1 && min < 20) {
+      return min +" minute";
+    } else {
+      return min + " de minute";
+    }
+  },
+  "fahrenheit": "$1\u00B0F",
+  "celsius": "$1\u00B0C",
+  "inches": "$1 in.",
+  "centimeters": "$1 cm.",
+  "less-than": "mai puțin de $1",
+  "and": function(a, b) {
+    return join_with_shared_prefix(
+      a,
+      b,
+      a.indexOf(",") !== -1 ? " și " : " și "
+    );
+  },
+  "through": function(a, b) {
+    return join_with_shared_prefix("de " + a, b, " până ");
+  },
+  "with": "$1, cu $2",
+  "range": "$1\u2013$2",
+  "parenthetical": function(a, b) {
+    return a + " (" + b + (a === "precipitații mixte" ? " de zăpadă)" : ")");
+  },
+  "for-hour": "$1 în următoarea oră",
+  "starting-in": "$1, în $2",
+  "stopping-in": "$1, durează $2",
+  "starting-then-stopping-later": "$1 peste $2, durează $3",
+  "stopping-then-starting-later": "$1, se oprește în $2, începe din nou $3 mai târziu",
+  "for-day": "$1 de-a lungul zilei",
+  "starting": "$1, începând de $2",
+  "until": function(condition, period) {
+    return condition + " până " + strip_prefix(period);
+  },
+  "until-starting-again": function(condition, a, b) {
+    return condition + " până " + strip_prefix(a) + ", începe din nou " + b;
+  },
+  "starting-continuing-until": function(condition, a, b) {
+    return condition + " începând de " + a + " și până " +
+           strip_prefix(b);
+  },
+  "during": "$1 $2",
+  "for-week": "$1 pe toată durata săptămânii",
+  "over-weekend": "$1 în weekend",
+  "temperatures-peaking": "temperaturi ce ating un maxim de $1 $2",
+  "temperatures-rising": "temperaturi ce urcă până la $1 $2",
+  "temperatures-valleying": "temperaturi ce ating un minim de $1 $2",
+  "temperatures-falling": "temperaturi ce coboară până la $1 $2",
+  /* Capitalize the first letter of every word, except if that word is "et".
+   *
+   * Fun fact: JavaScript regex's "\w" and "\b" don't recognize accented
+   * characters (such as ș or ț) and so the neat trick used in the English
+   * version of the "title" function can't be used here. (Conveniently,
+   * anyway.)
+    */
+  "title": function(str) {
+    return str.replace(/\S+/g, function(word) {
+      return word === "și" || word === "de" || word.search(/in\./) > -1 || word.search(/cm\./) > -1 ?
+        word :
+        word.charAt(0).toUpperCase() + word.slice(1);
+    });
+  },
+  /* Capitalize the first word of the sentence and end with a period. */
+  "sentence": function(str) {
+    /* Capitalize. */
+    str = str.charAt(0).toUpperCase() + str.slice(1);
+
+    /* Add a period if there isn't already one. */
+    if(str.charAt(str.length - 1) !== ".")
+      str += ".";
+
+    return str;
+  }
+});


Test patch:
diff --git a/test_cases/ro.json b/test_cases/ro.json
new file mode 100644
index 0000000..5a166e2
--- /dev/null
+++ b/test_cases/ro.json
@@ -0,0 +1,278 @@
+{
+  "Senin":
+    ["title", "clear"],
+
+  "Posibile Precipitații Foarte Slabe":
+    ["title", "possible-very-light-precipitation"],
+
+  "Precipitații Foarte Slabe":
+    ["title", "very-light-precipitation"],
+
+  "Posibile Precipitații Slabe":
+    ["title", "possible-light-precipitation"],
+
+  "Precipitații Slabe":
+    ["title", "light-precipitation"],
+
+  "Precipitații":
+    ["title", "medium-precipitation"],
+
+  "Precipitații Abundente":
+    ["title", "heavy-precipitation"],
+
+  "Posibil Burniță":
+    ["title", "possible-very-light-rain"],
+
+  "Burniță":
+    ["title", "very-light-rain"],
+
+  "Posibil Ploaie Ușoară":
+    ["title", "possible-light-rain"],
+
+  "Ploaie Ușoară":
+    ["title", "light-rain"],
+
+  "Ploaie":
+    ["title", "medium-rain"],
+
+  "Ploaie Torențială":
+    ["title", "heavy-rain"],
+
+  "Posibil Lapoviță":
+    ["title", "possible-very-light-sleet"],
+
+  "Lapoviță":
+    ["title", "very-light-sleet"],
+
+  "Posibil Lapoviță":
+    ["title", "possible-light-sleet"],
+
+  "Lapoviță":
+    ["title", "light-sleet"],
+
+  "Lapoviță":
+    ["title", "medium-sleet"],
+
+  "Lapoviță și Ninsoare":
+    ["title", "heavy-sleet"],
+
+  "Posibil Ninsoare Slabă":
+    ["title", "possible-very-light-snow"],
+
+  "Ninsoare Slabă":
+    ["title", "very-light-snow"],
+
+  "Posibil Ninsoare Slabă":
+    ["title", "possible-light-snow"],
+
+  "Ninsoare Slabă":
+    ["title", "light-snow"],
+
+  "Ninsoare":
+    ["title", "medium-snow"],
+
+  "Ninsoare Puternică":
+    ["title", "heavy-snow"],
+
+  "Bate Vântul":
+    ["title", "medium-wind"],
+
+  "Vânt Puternic":
+    ["title", "heavy-wind"],
+
+  "Ceață":
+    ["title", "fog"],
+
+  "Predominant Noros":
+    ["title", "medium-clouds"],
+
+  "Noros":
+    ["title", "heavy-clouds"],
+
+  "Umiditate Scăzută și Vânt Ușor":
+    ["title", ["and", "low-humidity", "light-wind"]],
+
+  "Burniță și Vânt Puternic":
+    ["title", ["and", "very-light-rain", "heavy-wind"]],
+
+  "Umiditate Ridicată și Parțial Noros":
+    ["title", ["and", "high-humidity", "light-clouds"]],
+
+
+  "Senin în următoarea oră.":
+    ["sentence", ["for-hour", "clear"]],
+
+  "Ploaie torențială în următoarea oră.":
+    ["sentence", ["for-hour", "heavy-rain"]],
+
+  "Ploaie în următoarea oră.":
+    ["sentence", ["for-hour", "medium-rain"]],
+
+  "Ninsoare slabă, în 35 de minute.":
+    ["sentence", ["starting-in", "very-light-snow", ["minutes", 35]]],
+
+  "Ploaie ușoară, durează 15 minute.":
+    ["sentence", ["stopping-in", "light-rain", ["minutes", 15]]],
+
+  "Lapoviță și ninsoare peste 20 de minute, durează 30 de minute.":
+    ["sentence",
+      ["starting-then-stopping-later",
+        "heavy-sleet",
+        ["minutes", 20],
+        ["minutes", 30]]],
+
+  "Ploaie, se oprește în 25 de minute, începe din nou 8 minute mai târziu.":
+    ["sentence",
+      ["stopping-then-starting-later",
+        "medium-rain",
+        ["minutes", 25],
+        ["minutes", 8]]],
+
+
+  "Predominant noros de-a lungul zilei.":
+    ["sentence", ["for-day", "medium-clouds"]],
+
+  "Lapoviță, începând de dimineață.":
+    ["sentence", ["starting", "very-light-sleet", "morning"]],
+
+  "Bate vântul până la noapte.":
+    ["sentence", ["until", "medium-wind", "today-night"]],
+
+  "Precipitații abundente până după-masă.":
+    ["sentence", ["until", "heavy-precipitation", "afternoon"]],
+
+  "Vânt ușor după-masă.":
+    ["sentence", ["during", "light-wind", "afternoon"]],
+
+  "Ninsoare mai târziu în această seară și mâine dimineață.":
+    ["sentence", ["during",
+      "medium-snow",
+      ["and", "later-today-evening", "tomorrow-morning"]]],
+
+  "Ploaie torențială până mai târziu în această dimineață, începe din nou diseară.":
+    ["sentence", ["until-starting-again",
+      "heavy-rain",
+      "later-today-morning",
+      "today-evening"]],
+
+  "Noros începând de seara și până la noapte.":
+    ["sentence", ["starting-continuing-until",
+      "heavy-clouds",
+      "evening",
+      "night"]],
+
+  "Noros începând de mai târziu în această seară și până la noapte.":
+    ["sentence", ["starting-continuing-until",
+      "heavy-clouds",
+      "later-today-evening",
+      "night"]],
+
+  "Lapoviță mai târziu în această după-amiază și ceață mâine dimineață.":
+    ["sentence", ["and",
+      ["during", "light-sleet", "later-today-afternoon"],
+      ["during", "fog", "tomorrow-morning"]]],
+
+  "Vânt puternic începând de dimineață și până după-amiază și lapoviță mâine dimineață.":
+    ["sentence", ["and",
+      ["starting-continuing-until",
+        "heavy-wind",
+        "today-morning",
+        "today-afternoon"],
+      ["during", "medium-sleet", "tomorrow-morning"]]],
+
+  "Noros, începând de la noapte și ninsoare puternică maine după-amiază.":
+    ["sentence", ["and",
+      ["starting", "heavy-clouds", "later-today-night"],
+      ["during", "heavy-snow", "tomorrow-afternoon"]]],
+
+  "Noros, începând de seara și ninsoare puternică maine după-amiază.":
+    ["sentence", ["and",
+      ["starting", "heavy-clouds", "evening"],
+      ["during", "heavy-snow", "tomorrow-afternoon"]]],
+
+  "Umiditate scăzută la noapte și precipitații slabe începând de mâine seară și până mâine noapte.":
+    ["sentence", ["and",
+      ["during", "low-humidity", "today-night"],
+      ["starting-continuing-until",
+        "light-precipitation",
+        "tomorrow-evening",
+        "tomorrow-night"]]],
+
+  "Ninsoare (5 in.) la noapte.":
+    ["sentence", ["during",
+      ["parenthetical", "medium-snow", ["inches", 5]],
+      "night"]],
+
+  "Ninsoare slabă (2 cm.) mai târziu în această dimineață.":
+    ["sentence", ["during",
+      ["parenthetical", "light-snow", ["centimeters", 2]],
+      "later-today-morning"]],
+
+  "Ninsoare puternică (8\u201312 in.) de-a lungul zilei.":
+    ["sentence", ["for-day",
+      ["parenthetical", "heavy-snow", ["inches", ["range", 8, 12]]]]],
+
+  "Ninsoare (mai puțin de 1 cm.) după-masă.":
+    ["sentence", ["during",
+      ["parenthetical", "medium-snow", ["less-than", ["centimeters", 1]]],
+      "afternoon"]],
+
+
+  "Fără precipitații pe toată durata săptămânii, cu temperaturi ce ating un maxim de 85\u00B0F mâine.":
+    ["sentence", ["with",
+      ["for-week", "no-precipitation"],
+      ["temperatures-peaking",
+        ["fahrenheit", 85],
+        "tomorrow"]]],
+
+  "Precipitații mixte în weekend, cu temperaturi ce urcă până la 32\u00B0C joi.":
+    ["sentence", ["with",
+      ["over-weekend", "mixed-precipitation"],
+      ["temperatures-rising",
+        ["celsius", 32],
+        "thursday"]]],
+
+  "Burniță luni, cu temperaturi ce ating un minim de 15\u00B0F vineri.":
+    ["sentence", ["with",
+      ["during", "very-light-rain", "monday"],
+      ["temperatures-valleying",
+        ["fahrenheit", 15],
+        "friday"]]],
+
+  "Ninsoare slabă marți și miercurea viitoare, cu temperaturi ce coboară până la 0\u00B0C duminică.":
+    ["sentence", ["with",
+      ["during", "light-snow", ["and", "tuesday", "next-wednesday"]],
+      ["temperatures-falling",
+        ["celsius", 0],
+        "sunday"]]],
+
+  "Precipitații de azi până sâmbătă, cu temperaturi ce ating un maxim de 100\u00B0F luni.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "saturday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "monday"]]],
+
+  "Precipitații mixte (1\u20133 in. de zăpadă) de-a lungul zilei.":
+    ["sentence",
+      ["for-day",
+        ["parenthetical", "mixed-precipitation", ["inches", ["range", 1, 3]]]]],
+
+  "Ninsoare Puternică (1\u20133 in.)":
+    ["title", ["parenthetical", "heavy-snow", ["inches", ["range", 1, 3]]]],
+
+  "Ninsoare Puternică (3\u20135 cm.)":
+    ["title", ["parenthetical", "heavy-snow", ["centimeters", ["range", 3, 5]]]],
+
+  "Posibil Furtună":
+    ["title", "possible-thunderstorm"],
+
+  "Ploaie Torențială și Furtună":
+    ["title", ["and", "heavy-rain", "thunderstorm"]],
+
+  "Burniță, în mai puțin de 1 minut.":
+    ["sentence",
+      ["starting-in", "very-light-rain", ["less-than", ["minutes", 1]]]]
+}