<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected {color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
/***
|''Name:''|CatalanLingo|
|''Description:''|Central Catalan translation for TiddlyWiki |
|''Author:''|Paco Rivière (http://pacoriviere.cat)|
|''Source:''|http://twcaclassic.tiddlyspot.com/ |
|''CodeRepository:''|https://github.com/TiddlyWiki/translations/tree/master/locales/core/ca |
|''Version:''|0.4.3|
|''Date:''|May 17, 2020|
|''Comments:''|Agrairem els vostres comentaris a http://twca.tiddlyspot.com/#Contacte |
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]] |
|''~CoreVersion:''|2.6.0|
***/

//{{{
//--
//-- Translateable strings
//--

// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone

config.locale = "ca"; // W3C language tag

if (config.options.txtUserName == 'YourName') // do not translate this line, but do translate the next line
	merge(config.options,{txtUserName: "ElVostreNom"});

merge(config.tasks,{
	save: {text: "desa", tooltip: "Desa tots els canvis en aquest arxiu", action: saveChanges},
	sync: {text: "sincronitza", tooltip: "Sincronitza els canvis amb d'altres fitxers i servidors TiddlyWiki", content: '<<sync>>'},
	importTask: {text: "importa", tooltip: "Importa tiddlers i connector d'altres fitxers TiddlyWiki i servidors", content: '<<importTiddlers>>'},
	tweak: {text: "opcions", tooltip: "Tria el comportament de TiddlyWiki", content: '<<options>>'},
	upgrade: {text: "actualitza", tooltip: "Actualitza el codi del nucli de TiddlyWiki", content: '<<upgrade>>'},
	plugins: {text: "connectors", tooltip: "Gestiona els connectors", content: '<<plugins>>'}
});

// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
	txtUserName: "Nom utilitzat per signar els canvis",
	chkRegExpSearch: "Cerca expressions regulars",
	chkCaseSensitiveSearch: "Distingeix les majúscules en cercar",
	chkIncrementalSearch: "Cerca incremental tecla a tecla",
	chkAnimate: "Fes servir animacions",
	chkSaveBackups: "Desa una còpia de seguretat abans de desar els canvis",
	chkAutoSave: "Registra els canvis de forma automàtica",
	chkGenerateAnRssFeed: "Genera un fil RSS en desar els canvis",
	chkSaveEmptyTemplate: "Genera un fitxer 'empty.html'en desar els canvis",
	chkOpenInNewWindow: "Obre els enllaços externs en una altre finestra",
	chkToggleLinks: "Tanca els elements oberts en clicar sobre els seus enllaços",
	chkHttpReadOnly: "Amaga els botons d'edició quan s'accedeix per HTTP",
	chkForceMinorUpdate: "Tracta les edicions com a Canvis Menors conservant la data i hora",
	chkConfirmDelete: "Demana confirmació abans de suprimir un element",
	chkInsertTabs: "Inserta un tabulador amb la tecla tab en lloc de slatar el camp",
	txtBackupFolder: "Nom de la carpeta per als arxius de còpia",
	txtMaxEditRows: "Màxim nombre de línies de la capsa d'edició del tiddler",
	txtTheme: "Nom del tema",
	txtFileSystemCharSet: "Codificació de caractèrs per desar els canvis (només per Firefox/Mozilla)"});

