''0.6.0'' (9.X.2006)\nРусифицированы автоматически создающиеся системные записи, поправлены ошибки в согласовании. Из плохого -- осталось одно "малоосмысленное" сообщение.
Новая версия русификации ReminderMacros!
[[Приветствую!]]\n[[Как русифицировать?]]\n[[Особенности русификации]]
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
[[Как русифицировать?]]\n[[О русификации|Особенности русификации]]\n[[Версии]]\n----\n[[XML|index.xml]]\n//[[Про TiddlyWiki на моем сайте.|http://glebsite.net/articles/design/pro-tiddlywiki-s-tsyganochk.html]] //\n^^(можно комментировать)^^\n
/***\n|''Name:''|ReminderPlugin|\n|''Version:''|2.3.8 (Mar 9, 2006)|\n|''Source:''|http://www.geocities.com/allredfaq/reminderMacros.html|\n|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|\n|''TiddlyWiki:''|2.0+|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n|''Hacked by:'' | //Cleb. Support for Russian dates added// |\n|''Hack version:'' | //0.8b// |\n|''Hack source:'' | http://glebsite.net/tw |\n\n!Description\nThis plugin provides macros for tagging a date with a reminder. Use the {{{reminder}}} macro to do this. The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.\n\n!Installation\n* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag. The tag is important because it tells TW that this is executable code.\n* Double click this tiddler, and copy all the text from the tiddler's body.\n* Paste the text into the body of the new tiddler in your TW.\n* Save and reload your TW.\n* You can copy some examples into your TW as well. See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]\n\n!Syntax:\n|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|\n\n!Revision history\n* v2.3.8 (Mar 9, 2006)\n**Bug fix: A global variable had snuck in, which was killing FF 1.5.0.1\n**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format\n* v2.3.6 (Mar 1, 2006)\n**Bug fix: Reminders for today weren't being matched sometimes.\n**Feature: Solidified integration with DatePlugin and CalendarPlugin\n**Feature: Recurring reminders will now return multiple hits in showReminders and the calendar.\n**Feature: Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.\n* v2.3.5 (Feb 8, 2006)\n**Bug fix: Sped up reminders lots. Added a caching mechanism for reminders that have already been matched.\n* v2.3.4 (Feb 7, 2006)\n**Bug fix: Cleaned up code to hopefully prevent the Firefox 1.5.0.1 crash that was causing lots of plugins \nto crash Firefox. Thanks to http://www.jslint.com\n* v2.3.3 (Feb 2, 2006)\n**Feature: newReminder now has drop down lists instead of text boxes.\n**Bug fix: A trailing space in a title would trigger an infinite loop.\n**Bug fix: using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"\n* v2.3.2 (Jan 21, 2006)\n**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman (http://www.elsdesign.com) for the code to do this.\n** Bug fix: offsetday was not working sometimes\n** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch. I've reverted back to searching through all tiddlers\n* v2.3.1 (Jan 7, 2006)\n**Feature: 2.0 compatibility\n**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.\n* v2.3.0 (Jan 3, 2006)\n** Bug Fix: Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.\n** Bug Fix: Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// ReminderPlugin\n//============================================================================\n//============================================================================\n\nversion.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://www.geocities.com/allredfaq/reminderMacros.html"};\n\n//============================================================================\n// Configuration\n// Modify this section to change the defaults for \n// leadtime and display strings\n//============================================================================\n\nconfig.macros.reminders = {};\nconfig.macros["reminder"] = {};\nconfig.macros["newReminder"] = {};\nconfig.macros["showReminders"] = {};\nconfig.macros["displayTiddlersWithReminders"] = {};\n\nconfig.macros.reminders["defaultLeadTime"] = [0,6000];\nconfig.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE: DATE ANNIVERSARY";\nconfig.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE: DATE ANNIVERSARY -- TIDDLER";\nconfig.macros.reminders["defaultAnniversaryMessage"] = "(DIFF-летие)";\nconfig.macros.reminders["untitledReminder"] = "Что-то";\nconfig.macros.reminders["noReminderFound"] = "В ближайшие дни (LEADTIMEUPPER) TITLE отсутствует в планах."\nconfig.macros.reminders["todayString"] = "''Сегодня''";\nconfig.macros.reminders["tomorrowString"] = "''Завтра''";\nconfig.macros.reminders["ndaysString"] = "Через DIFF дней";\nconfig.macros.reminders["emtpyShowRemindersString"] = "Ничего не запланировано!";\n\n\n//============================================================================\n// Code\n// You should not need to edit anything \n// below this. Make sure to edit this tiddler and copy \n// the code from the text box, to make sure that \n// tiddler rendering doesn't interfere with the copy \n// and paste.\n//============================================================================\n\n// This line is to preserve 1.2 compatibility\n if (!story) var story=window; \n//this object will hold the cache of reminders, so that we don't\n//recompute the same reminder over again.\nvar reminderCache = {};\n\nconfig.macros.showReminders.handler = function showReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the \n //leadtime a few lines down.\n paramHash["leadtime"] = [-10000, 10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = "";\n if (arr.length == 0)\n {\n mess += config.macros.reminders.emtpyShowRemindersString; \n }\n for (var j = 0; j < arr.length; j++)\n {\n if (paramHash["format"] != null)\n {\n arr[j]["params"]["format"] = paramHash["format"];\n }\n else\n {\n arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];\n }\n mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);\n mess += "\sn";\n }\n wikify(mess, elem, null, null);\n};\n\n\nconfig.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the leadtime \n //a few lines down.\n paramHash["leadtime"] = [-10000,10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n for (var j = 0; j < arr.length; j++)\n {\n displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);\n }\n};\n\nconfig.macros.reminder.handler = function reminder(place,macroName,params)\n{\n var dateHash = getParamsForReminder(params);\n if (dateHash["hidden"] != null)\n {\n return;\n }\n var leadTime = dateHash["leadtime"];\n if (leadTime == null)\n {\n leadTime = config.macros.reminders["defaultLeadTime"]; \n }\n var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);\n var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(place).id.substr(7);\n if (matchedDate != null)\n {\n var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);\n wikify(mess, elem, null, null);\n }\n else\n {\n createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );\n }\n};\n\nconfig.macros.newReminder.handler = function newReminder(place,macroName,params)\n{\n var today=new Date().getMidnight();\n var formstring = '<html><form>год: <select name="year"><option value="">Каждый год</option>';\n for (var i = 0; i < 5; i++)\n {\n formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';\n }\nformstring += '</select>&nbsp;&nbsp;день:<select name="day"><option value="">Каждый день</option>';\n for (i = 1; i < 32; i++)\n {\n formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';\n }\n\n\n formstring += '</select>&nbsp;&nbsp;месяца:<select name="month"><option value="">Каждый месяц</option>';\n for (i = 0; i < 12; i++)\n {\n formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';\n }\n \nformstring += '</select>&nbsp;&nbsp;<br />название:<input type="text" size="40" name="title" value="Введите название. Можно форматировать." onfocus="this.select();"><input type="button" value="Добавить" onclick="addReminderToTiddler(this.form)"></form></html>';\n\n var panel = config.macros.slider.createSlider(place,null,"Добавить новое напоминание","Откройте, чтобы добавить напоминание в эту запись");\n wikify(formstring ,panel,null,store.getTiddler(params[1]));\n};\n\n// onclick: process input and insert reminder at 'marker'\nwindow.addReminderToTiddler = function(form) {\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(form).id.substr(7);\n var tiddler=store.getTiddler(title);\n var txt='\sn<<reminder ';\n if (form.year.value != "")\n txt += 'year:'+form.year.value + ' ';\n if (form.month.value != "")\n txt += 'month:'+form.month.value + ' ';\n if (form.day.value != "")\n txt += 'day:'+form.day.value + ' ';\n txt += 'title:"'+form.title.value+'" ';\n txt +='>>';\n tiddler.set(null,tiddler.text + txt);\n window.story.refreshTiddler(title,1,true);\n store.setDirty(true);\n};\n\nfunction hasTag(tiddlerTags, tagFilters)\n{\n //Make sure we respond well to empty tiddlerTaglists or tagFilterlists\n if (tagFilters.length==0 || tiddlerTags.length==0)\n {\n return true;\n }\n\n var bHasTag = false;\n \n /*bNoPos says: "'till now there has been no check using a positive filter"\n Imagine a filterlist consisting of 1 negative filter:\n If the filter isn't matched, we want hasTag to be true.\n Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)\n \n If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false\n Thus: hasTag returns true.\n \n If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which\n means bHasTag must be true for hasTag to return true*/\n var bNoPos=true;\n \nfor (var t3 = 0; t3 < tagFilters.length; t3++)\n {\n for(var t2=0; t2<tiddlerTags.length; t2++)\n {\n if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') \n {\n if (tiddlerTags[t2] == tagFilters[t3].substring(1))\n {\n //If at any time a negative filter is matched, we return false\n return false;\n }\n }\n else \n {\n if (bNoPos)\n {\n //We encountered the first positive filter\n bNoPos=false;\n }\n if (tiddlerTags[t2] == tagFilters[t3])\n {\n //A positive filter is matched. As long as no negative filter is matched, hasTag will return true\n bHasTag=true;\n }\n }\n }\n }\n return (bNoPos || bHasTag);\n};\n\n//This function searches all tiddlers for the reminder //macro. It is intended that other plugins (like //calendar) will use this function to query for \n//upcoming reminders.\n//The arguments to this function filter out reminders //based on when they will fire.\n//\n//ARGUMENTS:\n//baseDate is the date that is used as "now". \n//leadtime is a two element int array, with leadtime[0] \n// as the lower bound and leadtime[1] as the\n// upper bound. A reasonable default is [0,14]\n//tags is a space-separated list of tags to use to filter \n// tiddlers. If a tag name begins with an !, then \n// only tiddlers which do not have that tag will \n// be considered. For example "examples holidays" \n// will search for reminders in any tiddlers that \n// are tagged with examples or holidays and \n// "!examples !holidays" will search for reminders \n// in any tiddlers that are not tagged with \n// examples or holidays. Pass in null to search \n// all tiddlers.\n//limit. If limit is null, individual reminders can \n// override the leadtime specified earlier. \n// Pass in 1 in order to override that behavior.\n\nwindow.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)\n{\n//function(searchRegExp,sortField,excludeTag)\n// var macroPattern = "<<([^>\s\s]+)(?:\s\s*)([^>]*)>>";\n var macroPattern = "<<(reminder)(.*)>>";\n var macroRegExp = new RegExp(macroPattern,"mg");\n var matches = store.search(macroRegExp,"title","");\n var arr = [];\n var tagsArray = null;\n if (tags != null)\n {\n tagsArray = tags.split(" ");\n }\n for(var t=matches.length-1; t>=0; t--)\n {\n if (tagsArray != null)\n {\n //If they specified tags to filter on, and this tiddler doesn't \n //match, skip it entirely.\n if ( ! hasTag(matches[t].tags, tagsArray))\n {\n continue;\n }\n }\n\n var targetText = matches[t].text;\n do {\n // Get the next formatting match\n var formatMatch = macroRegExp.exec(targetText);\n if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")\n {\n //Find the matching date.\n \n var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};\n var dateHash = getParamsForReminder(params);\n if (limit != null || dateHash["leadtime"] == null)\n {\n if (leadtime == null)\n dateHash["leadtime"] = leadtime;\n else\n {\n dateHash["leadtime"] = [];\n dateHash["leadtime"][0] = leadtime[0];\n dateHash["leadtime"][1] = leadtime[1];\n }\n }\n if (dateHash["leadtime"] == null)\n dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; \n var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);\n var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);\n var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n while (matchedDate != null)\n {\n var hash = {};\n hash["diff"] = matchedDate.getDifferenceInDays(baseDate);\n hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);\n hash["params"] = cloneParams(dateHash);\n hash["tiddler"] = matches[t].title;\n hash["tags"] = matches[t].tags;\n arr.pushUnique(hash);\n if (dateHash["recurdays"] != null || (dateHash["year"] == null))\n {\n leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);\n matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n }\n else matchedDate = null;\n }\n }\n }while(formatMatch);\n }\n if(arr.length > 1) //Sort the array by number of days remaining.\n {\n arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });\n }\n return arr;\n};\n\n//This function takes the reminder macro parameters and\n//generates the string that is used for display.\n//This function is not intended to be called by \n//other plugins.\n window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)\n{\n var anniversaryString = "";\n var reminderTitle = params["title"];\n if (reminderTitle == null)\n {\n reminderTitle = config.macros.reminders["untitledReminder"];\n }\n if (params["firstyear"] != null)\n {\n anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));\n }\n var mess = "";\n var diffString = "";\n if (diff == 0)\n {\n diffString = config.macros.reminders["todayString"];\n }\n else if (diff == 1)\n {\n diffString = config.macros.reminders["tomorrowString"];\n }\n else if (diff == 2)\n {\n diffString = "''Послезавтра''";\n }\n else if (diff == -1)\n {\n diffString = "//Вчера//";\n }\n else if (diff == -2)\n {\n diffString = "//Позавчера//";\n }\n else\n {\n diff-=1; //HACK(ru)\n diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);\n }\n var format = config.macros.reminders["defaultReminderMessage"];\n if (params["format"] != null)\n {\n format = params["format"];\n }\n mess = format;\n//HACK! -- Avoid replacing DD in TIDDLER with the date\n mess = mess.replace(/TIDDLER/g, "TIDELER");\n mess = matchedDate.formatStringDateOnly(mess);\n mess = mess.replace(/TIDELER/g, "TIDDLER");\n if (tiddlerTitle != null)\n {\n mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);\n mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");\n }\n \n mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD, [[DD MMM]], YYYY")).replace("ANNIVERSARY", anniversaryString);\n//RUSSIAN LANGUAGE HACK\n var daysS = diff.toString();\n var lastD = daysS.charAt(daysS.length-1);\n var lastDs = daysS.substring(daysS.length-2 );\n\n \n var rD = "дней";\n var rD1 = "1";\n var rD234 = "2-3-4";\n var rD5_9 = "5-6-7-8-9";\n\n daysS = daysS.substring(daysS.length-2);\n\nif( (lastDs.indexOf("14") == -1)&&(lastDs.indexOf("13") == -1)&&(lastDs.indexOf("12") == -1)&&(lastDs.indexOf("11") == -1) ){\n if (rD1.indexOf(lastD)!=-1){\n rD = "день"; \n }\n if (rD234.indexOf(lastD)!=-1){\n rD = "дня"; \n }\n } \n\nif(diff<0){\nmess = mess.replace(/Через -/, "" );\nmess = mess.replace(/ дней/, " дней назад" );\n}\n mess = mess.replace(/ дней/, " "+rD );\n//HACK ENDS\n return mess;\n};\n\n\n\n// Parse out the macro parameters into a hashtable. This\n// handles the arguments for reminder, showReminders and \n// displayTiddlersWithReminders.\nwindow.getParamsForReminder = function getParamsForReminder(params)\n{\n var dateHash = {};\n var type = "";\n var num = 0;\n var title = "";\n for(var t=0; t<params.length; t++)\n {\n var split = params[t].split(":");\n type = split[0].toLowerCase();\n var value = split[1];\n for (var i=2; i < split.length; i++)\n {\n value += ":" + split[i];\n }\n if (type == "nolinks" || type == "limit" || type == "hidden")\n {\n num = 1;\n }\n else if (type == "leadtime")\n {\n var leads = value.split("...");\n if (leads.length == 1)\n {\n leads[1]= leads[0];\n leads[0] = 0;\n }\n leads[0] = parseInt(leads[0], 10);\n leads[1] = parseInt(leads[1], 10);\n num = leads;\n }\n else if (type == "offsetdayofweek")\n {\n if (value.substr(0,1) == "-")\n {\n dateHash["negativeOffsetDayOfWeek"] = 1;\n value = value.substr(1);\n }\n num = parseInt(value, 10);\n }\n else if (type != "title" && type != "tag" && type != "format")\n {\n num = parseInt(value, 10);\n }\n else\n {\n title = value;\n t++;\n while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)\n {\n title += " " + params[t++];\n }\n //Trim off the leading and trailing quotes\n if (title.substr(0,1) == "\s"" && title.substr(title.length - 1,1)== "\s"")\n {\n title = title.substr(1, title.length - 2);\n t--;\n }\n num = title;\n }\n dateHash[type] = num;\n }\n //date is synonymous with day\n if (dateHash["day"] == null)\n {\n dateHash["day"] = dateHash["date"];\n }\n return dateHash;\n};\n\n//This function finds the date specified in the reminder \n//parameters. It will return null if no match can be\n//found. This function is not intended to be used by\n//other plugins.\nwindow.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)\n{\n if (baseDate == null)\n {\n baseDate = new Date().getMidnight();\n }\n var hashKey = baseDate.convertToYYYYMMDDHHMM();\n for (var k in dateHash)\n {\n hashKey += "," + k + "|" + dateHash[k];\n }\n hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();\n hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();\n if (reminderCache[hashKey] == null)\n {\n //If we don't find a match in this run, then we will\n //cache that the reminder can't be matched.\n reminderCache[hashKey] = false;\n }\n else if (reminderCache[hashKey] == false)\n {\n //We've already tried this date and failed\n return null;\n }\n else\n {\n return reminderCache[hashKey];\n }\n \n var bOffsetSpecified = dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null || \n dateHash["recurdays"] != null;\n \n // If we are matching the base date for a dayofweek offset, look for the base date a \n //little further back.\n var tmp1leadTimeLowerBound = leadTimeLowerBound; \n if ( dateHash["offsetdayofweek"] != null)\n {\n tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6); \n }\n var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);\n if (matchedDate != null)\n {\n var newMatchedDate = matchedDate;\n if (dateHash["recurdays"] != null)\n {\n while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())\n {\n newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);\n }\n }\n else if (dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null)\n {\n var tmpdateHash = cloneParams(dateHash);\n tmpdateHash["year"] = dateHash["offsetyear"];\n tmpdateHash["month"] = dateHash["offsetmonth"];\n tmpdateHash["day"] = dateHash["offsetday"];\n tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];\n var tmpleadTimeLowerBound = leadTimeLowerBound;\n var tmpleadTimeUpperBound = leadTimeUpperBound;\n if (tmpdateHash["offsetdayofweek"] != null)\n {\n if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)\n {\n tmpleadTimeLowerBound = matchedDate.addDays(-6);\n tmpleadTimeUpperBound = matchedDate;\n\n }\n else\n {\n tmpleadTimeLowerBound = matchedDate;\n tmpleadTimeUpperBound = matchedDate.addDays(6);\n }\n\n }\n newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);\n //The offset couldn't be matched. return null.\n if (newMatchedDate == null)\n {\n return null;\n }\n }\n if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n reminderCache[hashKey] = newMatchedDate;\n return newMatchedDate;\n }\n }\n return null;\n};\n\n//This does much the same job as findDateForReminder, but\n//this one doesn't deal with offsets or recurring \n//reminders.\nDate.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)\n{\n\n var bSpecifiedYear = (dateHash["year"] != null);\n var bSpecifiedMonth = (dateHash["month"] != null);\n var bSpecifiedDay = (dateHash["day"] != null);\n var bSpecifiedDayOfWeek = (dateHash["dayofweek"] != null);\n if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)\n {\n return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);\n }\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)\n {\n\n //Shortcut -- First try this year. If it's too small, try next year.\n var tmpMidnight = this.getMidnight();\n var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);\n if (tmpDate.getTime() < leadTimeLowerBound.getTime())\n {\n tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);\n }\n if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n return tmpDate;\n }\n else\n {\n return null;\n }\n }\n\n var newDate = leadTimeLowerBound; \n while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);\n if (tmp != null)\n return tmp;\n newDate = newDate.addDays(1);\n }\n};\n\nfunction testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)\n{\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedYear)\n {\n bMatchedYear = (dateHash["year"] == testMe.getFullYear());\n }\n if (bSpecifiedMonth)\n {\n bMatchedMonth = ((dateHash["month"] - 1) == testMe.getMonth() );\n }\n if (bSpecifiedDay)\n {\n bMatchedDay = (dateHash["day"] == testMe.getDate());\n }\n if (bSpecifiedDayOfWeek)\n {\n bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());\n }\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n {\n return testMe;\n }\n};\n\n//Returns true if the date is in between two given dates\nDate.prototype.isBetween = function isBetween(lowerBound, upperBound)\n{\n return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());\n}\n//Return a new date, with the time set to midnight (0000)\nDate.prototype.getMidnight = function getMidnight()\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);\n};\n// Add the specified number of days to a date.\nDate.prototype.addDays = function addDays(numberOfDays)\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);\n};\n//Return the number of days between two dates.\nDate.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)\n{\n//I have to do it this way, because this way ignores daylight savings\n var tmpDate = this.addDays(0);\n if (this.getTime() > otherDate.getTime())\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(-1);\n }\n return i;\n }\n else\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(1);\n }\n return i * -1;\n }\n return 0;\n};\nfunction cloneParams(what) {\n var tmp = {};\n for (var i in what) {\n tmp[i] = what[i];\n }\n return tmp;\n}\n// Substitute date components into a string\nDate.prototype.formatStringDateOnly = function formatStringDateOnly(template)\n{\n template = template.replace("YYYY",this.getFullYear());\n template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));\n template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);\n template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));\n template = template.replace("MM",this.getMonth()+1);\n template = template.replace("DDD",config.messages.dates.days[this.getDay()]);\n template = template.replace("0DD",String.zeroPad(this.getDate(),2));\n template = template.replace("DD",this.getDate());\n return template;\n};\n\n//}}}
/***\n|''Name:''|RuStyle|\n|''Description:''|TW russianization|\n|''Version:''|0.6.0|\n|''Date:''|2006|\n|''Source:''|http://www.glebsite.net|\n|''Author:''|Gleb|\n|''License:''|BSD open source license|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\nmerge(config.messages,{\n customConfigError: "Возникли проблемы при загрузке плагинов. См. PluginManager ",\n pluginError: "Ошибка: %0",\n pluginDisabled: "Не задействован, так как помечен 'systemConfigDisable' ",\n pluginForced: "Задействован, так как помечен 'systemConfigForce' ",\n pluginVersionError: "Не задействован из-за несоответствия версий",\n nothingSelected: "Ничего не выделено.",\n savedSnapshotError: "Похоже, эта wiki была неправильно сохранена. См. http://www.tiddlywiki.com/#DownloadSoftware ",\n subtitleUnknown: "(неизвестно)",\n undefinedTiddlerToolTip: "Записи '%0' не существует",\n shadowedTiddlerToolTip: "Запись '%0' заполнена по умолчанию.",\n tiddlerLinkTooltip: "%0 - %1, %2",\n externalLinkTooltip: "Ссылка: %0",\n noTags: "Нет помеченных записей",\n notFileUrlError: "Сохраните TiddlyWiki в файл, чтобы иметь возможность сохранять изменения ",\n cantSaveError: "Сохранение невозможно. Либо ваш браузер не подерживает эту функцию (используйте по возможности FireFox), либо путь к файлу содержит недопустимые символы",\n invalidFileError: "Файл '%0' не похож на файл TiddlyWiki",\n backupSaved: "Резервная копия сохранена",\n backupFailed: "Не получилось сохранить резервную копию",\n rssSaved: "RSS сохранен",\n rssFailed: "Не получилось сохранить RSS",\n emptySaved: "Пустой шаблон сохранен",\n emptyFailed: "Не получилось сохранить пустой шаблон",\n mainSaved: "Файл TiddlyWiki сохранен",\n mainFailed: "Не получилось сохранить файл TiddlyWiki. Изменения не сохранены",\n macroError: "Ошибка в сценарии <<%0>>",\n macroErrorDetails: "Ошибка при выполнении сценария <<%0>>:\sn%1",\n missingMacro: "Нет такого сценария",\n overwriteWarning: "Запись '%0' уже есть. Нажмите OK, чтобы перезаписать",\n unsavedChangesWarning: "ВНИМАНИЕ! Есть несохраненные изменения! \sn\snНажмите OK, чтобы сохранить\snНажмите CANCEL чтобы не сохранять",\n confirmExit: "--------------------------------\sn\snИзменения в TiddlyWiki не сохранены. Если вы продолжите, они потеряются.\sn\sn--------------------------------",\n saveInstructions: "SaveChanges",\n unsupportedTWFormat: "Неподдерживаемый TiddlyWiki формат '%0'",\n tiddlerSaveError: "Ошибка при сохранении записи '%0'",\n tiddlerLoadError: "Ошибка при открытии записи '%0'",\n wrongSaveFormat: "Не получается сохранить в формате '%0'. Сохранено в стандартном формате.",\n invalidFieldName: "Недопустимое имя поля %0",\n fieldCannotBeChanged: "Поле '%0' нельзя изменять"});\n\nmerge(config.messages.messageClose,{\n text: "×",\n tooltip: "скрыть сообщение"});\n\nconfig.messages.dates.months = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября","декабря"];\nconfig.messages.dates.days = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];\nconfig.messages.dates.shortMonths = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"];\nconfig.messages.dates.shortDays = ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"];\n\nmerge(config.views.wikified.tag,{\n labelNoTags: "меток нет",\n labelTags: "метки: ",\n openTag: "Открыть метку '%0'",\n tooltip: "Показать записи, помеченные как '%0'",\n openAllText: "Открыть все",\n openAllTooltip: "Открыть все эти записи",\n popupNone: "Нет других записей с меткой '%0'"});\n\nmerge(config.views.wikified,{\n defaultText: "Записи '%0' не существует. Создайте ее двойным щелчком.",\n defaultModifier: "(?)",\n shadowModifier: "(системная запись)",\n createdPrompt: "создана: "});\n\nmerge(config.views.editor,{\n tagPrompt: "Введите метки, разделенные пробелами, [[используйте квадратные скобки]] если нужно, или выберите метки из списка.",\n defaultText: "Здесь мог бы быть осмысленный текст на тему '%0'"});\n\nmerge(config.views.editor.tagChooser,{\n text: "метки",\n tooltip: "Выберите метки из списка",\n popupNone: "Меток пока нет",\n tagTooltip: "Добавить метку '%0'"});\n\nmerge(config.macros.search,{\n label: "поиск",\n prompt: "Поиск по всем записям",\n accessKey: "F",\n successMsg: "%0 записей, соответствующих критерию: %1",\n failureMsg: "Не найдено записей по запросу: %0"});\n\nmerge(config.macros.tagging,{\n label: "отмечены: ",\n labelNotTag: "нету",\n tooltip: "Список записей, помеченных: '%0'"});\n\nmerge(config.macros.timeline,{\n dateFormat: "DD.mmm.YYYY"});\n\nmerge(config.macros.allTags,{\n tooltip: "Показать записи, помеченные '%0'",\n noTags: "Нет таких записей"});\n\nconfig.macros.list.all.prompt = "Все записи по алфавиту";\nconfig.macros.list.missing.prompt = "Ненаписанные";\nconfig.macros.list.orphans.prompt = "Записи, на которые нет ссылок";\nconfig.macros.list.shadowed.prompt = "Системные записи";\n\nmerge(config.macros.closeAll,{\n label: "закрыть все",\n prompt: "Закрыть все записи \s(кроме редактируемых\s)"});\n\nmerge(config.macros.permaview,{\n label: "ссылка",\n prompt: "Постоянная ссылка"});\n\nmerge(config.macros.saveChanges,{\n label: "сохранить изменения",\n prompt: "Сохранить всё",\n accessKey: "S"});\n\nmerge(config.macros.newTiddler,{\n label: "новая запись",\n prompt: "Создать новую запись",\n title: "Новая запись",\n accessKey: "N"});\n\nmerge(config.macros.newJournal,{\n label: "новая датированная запись",\n prompt: "Создать запись, с названием, соответствующим текущей дате",\n accessKey: "J"});\n\nmerge(config.macros.plugins,{\n skippedText: "(Этот плагин не запущен, так как был добавлен после запуска)",\n noPluginText: "Плагинов нет",\n confirmDeleteText: "Вы действительно хотите удалить записи:\sn\sn%0",\n listViewTemplate : {\n columns: [\n {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},\n {name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'},\n {name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},\n {name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},\n {name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},\n {name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},\n {name: 'Log', field: 'log', title: "Log", type: 'StringList'}\n ],\n rowClasses: [\n {className: 'error', field: 'error'},\n {className: 'warning', field: 'warning'}\n ],\n actions: [\n {caption: "Действия...", name: ''},\n {caption: "Сделать не системной записью", name: 'remove'},\n {caption: "Удалить из wiki", name: 'delete'}\n ]}\n });\n\nmerge(config.macros.refreshDisplay,{\n label: "обновить",\n prompt: "Обновить отображение"\n });\n\nmerge(config.macros.importTiddlers,{\n defaultPath: "http://www.tiddlywiki.com/index.html",\n fetchLabel: "загрузить",\n fetchPrompt: "Загрузить файл TiddlyWiki",\n fetchError: "Ошибка при загрузке файла",\n confirmOverwriteText: "Вы уверены, что хотите перезаписать следующие записи:\sn\sn%0",\n wizardTitle: "Импорт записей из файла TiddlyWiki",\n step1: "Шаг 1: Введите путь к файлу",\n step1prompt: "Введите URL или путь к локальному файлу: ",\n step1promptFile: "...или выберите тут: ",\n step1promptFeeds: "...или из предустановленных: ",\n step1feedPrompt: "Выберите...",\n step2: "Шаг 2: Загрузка файла",\n step2Text: "Дождитесь окончания загрузки: %0",\n step3: "Шаг 3: Выберите записи для импорта:",\n step4: "%0 записей импортировано",\n step5: "Готово!",\n listViewTemplate: {\n columns: [\n {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},\n {name: 'Title', field: 'title', title: "Title", type: 'String'},\n {name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},\n {name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}\n ],\n rowClasses: [\n ],\n actions: [\n {caption: "Действия...", name: ''},\n {caption: "Импортировать", name: 'import'}\n ]}\n });\n\nmerge(config.commands.closeTiddler,{\n text: "закрыть",\n tooltip: "Закрыть запись"});\n\nmerge(config.commands.closeOthers,{\n text: "закрыть остальные",\n tooltip: "Закрыть все записи, кроме этой"});\n\nmerge(config.commands.editTiddler,{\n text: "редактировать",\n tooltip: "Редактировать запись",\n readOnlyText: "исходный код",\n readOnlyTooltip: "Просмотреть исходный код записи"});\n\nmerge(config.commands.saveTiddler,{\n text: "готово",\n tooltip: "Сохранить изменения"});\n\nmerge(config.commands.cancelTiddler,{\n text: "отменить",\n tooltip: "Отменить изменения",\n warning: "Вы уверены, что не хотите сохранить запись '%0'?",\n readOnlyText: "обычный вид",\n readOnlyTooltip: "Вернуться к обычному просмотру"});\n\nmerge(config.commands.deleteTiddler,{\n text: "удалить",\n tooltip: "Удалить запись",\n warning: "Вы действительно хотите удалить '%0'?"});\n\nmerge(config.commands.permalink,{\n text: "ссылка",\n tooltip: "Постоянная ссылка на эту запись"});\n\nmerge(config.commands.references,{\n text: "ссылки сюда",\n tooltip: "Показать записи, ссылающиеся на эту",\n popupNone: "Ссылок нет"});\n\nmerge(config.commands.jump,{\n text: "перейти...",\n tooltip: "Перейти на другие открытые записи"});\n\nmerge(config.shadowTiddlers,{\n DefaultTiddlers: "GettingStarted",\n MainMenu: "GettingStarted",\n SiteTitle: "~TiddlyWiki(ru)",\n SiteSubtitle: "нелинейный гипертекстовый органайзер",\n SiteUrl: "http://www.tiddlywiki.com/",\n GettingStarted: "Для того, чтобы начать работать с TiddlyWiki, вы можете поменять следующие записи:\sn* SiteTitle & SiteSubtitle: Заголовок и подзаголовок сайта (после сохранения вы увидите их в заголовке окна)\sn* MainMenu: Меню (оно обычно слева)\sn* DefaultTiddlers: Список записей, которые будут открыты при запуске wiki.\snИмя, которым будут подписаны ваши записи, можете ввести тут: <<option txtUserName>>",\n SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY г.'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'установки »' 'Различные опции TidlyWiki'>>",\n OptionsPanel: "Эти установки сохраняются в&nbsp\s;Вашем браузере\sn\snВаше имя для подписывания заметок. Лучше, если вы напишете его WotTak\sn\sn<<option txtUserName>>\sn<<option chkSaveBackups>> Сохранять резервные копии\sn<<option chkAutoSave>> Автосохранение\sn<<option chkRegExpSearch>> Поиск с&nbsp\s;регулярными выражениями\sn<<option chkCaseSensitiveSearch>> Поиск чувствителен к&nbsp\s;регистру?\sn<<option chkAnimate>> Анимация\sn\sn----\sn[[Дополнительно|AdvancedOptions]]\sn[[Плагины|PluginManager]]\sn[[Импорт записей|ImportTiddlers]]",\n AdvancedOptions: "<<option chkGenerateAnRssFeed>> Публиковать RSS\sn<<option chkOpenInNewWindow>> Ссылки в новом окне\sn<<option chkSaveEmptyTemplate>> Сохранять пустой шаблон\sn<<option chkToggleLinks>> Щелчок по ссылке на открытую заметку закрывает ее\sn^^(с Ctrl или другой функциональной клавишей не&nbsp\s;будет срабатывать)^^\sn<<option chkHttpReadOnly>> Не показывать инструменты редактирования через HTTP\sn<<option chkForceMinorUpdate>> Не менять дату заметки при редактировании\sn^^(для изменеия - жмите Shift при сохранеии, либо сохраняйте, нажимая Ctrl-Shift-Enter^^\sn<<option chkConfirmDelete>> Подтверждать удаление\snМаксимум строк в&nbsp\s;поле редактирования: <<option txtMaxEditRows>>\snСохранять бэкапы в&nbsp\s;папке: <<option txtBackupFolder>>\sn<<option chkInsertTabs>> При нажатии Tab вводить знак табуляции, а&nbsp\s;не&nbsp\s;переходить к&nbsp\s;следующему элементу формы",\n SideBarTabs: "<<tabs txtMainTab История История TabTimeline Все 'Все заметки' TabAll Метки 'Все метки' TabTags Ещё... 'Остальные списки' TabMore>>",\n TabTimeline: "<<timeline>>",\n TabAll: "<<list all>>",\n TabTags: "<<allTags>>",\n TabMore: "<<tabs txtMoreTab Нужные 'Ненаписанные заметки' TabMoreMissing Забытые 'Забытые заметки' TabMoreOrphans Системные 'Системные записи' TabMoreShadowed>>",\n TabMoreMissing: "<<list missing>>",\n TabMoreOrphans: "<<list orphans>>",\n TabMoreShadowed: "<<list shadowed>>",\n PluginManager: "<<plugins>>",\n ImportTiddlers: "<<importTiddlers>>"});\n\n\n\n//}}}
(предполагаю, что ~TiddlyWiki вы уже скачали, и прочли про [[основной способ|Как русифицировать?]])\n# Откройте здесь запись RuStyle\n# Наведите на нее курсор мыши, в появившемся меню выберите "редактировать"\n# Когда запись откроется для редактирования, выделите все ее содержимое (Ctrl + A)\n# Скопируйте в буфер обмена (Ctrl + C)\n# Создайте новую запись (new Tiddler) в //своей инсталляции ~TiddlyWiki//\n# Перейдите в режим редактирования, и вставьте в нее ранее скопированное.\n# Назовите запись RuStyle, добавьте метку (tag) systemConfig\n# Сохраните запись, сохраните изменения, перезагрузите ~TiddlyWiki
<<tagging Версии>>\n----\n^^[[открыть отдельно|Версии русификатора]]^^
Самый простой и правильный путь:\n\n''Установить ~TiddlyWiki''\n# Cкачать файл ~TiddlyWiki с [[официального сайта|http://www.tiddlywiki.com/ ]] (обратите внимание -- чтобы все работало, нужно скачивать файл, щелкнув правой клавишей мыши по ссылка (на Маке -- Ctrl+мышь) и выбрать из появившегося меню "save target as"\n# Открыть файл в совместимом браузере (Explorer я не пробовал, и вам не советую. Firefox, Opera, Safari (последние выпуски), Camino)\n# Убедится, что все работает, изменения сохраняются и пр.\n''Собственно, русифицировать''\n# Нажать ссылку "options" в правом меню.\n# В выехавшей панели нажать ~ImportTiddlers\n# В панели импорта ввести в верхнее поле адрес этой странички в интернете (см. в адресной строке браузера)\n# Нажать ''fetch''\n# Через какое-то время вы увидите список всех записей моей инсталляции. Выбитайте из списка RuStyle, поставив напротив нее галку, жмите кнопку, дождитесь сообщения об удачной загрузке.\n# Сохраните изменения и перезагрузите wiki (Shift+reload)\n# Интерфейс русифицировался!\n# Теперь можно импортировать записи из вашего старого файла, если он у вас был.
Если вы нашли ошибку, готовы предложить улучшение -- с точки зрения языка или программирования, связывайтесь со мной.\n* http://www.glebsite.net/about/ (вся контактная информация)\n----\n^^[[открыть отдельно|Как связаться?]]^^
Прошу не обвинять в поклонении перед Западом, я просто оставил прилагавшийся к плагину файл, это все же просто демо. Ну, перевел кое-что.\n!!!!Обычные напоминания, день месяца каждый год.\n*<<reminder month:1 day:1 title:"Новый Год, один из моих любимых дней" >>\n*<<reminder month:2 day:2 title:"День Сурка ;)" >>\n\n!!!!Напоминания со смещением (...день недели месяца)\n*Третий понедельник февраля\n**<<reminder month:2 day:15 offsetdayofweek:1 title:"Американский День Президента">>\n*Второе воскресенье мая\n**<<reminder month:5 day:8 offsetdayofweek:0 title:"Американский День Матери">>\n*Последний понедельник мая (обратите внимание -- offsetdayofweek отрицательное число, что означает обратный отсчет)\n**<<reminder month:5 day:31 offsetdayofweek:-1 title:"Memorial Day">>\n\n!!!И просто так\n*<<reminder month:4 day:1 title:"День Юмора" >>\n*<<reminder month:10 day:31 title:"Хэллоуин" >>\n*<<reminder month:12 day:25 title:"Католическое рождество" >>
''Who is mister Tiddler ?''\nЭлементарная единица информации в оригинале называется tiddler. Это разговорное выражение, обозначающее нечто маленькое: рыбешку, ребенка и т. д. В сочетании со словом Tiddly ("модный" и "пьяный") получается красивая, но непереводимая игра слов, к тому же осмысленная: tiddler действительно, маленький, сама вики - модная, а способ навигации иначе как "пьяным" не назвать.\nТак как переименовывать продукт в мои планы не входило, а аналогичной русской игры слов не придумалось, я решил не морочить голову пользователю, и перевел это слово как "запись". Слова "записка", "заметка", сужали реальные возможности tiddler'ов, "листок" не вызывало прямых ассоциаций.\n\n''Нет такого слова в русском алфавите''\nВ русском языке нет слова "тег" (и "тэг" тоже). Зато есть слово "метка", понятное не только жителям ЖЖ. Оно и используется во всем переводе. При помощи ''меток'' записи можно ''пометить''.\n\n''Плагин??''\nА вот такого слова в русском языке тоже нет, но в нынешней версии я его оставил, думаю заменить на "модуль", хотя это не вполне по смыслу. Предложения приветствуются.\n\n''Новый дневник''\nСсылка "new journal" при дословном переводе становится еще непонятней, чем в оригинале. Я перевел "датированная запись". Строго говоря, "датированы" все записи в вики, но эта -- особенно! :) Еще хороший вариант -- "новая дневниковая запись", но уж о-очень канцелярско.\n\n''Календарь''\nДаты переведены так, чтобы можно было выводить их по-русски, то есть, не "Октябрь, 12", а "12 октября". Краткие названия месяцев ("Янв", "Фев" и так далее), я изжил как факт, как только представил себе "Июн" с "Июлом", или "Ин" с "Илом". В качестве кратких названий взял римские цифры, что соответствует языковой традиции.\nТаким образом, RuStyle предполагает два основных формата полной даты:\n* DD MMM YYYY (либо YY) \n* DD.mmm.YYYY
!!Переведено\nВсе сообщения плагина. Перевод рассчитан на работу с русификатором RuStyle, так как учитывает падежи месяцев. \n!!Добавлено\nДобавлено слово "Послезавтра", так как "Через 1 день" это из серии "С вами говорит робот". В оригинале такой сущности не было из-за специфики английского языка. Слова "Сегодня", "Завтра" и "Послезавтра" выделяются полужирным шрифтом, чтобы привлекать внимание в списке. Слово "день" изменяется по правилам русского языка ("1 день", "2 дня" и так далее). Даты автоматически превращаются в ссылки, чтобы прямо из просмотра напоминаний можно было создать запись, посвященному этому дню.\n\n!!Изменено\nФорма ввода нового напоминания (которая вызывается макросом <<newReminder>>), чтобы поле "день" было //перед// полем "месяц".\n!!Недоделано\n==Математика пока немного странная, это вопрос к автору а не ко мне (сами увидите),== (поправил.) дни недели пишутся с большой буквы (это, я думаю, надо в русификаторе исправить, т. к. в русском они так не пишутся), код грязный(а вы не смотрите), длительного тестирования не было, так что возможны "артефакты" (сообщайте). Не переведен help, но тут уж я прошу помощи зала. Кто готов помочь стране -- напиши e-mail мне ;) \n!!Просто плохо\nЭто -- хак, со всеми вытекающими, но другого способа даже автор плагина не предусматривал.\n
Демонстрация русифицированного плагина [[ReminderMacros|ReminderMacros(ru)]] \n''Весия от 17 ноября, с правильным (!) выводом прошедших дат. Обновите свою инсталляцию!''\n\n<<showReminders leadtime:-150...150 >>\n<<tabs welCome\n"<<<" "Самое главное" "Самое главное"\n"Версии русификатора" "Версии русификатора" "Версии русификатора"\n"Про эту инсталляцию" "Про эту инсталляцию" "Про эту инсталляцию"\n"Связь" "Как связаться?" "Как связаться?"\n>>
* ~TiddlyWiki 2.1.2\n* плагин RuStyle \n* русифицированный плагин [[ReminderMacros|ReminderMacros(ru)]]\nШаблоны, стили, цвета, макросы и пр. -- стандартные.\n----\n^^[[открыть отдельно|Про эту инсталляцию]]^^\n
!!Что это?\nНа этой страничке вы найдете достаточно хороший русификатор для новых версий ~TiddlyWiki (эта страничка тоже ~TiddlyWiki, если кто не понял), и русифицированный плагин [[ReminderMacros(ru)]]. Помощь не переведена, английский оригинал см. тут: http://www.geocities.com/allredfaq/reminderMacros.html. Как всегда, вы можете прочитать, что и как русифицировано/хакнуто, см. [[Особенности русификации ReminderMacros]], и посмотрите [[примеры использования|Напоминания (примеры)]].\n!!Самое главное:\n* [[Как русифицировать?]]\n* [[Альтернативный способ русификации]]\n* [[Особенности русификации]]\n* [[Что еще поставить]], чтобы было удобнее работатьс русифицированной ~TiddlyWiki\n\nПризываю всех, кто знает ~JavaScript лучше меня и любит ~TiddlyWiki, сделать также плагин для расстановки правильных кавычек и прочей типографики!\n----\n^^[[открыть отдельно|Самое главное]]^^
Основное неудобство при работе с руским языком -- разметка. Для того, чтобы не мучится, постоянно переключая раскладку, постаьте ~WikiBar. Скачать/симпортировать отсюда: http://aiddlywiki.sourceforge.net/\n\nПосле инсталляции при редактировании записи в правом верхнем углу (там, где ссылки: "готово", "отменить", "удалить"), появится кнопочка "wikibar", при нажатии на которую над областью редактирования будет размещена небольшая панелька с инструментами, позволяющими вводить основные команды форматирования мышью.\n----\nТакже очень рекомендую поставить [[ReminderMacros(ru)]], он добавляет возможность записи важных дат с напоминаниями. См. [[Напоминания (примеры)]]