Repository: darkskyapp/forecast-io-translations
Pull request #61 (2016-01-20 14:03:10)

Serbian language
There are to many variations, tryed to cover them all. Will see in the future if this goes well.

Marko


Patch:
diff --git a/lib/lang/rs.js b/lib/lang/rs.js
new file mode 100644
index 0000000..80c5a1c
--- /dev/null
+++ b/lib/lang/rs.js
@@ -0,0 +1,313 @@
+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);
+}
+function strip_prefix(period) {
+  return period.slice(0, 9) === "overnight" ? period.slice(4) :
+         period.slice(0, 7) ===   "in the " ? period.slice(7) :
+                                              period;
+}
+function time_var(time, pref, t)
+{
+  switch(time) {
+    case "danas":
+			time = pref+" "+time;
+			break;
+		break;
+    case "utor":
+    case "ponedelj":
+    case "pet":
+    case "četvrt":
+      switch(pref){
+				case "od":
+				case "do":
+					time+="ka";
+					if(t!==undefined){
+						if(t[2]!==undefined && t[3]!==undefined && t[2]=="during" && t[3]=="through"){
+							return time;
+						}
+					}
+					time = pref+"do "+time;
+				break;
+				case "u":
+					time += "ak";
+					time = pref+" "+time;
+				break;
+				default:
+					time += "ak";
+				break;
+			}
+      break;
+		case "nedelj":	
+			switch(pref){
+				case "od":
+				case "do":
+					time += "e";
+				break;
+				case "u":
+					time += "u";
+					time = pref+" "+time;
+				break;
+				default:
+					time += "a";
+				break;
+			}
+		break;
+    case "subot":
+    case "sred":
+			switch(pref){
+				case "od":
+				case "do":
+					time += "e";
+				break;
+				case "u":
+					time += "u";
+					time = pref+" "+time;
+				break;
+				default:
+					time += "u";
+				break;
+			}
+      break;
+		case "noć":
+			if(t[1]=="starting-continuing-until"){
+				return "tokom noći";
+			}
+			switch(pref){
+				case "u":
+					time += "i";
+					time = "tokom "+time;
+				break;
+				default:
+					time += "a";
+				break;
+			}
+		break;
+		case "sutra noć":
+			if(t[2]=="starting-continuing-until"){
+				return "tokom noći";
+			}
+			switch(pref){
+				case "u":
+					time += "i";
+					time = "tokom "+time;
+				break;
+				default:
+					
+				break;
+			}
+		break;
+		case "kasnije noć":
+			if(t[2]=="starting"){
+				return "kasnije tokom noći";
+			}
+		break;
+		case "kasnije ovog jutra":
+			if(t[1]=="during"){
+				return "kasnije tokom ovog jutra";
+			}
+			if(t[1]=="until-starting-again"){
+				return "kasnije ovog jutra";
+			}
+		break;
+ 
+  };
+
+  return time;
+}
+function checkCondition(a){
+	switch(a){
+		case "slabe padavine":
+		case "padavine":
+		case "jake padavine":
+			return "počinju";
+		break;
+		default:
+			return "počev od";
+		break;
+	}
+}
+function getPrefix(a, t){
+	switch(a){
+		case "sred":
+			return " i "
+		break;
+		case "sutra ujutro":
+			if(t[1]=="during" && t[2]=="and"){
+				return " i ";
+			}
+			return ", ";
+		break;
+		default:
+			if(t!==undefined){
+				if(t[0]=="title" && t[1]=="and"){
+					return " i ";
+				}
+			}
+			return ", ";
+		break;
+	}
+}
+module.exports = require("../template")({
+  "clear": function(){ return "vedro"; }, 
+  "no-precipitation": "nema padavina",
+  "mixed-precipitation": "različite padavine",
+  "possible-very-light-precipitation": "moguće su veoma slabe padavine",
+  "very-light-precipitation": "veoma slabe padavine",
+  "possible-light-precipitation": "moguće su slabe padavine",
+  "light-precipitation": "slabe padavine",
+  "medium-precipitation": "padavine",
+  "heavy-precipitation": "jake padavine",
+  "possible-very-light-rain": "moguća je veoma sitna kiša",
+  "very-light-rain": "veoma sitna kiša",
+  "possible-light-rain": "moguća je sitna kiša",
+  "light-rain": "sitna kiša",
+  "medium-rain": "kiša",
+  "heavy-rain": "jaka kiša",
+  "possible-very-light-sleet": "moguća je veoma slaba susnežica",
+  "very-light-sleet": "veoma slaba susnežica",
+  "possible-light-sleet": "moguća je slaba susnežica",
+  "light-sleet": "slaba susnežica",
+  "medium-sleet": "susnežica",
+  "heavy-sleet": "jaka susnežica",
+  "possible-very-light-snow": "moguć je veoma sitan sneg",
+  "very-light-snow": "veoma sitan sneg",
+  "possible-light-snow": "moguć je sitan sneg",
+  "light-snow": "sitan sneg",
+  "medium-snow": "sneg",
+  "heavy-snow": function(){ return "jak sneg"; },
+  "light-wind": function(){ return "vetrovito"; }, 
+  "medium-wind": function(){ return "vetrovito"; },
+  "heavy-wind": function(){ return "opasno vetrovito"; },
+  "low-humidity": function(){ return "suvo"; },
+  "high-humidity": function(){ return "vlažno"; },
+  "fog": function(){ return "maglovito"; },
+  "light-clouds": function(){ return "mestimično oblačno"; },
+  "medium-clouds": function(){ return "pretežno oblačno"; }, 
+  "heavy-clouds": function(){ return "oblačno"; },
+  "today-morning": "ovog jutra",
+  "later-today-morning": function(){ return "kasnije ovog jutra"; },
+  "today-afternoon": "ovog popodneva",
+  "later-today-afternoon": "kasnije ovog popodneva",
+  "today-evening": "uveče",
+  "later-today-evening": "kasno uveče",
+  "today-night": "večeras",
+  "later-today-night": function(){ return "kasnije noć"; },
+  "tomorrow-morning": function(){ return "sutra ujutro"; },
+  "tomorrow-afternoon": "sutra popodne",
+  "tomorrow-evening": "sutra uveče",
+  "tomorrow-night": function(){ return "sutra noć"; },
+  "morning": "ujutro",
+  "afternoon": "popodne",
+  "evening": "uveče",
+  "night": function(){ return "noć"; },  
+  "today": "danas",
+  "tomorrow": "sutra",
+  "monday": function(){ return "ponedelj"; },
+  "tuesday": function(){ return "utor"; },
+  "wednesday": function(){ return "sred"; },
+  "thursday": function(){ return "četvrt"; },
+  "friday": function(){ return "pet"; },
+  "saturday": function(){ return "subot"; },
+	"sunday": function(){ return "nedelj"; },
+  "minutes": "$1 minuta",
+  "fahrenheit": "$1\u00B0F",
+  "celsius": "$1\u00B0C",
+  "inches": "$1 inča",
+  "centimeters": "$1cm",
+  "less-than": "ispod $1",
+  "and": function(a, b) {
+		var c = getPrefix(b, this);
+		a = time_var(a, "u", this);
+		b = time_var(b, "u", this);
+    return join_with_shared_prefix(
+      a,
+      b,
+      c
+    );
+  },
+  "through": function(a, b) {
+		return join_with_shared_prefix(time_var(a, "od", this), time_var(b, "do", this), " do ");
+  },
+  "with": "$1, sa $2",
+  "range": "$1\u2013$2",
+  "parenthetical": "$1 ($2)",
+  "for-hour": "$1 za ovaj sat",
+  "starting-in": "$1 počinje za $2",
+  "stopping-in": "$1 prestaje za $2",
+  "starting-then-stopping-later": "$1 počinje za $2, onda prestaje za $3",
+  "stopping-then-starting-later": "$1 prestaje za $2, onda počinje za $3",
+  "for-day": "$1 tokom celog dana",
+  "starting": function(condition, time) {
+    return condition + " počinje " + time_var(time, "u", this);
+  },
+  "until": function(condition, time) {
+    return condition + " do " + time_var(time, "", this);
+  },
+  "until-starting-again": function(condition, timeUntil, timeAgain){
+    timeUntil = time_var(timeUntil, "do", this);
+    return condition + " " + timeUntil + " i opet počinje " + timeAgain;
+  },
+  "starting-continuing-until": function(condition, timeFrom, timeTo) {
+    timeFrom = time_var(timeFrom, "", this);
+    timeTo = time_var(timeTo, "u", this);
+		var starting_word = checkCondition(condition);
+    return condition + " " +starting_word + " " + timeFrom + ", nastaviće se " + timeTo;
+  },
+  "during": function(condition, time) {
+		time = time_var(time, "u", this);
+		if(this[1] === "and")
+      return time + " " + condition;
+    return condition + " " + time;
+  },
+  "for-week": "$1 tokom sedmice",
+  "over-weekend": "$1 tokom vikenda",
+  "temperatures-peaking": function(a, b){
+		b = time_var(b, "u", this);
+		return "temperaturom najviše do "+a+" "+b;
+	},
+  "temperatures-rising": function(a, b){
+		b = time_var(b, "u", this);
+		return "temperaturnim rastom do "+a+" "+b;
+	},
+  "temperatures-valleying": function(a, b){
+		b = time_var(b, "u", this);
+		return "temperaturom najniže do "+a+" "+b;
+	},
+  "temperatures-falling": function(a, b){
+		b = time_var(b, "u", this);
+		return "temperaturnim padom do "+a+" "+b;
+	},
+  /* Capitalize the first letter of every word, except if that word is "e". */
+  "title": function(str) {
+    return str.charAt(0).toUpperCase() + str.slice(1);
+    /*return str.replace(
+      /\b(?:a(?!nd\b)|[^\Wa])/g,
+      function(letter) {
+        return letter.toUpperCase();
+      }
+    );*/
+  },
+  /* 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/rs.json b/test_cases/rs.json
new file mode 100644
index 0000000..81348a2
--- /dev/null
+++ b/test_cases/rs.json
@@ -0,0 +1,295 @@
+{
+  "Vedro":
+    ["title", "clear"],
+
+  "Moguće su veoma slabe padavine":
+    ["title", "possible-very-light-precipitation"],
+
+  "Slabe padavine":
+    ["title", "very-light-precipitation"],
+
+  "Moguće su slabe padavine":
+    ["title", "possible-light-precipitation"],
+
+  "Slabe padavine":
+    ["title", "light-precipitation"],
+
+  "Padavine":
+    ["title", "medium-precipitation"],
+
+  "Jake padavine":
+    ["title", "heavy-precipitation"],
+
+  "Moguća je veoma sitna kiša":
+    ["title", "possible-very-light-rain"],
+
+  "Veoma sitna kiša":
+    ["title", "very-light-rain"],
+
+  "Moguća je sitna kiša":
+    ["title", "possible-light-rain"],
+
+  "Sitna kiša":
+    ["title", "light-rain"],
+
+  "Kiša":
+    ["title", "medium-rain"],
+
+  "Jaka kiša":
+    ["title", "heavy-rain"],
+
+  "Moguća je veoma slaba susnežica":
+    ["title", "possible-very-light-sleet"],
+
+  "Veoma slaba susnežica":
+    ["title", "very-light-sleet"],
+
+  "Moguća je slaba susnežica":
+    ["title", "possible-light-sleet"],
+
+  "Slaba susnežica":
+    ["title", "light-sleet"],
+
+  "Susnežica":
+    ["title", "medium-sleet"],
+
+  "Jaka susnežica":
+    ["title", "heavy-sleet"],
+
+  "Moguć je veoma sitan sneg":
+    ["title", "possible-very-light-snow"],
+
+  "Veoma sitan sneg":
+    ["title", "very-light-snow"],
+
+  "Moguć je sitan sneg":
+    ["title", "possible-light-snow"],
+
+  "Sitan sneg":
+    ["title", "light-snow"],
+
+  "Sneg":
+    ["title", "medium-snow"],
+
+  "Jak sneg":
+    ["title", "heavy-snow"],
+
+  "Vetrovito":
+    ["title", "medium-wind"],
+
+  "Opasno vetrovito":
+    ["title", "heavy-wind"],
+
+  "Maglovito":
+    ["title", "fog"],
+
+  "Pretežno oblačno":
+    ["title", "medium-clouds"],
+
+  "Oblačno":
+    ["title", "heavy-clouds"],
+
+  "Suvo i vetrovito":
+    ["title", ["and", "low-humidity", "light-wind"]],
+
+  "Veoma sitna kiša i opasno vetrovito":
+    ["title", ["and", "very-light-rain", "heavy-wind"]],
+
+  "Vlažno i mestimično oblačno":
+    ["title", ["and", "high-humidity", "light-clouds"]],
+
+  "Vedro za ovaj sat.":
+    ["sentence", ["for-hour", "clear"]],
+
+  "Veoma sitan sneg počinje za 35 minuta.":
+    ["sentence", ["starting-in", "very-light-snow", ["minutes", 35]]],
+
+  "Sitna kiša prestaje za 15 minuta.":
+    ["sentence", ["stopping-in", "light-rain", ["minutes", 15]]],
+
+  "Jaka susnežica počinje za 20 minuta, onda prestaje za 30 minuta.":
+    ["sentence",
+      ["starting-then-stopping-later",
+        "heavy-sleet",
+        ["minutes", 20],
+        ["minutes", 30]]],
+
+  "Kiša prestaje za 25 minuta, onda počinje za 8 minuta.":
+    ["sentence",
+      ["stopping-then-starting-later",
+        "medium-rain",
+        ["minutes", 25],
+        ["minutes", 8]]],
+
+
+  "Pretežno oblačno tokom celog dana.":
+    ["sentence", ["for-day", "medium-clouds"]],
+
+  "Veoma slaba susnežica počinje ujutro.":
+    ["sentence", ["starting", "very-light-sleet", "morning"]],
+
+  "Vetrovito do večeras.":
+    ["sentence", ["until", "medium-wind", "today-night"]],
+
+  "Jake padavine do popodne.":
+    ["sentence", ["until", "heavy-precipitation", "afternoon"]],
+
+  "Vetrovito popodne.":
+    ["sentence", ["during", "light-wind", "afternoon"]],
+
+  "Sneg kasno uveče i sutra ujutro.":
+    ["sentence", ["during",
+      "medium-snow",
+      ["and", "later-today-evening", "tomorrow-morning"]]],
+
+  "Jaka kiša kasnije ovog jutra i opet počinje uveče.":
+    ["sentence", ["until-starting-again",
+      "heavy-rain",
+      "later-today-morning",
+      "today-evening"]],
+
+  "Oblačno počev od uveče, nastaviće se tokom noći.":
+    ["sentence", ["starting-continuing-until",
+      "heavy-clouds",
+      "evening",
+      "night"]],
+
+  "Kasnije ovog popodneva slaba susnežica, sutra ujutro maglovito.":
+    ["sentence", ["and",
+      ["during", "light-sleet", "later-today-afternoon"],
+      ["during", "fog", "tomorrow-morning"]]],
+
+  "Opasno vetrovito počev od ovog jutra, nastaviće se ovog popodneva, sutra ujutro susnežica.":
+    ["sentence", ["and",
+      ["starting-continuing-until",
+        "heavy-wind",
+        "today-morning",
+        "today-afternoon"],
+      ["during", "medium-sleet", "tomorrow-morning"]]],
+
+  "Oblačno počinje kasnije tokom noći, sutra popodne jak sneg.":
+    ["sentence", ["and",
+      ["starting", "heavy-clouds", "later-today-night"],
+      ["during", "heavy-snow", "tomorrow-afternoon"]]],
+
+  "Večeras suvo, slabe padavine počinju sutra uveče, nastaviće se tokom noći.":
+    ["sentence", ["and",
+      ["during", "low-humidity", "today-night"],
+      ["starting-continuing-until",
+        "light-precipitation",
+        "tomorrow-evening",
+        "tomorrow-night"]]],
+
+  "Sneg (5 inča) tokom noći.":
+    ["sentence", ["during",
+      ["parenthetical", "medium-snow", ["inches", 5]],
+      "night"]],
+
+  "Sitan sneg (2cm) kasnije tokom ovog jutra.":
+    ["sentence", ["during",
+      ["parenthetical", "light-snow", ["centimeters", 2]],
+      "later-today-morning"]],
+
+  "Jak sneg (8\u201312 inča) tokom celog dana.":
+    ["sentence", ["for-day",
+      ["parenthetical", "heavy-snow", ["inches", ["range", 8, 12]]]]],
+
+  "Sneg (ispod 1cm) popodne.":
+    ["sentence", ["during",
+      ["parenthetical", "medium-snow", ["less-than", ["centimeters", 1]]],
+      "afternoon"]],
+
+
+  "Nema padavina tokom sedmice, sa temperaturom najviše do 85°F sutra.":
+    ["sentence", ["with",
+      ["for-week", "no-precipitation"],
+      ["temperatures-peaking",
+        ["fahrenheit", 85],
+        "tomorrow"]]],
+
+  "Različite padavine tokom vikenda, sa temperaturnim rastom do 32\u00B0C u četvrtak.":
+    ["sentence", ["with",
+      ["over-weekend", "mixed-precipitation"],
+      ["temperatures-rising",
+        ["celsius", 32],
+        "thursday"]]],
+
+  "Veoma sitna kiša u ponedeljak, sa temperaturom najniže do 15°F u petak.":
+    ["sentence", ["with",
+      ["during", "very-light-rain", "monday"],
+      ["temperatures-valleying",
+        ["fahrenheit", 15],
+        "friday"]]],
+
+  "Sitan sneg u utorak i sredu, sa temperaturnim padom do 0\u00B0C u nedelju.":
+    ["sentence", ["with",
+      ["during", "light-snow", ["and", "tuesday", "wednesday"]],
+      ["temperatures-falling",
+        ["celsius", 0],
+        "sunday"]]],
+
+  "Padavine od danas do subote, sa temperaturom najviše do 100\u00B0F u ponedeljak.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "saturday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "monday"]]],
+				
+	"Padavine od danas do nedelje, sa temperaturom najviše do 100\u00B0F u utorak.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "sunday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "tuesday"]]],
+				
+	"Padavine od danas do ponedeljka, sa temperaturom najviše do 100\u00B0F u sredu.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "monday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "wednesday"]]],
+				
+	"Padavine od danas do utorka, sa temperaturom najviše do 100\u00B0F u četvrtak.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "tuesday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "thursday"]]],
+				
+	"Padavine od danas do srede, sa temperaturom najviše do 100\u00B0F u petak.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "wednesday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "friday"]]],
+				
+	"Padavine od danas do četvrtka, sa temperaturom najviše do 100\u00B0F u subotu.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "thursday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "saturday"]]] ,
+
+		"Padavine od danas do petka, sa temperaturom najviše do 100\u00B0F u nedelju.":
+    ["sentence", ["with",
+      ["during",
+        "medium-precipitation",
+        ["through", "today", "friday"]],
+      ["temperatures-peaking",
+        ["fahrenheit", 100],
+        "sunday"]]] 
+
+				
+}