merge(config.messages,{
	customConfigError: "S'han trobat problemes en carregar els connectors. Consulteu el PluginManager per a més detalls",
	pluginError: "Error: %0",
	pluginDisabled: "Not executed because disabled via 'systemConfigDisable' tag",
	pluginForced: "Executed because forced via 'systemConfigForce' tag",
	pluginVersionError: "Not executed because this plugin needs a newer version of TiddlyWiki",
	nothingSelected: "Nothing is selected. You must select one or more items first",
	savedSnapshotError: "It appears that this TiddlyWiki has been incorrectly saved. Please see http://www.tiddlywiki.com/#Download for details",
	subtitleUnknown: "(unknown)",
	undefinedTiddlerToolTip: "The tiddler '%0' doesn't yet exist",
	shadowedTiddlerToolTip: "The tiddler '%0' doesn't yet exist, but has a pre-defined shadow value",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "Enllaç extern cap a %0",
	noTags: "No hi ha tiddlers amb etiquetes",
	notFileUrlError: "Cal desar aquest TiddlyWiki a un arxiu abans de poder desar els canvis",
	cantSaveError: "No es poden desar els canvis. Pot ser que el vostre navegador no permeti desar (Proveu de fer servir Firefox, en lloc), o degut a que el nom de la ruta de l'arxiu TiddlyWiki té algun caràcter incorrecte",
	invalidFileError: "Sembla que l'arxiu original '%0' no és un TiddlyWiki vàlid",
	backupSaved: "S'ha desat la còpia de seguretat",
	backupFailed: "No ha estat possible desar l'arxiu de la còpia de seguretat",
	rssSaved: "S'ha desat el fil RSS",
	rssFailed: "No ha estat possible desar el fil RSS",
	emptySaved: "S'ha desat la plantilla buida",
	emptyFailed: "No ha estat possible desar la plantilla buida",
	mainSaved: "S'ha desat l'arxiu principal de TiddlyWiki",
	mainFailed: "No ha estat possible desar l'arxiu principal de TiddlyWiki. Els vostres canvis no s'han desat",
	macroError: "Hi ha un error a la macro <<%0>>",
	macroErrorDetails: "Hi ha hagut un error a l'executar la macro <<%0>>:\n%1",
	missingMacro: "No es troba la macro",
	overwriteWarning: "Ja hi ha un tiddler amb el nom '%0'. Trieu DAcord si el voleu sobreescriure",
	unsavedChangesWarning: "ATENCIÓ! Hi ha canvis que no s'han desat al TiddlyWiki\n\nTrieu DAcord per desar\nTrieu ANUL·LA per descartar-los",
	confirmExit: "--------------------------------\n\nHi ha canvis que no s'han desat al TiddlyWiki. Si continueu perdreu aquests canvis\n\n--------------------------------",
	saveInstructions: "DesaElsCanvis",
	unsupportedTWFormat: "El format del TiddlyWiki no es permés '%0'",
	tiddlerSaveError: "Hi ha hagut un error en desar el tiddler '%0'",
	tiddlerLoadError: "Hi ha hagut un error en desar el tiddler '%0'",
	wrongSaveFormat: "No es pot desar en el format de magatzament '%0'. Feu servir el format standard per a desar.",
	invalidFieldName: "El nom del camp no és vàlid vàlid %0",
	fieldCannotBeChanged: "No es pot modificar el camp '%0'",
	loadingMissingTiddler: "Intentant recuperar el '%0' del servidor '%1' a:\n\n'%2' a l'espai de treball '%3'",
	upgradeDone: "S'ha completat l'actualització a la versió %0\n\nCliqueu 'D'acord' per tornar a carregar el nou TiddlyWiki actualitzat",
	invalidCookie: "La galeta '%0' no és vàlida"});

merge(config.messages.messageClose,{
	text: "tanca",
	tooltip: "tanca aquest tiddler"});

config.messages.backstage = {
	open: {text: "bastidors", tooltip: "Obre els bastidors per les tasques d'autor i editor"},
	close: {text: "tanca", tooltip: "Tanca els bastidors"},
	prompt: "bastidors: ",
	decal: {
		edit: {text: "edita", tooltip: "Edita el tiddler '%0'"}
	}
};

config.messages.listView = {
	tiddlerTooltip: "Cliqueu per previsualitzar el tiddler",
	previewUnavailable: "(no es pot previsualitzar)"
};

