Russian translation

View previous topic View next topic Go down

Russian translation

Post  flire on Tue Aug 21, 2012 9:19 pm

Hello there!
I've translated FTM into Russian:
Spoiler:

Code:

//
// General rules:
//
// - The encoding of the file, which is Unicode, must not be changed.
// - The name of the file should be [language].js where [language] is the
//  name of the languages in English.
// - You can just put the file in directory "language" under the gadget
//  directory and this is integrated automatically, you can choose
//  the language on settings panel.
//

{

//
// This will be displayed in the language selector combobox on
// settings panel.
//
languagedisplay: "Русский",


//
// Recurrence part is for translating ical recurrence info returned
// by RTM API to a human readable form.
//
recurrence: {

   //
   // These are templates for the supported types of standard
   // "every" recurrences.
   // In the templates, #1#, #2# and #3# will be replaced to the
   // proper data, see the examples after the templates.
   //
   types: {
      weekly_byday: "#2# каждой #1# недели", // E.g.: Every 2nd week on tuesday
      montyly_byday: "Каждый #1# месяц, #2# #3#", // E.g.: Every 2nd month on the third tuesday
      monthly_bymonthday: "Каждый #1# месяц, #2#-го числа", // E.g.: Every 2nd month on the 27th
      daily: "Каждый #1# день", // E.g.: Every 2nd day
      weekly: "Каждую #1# неделю", // E.g.: Every 2nd week
      monthly: "Каждый #1# месяц", // E.g.: Every 2nd month
      yearly: "Каждый #1# год" // E.g.: Every 2nd year
   },

   //
   // These are templates for the supported types of RTM's special
   // "after" recurrences.
   // In the templates, #1#, #2# and #3# will be replaced to the
   // proper data, see the examples after the templates.
   //
   after_types: {
      after1day: "Через день",
      afterdays: "Через #1# дня", // E.g.: After 2 days
      aftermanydays: "Через #1# дней",
      after1week: "Через неделю",
      afterweeks: "Через #1# недели", // E.g.: After 2 weeks !!!It's little different in Russian
      aftermanyweeks: "Через #1# недель",
      after1month: "Через месяц",
      aftermonths: "Через #1# месяца", // E.g.: After 2 months !!!It's little different in Russian
      aftermanymonths: "Через #1# недель",
      after1year: "Через год",
      afteryears: "Через #1# лет", // E.g.: After 2 years !!!It's little different in Russian
      aftermanyyears: "Через #1# лет"
   },
   
   //
   // These are used for translating weekdays in recurrence rules.
   // See for example types.montyly_byday above.
   //
   weekday_translator: {
      SU: "воскресенье",
      MO: "понедельник",
      TU: "вторник",
      WE: "среда",
      TH: "четверг",
      FR: "пятница",
      SA: "суббота"
   },
   
   //
   // These are used for translating ordinal numbers in recurrence rules.
   // See any example in types above.
   //
   ordinal_number_translator: {

      /*
         The following regular expression replace rules are executed
         sequentially on an ordinal number, the result is created by
         the first matching rule.
         
         This algorithm works for english:
         - rule 1 replaces anything that ends with a number between 10 and 19 to ...th, ie. 11th or 216th
         - rule 2 replaces anything that ends with 1 to ...1st, ie. 1st, 21st, 1561st (note: rule1 handles 11 before this!)
         - rule 3 replaces anything that ends with 2 to ...2nd, ie. 2nd, 22nd, 1562nd (note: rule1 handles 12 before this!)
         - rule 4 replaces anything that ends with 3 to ...3rd, ie. 3rd, 23rd, 1563rd (note: rule1 handles 13 before this!)
         - rule 5 replaces anything else to ...th, ie. 4th, 24nd, 1564th

         This might seem a bit complicated. For other languages, perhaps
         you can be as simple as applying only one rule, which translates
         everything to X. for, ie. 1. or 22. or 1563.

            rule1: {regexp: "([0-9]+)", replace: "$1." },
         
      */   
      //It's made a bit simplier for Russian. :)
   }
},
   
//
// The following are key-value pairs, where the values are
// displayed in certain points of the gadget user interface.
// There might be comments at the end of the lines which help
// the translation.
//

lorem: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
notesdateformat: "dofw dd mon yy",
dateformat: "dd mon yy",
overduedateformat: "dd mon",
timeformat: "Время",
time12: "6:00PM",
time12am: "AM",
time12pm: "PM",
weekdays: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
months: ["Янв", "Фев", "Мар", "Апр", "Май", "Июнь", "Июль", "Авг", "Сен", "Окт", "Ноя", "Дек"],
notasks: "Нет задач",
nodue: "Бессрочные",
lang: "Язык",
days: "Дни",
height: "Высота",
width: "Ширина",
logout: "Выход",
login: "Вход",
auth: "Аутентификация",
close: "Закрыть",
overdue: "Просроченные",
pleaselogin: "Пожалуйста, войдите!",
time12am: "AM",
time12pm: "PM",
newver: "Доступно обновление",
backtotasks: "Вернуться к задачам",
dateformatflyout: "dd mon",
when: "Когда",
where: "Где",
notes: "Примечания",
edit: "Правка",
rtm: "RTM",
complete: "Завершить",
postpone: "Отложить",
list: "Список",
create: "Создать",
update: "Обновить",
cancel: "Отменить",
ok: "  Ok  ",
okay: "Ok",
help: "Помощь",
duehelp: "Формат даты окончания аналогичен описанному в документации RTM.<p>Примеры даты окончания: <li>Сегодня: Сегодня(сег также работает)</li><li>Завтра: Завтра(зав также работает)</li><li>25 апр: 25 апреля этого года(следующего, если в этом году 25 апреля уже прошло)</li><li>Апр 25: 25 апреля этого года(следующего, если в этом году 25 апреля уже прошло)</li><li>25/04/2008: 25 апреля 2008</li><li>04/25/2008: 25 апреля 2008(<i>прим. перев.: при неопределённости даты выбирается первый вариант</i>)</li><li>2008-04-25: 25 апреля 2008</li><li>Пятница: ближайшая пятница для текущего числа</li><li>Следующая пятница: пятница, следующая второй за текущим числом</li><li>Пт в 7pm: В пятницу в семь часов вечера</li><li>6pm: Сегодня в 18:00(завтра, если 18:00 уже прошло)</li><li>18:00: Сегодня в 18:00(завтра, если 18:00 уже прошло)</li><li>5 часов: через пять часов от текущего момента</li><li>2 дня: через два дня от текущего момента</li><li>3 недели: через три недели от текущего момента</li><p><i>Прим. перев.: не описанные здесь форматы даты не проверены.</i>",
repeathelp: "Формат даты повтора аналогичен описанному в документации RTM.<p>Примеры повтора:<li>Каждая пятница</li><li>Пн, Вт</li><li>Каждый день</li><li>Каждую неделю</li><li>Каждые 2 недели</li><li>Каждый месяц</li><li>Каждые 6 месяцев</li><li>Каждый год</li><li>Через 5 дней</li><li>Через неделю</li><li>Через 6 месяцев</li><li>Через год</li><p><i>Прим. перев.: не описанные здесь форматы повтора не проверены.</i>",
quickadd: "Быстрое добавление задачи",
name: "Имя",
repeat: "Повтор",
due: "Дата",
tags: "Метки",
background: "Использовать фон",
versioncheck: "Проверять обновления",
loginhelp: "Вы можете выполнить вход, следуя этому описанию. <p>Нажмите на кнопку <i>Аутентификация</i> после чего браузер откроет окно, в котором необходимо ввести имя пользователя и пароль. В случае успешного выполнения этих действий RTM покажет сообщение об успешной авторизации приложения. После этого нажмите на кнопку <i>Вход</i>, чтобы гаджет получил ключ доступа для операций с вашими задачами в RTM. Кнопка <i>Выход</i> используется для удаления этого ключа. Пока ключ доступен, гаджет автоматически проводит авторизацию. Если же вы нажали кнопку <i>Выход</i>, вы можете войти, повторив всю процедуру сначала.",
pleasewait: "Подождите...",
getfrob: "Запрашиваю аутентификацию...",
loggingin: "Выполняю вход...",
todo: "Выполнение",
pleaseloginrtm: "Пожалуйста, совершите вход в систему Remember The Milk в появившемся окне браузера, а затем нажмите кнопку 'Вход' здесь.",
postponing: "Откладываю задачу...",
completing: "Завершаю задачу...",
quickadding: "Добавляю задачу...",
settingname: "Устанавливаю имя...",
settinglist: "Устанавливаю список...",
settingdue: "Устанавливаю срок...",
settingtags: "Расставляю метки...",
settingrepeat: "Устанавливаю повтор...",
settingprior: "Устанавливаю приоритет...",
forumtext: "Добавляйте отзывы и багрепорты на ",
forum: "форум",
donatetext: "Пожалуйста, поддержите проект, если вам оказался полезен этот гаджет:",
hide: "Спрятать",
retry: "Повторить",
theme: "Тема",
fontsize: "Размер шрифта",
priorAlways: "Всегда",
others: "Другие",
lists: "Списки",
priorNever: "Никогда",
priorNodue: "Только бессрочные",
priority: "Показывать приоритет",
prior: "Приоритет",
error: "Ошибка",
key: "Ключ входа",
quieterrors: "'Бесшумные' ошибки",
groupby: "Группировать по дням",
nodueTitle: "Положение бессрочных задач",
nodueTop: "Первые",
nodueBottom: "Последние",
nodueHide: "Не показывать",
reloadFeeds: "Перезагрузить списки задач",
feedlist: "Списки задач",
reloadingfeeds: "Загружаю списки задач",
nolists: "Нет выбранных списков",
remove: "Удалить",
newnote: "Добавить заметку",
suredelnote: "Удалить заметку?",
confirm: "Подтверждение",
getvalue: "Получить значение", //??
today: "Сегодня",
tomorrow: "Завтра",
trace: "Отслеживать",
showLog: "Показать лог",
advancedSettings: "Расширенные настройки",
hintMenu: "Меню",
hintScroll: "Прокрутить",
hintNewTask: "Добавить новую заметку",
hintRefresh: "Обновить",
hintHome: "Открыть Remember The Milk в браузере",
hintForum: "Форум",
notedeleting: "Удаляю заметку",
noteadding: "Добавляю заметку",
noteupdating: "Обновляю заметку"

}
Also patch for I18N might be useful, so FTM will show Russian plural nouns correctly(I've already described this problem in the other topic):
Spoiler:

Code:

var I18N = {
   d : null,
   lang : null
};
I18N.x304x = function (lang) {
   try {
      I18N.lang = lang;
      var file = Util.x138x();
      var langdata = Util.x114x(file + "/language/english.js", false, false);
      I18N.d = eval("(" + langdata + ")");
      if (lang != "english.js") {
         langdata = Util.x114x(file + "/language/" + lang, false, false);
         var d = eval("(" + langdata + ")");
         var missingFile = file + "/language/" + lang + ".missing";
         var missing = "";
         for (var key in I18N.d) {
            if (typeof(d[key]) == "undefined") {
               missing += key + ': "' + I18N.d[key] + '",\n'
            }
         }
         if (missing != "") {
            Util.x102x(missingFile, missing)
         } else {
            if (Util.x140x().FileExists(missingFile)) {
               Util.x140x().DeleteFile(missingFile)
            }
         }
         for (var key in d) {
            I18N.d[key] = d[key]
         }
      }
   } catch (err) {
      Log.log("[I18N.x304x] ERROR: " + Util.x148x(err))
   }
};
I18N.x302x = function (a) {
   var f = I18N.d.recurrence.ordinal_number_translator;
   var e = new String(a);
   for (var b in f) {
      var d = f[b];
      var c = new RegExp(d.regexp, "");
      if (e.match(c)) {
         return e.replace(c, d.replace)
      }
   }
   return e
};
I18N.x301x = function (c) {
   var d = I18N.d.recurrence.weekday_translator;
   var b = "";
   for (var a in d) {
      if (c.match(a)) {
         if (b != "") {
            b += ", "
         }
         b += d[a]
      }
   }
   return b
};
I18N.x306x = function (l, b, a) {
   if (l == null) {
      return ""
   }
   var h = I18N.lang;
   if (a != null && h != a) {
      I18N.x304x(a)
   }
   var i = l.replace("FREQ=", "");
   i = i + ";";
   i = i.replace(/WKST=[^;]*;/, "");
   i = i.replace(/UNTIL=[^;]*;/, "");
   var e = I18N.d.recurrence;
   var g = null;
   if (g = i.match("WEEKLY;(INTERVAL=([0-9]+);)?BYDAY=(([A-Z]*,)*[A-Z]*);")) {
      var f = g[2];
      var m = g[3];
      if (f == null || f == "") {
         f = 1
      }
      i = e.types.weekly_byday;
      i = i.replace("#1#", f == 1 ? "" : I18N.x302x(f));
      i = i.replace("#2#", I18N.x301x(m))
   }
   if (g = i.match("MONTHLY;(INTERVAL=([0-9]+);)?BYDAY=([0-9]+)([A-Z]*);")) {
      var k = g[2];
      var c = g[3];
      var j = g[4];
      if (k == null || k == "") {
         k = 1
      }
      i = e.types.montyly_byday;
      i = i.replace("#1#", k == 1 ? "" : I18N.x302x(k));
      i = i.replace("#2#", I18N.x302x(c));
      i = i.replace("#3#", I18N.x301x(j))
   }
   if (g = i.match("MONTHLY;(INTERVAL=([0-9]+);)?BYMONTHDAY=([0-9]+);")) {
      var k = g[2];
      var c = g[3];
      if (k == null || k == "") {
         k = 1
      }
      i = e.types.monthly_bymonthday;
      i = i.replace("#1#", k == 1 ? "" : I18N.x302x(k));
      i = i.replace("#2#", I18N.x302x(c))
   }
   if (g = i.match("DAILY;(INTERVAL=([0-9]+);)?")) {
      var c = g[2];
      if (c == null || c == "") {
         c = 1
      }
      if (b) {
         if (c > 1) {
            if (c > 4) {
               i = e.after_types.aftermanydays.replace("#1#", c)
               }
            else {
            i = e.after_types.afterdays.replace("#1#", c)
            }
         } else {
            i = e.after_types.after1day
         }
      } else {
         i = e.types.daily;
         i = i.replace("#1#", c == 1 ? "" : I18N.x302x(c))
      }
   }
   if (g = i.match("WEEKLY;(INTERVAL=([0-9]+);)?")) {
      var f = g[2];
      if (f == null || f == "") {
         f = 1
      }
      if (b) {
         if (f > 1) {
            if (f > 4) {
               i = e.after_types.aftermanyweeks.replace("#1#", f)
               }
            else {
            i = e.after_types.afterweeks.replace("#1#", f)
            }
         } else {
            i = e.after_types.after1week
         }
      } else {
         i = e.types.weekly;
         i = i.replace("#1#", f == 1 ? "" : I18N.x302x(f))
      }
   }
   if (g = i.match("MONTHLY;(INTERVAL=([0-9]+);)?")) {
      var k = g[2];
      if (k == null || k == "") {
         k = 1
      }
      if (b) {
         if (k > 1) {
            if (k > 4) {
               i = e.after_types.aftermanymonths.replace("#1#", k)
               }
            else {
            i = e.after_types.aftermonths.replace("#1#", k)
            }
         } else {
            i = e.after_types.after1month
         }
      } else {
         i = e.types.monthly;
         i = i.replace("#1#", k == 1 ? "" : I18N.x302x(k))
      }
   }
   if (g = i.match("YEARLY;(INTERVAL=([0-9]+);)?")) {
      var d = g[2];
      if (d == null || d == "") {
         d = 1
      }
      if (b) {
         if (d > 1) {
            if (d > 4) {
               i = e.after_types.aftermanyyears.replace("#1#", d)
               }
            else {
            i = e.after_types.afteryears.replace("#1#", d)
            }
         } else {
            i = e.after_types.after1year
         }
      } else {
         i = e.types.yearly;
         i = i.replace("#1#", d == 1 ? "" : I18N.x302x(d))
      }
   }
   i = i.replace(/ +/, " ");
   if (a != null && h != a) {
      I18N.x304x(h)
   }
   return i
};
I18N.x305x = function (b) {
   var a = b.replace(/DTSTART|DTEND/, "");
   if (a.match(/^;VALUE=DATE:[0-9]{8}$/)) {
      a = a.replace(/;VALUE=DATE:/, "");
      a = a.substr(0, 4) + "." + a.substr(4, 2) + "." + a.substr(6, 2)
   } else {
      if (a.match(/^.*:[0-9]{8}T[0-9]{6}Z?$/)) {
         if (a.match(/Z$/)) {
            a = a.replace(/Z$/, ".000Z")
         }
         a = a.replace(/.*:/, "");
         a = a.substr(0, 4) + "." + a.substr(4, 2) + "." + a.substr(6, 2) + "T" + a.substr(9, 2) + ":" + a.substr(11, 2) + ":" + a.substr(13, 20)
      } else {
         throw "Unknown format: " + b
      }
   }
   return a
};
I18N.x303x = function () {
   var e = ["FREQ=DAILY;WKST=MO", "FREQ=DAILY;WKST=MO;UNTIL=20090123", "FREQ=DAILY;WKST=MO;UNTIL=20090123;INTERVAL=1", "FREQ=DAILY;WKST=MO;UNTIL=20090123;INTERVAL=2", "FREQ=DAILY;WKST=MO;UNTIL=20090123T090000Z;INTERVAL=2", "FREQ=WEEKLY;WKST=MO;UNTIL=20090123T090000Z;BYDAY=MO,TU,WE,TH,FR", "FREQ=WEEKLY;WKST=MO;BYDAY=MO,TU,WE,TH,FR", "FREQ=WEEKLY;WKST=MO;BYDAY=MO,WE,FR", "FREQ=WEEKLY;WKST=MO;INTERVAL=2;BYDAY=MO,WE,FR", "FREQ=MONTHLY;WKST=MO;BYDAY=2FR", "FREQ=MONTHLY;WKST=MO;INTERVAL=1;BYDAY=2FR", "FREQ=MONTHLY;WKST=MO;INTERVAL=2;BYDAY=2FR", "FREQ=MONTHLY;WKST=MO;BYMONTHDAY=9", "FREQ=MONTHLY;WKST=MO;INTERVAL=2;BYMONTHDAY=9", "FREQ=YEARLY;WKST=MO", "FREQ=YEARLY;WKST=MO;INTERVAL=2"];
   var a = Util.x138x() + "/language";
   if (Util.x140x().FolderExists(a)) {
      var c = Util.x140x().GetFolder(a).Files;
      for (var d = new Enumerator(c); !d.atEnd(); d.moveNext()) {
         Log.log(">>>>>>>>>>>>>>>>> " + d.item().Name + " >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
         Log.log("");
         I18N.x304x(d.item().Name);
         for (var b in e) {
            Log.log(e[b]);
            Log.log(I18N.x306x(e[b]));
            Log.log("")
         }
      }
   }
};

flire

Posts : 2
Join date : 2012-08-17

View user profile

Back to top Go down

Re: Russian translation

Post  Admin on Fri Aug 31, 2012 6:54 pm

Thanks!

FYI: with the source modification you did, the other language files have to be also modified.

Admin
Admin

Posts : 690
Join date : 2008-10-13

View user profile http://ilab.forumotion.net

Back to top Go down

View previous topic View next topic Back to top

- Similar topics

 
Permissions in this forum:
You cannot reply to topics in this forum