Repository: darkskyapp/forecast-io-translations
Pull request #67 (2016-02-18 20:12:35)

Added Finnish translation
Finnish language translation and test cases.


Patch:
diff --git a/lib/lang/fi.js b/lib/lang/fi.js
new file mode 100644
index 0000000..3435540
--- /dev/null
+++ b/lib/lang/fi.js
@@ -0,0 +1,194 @@
+function join_with_shared_prefix(a, b, joiner) {
+  var m = a,
+      i = 0,
+      j;
+
+  while(i !== m.length &&
+        i !== b.length &&
+        m.charCodeAt(i) === b.charCodeAt(i))
+    ++i;
+
+  while(i && m.charCodeAt(i - 1) !== 32)
+    --i;
+
+  return a + joiner + b.slice(i);
+}
+
+
+var timeGrammar = [
+		['tänään', '', ''],
+		['huomenna', 'huomisesta', 'huomiseen asti'],
+		['yöllä', 'yöstä', 'yöhön asti'],
+		['ilta', 'illasta', 'iltaan asti'],
+		['aamulla', 'aamusta', 'aamuun asti'],
+		['illalla', 'illasta', 'iltaan asti'],
+		['iltapäivällä', 'iltapäivästä', 'iltapäivään asti'],
+		['huomisaamu', 'huomisaamusta', 'huomisaamuun asti'],
+		['myöhemmin illalla', 'myöhemmästä illasta alkaen', 'myöhempään iltaan asti'],
+		['myöhemmin yöllä', 'myöhemmästä yöstä alkaen', 'myöhempään yöhön asti'],
+		['huomenna iltapäivällä', 'huomisesta iltapäivästä', 'huomiseen iltapäivään asti'],
+		['huomenna illalla', 'huomisesta illasta', 'huomiseen iltaan asti'],
+		['huomenna yöllä', 'huomisesta yöstä', 'huomiseen yöhön asti'],
+		['maanantaina', 'maanantaista', 'maanantaihin'],
+		['tiistaina', 'tiistaista', 'tiistaihin'],
+		['keskiviikkona', 'keskiviikosta', 'keskiviikkoon'],
+		['torstaina', 'torstaista', 'torstaihin'],
+		['perjantaina', 'perjantaista', 'perjantaihin'],
+		['lauantaina', 'lauantaista', 'lauantaihin'],
+		['sunnuntaina', 'sunnuntaista', 'sunnuntaihin']
+]
+
+function elative(word){
+    for (var i in timeGrammar) {
+        if(timeGrammar[i][0] === word){
+            return timeGrammar[i][1];
+        }
+    }
+
+    return word;
+}
+
+function illative(word){
+    for (var i in timeGrammar) {
+        if(timeGrammar[i][0] === word){
+            return timeGrammar[i][2];
+        }
+    }
+
+   return word;
+}
+
+
+module.exports = require("../template")({
+  "clear": "selkeää",
+  "no-precipitation": "poutaa",
+  "mixed-precipitation": "räntäsadetta",
+  "possible-very-light-precipitation": "heikon sateen mahdollisuus",
+  "very-light-precipitation": "heikkoa sadetta",
+  "possible-light-precipitation": "sadekuurojen mahdollisuus",
+  "light-precipitation": "sadekuuroja",
+  "medium-precipitation": "sadetta",
+  "heavy-precipitation": "rankkasadetta",
+  "possible-very-light-rain": "heikon sateen mahdollisuus",
+  "very-light-rain": "heikkoa sadetta",
+  "possible-light-rain": "sadekuurojen mahdollisuus",
+  "light-rain": "sadekuuroja",
+  "medium-rain": "sadetta",
+  "heavy-rain": "rankkasadetta",
+  "possible-very-light-sleet": "heikon räntäsateen mahdollisuus",
+  "very-light-sleet": "heikkoa räntäsadetta",
+  "possible-light-sleet": "räntäkuurojen mahdollisuus",
+  "light-sleet": "räntäkuuroja",
+  "medium-sleet": "räntäsadetta",
+  "heavy-sleet": "voimakasta räntäsadetta",
+  "possible-very-light-snow": "heikon lumisateen mahdollisuus",
+  "very-light-snow": "heikkoa lumisadetta",
+  "possible-light-snow": "lumikuurojen mahdollisuus",
+  "light-snow": "lumikuuroja",
+  "medium-snow": "lumisadetta",
+  "heavy-snow": "rankkaa lumisadetta",
+  "light-wind": "heikkoa tuulta",
+  "medium-wind": "tuulista",
+  "heavy-wind": "myrskyisää",
+  "low-humidity": "kuivaa",
+  "high-humidity": "kosteaa",
+  "fog": "sumua",
+  "light-clouds": "puolipilvistä",
+  "medium-clouds": "enimmäkseen pilvistä",
+  "heavy-clouds": "pilvistä",
+  "today-morning": "aamulla",
+  "later-today-morning": "myöhemmin aamulla",
+  "today-afternoon": "iltapäivällä",
+  "later-today-afternoon": "myöhemmin iltapäivällä",
+  "today-evening": "illalla",
+  "later-today-evening": "myöhemmin illalla",
+  "today-night": "yöllä",
+  "later-today-night": "myöhemmin yöllä",
+  "tomorrow-morning": "huomisaamuna",
+  "tomorrow-afternoon": "huomenna iltapäivällä",
+  "tomorrow-evening": "huomenna illalla",
+  "tomorrow-night": "huomenna yöllä",
+  "morning": "aamulla",
+  "afternoon": "iltapäivällä",
+  "evening": "illalla",
+  "night": "yöllä",
+  "today": "tänään",
+  "tomorrow": "huomenna",
+  "sunday": "sunnuntaina",
+  "monday": "maanantaina",
+  "tuesday": "tiistaina",
+  "wednesday": "keskiviikkona",
+  "thursday": "torstaina",
+  "friday": "perjantaina",
+  "saturday": "lauantaina",
+  "minutes": "$1 min.",
+  "fahrenheit": "$1\u00B0F",
+  "celsius": "$1\u00B0C",
+  "inches": "$1 tuumaa",
+  "centimeters": "$1 cm",
+  "less-than": "alle $1",
+  "and": function(a, b) {
+    return join_with_shared_prefix(a, b, " ja ");
+  },
+  "through": function(a, b) {
+    return (elative(a) +  " " + illative(b) + " asti").trim();
+  },
+  "with": "$1, $2",
+  "range": "$1\u2013$2",
+  "parenthetical": "$1 ($2)",
+  "for-hour": "$1 seuraavan tunnin ajan",
+  "starting-in": "$1 odotettavissa $2 kuluessa",
+  "stopping-in": function(condition, period){
+      return condition + " vielä " + period;
+  },
+  "starting-then-stopping-later": function(condition, a, b){
+      return condition + " " + a + " kuluessa, päättyen " + b + " myöhemmin";
+  },
+  "stopping-then-starting-later": function(condition, a, b){
+      return condition + " vielä " + a + ", alkaen uudestaan " + b + " myöhemmin";
+  },
+  "for-day": "$1 päivän aikana",
+  "starting": function(condition, period){
+	return condition + " " + elative(period); 
+  },
+  "until": function(condition, period) {
+    return condition + " " + illative(period);
+  },
+  "until-starting-again": function(condition, a, b) {
+    return condition + " " + illative(a) +
+           ", ja jälleen " + b;
+  },
+
+  "starting-continuing-until": function(condition, a, b) {
+    return condition + " " + elative(a) + " " + illative(b);
+  },
+  "during": "$1 $2",
+  "for-week": "$1 viikon ajan",
+  "over-weekend": "$1 viikonloppuna",
+  "temperatures-peaking": function(a, b) {
+    return "lämpötilan noustessa lukemaan " + a + " " + b;
+  },
+  "temperatures-rising": function(a, b) {
+    return "lämpötilan noustessa lukemaan " + a + " " + b;
+  },
+  "temperatures-valleying": function(a, b) {
+    return "lämpötilan käydessä lukemassa " + a + " " + b;
+  },
+  "temperatures-falling": function(a, b) {
+    return "lämpötilan laskiessa lukemaan " + a + " " + b;
+  },
+  /* Capitalize the first character in the word.*/
+  "title": function(str) {
+    str = str.charAt(0).toUpperCase() + str.slice(1);
+    return str;
+  },
+  /* Capitalize the first word of the sentence and end with a period. */
+  "sentence": function(str) {
+    str = str.charAt(0).toUpperCase() + str.slice(1);
+
+    if(str.charAt(str.length - 1) !== ".")
+      str += ".";
+
+    return str;
+  }
+});