config.messages.dates.months = ["de gener de", "de febrer de", "de març de", "d'abril de", "de maig de", "de juny de", "de juliol de", "d'agost de", "de setembre de", "d'octubre de", "de novembre de","de desembre de"];
config.messages.dates.days = ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"];
config.messages.dates.shortMonths = ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"];
config.messages.dates.shortDays = ["Diu", "Dil", "Dma", "Dcr", "Dij", "Div", "Dis"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["r","n","r","t","é","é","é","é","é","é",
		"é","é","é","é","é","é","é","é","é","é",
		"é","","é","é","é","é","é","é","é","é",
		"é"];
config.messages.dates.am = "del matí";
config.messages.dates.pm = "de la tarda";

merge(config.messages.tiddlerPopup,{
	});

merge(config.views.wikified.tag,{
	labelNoTags: "sense etiquetes",
	labelTags: "etiquetes: ",
	openTag: "Obre l'etiqueta '%0'",
	tooltip: "Obre els tiddlers etiquetats amb '%0'",
	openAllText: "obre tots",
	openAllTooltip: "Obre tots aquests tiddlers",
	popupNone: "No hi ha altres tiddlers etiquetats amb '%0'"});

merge(config.views.wikified,{
	defaultText: "El tiddler '%0' no existeix. Cliqueu dos cops per començar-lo",
	defaultModifier: "(falta)",
	shadowModifier: "(tiddler ombra pre-definit)",
	dateFormat: "DD MMM YYYY", // use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D
	createdPrompt: "creat el"});

merge(config.views.editor,{
	tagPrompt: "Afegiu les etiquetes separades per espais, [[feu servir dobles corxets]] si cal, o afegiu-ne",
	defaultText: "Entreu el text per a '%0'.'"});

merge(config.views.editor.tagChooser,{
	text: "etiquetes",
	tooltip: "Trieu entre les etiquetes actuals per afegir a aquest tiddler",
	popupNone: "No hi ha etiquetes definides",
	tagTooltip: "Afegeix l'etiqueta '%0'"});

merge(config.messages,{
	sizeTemplates:
		[
		{unit: 1024*1024*1024, template: "%0\u00a0GB"},
		{unit: 1024*1024, template: "%0\u00a0MB"},
		{unit: 1024, template: "%0\u00a0KB"},
		{unit: 1, template: "%0\u00a0B"}
		]});

merge(config.macros.search,{
	label: "cerca",
	prompt: "Cerca en aquest TiddlyWiki",
	accessKey: "F",
	successMsg: "S'han trobat %0 tiddlers que contenen: '%1'",
	failureMsg: "No s'ha trobat cap tiddler coincident amb: '%0'"});

merge(config.macros.tagging,{
	label: "etiquetes:",
	labelNotTag: "cap etiqueta",
	tooltip: "Llista de tiddlers etiquetats amb '%0'"});

merge(config.macros.timeline,{
	dateFormat: "DD MMM YYYY"});// use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D

merge(config.macros.allTags,{
	tooltip: "Mostra tiddlers amb l'etiqueta '%0'",
	noTags: "No hi ha tiddlers amb etiquetes"});

config.macros.list.all.prompt = "Tots els tiddlers per ordre alfabètic";
config.macros.list.missing.prompt = "Tiddlers que tenen enllaços cap a ells, però no estàn definits";
config.macros.list.orphans.prompt = "Tiddlers sense enllaços des de cap altre";
config.macros.list.shadowed.prompt = "Tiddlers amb ombres amb contingut per omisió";
config.macros.list.touched.prompt = "Tiddlers que heu modificat localment";

merge(config.macros.closeAll,{
	label: "tanca'ls tots",
	prompt: "Tanca tots els tiddlers oberts (excepte els que s'estàn editant)"});

merge(config.macros.permaview,{
	label: "vista permanent",
	prompt: "Enllaça a una URL que torni tots els tiddlers que es mostren ara"});

merge(config.macros.saveChanges,{
	label: "desa els canvis",
	prompt: "Desa tots els canvis a un arxiu",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "nou tiddler",
	prompt: "Obre un nou tiddler",
	title: "Nou tiddler",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "nou diari",
	prompt: "Obre un nou tiddler amb la data i hora actuals",
	accessKey: "J"});

merge(config.macros.options,{
	wizardTitle: "Opcions avançades",
	step1Title: "Aquestes opcions es desen a les galetes del vostre navegador",
	step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Mostra les opcions desconegudes</input>",
	unknownDescription: "//(desconegut)//",
	listViewTemplate: {
		columns: [
			{name: 'Option', field: 'option', title: "Opció", type: 'String'},
			{name: 'Description', field: 'description', title: "Descripció", type: 'WikiText'},
			{name: 'Name', field: 'name', title: "Nom", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'}
			]}
	});

merge(config.macros.plugins,{
	wizardTitle: "Gestor de connectors",
	step1Title: "Connectors carregats",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	skippedText: "(Aquest connector encara no s'ha carrega perquè s'ha afegit desprès de l'inicit)",
	noPluginText: "No hi ha cap connector instal·lat",
	confirmDeleteText: "Segur que voleu que suprimir els connectors:\n\n%0",
	removeLabel: "suprimeix l'etiqueta systemConfig",
	removePrompt: "Suprimeix l'etiqueta systemConfig",
	deleteLabel: "suprimeix",
	deletePrompt: "Suprimeix definitivament aquests tiddlers",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Description', field: 'Description', title: "Descripció", type: 'String'},
			{name: 'Version', field: 'Version', title: "Versió", type: 'String'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Mida", type: 'Size'},
			{name: 'Forced', field: 'forced', title: "Forçat", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Desactivat", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Carregat", type: 'Boolean', trueText: "Sí", falseText: "No"},
			{name: 'Startup Time', field: 'startupTime', title: "Temps de càrrega", type: 'String'},
			{name: 'Error', field: 'error', title: "Estat", type: 'Boolean', trueText: "Error", falseText: "D'acord"},
			{name: 'Log', field: 'log', title: "Registre", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'avís'}
			]},
	listViewTemplateReadOnly: {
		columns: [
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Description', field: 'Description', title: "Descripció", type: 'String'},
			{name: 'Version', field: 'Version', title: "Versió", type: 'String'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Mida", type: 'Size'},
			{name: 'Executed', field: 'executed', title: "Carregat", type: 'Boolean', trueText: "Sí", falseText: "No"},
			{name: 'Startup Time', field: 'startupTime', title: "Temps de càrrega", type: 'String'},
			{name: 'Error', field: 'error', title: "Estat", type: 'Boolean', trueText: "Error", falseText: "D'acord"},
			{name: 'Log', field: 'log', title: "Registre", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'avís'}
			]}
	});

merge(config.macros.toolbar,{
	moreLabel: "més",
	morePrompt: "Mostra més ordres",
	lessLabel: "menys",
	lessPrompt: "Mostra menys ordres",
	separator: "|"
	});

merge(config.macros.refreshDisplay,{
	label: "actualitza",
	prompt: "Torna a carregar tot el TiddlyWiki"
	});

merge(config.macros.importTiddlers,{
	readOnlyWarning: "No podeu importar a un fitxer TiddlyWiki només de lectura. Mireu d'obrir-lo des d'un fitxer, file:// URL",
	wizardTitle: "Importa tiddlers d'un altre fitxer o servidor",
	step1Title: "Pas 1: Indiqueu el fitxer TiddlyWiki o servidor",
	step1Html: "Indiqueu el tipus de servidor: <select name='selTypes'><option value=''>Trieu...</option></select><br>Entreu la URL o la ruta aquí: <input type='text' size=50 name='txtPath'><br>...o navega: <input type='file' size=50 name='txtBrowse'><br><hr>...o trieu un canal predefinit: <select name='selFeeds'><option value=''>Trieu...</option></select>",
	openLabel: "obre",
	openPrompt: "Obre la connexió amb aquest fitxer o servidor",
	statusOpenHost: "Obrint el servidor",
	statusGetWorkspaceList: "Obtenint la llista d'espais de treball disponibles",
	step2Title: "Pas 2: Trieu un espai de treball",
	step2Html: "Entreu el nom de l'espai de treball: <input type='text' size=50 name='txtWorkspace'><br>...o trieu un espai de treball: <select name='selWorkspace'><option value=''>Trieu...</option></select>",
	cancelLabel: "anul·la",
	cancelPrompt: "Anul·la la importació",
	statusOpenWorkspace: "Obrint l'espai de treball",
	statusGetTiddlerList: "Obtenint la llista de tiddlers",
	errorGettingTiddlerList: "Hi ha hagut un problema en obtenir la llist de tiddlers, cliqueu Anul·la o torneu a provar",
	step3Title: "Pas 3: Trieu els tiddlers que voleu importar",
	step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Manté aquests tiddlers enllaçats a aquest servidor per doder sincronitzar el canvis</input><br><input type='checkbox' name='chkSave'>Deseu els detalls del servidor en un tiddler 'systemServer' anomenat:</input> <input type='text' size=25 name='txtSaveTiddler'>",
	importLabel: "importa",
	importPrompt: "Importa aquests tiddlers",
	confirmOverwriteText: "Segur que voleu substituir aquests tiddlers:\n\n%0",
	step4Title: "Pas 4: Important %0 tiddler(s)",
	step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
	doneLabel: "fet",
	donePrompt: "Tanca l'assistent",
	statusDoingImport: "Important els tiddlers",
	statusDoneImport: "S'han importat tots els tiddlers",
	systemServerNamePattern: "%2 de %1",
	systemServerNamePatternNoWorkspace: "%1",
	confirmOverwriteSaveTiddler: "El tiddler '%0' ja existeix. Cliqueu 'D'acord' per sobreescriure'l amb els detalls d'aquest servidor, o 'Anul·la' per deixar-ho tal com és",
	serverSaveTemplate: "|''Tipus:''|%0|\n|''URL:''|%1|\n|''Espai:''|%2|\n\nAquest tiddler es va crear automàticament per registrar els detalls d'aquest servidor",
	serverSaveModifier: "(System)",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Mida", type: 'Size'},
			{name: 'Tags', field: 'tags', title: "Etiquetes", type: 'Tags'}
			],
		rowClasses: [
			]}
	});

merge(config.macros.upgrade,{
	wizardTitle: "Actualitza el codi del nucli de TiddlyWiki",
	step1Title: "Actualitza o repara aquest TiddlyWiki a la darrera versió",
	step1Html: "Aneu a actualitzar a la darrera versió el nucli de TiddlyWiki (de <a href='%0' class='externalLink' target='_blank'>%1</a>). El vostre contingut es conservarà al actualitzar.<br><br>Les actualitzacions del nucli poden fer que els connectors més antics deixin de funcionar correctament. Si trobeu problemes amb l'arxiu actualitzat, veieu <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
	errorCantUpgrade: "No es pot actualitzar aquest TiddlyWiki. Només podeu actualitzar fitxers TiddlyWiki desats localment",
	errorNotSaved: "Heu de desar els canvis abans d'actualitzar",
	step2Title: "Confirmeu els detalls de l'actualització",
	step2Html_downgrade: "Aneu a retrocedir a TiddlyWiki versió %0 des de la  %1.<br><br>No és recomanable baixar el nucli a una versió anterior",
	step2Html_restore: "Sembla que aquest TiddlyWiki ja fa servir la darrera versió del codi del nucli (%0).<br><br>Podeu continuar igualment l'actualització per assegurar que el codi del nucli no està danyat",
	step2Html_upgrade: "Aneu a actualitzar aquest TiddlyWiki a la versió %0 des de la %1",
	upgradeLabel: "actualitza",
	upgradePrompt: "Inicia el procés d'actualització",
	statusPreparingBackup: "Preparant la còpia de seguretat",
	statusSavingBackup: "S'està desant la còpia de seguretat",
	errorSavingBackup: "S'han trobat un problema en desar la còpia de seguretat",
	statusLoadingCore: "S'està carregant el codi del nucli",
	errorLoadingCore: "Hi ha hagut un error carregant el codi del nucli",
	errorCoreFormat: "Hi ha hagut un error amb el nou codi del nucli",
	statusSavingCore: "S'està desant el nou codi del nucli",
	statusReloadingCore: "S'està tornant a carregar el nou codi del nucli",
	startLabel: "inicia",
	startPrompt: "Inicia l'actualització",
	cancelLabel: "cancel·la",
	cancelPrompt: "Cancel·la l'actualització",
	step3Title: "procés cancel·lat",
	step3Html: "Heu cancel·lat l'actualització"
	});