Test patch:
diff --git a/test_cases/fi.json b/test_cases/fi.json
new file mode 100644
index 0000000..f034c5a
--- /dev/null
+++ b/test_cases/fi.json
@@ -0,0 +1,249 @@
+{
+  "Selkeää":
+    ["title", "clear"],
+
+  "Heikon sateen mahdollisuus":
+    ["title", "possible-very-light-precipitation"],
+
+  "Heikkoa sadetta":
+    ["title", "very-light-precipitation"],
+
+  "Sadekuurojen mahdollisuus":
+    ["title", "possible-light-precipitation"],
+
+  "Sadekuuroja":
+    ["title", "light-precipitation"],
+
+  "Sadetta":
+    ["title", "medium-precipitation"],
+
+  "Rankkasadetta":
+    ["title", "heavy-precipitation"],
+
+  "Heikon sateen mahdollisuus":
+    ["title", "possible-very-light-rain"],
+
+  "Heikkoa sadetta":
+    ["title", "very-light-rain"],
+
+  "Sadekuurojen mahdollisuus":
+    ["title", "possible-light-rain"],
+
+  "Sadekuuroja":
+    ["title", "light-rain"],
+
+  "Sadetta":
+    ["title", "medium-rain"],
+
+  "Rankkasadetta":
+    ["title", "heavy-rain"],
+
+  "Heikon räntäsateen mahdollisuus":
+    ["title", "possible-very-light-sleet"],
+
+  "Heikkoa räntäsadetta":
+    ["title", "very-light-sleet"],
+
+  "Räntäkuurojen mahdollisuus":
+    ["title", "possible-light-sleet"],
+
+  "Räntäkuuroja":
+    ["title", "light-sleet"],
+
+  "Räntäsadetta":
+    ["title", "medium-sleet"],
+
+  "Voimakasta räntäsadetta":
+    ["title", "heavy-sleet"],
+
+  "Heikon lumisateen mahdollisuus":
+    ["title", "possible-very-light-snow"],
+
+  "Heikkoa lumisadetta":
+    ["title", "very-light-snow"],
+
+  "Lumikuurojen mahdollisuus":
+    ["title", "possible-light-snow"],
+
+  "Lumikuuroja":
+    ["title", "light-snow"],
+
+  "Lumisadetta":
+    ["title", "medium-snow"],
+
+  "Rankkaa lumisadetta":
+    ["title", "heavy-snow"],
+
+  "Tuulista":
+    ["title", "medium-wind"],
+
+  "Myrskyisää":
+    ["title", "heavy-wind"],
+
+  "Sumua":
+    ["title", "fog"],
+
+  "Enimmäkseen pilvistä":
+    ["title", "medium-clouds"],
+
+  "Pilvistä":
+    ["title", "heavy-clouds"],
+
+  "Kuivaa ja heikkoa tuulta":
+    ["title", ["and", "low-humidity", "light-wind"]],
+
+  "Heikkoa sadetta ja myrskyisää":
+    ["title", ["and", "very-light-rain", "heavy-wind"]],
+
+  "Kosteaa ja puolipilvistä":
+    ["title", ["and", "high-humidity", "light-clouds"]],
+
+  "Selkeää seuraavan tunnin ajan.":
+    ["sentence", ["for-hour", "clear"]],
+
+  "Heikkoa lumisadetta odotettavissa 35 min. kuluessa.":
+    ["sentence", ["starting-in", "very-light-snow", ["minutes", 35]]],
+
+  "Sadekuuroja vielä 15 min.":
+    ["sentence", ["stopping-in", "light-rain", ["minutes", 15]]],
+
+  "Voimakasta räntäsadetta 20 min. kuluessa, päättyen 30 min. myöhemmin.":
+    ["sentence",
+      ["starting-then-stopping-later",
+        "heavy-sleet",
+        ["minutes", 20],
+        ["minutes", 30]]],
+
+  "Sadetta vielä 25 min., alkaen uudestaan 8 min. myöhemmin.":
+    ["sentence",
+      ["stopping-then-starting-later",
+        "medium-rain",
+        ["minutes", 25],
+        ["minutes", 8]]],
+
+  "Enimmäkseen pilvistä päivän aikana.":
+    ["sentence", ["for-day", "medium-clouds"]],
+
+  "Heikkoa räntäsadetta aamusta.":
+    ["sentence", ["starting", "very-light-sleet", "morning"]],
+
+  "Tuulista yöhön asti.":
+    ["sentence", ["until", "medium-wind", "today-night"]],
+
+  "Rankkasadetta iltapäivään asti.":
+    ["sentence", ["until", "heavy-precipitation", "afternoon"]],
+
+  "Heikkoa tuulta iltapäivällä.":
+    ["sentence", ["during", "light-wind", "afternoon"]],
+
+  "Lumisadetta myöhemmin illalla ja huomisaamuna.":
+    ["sentence", ["during",
+      "medium-snow",
+      ["and", "later-today-evening", "tomorrow-morning"]]],
+
+  "Rankkasadetta myöhemmin aamulla, ja jälleen illalla.":
+    ["sentence", ["until-starting-again",
+      "heavy-rain",
+      "later-today-morning",
+      "today-evening"]],
+
+  "Pilvistä illasta yöhön asti.":
+    ["sentence", ["starting-continuing-until",
+      "heavy-clouds",
+      "evening",
+      "night"]],
+
+  "Räntäkuuroja myöhemmin iltapäivällä ja sumua huomisaamuna.":
+    ["sentence", ["and",
+      ["during", "light-sleet", "later-today-afternoon"],
+      ["during", "fog", "tomorrow-morning"]]],
+
+  "Myrskyisää aamusta iltapäivään asti ja räntäsadetta huomisaamuna.":
+    ["sentence", ["and",
+      ["starting-continuing-until",
+        "heavy-wind",
+        "today-morning",
+        "today-afternoon"],
+      ["during", "medium-sleet", "tomorrow-morning"]]],
+
+  "Pilvistä myöhemmästä yöstä alkaen ja rankkaa lumisadetta huomenna iltapäivällä.":
+    ["sentence", ["and",
+      ["starting", "heavy-clouds", "later-today-night"],
+      ["during", "heavy-snow", "tomorrow-afternoon"]]],
+
+  "Kuivaa yöllä ja sadekuuroja huomisesta illasta huomiseen yöhön asti.":
+    ["sentence", ["and",
+      ["during", "low-humidity", "today-night"],
+      ["starting-continuing-until",
+        "light-precipitation",
+        "tomorrow-evening",
+        "tomorrow-night"]]],
+
+  "Lumisadetta (5 tuumaa) yöllä.":
+    ["sentence", ["during",
+      ["parenthetical", "medium-snow", ["inches", 5]],
+      "night"]],
+
+  "Lumikuuroja (2 cm) myöhemmin aamulla.":
+    ["sentence", ["during",
+      ["parenthetical", "light-snow", ["centimeters", 2]],
+      "later-today-morning"]],
+
+  "Rankkaa lumisadetta (8\u201312 tuumaa) päivän aikana.":
+    ["sentence", ["for-day",
+      ["parenthetical", "heavy-snow", ["inches", ["range", 8, 12]]]]],
+
+  "Lumisadetta (alle 1 cm) iltapäivällä.":
+    ["sentence", ["during",
+      ["parenthetical", "medium-snow", ["less-than", ["centimeters", 1]]],
+      "afternoon"]],
+
+
+  "Poutaa viikon ajan, lämpötilan noustessa lukemaan 85°F huomenna.":
+    ["sentence", ["with",
+      ["for-week", "no-precipitation"],
+      ["temperatures-peaking",
+        ["fahrenheit", 85],
+        "tomorrow"]]],
+
+  "Räntäsadetta viikonloppuna, lämpötilan noustessa lukemaan 32°C torstaina.":
+    ["sentence", ["with",
+      ["over-weekend", "mixed-precipitation"],
+      ["temperatures-rising",
+        ["celsius", 32],
+        "thursday"]]],
+
+  "Heikkoa sadetta maanantaina, lämpötilan käydessä lukemassa 15\u00B0F perjantaina.":
+    ["sentence", ["with",
+      ["during", "very-light-rain", "monday"],
+      ["temperatures-valleying",
+        ["fahrenheit", 15],
+        "friday"]]],
+
+  "Lumikuuroja tiistaina ja keskiviikkona, lämpötilan laskiessa lukemaan 0°C sunnuntaina.":
+    ["sentence", ["with",
+      ["during", "light-snow", ["and", "tuesday", "wednesday"]],
+      ["temperatures-falling",
+        ["celsius", 0],
+        "sunday"]]],
+
+  "Sadetta lauantaihin asti, lämpötilan noustessa lukemaan 100°F maanantaina.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "saturday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "monday"]]],
+
+  "Räntäsadetta (1\u20133 tuumaa) päivän aikana.":
+    ["sentence",
+      ["for-day",
+        ["parenthetical", "mixed-precipitation", ["inches", ["range", 1, 3]]]]],
+
+  "Rankkaa lumisadetta (1\u20133 tuumaa)":
+    ["title", ["parenthetical", "heavy-snow", ["inches", ["range", 1, 3]]]],
+
+  "Rankkaa lumisadetta (3\u20135 cm)":
+    ["title", ["parenthetical", "heavy-snow", ["centimeters", ["range", 3, 5]]]]
+}