merge(config.macros.sync,{
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Server Type', field: 'serverType', title: "Tipus de servidor", type: 'String'},
			{name: 'Server Host', field: 'serverHost', title: "Servidor", type: 'String'},
			{name: 'Server Workspace', field: 'serverWorkspace', title: "Espai de treball", type: 'String'},
			{name: 'Status', field: 'status', title: "Estat de la sicronització", type: 'String'},
			{name: 'Server URL', field: 'serverUrl', title: "URL del servidor", text: "Mostra", type: 'Link'}
			],
		rowClasses: [
			],
		buttons: [
			{caption: "Sync these tiddlers", name: 'sync'}
			]},
	wizardTitle: "Sincronitza amb servidors i fitxers externs",
	step1Title: "Trieu els tiddlers que voleu sincronitzar",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	syncLabel: "sinc",
	syncPrompt: "Sincronitza aquests tiddlers",
	hasChanged: "Ha canviat mentre no era connectat",
	hasNotChanged: "Sense canvis mentre no era connectat",
	syncStatusList: {
		none: {text: "...", display:'none', className:'notChanged'},
		changedServer: {text: "Canviat al servidor", display:null, className:'changedServer'},
		changedLocally: {text: "Canviat mentre era desconnectat", display:null, className:'changedLocally'},
		changedBoth: {text: "Canviat era mentre desconnectat i al servidor", display:null, className:'changedBoth'},
		notFound: {text: "No s'ha trobat al servidor", display:null, className:'notFound'},
		putToServer: {text: "S'han desat els canvis al servidor", display:null, className:'putToServer'},
		gotFromServer: {text: "S'han recuperat els canvis des del servidor", display:null, className:'gotFromServer'}
		}
	});

merge(config.commands.closeTiddler,{
	text: "tanca",
	tooltip: "Tanca aquest tiddler"});

merge(config.commands.closeOthers,{
	text: "tanca altres",
	tooltip: "Tanca tots els altres tiddlers"});

merge(config.commands.editTiddler,{
	text: "edita",
	tooltip: "Edita aquest tiddler",
	readOnlyText: "mostra",
	readOnlyTooltip: "Mostra el codi d'aquest tiddler"});

merge(config.commands.saveTiddler,{
	text: "desa",
	tooltip: "Desa els canvis d'aquest tiddler"});

merge(config.commands.cancelTiddler,{
	text: "anul·la",
	tooltip: "Anul·la els canvis a aquest tiddler",
	warning: "Segur que voleu anul·lar els canvis a '%0'?",
	readOnlyText: "fet",
	readOnlyTooltip: "Torna a l'aspecte normal"});

merge(config.commands.deleteTiddler,{
	text: "suprimeix",
	tooltip: "Suprimeix aquest tiddler",
	warning: "Segur que voleu suprimir '%0'?"});

merge(config.commands.permalink,{
	text: "enllaç permanent",
	tooltip: "Enllaç permanent d'aquest tiddler"});

merge(config.commands.references,{
	text: "referències",
	tooltip: "Obre els tiddlers que enllacen a aquest",
	popupNone: "sense referències"});

merge(config.commands.jump,{
	text: "salta",
	tooltip: "Salta a un altre tiddler obert"});

merge(config.commands.syncing,{
	text: "sincronitzant",
	tooltip: "Control de la sincronització d'aquest tiddler amb un servidor o fitxer extern",
	currentlySyncing: "<div>Es sincromitza <span class='popupHighlight'>'%0'</span> amb:</"+"div><div>servidor: <span class='popupHighlight'>%1</span></"+"div><div>workspace: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
	notCurrentlySyncing: "No s'està sincronitzant",
	captionUnSync: "Atura la sincronització d'aquest tiddler",
	chooseServer: "Sincronitza aquest tiddler amb un altre servidor:",
	currServerMarker: "\u25cf ",
	notCurrServerMarker: "  "});

merge(config.commands.fields,{
	text: "camps",
	tooltip: "Mostra els camps ampliats d'aquest tiddler",
	emptyText: "Aquest tiddler no té camps ampliats",
	listViewTemplate: {
		columns: [
			{name: 'Field', field: 'field', title: "Camp", type: 'String'},
			{name: 'Value', field: 'value', title: "Valor", type: 'String'}
			],
		rowClasses: [
			],
		buttons: [
			]}});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "[[ComComençar]]",
	MainMenu: "ComComençar\n\n[[Donacions]]\n© 2010 [[UnaMesa|http://www.unamesa.org/]]\n© 2020 [[Paco Rivière|http://paco.riviere.cat/]]\n\n\n^^TiddlyWiki versió <<version>>^^",
	SiteTitle: "El meu TiddlyWiki",
	SiteSubtitle: "bloc web personal no lineal, reutilitzable",
	SiteUrl: "http://www.tiddlywiki.com/",
	ComComençar: "Podeu entrar el vostre nom d'usuari per signar les vostres edicions: <<option txtUserName>>\n\nAbans de desar informació important, comproveu que podeu desar els canvis - veieu les instruccions detallades a https://classic.tiddlywiki.com/#GettingStarted\n\nLlavors podeu:\n\n* Crear nous tiddlers amb el botó 'nou tiddler' de la columna de la dreta\n* Desar els canvis amb el botó 'desa els canvis' de la columna de la dreta\n* Editar els [[TiddlersPerOmissió|DefaultTiddlers]] per decidir quins tiddlers apareixen en obrir aquest wiki\n* Editar el [[Títol de la pàgina|SiteTitle]] i el [[Subtítol|SiteTitle]]\n* Editar el [[MenuPrincipal|MainMenu]]: El menú (normalment a l'esquerra)\n* Col·laborar en la [[traducció al català|https://github.com/TiddlyWiki/translations]]\n* Més informació sobre el [[contingut WikiText|https://classic.tiddlywiki.com/#WikiTextContent]]\n\nVeieu més opcions al [[tauler de control|AdvancedOptions]].",
	Donacions: "La localització de TiddlyWiki al català és programari lliure, disponible gratuitament per tothom i sempre ho serà. Si feu  servir TiddlyWiki de forma regular i us resulta útil, podeu [[contribuïr amb una donació|https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=web%40pacoriviere%2ecat&item_name=Donaci%c3%b3%20per%20la%20localitzaci%c3%b3%20de%20TiddlyWiki%20al%20catal%c3%a0&amount=10%2e00&no_shipping=1&return=http%3a%2f%2fpacoriviere%2egooglepages%2ecom%2fTiddlyWiki%2ehtml&no_note=1&tax=0&currency_code=EUR&lc=ES&bn=PP%2dDonationsBF&charset=UTF%2d8]] encara que sigui modesta  a PayPal (com ara 10 Euros)",
	OptionsPanel: "Les opcions per personalitzar TiddlyWiki es desen al vostre navegador\n\nEl vostre nom per signar les vostres edicions. Escribiu-lo com una ParaulaWiki (com ara MartiCliment)\n<<option txtUserName>>\n<<option chkSaveBackups>> Desa còpies\n<<option chkAutoSave>> Desa automàticament\n<<option chkRegExpSearch>> Cerca expressions regulars\n<<option chkCaseSensitiveSearch>> Cerca sensible a caixa\n<<option chkAnimate>> Activa les animacions\n\n----\nVeieu també les [[OpcionsAvançades|AdvancedOptions]]",
	SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "0DD MMM YYYY" "diari">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel opcions "Canvia les opcions avançades del TiddlyWiki">>',
	SideBarTabs: '<<tabs txtMainTab "Data" "Tiddlers per ordre cronològic" TabTimeline "Títol" "Tots els tiddlers" TabAll "Etiquetes" "Tiddlers etiquetats" TabTags "Més" "Més llistes" TabMore>>',
	TabMore: '<<tabs txtMoreTab "Falten" "Tiddlers que no existeixen" TabMoreMissing "Orfes" "Tiddlers orfes" TabMoreOrphans Ombres "Tiddlers amb ombra" TabMoreShadowed>>',
	TiddlyWiki: "TiddlyWiki en català:\n\nhttp://projectes.lafarga.cat/projects/tiddlywiki\n[[Guia ràpida en català|http://projectes.lafarga.cat/projects/tiddlywiki/downloads/docs/152/14]]\n\nLloc web original de TiddlyWiki (en anglés):\n\nhttp://www.tiddlywiki.com/",
	});

merge(config.annotations,{
	AdvancedOptions: "Aquest tiddler ombra dóna accès a vàries opcions avançades",
	ColorPalette: "Els valors que hi ha en aquest tiddler ombra determinen l'esquema de colors de la interfície d'usuari de ~TiddlyWiki",
	DefaultTiddlers: "Els tiddlers que es llisten en aquest tiddler ombra es mostren quan arrenca ~TiddlyWiki",
	EditTemplate: "La plantilla HTML que hi ha en aquest tiddler ombra determina l'aspecte dels tiddlers mentre s'editen",
	GettingStarted: "Aquest tiddler ombra dóna instruccions bàsiques d'ús",
	ImportTiddlers: "Aquest tiddler ombra permet importar tiddlers",
	MainMenu: "Aquest tiddler ombra es fa servir per al contingut del menú principal de la columna de l'esquerra",
	MarkupPreHead: "Aquest tiddler s'inserta a la part superior de la secció <head> del fitxer HTML de TiddlyWiki",
	MarkupPostHead: "Aquest tiddler s'inserta a la part final de la secció <head> del fitxer HTML de TiddlyWiki",
	MarkupPreBody: "Aquest tiddler s'inserta a la part superior de la secció <body> del fitxer HTML de TiddlyWiki",
	MarkupPostBody: "Aquest tiddler s'inserta a la part final de la secció <body> del fitxer HTML de TiddlyWiki just abans del bloc de seqüències",
	OptionsPanel: "Aquest tiddler ombra es fa servir per al contingut del quadre d'opcions slider de la columna de la dreta",
	PageTemplate: "La plantilla HTML que hi ha en aquest tiddler ombra determina la disposició de ~TiddlyWiki",
	PluginManager: "Aquest tiddler ombra dóna access al gestor de connectors",
	SideBarOptions: "Aquest tiddler ombra es fa servir per al contingut del quadre d'opcions de la columna de la dreta",
	SideBarTabs: "Aquest tiddler ombra es fa servir per al contingut del quadre d'etiquetes de la columna de la dreta",
	SiteSubtitle: "Aquest tiddler ombra es fa servir per la segona part del títol de la pàgina",
	SiteTitle: "Aquest tiddler ombra es fa servir per la primera part del títol de la pàgina",
	SiteUrl: "Aquest tiddler ombra cal escriure l'adreça URL sencera per la publicació",
	StyleSheetColors: "Aquest tiddler ombra conté les definicions CSS relatives al color dels elements de la pàgina",
	StyleSheet: "Aquest tiddler pot contenir les vostres definicions CSS personalitzades",
	StyleSheetLayout: "Aquest tiddler ombra conté les definicions CSS relatives a la disposició dels elements de la pàgina",
	StyleSheetLocale: "Aquest tiddler ombra conté les definicions CSS relatives a la traducció local",
	StyleSheetPrint: "Aquest tiddler ombra conté les definicions CSS per la impressió",
	SystemSettings: "Aquest tiddler s’utilitza per emmagatzemar les opcions de configuració d’aquest document TiddlyWiki",
	TabAll: "Aquest tiddler ombra conté el contingut de la pestanya 'Títol'de la columna de la dreta",
	TabMore: "Aquest tiddler ombra conté el contingut de la pestanya 'Més'de la columna de la dreta",
	TabMoreMissing: "Aquest tiddler ombra conté el contingut de la pestanya 'Falten'de la columna de la dreta",
	TabMoreOrphans: "Aquest tiddler ombra conté el contingut de la pestanya 'Orfes'de la columna de la dreta",
	TabMoreShadowed: "Aquest tiddler ombra conté el contingut de la pestanya 'Ombres'de la columna de la dreta",
	TabTags: "Aquest tiddler ombra conté el contingut de la pestanya 'Etiquetes'de la columna de la dreta",
	TabTimeline: "Aquest tiddler ombra conté el contingut de la pestanya 'Data'de la columna de la dreta",
	ToolbarCommands: "Aquest tiddler ombra determina quines ordres es mostren a les barres d'eines dels tiddlers",
	ViewTemplate: "La plantilla HTML que hi ha en aquest tiddler ombra determina l'aspecte dels tiddlers"
	});

//}}}
Background: #fff
Foreground: #000
PrimaryPale: #aef
PrimaryLight: #8ad
PrimaryMid: #38c
PrimaryDark: #026
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
QuaternaryPale: #cf8
QuaternaryLight: #8f1
QuaternaryMid: #4b0
QuaternaryDark: #140
Error: #f88
Es recomana treballar sempre amb la darrera versió de CatalanLingo.

!Instruccions
* Copieu el [[contingut d'aquest tiddler|CatalanLingo]], al tiddler ''~CatalanLingo'' del vostre TiddlyWiki classic, afegiu a aquest tiddler la etiqueta systemConfig i feu ''desa els canvis''i actualitzeu la pàgina per comprovar que ha funcionat.
* Només cal seguir aquestes instruccions si ja has afegit continguts (tiddlers) al teu TiddlyWiki classic. Per començar un nou TiddlyWiki clica [[aquí|BaixaElProgramari]].

Les versions classic, són les anteriors a la versió 5 i no són compatibles. Si utllitzeu una versió posterior, heu d'anar a https://tiddlywiki.com/

!Nota
La versió catalana de TiddlyWiki està formada per dues entitats separades, el que facilita l'actualizació del codi i de la traducció de forma independent:
* El codi (en anglés) que es troba aquí: https://classic.tiddlywiki.com/empty.html
* La traducció al català, que es troba aquí: http://twcaclassic.tiddlyspot.com/#CatalanLingo

Per disposar de la darrera versió en anglés traduïda al català, només cal baixar els dos arxius anteriors i combinar-los seguint les Instruccions anteriors.

!Versions
*1.0.0 05-05-2006 - Primera versió pública
*1.0.1 13-05-2006 - Petites correccions
*1.0.2 14-05-2006 - Connector Calendari
*1.0.3 15-05-2006 - Connector TriaTema i com ActualitzarCatalanLingo
*1.0.4 17-07-2006 - Diverses aportacions de [[Jordi Fontich|http://phobos.xtec.cat/jfontich/tw.html#JordiFontich]]
*2.0.0 20-10-2006 - Importants canvis. Nova capçalera i nou format
*2.0.1 28-05-2007 - Millores a ComComençar i Aparença
*2.2.1 08-06-2007 - Noves bafarades, toolpits, camps txt i chk, backsatge, listView, ordinals de les dates, AdvancedOptions i més
*2.2.3 17-06-2007 - Correcció sincronitzar, twca passa de googelpages.com a lafarga.cat
*2.4.0 16-04-2008 - Correcio vincles capçalera. Nova macro upgrade,
*2.5.2 11-04-2010 - Fora: chkIncrementalSearch, Nou: upgradeDone, errorGettingTiddlerList, annotations, TabTimeline i ToolbarCommands. Article passa a ser etiqueta. Canvis a toolbar
*2.6.0 17-05-2020 - twca passa de lafarga.cat a twca.tiddlyspot.com. Nou: listViewTemplateReadOnly, SystemSettings. Nou redactat de ComComençar i petites correccions.
[[ComComençar]] [[WelcomeToTiddlyspot]]
/***
|''Name:''|DownloadTiddlyWikiPlugin|
|''Description:''|Download TiddlyWiki according to browser type|
|''Version:''|0.0.9|
|''Date:''|Jul 18, 2012|
|''Source:''|https://classic.tiddlywiki.com/#DownloadTiddlyWikiPlugin|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.4.1|
***/

//{{{
if(!version.extensions.DownloadTiddlyWikiPlugin) {
version.extensions.DownloadTiddlyWikiPlugin = {installed:true};

config.macros.download = {};

merge(config.macros.download,{
	label: "download",
	prompt: "Download TiddlyWiki",
	className: "chunkyButton"});

config.macros.download.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var span = createTiddlyElement(place,"span",null,this.className);
	createTiddlyButton(span,params[0]||this.label,params[1]||this.prompt,this.onClick);
};

config.macros.download.onClick = function(ev)
{
	// display the tiddler containing the instructions
	var e = ev || window.event;
	var title = "Downloading";
	var url = 'empty.zip';
	if(config.browser.isOpera || config.browser.isWindows) {
		story.displayTiddler(target,title);
		window.setTimeout(function() {document.location.href = url;},300);
	} else {
		// put an iframe in the target instructions tiddler to start the download
		var html = '<html><iframe src="' + url + '" style="display:none"></html>';
		var tiddler = store.getTiddler(title);
		var oldText = tiddler.text;
		tiddler.text = html + tiddler.text;
		var target = resolveTarget(e);
		story.closeTiddler(title,true);
		story.displayTiddler(target,title);
		tiddler.text = oldText;
	}
	return false;
};

} //# end of 'install only once'
//}}}
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'twcaclassic';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n")

});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 17/05/2020 20:19:26 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
| 17/05/2020 20:32:43 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . | failed |
| 17/05/2020 20:33:19 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
| 17/05/2020 20:34:55 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
| 17/05/2020 21:15:00 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
| 18/05/2020 00:09:29 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
| 18/05/2020 00:15:57 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . | ok |
| 18/05/2020 00:23:04 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
| 18/05/2020 00:25:56 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
| 18/05/2020 14:23:25 | twcaclassic | [[/|http://twcaclassic.tiddlyspot.com/]] | [[store.cgi|http://twcaclassic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twcaclassic.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
};

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");


//}}}