diff options
author | Nicolas Lœuillet <nicolas@loeuillet.org> | 2014-04-03 14:42:03 +0200 |
---|---|---|
committer | Nicolas Lœuillet <nicolas@loeuillet.org> | 2014-04-03 14:42:03 +0200 |
commit | 0d67b00d5d3b7ce1b76b639dcc65c415a5f13439 (patch) | |
tree | 7c4d113bb1c3d90ef53e08138a2850576395780f | |
parent | 99679d06884120c57f43b44e55e03595f1f87bed (diff) | |
parent | 7d2f1aa2793595aa6cdc58a58260184234cfa809 (diff) | |
download | wallabag-0d67b00d5d3b7ce1b76b639dcc65c415a5f13439.tar.gz wallabag-0d67b00d5d3b7ce1b76b639dcc65c415a5f13439.tar.zst wallabag-0d67b00d5d3b7ce1b76b639dcc65c415a5f13439.zip |
wallabag 1.6.0
100 files changed, 9895 insertions, 2255 deletions
@@ -3,4 +3,5 @@ cache/* | |||
3 | vendor | 3 | vendor |
4 | composer.phar | 4 | composer.phar |
5 | db/poche.sqlite | 5 | db/poche.sqlite |
6 | inc/poche/config.inc.php \ No newline at end of file | 6 | inc/poche/config.inc.php |
7 | inc/3rdparty/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/ \ No newline at end of file | ||
diff --git a/TRANSLATION.md b/TRANSLATION.md new file mode 100755 index 00000000..2e38d5cc --- /dev/null +++ b/TRANSLATION.md | |||
@@ -0,0 +1,67 @@ | |||
1 | # How to manage translations of wallabag | ||
2 | |||
3 | This guide will describe procedure of translation management of wallabag web application. | ||
4 | |||
5 | All translation are made using [gettext](http://en.wikipedia.org/wiki/Gettext) system and tools. | ||
6 | |||
7 | You will need [Poedit](http://www.poedit.net/download.php) editor to update, edit and create your translation files comfortably. In general, you can handle translations also without it: all can be done using gettext tools and your favorite plain text editor only. This guide, however, describes editing with Poedit. If you want to use gettext only, pls refer to xgettext manual page to update po files from sources (see also how it is used by Poedit below) and use msgunfmt tool to compile .mo files manually. | ||
8 | |||
9 | You need to know, that translation phrases are stored in **".po"** files (for example: `locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po`), which are then complied in **".mo"** files using **msgfmt** gettext tool or by Poedit, which will run msgfmt for you in background. | ||
10 | |||
11 | **It's assumed, that you have wallabag installed locally on your computer or on the server you have access to.** | ||
12 | |||
13 | ## To change existing translation you will need to do: | ||
14 | |||
15 | ### 1. Clear cache | ||
16 | You can do this using **http://your-wallabag-host.com/?empty-cache** link (replace http://your-wallabag-host.com/ with real url of your wallabag application) | ||
17 | |||
18 | OR | ||
19 | |||
20 | from command line: | ||
21 | go to root of your installation of wallabag project and run next command: | ||
22 | |||
23 | `rm -rf ./cache/*` | ||
24 | |||
25 | (this may require root privileges if you run, for example Apatche web server with mod_php) | ||
26 | |||
27 | ### 2. Generate php files from all twig templates | ||
28 | Do this using next command: | ||
29 | |||
30 | `php ./locale/tools/fillCache.php` | ||
31 | |||
32 | OR | ||
33 | |||
34 | from your browser: **http://your-wallabag-host.com/locale/tools/fillCache.php** (this may require removal of .htacces file in locale/ directory). | ||
35 | |||
36 | ### 3. Configure your Poedit | ||
37 | Open Poedit editor, open Edit->Preferences. Go to "Parsers" tab, click on PHP and press "Edit" button. Make sure your "Parser command:" looks like | ||
38 | |||
39 | `xgettext --no-location --force-po -o %o %C %K %F` | ||
40 | |||
41 | Usualy it is required to add "--no-location" to default value. | ||
42 | |||
43 | ### 4. Open .po file you want to edit in Poedit and change it's settings | ||
44 | Open, for example `locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po` file in your Poedit. | ||
45 | |||
46 | Go to "Catalog"->"Settings..." menu. Go to "Path" tab and add path to wallabag installaion in your local file system. This step can't be ommited as you will not be able to update phrases otherwise. | ||
47 | |||
48 | You can also check "project into" tab to be sure, that "Language" is set correctly (this will allow you to spell check your translation). | ||
49 | |||
50 | ### 5. Update opened .po file from sources | ||
51 | Once you have set your path correctly, you are able to update phrases from sources. Press "Update catalog - synchronize it with sources" button or go to "Catalog"->"Update from sources" menu. | ||
52 | |||
53 | As a result you will see confirmation popup with two tabs: "New strings" and "Obsolete strings". Pls review and accept changes (or press "Undo" if you see too many obsolete strings, as Poedit will remove them all - in this case please make sure all previous steps are performed w/o errors). | ||
54 | |||
55 | ### 6. Translate and save your .po file | ||
56 | If you have any dificulties on this step, please consult with Poedit manual. | ||
57 | Every time you save your .po file, Poedit will also comple appropriate .mo file by default (of course, if not disabled in preferences). | ||
58 | |||
59 | So, you are almost done. | ||
60 | |||
61 | ### 7. Clear cache again | ||
62 | This step may be required if your web server runs php scripts in name of, say, www user (i.e. Apache with mod_php, not cgi). | ||
63 | |||
64 | |||
65 | ##To create new translation | ||
66 | Please simple create appropriate directories in locale folder and perform all steps, described above. Instead of opening an existing file just create new one. | ||
67 | |||
diff --git a/check_setup.php b/check_setup.php index 96dd0f7d..2b84a744 100644 --- a/check_setup.php +++ b/check_setup.php | |||
@@ -13,16 +13,6 @@ if (version_compare(PHP_VERSION, '5.4.0', '<')) { | |||
13 | } | 13 | } |
14 | } | 14 | } |
15 | 15 | ||
16 | // Check PDO Sqlite | ||
17 | if (! extension_loaded('pdo_sqlite')) { | ||
18 | die('PHP extension required: pdo_sqlite'); | ||
19 | } | ||
20 | |||
21 | // Check ZIP | ||
22 | if (! extension_loaded('zip')) { | ||
23 | die('PHP extension required: zip'); | ||
24 | } | ||
25 | |||
26 | // Check if /cache is writeable | 16 | // Check if /cache is writeable |
27 | if (! is_writable('cache')) { | 17 | if (! is_writable('cache')) { |
28 | die('The directory "cache" must be writeable by your web server user'); | 18 | die('The directory "cache" must be writeable by your web server user'); |
diff --git a/inc/3rdparty/Session.class.php b/inc/3rdparty/Session.class.php index b30a31f3..59dfbe67 100644 --- a/inc/3rdparty/Session.class.php +++ b/inc/3rdparty/Session.class.php | |||
@@ -31,9 +31,9 @@ class Session | |||
31 | public static $sessionName = ''; | 31 | public static $sessionName = ''; |
32 | // If the user does not access any page within this time, | 32 | // If the user does not access any page within this time, |
33 | // his/her session is considered expired (3600 sec. = 1 hour) | 33 | // his/her session is considered expired (3600 sec. = 1 hour) |
34 | public static $inactivityTimeout = 86400; | 34 | public static $inactivityTimeout = 3600; |
35 | // Extra timeout for long sessions (if enabled) (82800 sec. = 23 hours) | 35 | // Extra timeout for long sessions (if enabled) (82800 sec. = 23 hours) |
36 | public static $longSessionTimeout = 31536000; | 36 | public static $longSessionTimeout = 7776000; // 7776000 = 90 days |
37 | // If you get disconnected often or if your IP address changes often. | 37 | // If you get disconnected often or if your IP address changes often. |
38 | // Let you disable session cookie hijacking protection | 38 | // Let you disable session cookie hijacking protection |
39 | public static $disableSessionProtection = false; | 39 | public static $disableSessionProtection = false; |
@@ -48,8 +48,13 @@ class Session | |||
48 | /** | 48 | /** |
49 | * Initialize session | 49 | * Initialize session |
50 | */ | 50 | */ |
51 | public static function init() | 51 | public static function init($longlastingsession = false) |
52 | { | 52 | { |
53 | //check if session name is correct | ||
54 | if ( (session_id() && !empty(self::$sessionName) && session_name()!=self::$sessionName) || $longlastingsession ) { | ||
55 | session_destroy(); | ||
56 | } | ||
57 | |||
53 | // Force cookie path (but do not change lifetime) | 58 | // Force cookie path (but do not change lifetime) |
54 | $cookie = session_get_cookie_params(); | 59 | $cookie = session_get_cookie_params(); |
55 | // Default cookie expiration and path. | 60 | // Default cookie expiration and path. |
@@ -61,12 +66,22 @@ class Session | |||
61 | if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") { | 66 | if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") { |
62 | $ssl = true; | 67 | $ssl = true; |
63 | } | 68 | } |
64 | session_set_cookie_params($cookie['lifetime'], $cookiedir, $_SERVER['HTTP_HOST'], $ssl); | 69 | |
70 | if ( $longlastingsession ) { | ||
71 | session_set_cookie_params(self::$longSessionTimeout, $cookiedir, null, $ssl, true); | ||
72 | } | ||
73 | else { | ||
74 | session_set_cookie_params(0, $cookiedir, null, $ssl, true); | ||
75 | } | ||
76 | //set server side valid session timeout | ||
77 | //WARNING! this may not work in shared session environment. See http://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime about min value: it can be set in any application | ||
78 | ini_set('session.gc_maxlifetime', self::$longSessionTimeout); | ||
79 | |||
65 | // Use cookies to store session. | 80 | // Use cookies to store session. |
66 | ini_set('session.use_cookies', 1); | 81 | ini_set('session.use_cookies', 1); |
67 | // Force cookies for session (phpsessionID forbidden in URL) | 82 | // Force cookies for session (phpsessionID forbidden in URL) |
68 | ini_set('session.use_only_cookies', 1); | 83 | ini_set('session.use_only_cookies', 1); |
69 | if (!session_id()) { | 84 | if ( !session_id() ) { |
70 | // Prevent php to use sessionID in URL if cookies are disabled. | 85 | // Prevent php to use sessionID in URL if cookies are disabled. |
71 | ini_set('session.use_trans_sid', false); | 86 | ini_set('session.use_trans_sid', false); |
72 | if (!empty(self::$sessionName)) { | 87 | if (!empty(self::$sessionName)) { |
@@ -115,6 +130,9 @@ class Session | |||
115 | if (self::banCanLogin()) { | 130 | if (self::banCanLogin()) { |
116 | if ($login === $loginTest && $password === $passwordTest) { | 131 | if ($login === $loginTest && $password === $passwordTest) { |
117 | self::banLoginOk(); | 132 | self::banLoginOk(); |
133 | |||
134 | self::init($longlastingsession); | ||
135 | |||
118 | // Generate unique random number to sign forms (HMAC) | 136 | // Generate unique random number to sign forms (HMAC) |
119 | $_SESSION['uid'] = sha1(uniqid('', true).'_'.mt_rand()); | 137 | $_SESSION['uid'] = sha1(uniqid('', true).'_'.mt_rand()); |
120 | $_SESSION['ip'] = self::_allIPs(); | 138 | $_SESSION['ip'] = self::_allIPs(); |
@@ -135,6 +153,7 @@ class Session | |||
135 | self::banLoginFailed(); | 153 | self::banLoginFailed(); |
136 | } | 154 | } |
137 | 155 | ||
156 | self::init(); | ||
138 | return false; | 157 | return false; |
139 | } | 158 | } |
140 | 159 | ||
@@ -143,7 +162,14 @@ class Session | |||
143 | */ | 162 | */ |
144 | public static function logout() | 163 | public static function logout() |
145 | { | 164 | { |
146 | unset($_SESSION['uid'],$_SESSION['ip'],$_SESSION['expires_on'],$_SESSION['tokens'], $_SESSION['login'], $_SESSION['pass'], $_SESSION['longlastingsession'], $_SESSION['poche_user']); | 165 | // unset($_SESSION['uid'],$_SESSION['ip'],$_SESSION['expires_on'],$_SESSION['tokens'], $_SESSION['login'], $_SESSION['pass'], $_SESSION['longlastingsession'], $_SESSION['poche_user']); |
166 | |||
167 | // Destruction du cookie (le code peut paraître complexe mais c'est pour être certain de reprendre les mêmes paramètres) | ||
168 | $args = array_merge(array(session_name(), ''), array_values(session_get_cookie_params())); | ||
169 | $args[2] = time() - 3600; | ||
170 | call_user_func_array('setcookie', $args); | ||
171 | // Suppression physique de la session | ||
172 | session_destroy(); | ||
147 | } | 173 | } |
148 | 174 | ||
149 | /** | 175 | /** |
@@ -157,7 +183,7 @@ class Session | |||
157 | || (self::$disableSessionProtection === false | 183 | || (self::$disableSessionProtection === false |
158 | && $_SESSION['ip'] !== self::_allIPs()) | 184 | && $_SESSION['ip'] !== self::_allIPs()) |
159 | || time() >= $_SESSION['expires_on']) { | 185 | || time() >= $_SESSION['expires_on']) { |
160 | self::logout(); | 186 | //self::logout(); |
161 | 187 | ||
162 | return false; | 188 | return false; |
163 | } | 189 | } |
diff --git a/inc/3rdparty/class.messages.php b/inc/3rdparty/class.messages.php index e60bd3a1..27c28f43 100644 --- a/inc/3rdparty/class.messages.php +++ b/inc/3rdparty/class.messages.php | |||
@@ -59,6 +59,7 @@ class Messages { | |||
59 | $this->msgId = md5(uniqid()); | 59 | $this->msgId = md5(uniqid()); |
60 | 60 | ||
61 | // Create the session array if it doesnt already exist | 61 | // Create the session array if it doesnt already exist |
62 | settype($_SESSION, 'array'); | ||
62 | if( !array_key_exists('flash_messages', $_SESSION) ) $_SESSION['flash_messages'] = array(); | 63 | if( !array_key_exists('flash_messages', $_SESSION) ) $_SESSION['flash_messages'] = array(); |
63 | 64 | ||
64 | } | 65 | } |
@@ -228,4 +229,4 @@ class Messages { | |||
228 | 229 | ||
229 | 230 | ||
230 | } // end class | 231 | } // end class |
231 | ?> \ No newline at end of file | 232 | ?> |
diff --git a/inc/3rdparty/libraries/feedwriter/FeedItem.php b/inc/3rdparty/libraries/feedwriter/FeedItem.php index 9373deeb..0eae5e08 100644 --- a/inc/3rdparty/libraries/feedwriter/FeedItem.php +++ b/inc/3rdparty/libraries/feedwriter/FeedItem.php | |||
@@ -156,6 +156,7 @@ | |||
156 | if($this->version == RSS2 || $this->version == RSS1) | 156 | if($this->version == RSS2 || $this->version == RSS1) |
157 | { | 157 | { |
158 | $this->setElement('link', $link); | 158 | $this->setElement('link', $link); |
159 | $this->setElement('guid', $link); | ||
159 | } | 160 | } |
160 | else | 161 | else |
161 | { | 162 | { |
diff --git a/inc/3rdparty/libraries/feedwriter/FeedWriter.php b/inc/3rdparty/libraries/feedwriter/FeedWriter.php index adb2526c..5d16e765 100644..100755 --- a/inc/3rdparty/libraries/feedwriter/FeedWriter.php +++ b/inc/3rdparty/libraries/feedwriter/FeedWriter.php | |||
@@ -9,9 +9,9 @@ define('JSONP', 3, true); | |||
9 | * Genarate RSS2 or JSON (original: RSS 1.0, RSS2.0 and ATOM Feed) | 9 | * Genarate RSS2 or JSON (original: RSS 1.0, RSS2.0 and ATOM Feed) |
10 | * | 10 | * |
11 | * Modified for FiveFilters.org's Full-Text RSS project | 11 | * Modified for FiveFilters.org's Full-Text RSS project |
12 | * to allow for inclusion of hubs, JSON output. | 12 | * to allow for inclusion of hubs, JSON output. |
13 | * Stripped RSS1 and ATOM support. | 13 | * Stripped RSS1 and ATOM support. |
14 | * | 14 | * |
15 | * @package UnivarselFeedWriter | 15 | * @package UnivarselFeedWriter |
16 | * @author Anis uddin Ahmad <anisniit@gmail.com> | 16 | * @author Anis uddin Ahmad <anisniit@gmail.com> |
17 | * @link http://www.ajaxray.com/projects/rss | 17 | * @link http://www.ajaxray.com/projects/rss |
@@ -26,32 +26,32 @@ define('JSONP', 3, true); | |||
26 | private $CDATAEncoding = array(); // The tag names which have to encoded as CDATA | 26 | private $CDATAEncoding = array(); // The tag names which have to encoded as CDATA |
27 | private $xsl = null; // stylesheet to render RSS (used by Chrome) | 27 | private $xsl = null; // stylesheet to render RSS (used by Chrome) |
28 | private $json = null; // JSON object | 28 | private $json = null; // JSON object |
29 | 29 | ||
30 | private $version = null; | 30 | private $version = null; |
31 | 31 | ||
32 | /** | 32 | /** |
33 | * Constructor | 33 | * Constructor |
34 | * | 34 | * |
35 | * @param constant the version constant (RSS2 or JSON). | 35 | * @param constant the version constant (RSS2 or JSON). |
36 | */ | 36 | */ |
37 | function __construct($version = RSS2) | 37 | function __construct($version = RSS2) |
38 | { | 38 | { |
39 | $this->version = $version; | 39 | $this->version = $version; |
40 | 40 | ||
41 | // Setting default value for assential channel elements | 41 | // Setting default value for assential channel elements |
42 | $this->channels['title'] = $version . ' Feed'; | 42 | $this->channels['title'] = $version . ' Feed'; |
43 | $this->channels['link'] = 'http://www.ajaxray.com/blog'; | 43 | $this->channels['link'] = 'http://www.ajaxray.com/blog'; |
44 | 44 | ||
45 | //Tag names to encode in CDATA | 45 | //Tag names to encode in CDATA |
46 | $this->CDATAEncoding = array('description', 'content:encoded', 'content', 'subtitle', 'summary'); | 46 | $this->CDATAEncoding = array('description', 'content:encoded', 'content', 'subtitle', 'summary'); |
47 | } | 47 | } |
48 | 48 | ||
49 | public function setFormat($format) { | 49 | public function setFormat($format) { |
50 | $this->version = $format; | 50 | $this->version = $format; |
51 | } | 51 | } |
52 | 52 | ||
53 | // Start # public functions --------------------------------------------- | 53 | // Start # public functions --------------------------------------------- |
54 | 54 | ||
55 | /** | 55 | /** |
56 | * Set a channel element | 56 | * Set a channel element |
57 | * @access public | 57 | * @access public |
@@ -63,11 +63,11 @@ define('JSONP', 3, true); | |||
63 | { | 63 | { |
64 | $this->channels[$elementName] = $content ; | 64 | $this->channels[$elementName] = $content ; |
65 | } | 65 | } |
66 | 66 | ||
67 | /** | 67 | /** |
68 | * Set multiple channel elements from an array. Array elements | 68 | * Set multiple channel elements from an array. Array elements |
69 | * should be 'channelName' => 'channelContent' format. | 69 | * should be 'channelName' => 'channelContent' format. |
70 | * | 70 | * |
71 | * @access public | 71 | * @access public |
72 | * @param array array of channels | 72 | * @param array array of channels |
73 | * @return void | 73 | * @return void |
@@ -75,30 +75,30 @@ define('JSONP', 3, true); | |||
75 | public function setChannelElementsFromArray($elementArray) | 75 | public function setChannelElementsFromArray($elementArray) |
76 | { | 76 | { |
77 | if(! is_array($elementArray)) return; | 77 | if(! is_array($elementArray)) return; |
78 | foreach ($elementArray as $elementName => $content) | 78 | foreach ($elementArray as $elementName => $content) |
79 | { | 79 | { |
80 | $this->setChannelElement($elementName, $content); | 80 | $this->setChannelElement($elementName, $content); |
81 | } | 81 | } |
82 | } | 82 | } |
83 | 83 | ||
84 | /** | 84 | /** |
85 | * Genarate the actual RSS/JSON file | 85 | * Genarate the actual RSS/JSON file |
86 | * | 86 | * |
87 | * @access public | 87 | * @access public |
88 | * @return void | 88 | * @return void |
89 | */ | 89 | */ |
90 | public function genarateFeed() | 90 | public function genarateFeed() |
91 | { | 91 | { |
92 | if ($this->version == RSS2) { | 92 | if ($this->version == RSS2) { |
93 | header('Content-type: text/xml; charset=UTF-8'); | 93 | // header('Content-type: text/xml; charset=UTF-8'); |
94 | // this line prevents Chrome 20 from prompting download | 94 | // this line prevents Chrome 20 from prompting download |
95 | // used by Google: https://news.google.com/news/feeds?ned=us&topic=b&output=rss | 95 | // used by Google: https://news.google.com/news/feeds?ned=us&topic=b&output=rss |
96 | header('X-content-type-options: nosniff'); | 96 | // header('X-content-type-options: nosniff'); |
97 | } elseif ($this->version == JSON) { | 97 | } elseif ($this->version == JSON) { |
98 | header('Content-type: application/json; charset=UTF-8'); | 98 | // header('Content-type: application/json; charset=UTF-8'); |
99 | $this->json = new stdClass(); | 99 | $this->json = new stdClass(); |
100 | } elseif ($this->version == JSONP) { | 100 | } elseif ($this->version == JSONP) { |
101 | header('Content-type: application/javascript; charset=UTF-8'); | 101 | // header('Content-type: application/javascript; charset=UTF-8'); |
102 | $this->json = new stdClass(); | 102 | $this->json = new stdClass(); |
103 | } | 103 | } |
104 | $this->printHead(); | 104 | $this->printHead(); |
@@ -109,10 +109,10 @@ define('JSONP', 3, true); | |||
109 | echo json_encode($this->json); | 109 | echo json_encode($this->json); |
110 | } | 110 | } |
111 | } | 111 | } |
112 | 112 | ||
113 | /** | 113 | /** |
114 | * Create a new FeedItem. | 114 | * Create a new FeedItem. |
115 | * | 115 | * |
116 | * @access public | 116 | * @access public |
117 | * @return object instance of FeedItem class | 117 | * @return object instance of FeedItem class |
118 | */ | 118 | */ |
@@ -121,24 +121,24 @@ define('JSONP', 3, true); | |||
121 | $Item = new FeedItem($this->version); | 121 | $Item = new FeedItem($this->version); |
122 | return $Item; | 122 | return $Item; |
123 | } | 123 | } |
124 | 124 | ||
125 | /** | 125 | /** |
126 | * Add a FeedItem to the main class | 126 | * Add a FeedItem to the main class |
127 | * | 127 | * |
128 | * @access public | 128 | * @access public |
129 | * @param object instance of FeedItem class | 129 | * @param object instance of FeedItem class |
130 | * @return void | 130 | * @return void |
131 | */ | 131 | */ |
132 | public function addItem($feedItem) | 132 | public function addItem($feedItem) |
133 | { | 133 | { |
134 | $this->items[] = $feedItem; | 134 | $this->items[] = $feedItem; |
135 | } | 135 | } |
136 | 136 | ||
137 | // Wrapper functions ------------------------------------------------------------------- | 137 | // Wrapper functions ------------------------------------------------------------------- |
138 | 138 | ||
139 | /** | 139 | /** |
140 | * Set the 'title' channel element | 140 | * Set the 'title' channel element |
141 | * | 141 | * |
142 | * @access public | 142 | * @access public |
143 | * @param srting value of 'title' channel tag | 143 | * @param srting value of 'title' channel tag |
144 | * @return void | 144 | * @return void |
@@ -147,59 +147,59 @@ define('JSONP', 3, true); | |||
147 | { | 147 | { |
148 | $this->setChannelElement('title', $title); | 148 | $this->setChannelElement('title', $title); |
149 | } | 149 | } |
150 | 150 | ||
151 | /** | 151 | /** |
152 | * Add a hub to the channel element | 152 | * Add a hub to the channel element |
153 | * | 153 | * |
154 | * @access public | 154 | * @access public |
155 | * @param string URL | 155 | * @param string URL |
156 | * @return void | 156 | * @return void |
157 | */ | 157 | */ |
158 | public function addHub($hub) | 158 | public function addHub($hub) |
159 | { | 159 | { |
160 | $this->hubs[] = $hub; | 160 | $this->hubs[] = $hub; |
161 | } | 161 | } |
162 | 162 | ||
163 | /** | 163 | /** |
164 | * Set XSL URL | 164 | * Set XSL URL |
165 | * | 165 | * |
166 | * @access public | 166 | * @access public |
167 | * @param string URL | 167 | * @param string URL |
168 | * @return void | 168 | * @return void |
169 | */ | 169 | */ |
170 | public function setXsl($xsl) | 170 | public function setXsl($xsl) |
171 | { | 171 | { |
172 | $this->xsl = $xsl; | 172 | $this->xsl = $xsl; |
173 | } | 173 | } |
174 | 174 | ||
175 | /** | 175 | /** |
176 | * Set self URL | 176 | * Set self URL |
177 | * | 177 | * |
178 | * @access public | 178 | * @access public |
179 | * @param string URL | 179 | * @param string URL |
180 | * @return void | 180 | * @return void |
181 | */ | 181 | */ |
182 | public function setSelf($self) | 182 | public function setSelf($self) |
183 | { | 183 | { |
184 | $this->self = $self; | 184 | $this->self = $self; |
185 | } | 185 | } |
186 | 186 | ||
187 | /** | 187 | /** |
188 | * Set the 'description' channel element | 188 | * Set the 'description' channel element |
189 | * | 189 | * |
190 | * @access public | 190 | * @access public |
191 | * @param srting value of 'description' channel tag | 191 | * @param srting value of 'description' channel tag |
192 | * @return void | 192 | * @return void |
193 | */ | 193 | */ |
194 | public function setDescription($desciption) | 194 | public function setDescription($desciption) |
195 | { | 195 | { |
196 | $tag = ($this->version == ATOM)? 'subtitle' : 'description'; | 196 | $tag = ($this->version == ATOM)? 'subtitle' : 'description'; |
197 | $this->setChannelElement($tag, $desciption); | 197 | $this->setChannelElement($tag, $desciption); |
198 | } | 198 | } |
199 | 199 | ||
200 | /** | 200 | /** |
201 | * Set the 'link' channel element | 201 | * Set the 'link' channel element |
202 | * | 202 | * |
203 | * @access public | 203 | * @access public |
204 | * @param srting value of 'link' channel tag | 204 | * @param srting value of 'link' channel tag |
205 | * @return void | 205 | * @return void |
@@ -208,10 +208,10 @@ define('JSONP', 3, true); | |||
208 | { | 208 | { |
209 | $this->setChannelElement('link', $link); | 209 | $this->setChannelElement('link', $link); |
210 | } | 210 | } |
211 | 211 | ||
212 | /** | 212 | /** |
213 | * Set the 'image' channel element | 213 | * Set the 'image' channel element |
214 | * | 214 | * |
215 | * @access public | 215 | * @access public |
216 | * @param srting title of image | 216 | * @param srting title of image |
217 | * @param srting link url of the imahe | 217 | * @param srting link url of the imahe |
@@ -222,14 +222,14 @@ define('JSONP', 3, true); | |||
222 | { | 222 | { |
223 | $this->setChannelElement('image', array('title'=>$title, 'link'=>$link, 'url'=>$url)); | 223 | $this->setChannelElement('image', array('title'=>$title, 'link'=>$link, 'url'=>$url)); |
224 | } | 224 | } |
225 | 225 | ||
226 | // End # public functions ---------------------------------------------- | 226 | // End # public functions ---------------------------------------------- |
227 | 227 | ||
228 | // Start # private functions ---------------------------------------------- | 228 | // Start # private functions ---------------------------------------------- |
229 | 229 | ||
230 | /** | 230 | /** |
231 | * Prints the xml and rss namespace | 231 | * Prints the xml and rss namespace |
232 | * | 232 | * |
233 | * @access private | 233 | * @access private |
234 | * @return void | 234 | * @return void |
235 | */ | 235 | */ |
@@ -247,10 +247,10 @@ define('JSONP', 3, true); | |||
247 | $this->json->rss = array('@attributes' => array('version' => '2.0')); | 247 | $this->json->rss = array('@attributes' => array('version' => '2.0')); |
248 | } | 248 | } |
249 | } | 249 | } |
250 | 250 | ||
251 | /** | 251 | /** |
252 | * Closes the open tags at the end of file | 252 | * Closes the open tags at the end of file |
253 | * | 253 | * |
254 | * @access private | 254 | * @access private |
255 | * @return void | 255 | * @return void |
256 | */ | 256 | */ |
@@ -258,14 +258,14 @@ define('JSONP', 3, true); | |||
258 | { | 258 | { |
259 | if ($this->version == RSS2) | 259 | if ($this->version == RSS2) |
260 | { | 260 | { |
261 | echo '</channel>',PHP_EOL,'</rss>'; | 261 | echo '</channel>',PHP_EOL,'</rss>'; |
262 | } | 262 | } |
263 | // do nothing for JSON | 263 | // do nothing for JSON |
264 | } | 264 | } |
265 | 265 | ||
266 | /** | 266 | /** |
267 | * Creates a single node as xml format | 267 | * Creates a single node as xml format |
268 | * | 268 | * |
269 | * @access private | 269 | * @access private |
270 | * @param string name of the tag | 270 | * @param string name of the tag |
271 | * @param mixed tag value as string or array of nested tags in 'tagName' => 'tagValue' format | 271 | * @param mixed tag value as string or array of nested tags in 'tagName' => 'tagValue' format |
@@ -273,22 +273,22 @@ define('JSONP', 3, true); | |||
273 | * @return string formatted xml tag | 273 | * @return string formatted xml tag |
274 | */ | 274 | */ |
275 | private function makeNode($tagName, $tagContent, $attributes = null) | 275 | private function makeNode($tagName, $tagContent, $attributes = null) |
276 | { | 276 | { |
277 | if ($this->version == RSS2) | 277 | if ($this->version == RSS2) |
278 | { | 278 | { |
279 | $nodeText = ''; | 279 | $nodeText = ''; |
280 | $attrText = ''; | 280 | $attrText = ''; |
281 | if (is_array($attributes)) | 281 | if (is_array($attributes)) |
282 | { | 282 | { |
283 | foreach ($attributes as $key => $value) | 283 | foreach ($attributes as $key => $value) |
284 | { | 284 | { |
285 | $attrText .= " $key=\"$value\" "; | 285 | $attrText .= " $key=\"$value\" "; |
286 | } | 286 | } |
287 | } | 287 | } |
288 | $nodeText .= "<{$tagName}{$attrText}>"; | 288 | $nodeText .= "<{$tagName}{$attrText}>"; |
289 | if (is_array($tagContent)) | 289 | if (is_array($tagContent)) |
290 | { | 290 | { |
291 | foreach ($tagContent as $key => $value) | 291 | foreach ($tagContent as $key => $value) |
292 | { | 292 | { |
293 | $nodeText .= $this->makeNode($key, $value); | 293 | $nodeText .= $this->makeNode($key, $value); |
294 | } | 294 | } |
@@ -297,7 +297,7 @@ define('JSONP', 3, true); | |||
297 | { | 297 | { |
298 | //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent : htmlentities($tagContent); | 298 | //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent : htmlentities($tagContent); |
299 | $nodeText .= htmlspecialchars($tagContent); | 299 | $nodeText .= htmlspecialchars($tagContent); |
300 | } | 300 | } |
301 | //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? "]]></$tagName>" : "</$tagName>"; | 301 | //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? "]]></$tagName>" : "</$tagName>"; |
302 | $nodeText .= "</$tagName>"; | 302 | $nodeText .= "</$tagName>"; |
303 | return $nodeText . PHP_EOL; | 303 | return $nodeText . PHP_EOL; |
@@ -321,7 +321,7 @@ define('JSONP', 3, true); | |||
321 | } | 321 | } |
322 | return ''; // should not get here | 322 | return ''; // should not get here |
323 | } | 323 | } |
324 | 324 | ||
325 | private function json_keys(array $array) { | 325 | private function json_keys(array $array) { |
326 | $new = array(); | 326 | $new = array(); |
327 | foreach ($array as $key => $val) { | 327 | foreach ($array as $key => $val) { |
@@ -334,7 +334,7 @@ define('JSONP', 3, true); | |||
334 | } | 334 | } |
335 | return $new; | 335 | return $new; |
336 | } | 336 | } |
337 | 337 | ||
338 | /** | 338 | /** |
339 | * @desc Print channels | 339 | * @desc Print channels |
340 | * @access private | 340 | * @access private |
@@ -344,7 +344,7 @@ define('JSONP', 3, true); | |||
344 | { | 344 | { |
345 | //Start channel tag | 345 | //Start channel tag |
346 | if ($this->version == RSS2) { | 346 | if ($this->version == RSS2) { |
347 | echo '<channel>' . PHP_EOL; | 347 | echo '<channel>' . PHP_EOL; |
348 | // add hubs | 348 | // add hubs |
349 | foreach ($this->hubs as $hub) { | 349 | foreach ($this->hubs as $hub) { |
350 | //echo $this->makeNode('link', '', array('rel'=>'hub', 'href'=>$hub, 'xmlns'=>'http://www.w3.org/2005/Atom')); | 350 | //echo $this->makeNode('link', '', array('rel'=>'hub', 'href'=>$hub, 'xmlns'=>'http://www.w3.org/2005/Atom')); |
@@ -356,7 +356,7 @@ define('JSONP', 3, true); | |||
356 | echo '<link rel="self" href="'.htmlspecialchars($this->self).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL; | 356 | echo '<link rel="self" href="'.htmlspecialchars($this->self).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL; |
357 | } | 357 | } |
358 | //Print Items of channel | 358 | //Print Items of channel |
359 | foreach ($this->channels as $key => $value) | 359 | foreach ($this->channels as $key => $value) |
360 | { | 360 | { |
361 | echo $this->makeNode($key, $value); | 361 | echo $this->makeNode($key, $value); |
362 | } | 362 | } |
@@ -364,26 +364,26 @@ define('JSONP', 3, true); | |||
364 | $this->json->rss['channel'] = (object)$this->json_keys($this->channels); | 364 | $this->json->rss['channel'] = (object)$this->json_keys($this->channels); |
365 | } | 365 | } |
366 | } | 366 | } |
367 | 367 | ||
368 | /** | 368 | /** |
369 | * Prints formatted feed items | 369 | * Prints formatted feed items |
370 | * | 370 | * |
371 | * @access private | 371 | * @access private |
372 | * @return void | 372 | * @return void |
373 | */ | 373 | */ |
374 | private function printItems() | 374 | private function printItems() |
375 | { | 375 | { |
376 | foreach ($this->items as $item) { | 376 | foreach ($this->items as $item) { |
377 | $itemElements = $item->getElements(); | 377 | $itemElements = $item->getElements(); |
378 | 378 | ||
379 | echo $this->startItem(); | 379 | echo $this->startItem(); |
380 | 380 | ||
381 | if ($this->version == JSON || $this->version == JSONP) { | 381 | if ($this->version == JSON || $this->version == JSONP) { |
382 | $json_item = array(); | 382 | $json_item = array(); |
383 | } | 383 | } |
384 | 384 | ||
385 | foreach ($itemElements as $thisElement) { | 385 | foreach ($itemElements as $thisElement) { |
386 | foreach ($thisElement as $instance) { | 386 | foreach ($thisElement as $instance) { |
387 | if ($this->version == RSS2) { | 387 | if ($this->version == RSS2) { |
388 | echo $this->makeNode($instance['name'], $instance['content'], $instance['attributes']); | 388 | echo $this->makeNode($instance['name'], $instance['content'], $instance['attributes']); |
389 | } elseif ($this->version == JSON || $this->version == JSONP) { | 389 | } elseif ($this->version == JSON || $this->version == JSONP) { |
@@ -406,10 +406,10 @@ define('JSONP', 3, true); | |||
406 | } | 406 | } |
407 | } | 407 | } |
408 | } | 408 | } |
409 | 409 | ||
410 | /** | 410 | /** |
411 | * Make the starting tag of channels | 411 | * Make the starting tag of channels |
412 | * | 412 | * |
413 | * @access private | 413 | * @access private |
414 | * @return void | 414 | * @return void |
415 | */ | 415 | */ |
@@ -417,14 +417,14 @@ define('JSONP', 3, true); | |||
417 | { | 417 | { |
418 | if ($this->version == RSS2) | 418 | if ($this->version == RSS2) |
419 | { | 419 | { |
420 | echo '<item>' . PHP_EOL; | 420 | echo '<item>' . PHP_EOL; |
421 | } | 421 | } |
422 | // nothing for JSON | 422 | // nothing for JSON |
423 | } | 423 | } |
424 | 424 | ||
425 | /** | 425 | /** |
426 | * Closes feed item tag | 426 | * Closes feed item tag |
427 | * | 427 | * |
428 | * @access private | 428 | * @access private |
429 | * @return void | 429 | * @return void |
430 | */ | 430 | */ |
@@ -432,10 +432,10 @@ define('JSONP', 3, true); | |||
432 | { | 432 | { |
433 | if ($this->version == RSS2) | 433 | if ($this->version == RSS2) |
434 | { | 434 | { |
435 | echo '</item>' . PHP_EOL; | 435 | echo '</item>' . PHP_EOL; |
436 | } | 436 | } |
437 | // nothing for JSON | 437 | // nothing for JSON |
438 | } | 438 | } |
439 | 439 | ||
440 | // End # private functions ---------------------------------------------- | 440 | // End # private functions ---------------------------------------------- |
441 | } \ No newline at end of file | 441 | } \ No newline at end of file |
diff --git a/inc/3rdparty/makefulltextfeed.php b/inc/3rdparty/makefulltextfeed.php index 2852c4c2..135964f1 100755 --- a/inc/3rdparty/makefulltextfeed.php +++ b/inc/3rdparty/makefulltextfeed.php | |||
@@ -55,42 +55,8 @@ if (get_magic_quotes_gpc()) { | |||
55 | 55 | ||
56 | // set include path | 56 | // set include path |
57 | set_include_path(realpath(dirname(__FILE__).'/libraries').PATH_SEPARATOR.get_include_path()); | 57 | set_include_path(realpath(dirname(__FILE__).'/libraries').PATH_SEPARATOR.get_include_path()); |
58 | // Autoloading of classes allows us to include files only when they're | 58 | |
59 | // needed. If we've got a cached copy, for example, only Zend_Cache is loaded. | 59 | require_once dirname(__FILE__).'/makefulltextfeedHelpers.php'; |
60 | function autoload($class_name) { | ||
61 | static $dir = null; | ||
62 | if ($dir === null) $dir = dirname(__FILE__).'/libraries/'; | ||
63 | static $mapping = array( | ||
64 | // Include FeedCreator for RSS/Atom creation | ||
65 | 'FeedWriter' => 'feedwriter/FeedWriter.php', | ||
66 | 'FeedItem' => 'feedwriter/FeedItem.php', | ||
67 | // Include ContentExtractor and Readability for identifying and extracting content from URLs | ||
68 | 'ContentExtractor' => 'content-extractor/ContentExtractor.php', | ||
69 | 'SiteConfig' => 'content-extractor/SiteConfig.php', | ||
70 | 'Readability' => 'readability/Readability.php', | ||
71 | // Include Humble HTTP Agent to allow parallel requests and response caching | ||
72 | 'HumbleHttpAgent' => 'humble-http-agent/HumbleHttpAgent.php', | ||
73 | 'SimplePie_HumbleHttpAgent' => 'humble-http-agent/SimplePie_HumbleHttpAgent.php', | ||
74 | 'CookieJar' => 'humble-http-agent/CookieJar.php', | ||
75 | // Include Zend Cache to improve performance (cache results) | ||
76 | 'Zend_Cache' => 'Zend/Cache.php', | ||
77 | // Language detect | ||
78 | 'Text_LanguageDetect' => 'language-detect/LanguageDetect.php', | ||
79 | // HTML5 Lib | ||
80 | 'HTML5_Parser' => 'html5/Parser.php', | ||
81 | // htmLawed - used if XSS filter is enabled (xss_filter) | ||
82 | 'htmLawed' => 'htmLawed/htmLawed.php' | ||
83 | ); | ||
84 | if (isset($mapping[$class_name])) { | ||
85 | debug("** Loading class $class_name ({$mapping[$class_name]})"); | ||
86 | require $dir.$mapping[$class_name]; | ||
87 | return true; | ||
88 | } else { | ||
89 | return false; | ||
90 | } | ||
91 | } | ||
92 | spl_autoload_register('autoload'); | ||
93 | require dirname(__FILE__).'/libraries/simplepie/autoloader.php'; | ||
94 | 60 | ||
95 | //////////////////////////////// | 61 | //////////////////////////////// |
96 | // Load config file | 62 | // Load config file |
@@ -415,6 +381,7 @@ if (!$debug_mode) { | |||
415 | ////////////////////////////////// | 381 | ////////////////////////////////// |
416 | // Set up HTTP agent | 382 | // Set up HTTP agent |
417 | ////////////////////////////////// | 383 | ////////////////////////////////// |
384 | global $http; | ||
418 | $http = new HumbleHttpAgent(); | 385 | $http = new HumbleHttpAgent(); |
419 | $http->debug = $debug_mode; | 386 | $http->debug = $debug_mode; |
420 | $http->userAgentMap = $options->user_agents; | 387 | $http->userAgentMap = $options->user_agents; |
@@ -478,29 +445,6 @@ if ($html_only || !$result) { | |||
478 | $isDummyFeed = true; | 445 | $isDummyFeed = true; |
479 | unset($feed, $result); | 446 | unset($feed, $result); |
480 | // create single item dummy feed object | 447 | // create single item dummy feed object |
481 | class DummySingleItemFeed { | ||
482 | public $item; | ||
483 | function __construct($url) { $this->item = new DummySingleItem($url); } | ||
484 | public function get_title() { return ''; } | ||
485 | public function get_description() { return 'Content extracted from '.$this->item->url; } | ||
486 | public function get_link() { return $this->item->url; } | ||
487 | public function get_language() { return false; } | ||
488 | public function get_image_url() { return false; } | ||
489 | public function get_items($start=0, $max=1) { return array(0=>$this->item); } | ||
490 | } | ||
491 | class DummySingleItem { | ||
492 | public $url; | ||
493 | function __construct($url) { $this->url = $url; } | ||
494 | public function get_permalink() { return $this->url; } | ||
495 | public function get_title() { return null; } | ||
496 | public function get_date($format='') { return false; } | ||
497 | public function get_author($key=0) { return null; } | ||
498 | public function get_authors() { return null; } | ||
499 | public function get_description() { return ''; } | ||
500 | public function get_enclosure($key=0, $prefer=null) { return null; } | ||
501 | public function get_enclosures() { return null; } | ||
502 | public function get_categories() { return null; } | ||
503 | } | ||
504 | $feed = new DummySingleItemFeed($url); | 448 | $feed = new DummySingleItemFeed($url); |
505 | } | 449 | } |
506 | 450 | ||
@@ -903,294 +847,3 @@ if (!$debug_mode) { | |||
903 | if ($callback) echo ');'; | 847 | if ($callback) echo ');'; |
904 | } | 848 | } |
905 | 849 | ||
906 | /////////////////////////////// | ||
907 | // HELPER FUNCTIONS | ||
908 | /////////////////////////////// | ||
909 | |||
910 | function url_allowed($url) { | ||
911 | global $options; | ||
912 | if (!empty($options->allowed_urls)) { | ||
913 | $allowed = false; | ||
914 | foreach ($options->allowed_urls as $allowurl) { | ||
915 | if (stristr($url, $allowurl) !== false) { | ||
916 | $allowed = true; | ||
917 | break; | ||
918 | } | ||
919 | } | ||
920 | if (!$allowed) return false; | ||
921 | } else { | ||
922 | foreach ($options->blocked_urls as $blockurl) { | ||
923 | if (stristr($url, $blockurl) !== false) { | ||
924 | return false; | ||
925 | } | ||
926 | } | ||
927 | } | ||
928 | return true; | ||
929 | } | ||
930 | |||
931 | ////////////////////////////////////////////// | ||
932 | // Convert $html to UTF8 | ||
933 | // (uses HTTP headers and HTML to find encoding) | ||
934 | // adapted from http://stackoverflow.com/questions/910793/php-detect-encoding-and-make-everything-utf-8 | ||
935 | ////////////////////////////////////////////// | ||
936 | function convert_to_utf8($html, $header=null) | ||
937 | { | ||
938 | $encoding = null; | ||
939 | if ($html || $header) { | ||
940 | if (is_array($header)) $header = implode("\n", $header); | ||
941 | if (!$header || !preg_match_all('/^Content-Type:\s+([^;]+)(?:;\s*charset=["\']?([^;"\'\n]*))?/im', $header, $match, PREG_SET_ORDER)) { | ||
942 | // error parsing the response | ||
943 | debug('Could not find Content-Type header in HTTP response'); | ||
944 | } else { | ||
945 | $match = end($match); // get last matched element (in case of redirects) | ||
946 | if (isset($match[2])) $encoding = trim($match[2], "\"' \r\n\0\x0B\t"); | ||
947 | } | ||
948 | // TODO: check to see if encoding is supported (can we convert it?) | ||
949 | // If it's not, result will be empty string. | ||
950 | // For now we'll check for invalid encoding types returned by some sites, e.g. 'none' | ||
951 | // Problem URL: http://facta.co.jp/blog/archives/20111026001026.html | ||
952 | if (!$encoding || $encoding == 'none') { | ||
953 | // search for encoding in HTML - only look at the first 50000 characters | ||
954 | // Why 50000? See, for example, http://www.lemonde.fr/festival-de-cannes/article/2012/05/23/deux-cretes-en-goguette-sur-la-croisette_1705732_766360.html | ||
955 | // TODO: improve this so it looks at smaller chunks first | ||
956 | $html_head = substr($html, 0, 50000); | ||
957 | if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $html_head, $match)) { | ||
958 | $encoding = trim($match[1], '"\''); | ||
959 | } elseif (preg_match('/<meta\s+http-equiv=["\']?Content-Type["\']? content=["\'][^;]+;\s*charset=["\']?([^;"\'>]+)/i', $html_head, $match)) { | ||
960 | $encoding = trim($match[1]); | ||
961 | } elseif (preg_match_all('/<meta\s+([^>]+)>/i', $html_head, $match)) { | ||
962 | foreach ($match[1] as $_test) { | ||
963 | if (preg_match('/charset=["\']?([^"\']+)/i', $_test, $_m)) { | ||
964 | $encoding = trim($_m[1]); | ||
965 | break; | ||
966 | } | ||
967 | } | ||
968 | } | ||
969 | } | ||
970 | if (isset($encoding)) $encoding = trim($encoding); | ||
971 | // trim is important here! | ||
972 | if (!$encoding || (strtolower($encoding) == 'iso-8859-1')) { | ||
973 | // replace MS Word smart qutoes | ||
974 | $trans = array(); | ||
975 | $trans[chr(130)] = '‚'; // Single Low-9 Quotation Mark | ||
976 | $trans[chr(131)] = 'ƒ'; // Latin Small Letter F With Hook | ||
977 | $trans[chr(132)] = '„'; // Double Low-9 Quotation Mark | ||
978 | $trans[chr(133)] = '…'; // Horizontal Ellipsis | ||
979 | $trans[chr(134)] = '†'; // Dagger | ||
980 | $trans[chr(135)] = '‡'; // Double Dagger | ||
981 | $trans[chr(136)] = 'ˆ'; // Modifier Letter Circumflex Accent | ||
982 | $trans[chr(137)] = '‰'; // Per Mille Sign | ||
983 | $trans[chr(138)] = 'Š'; // Latin Capital Letter S With Caron | ||
984 | $trans[chr(139)] = '‹'; // Single Left-Pointing Angle Quotation Mark | ||
985 | $trans[chr(140)] = 'Œ'; // Latin Capital Ligature OE | ||
986 | $trans[chr(145)] = '‘'; // Left Single Quotation Mark | ||
987 | $trans[chr(146)] = '’'; // Right Single Quotation Mark | ||
988 | $trans[chr(147)] = '“'; // Left Double Quotation Mark | ||
989 | $trans[chr(148)] = '”'; // Right Double Quotation Mark | ||
990 | $trans[chr(149)] = '•'; // Bullet | ||
991 | $trans[chr(150)] = '–'; // En Dash | ||
992 | $trans[chr(151)] = '—'; // Em Dash | ||
993 | $trans[chr(152)] = '˜'; // Small Tilde | ||
994 | $trans[chr(153)] = '™'; // Trade Mark Sign | ||
995 | $trans[chr(154)] = 'š'; // Latin Small Letter S With Caron | ||
996 | $trans[chr(155)] = '›'; // Single Right-Pointing Angle Quotation Mark | ||
997 | $trans[chr(156)] = 'œ'; // Latin Small Ligature OE | ||
998 | $trans[chr(159)] = 'Ÿ'; // Latin Capital Letter Y With Diaeresis | ||
999 | $html = strtr($html, $trans); | ||
1000 | } | ||
1001 | if (!$encoding) { | ||
1002 | debug('No character encoding found, so treating as UTF-8'); | ||
1003 | $encoding = 'utf-8'; | ||
1004 | } else { | ||
1005 | debug('Character encoding: '.$encoding); | ||
1006 | if (strtolower($encoding) != 'utf-8') { | ||
1007 | debug('Converting to UTF-8'); | ||
1008 | $html = SimplePie_Misc::change_encoding($html, $encoding, 'utf-8'); | ||
1009 | /* | ||
1010 | if (function_exists('iconv')) { | ||
1011 | // iconv appears to handle certain character encodings better than mb_convert_encoding | ||
1012 | $html = iconv($encoding, 'utf-8', $html); | ||
1013 | } else { | ||
1014 | $html = mb_convert_encoding($html, 'utf-8', $encoding); | ||
1015 | } | ||
1016 | */ | ||
1017 | } | ||
1018 | } | ||
1019 | } | ||
1020 | return $html; | ||
1021 | } | ||
1022 | |||
1023 | function makeAbsolute($base, $elem) { | ||
1024 | $base = new SimplePie_IRI($base); | ||
1025 | // remove '//' in URL path (used to prevent URLs from resolving properly) | ||
1026 | // TODO: check if this is still the case | ||
1027 | if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path); | ||
1028 | foreach(array('a'=>'href', 'img'=>'src') as $tag => $attr) { | ||
1029 | $elems = $elem->getElementsByTagName($tag); | ||
1030 | for ($i = $elems->length-1; $i >= 0; $i--) { | ||
1031 | $e = $elems->item($i); | ||
1032 | //$e->parentNode->replaceChild($articleContent->ownerDocument->createTextNode($e->textContent), $e); | ||
1033 | makeAbsoluteAttr($base, $e, $attr); | ||
1034 | } | ||
1035 | if (strtolower($elem->tagName) == $tag) makeAbsoluteAttr($base, $elem, $attr); | ||
1036 | } | ||
1037 | } | ||
1038 | function makeAbsoluteAttr($base, $e, $attr) { | ||
1039 | if ($e->hasAttribute($attr)) { | ||
1040 | // Trim leading and trailing white space. I don't really like this but | ||
1041 | // unfortunately it does appear on some sites. e.g. <img src=" /path/to/image.jpg" /> | ||
1042 | $url = trim(str_replace('%20', ' ', $e->getAttribute($attr))); | ||
1043 | $url = str_replace(' ', '%20', $url); | ||
1044 | if (!preg_match('!https?://!i', $url)) { | ||
1045 | if ($absolute = SimplePie_IRI::absolutize($base, $url)) { | ||
1046 | $e->setAttribute($attr, $absolute); | ||
1047 | } | ||
1048 | } | ||
1049 | } | ||
1050 | } | ||
1051 | function makeAbsoluteStr($base, $url) { | ||
1052 | $base = new SimplePie_IRI($base); | ||
1053 | // remove '//' in URL path (causes URLs not to resolve properly) | ||
1054 | if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path); | ||
1055 | if (preg_match('!^https?://!i', $url)) { | ||
1056 | // already absolute | ||
1057 | return $url; | ||
1058 | } else { | ||
1059 | if ($absolute = SimplePie_IRI::absolutize($base, $url)) { | ||
1060 | return $absolute; | ||
1061 | } | ||
1062 | return false; | ||
1063 | } | ||
1064 | } | ||
1065 | // returns single page response, or false if not found | ||
1066 | function getSinglePage($item, $html, $url) { | ||
1067 | global $http, $extractor; | ||
1068 | debug('Looking for site config files to see if single page link exists'); | ||
1069 | $site_config = $extractor->buildSiteConfig($url, $html); | ||
1070 | $splink = null; | ||
1071 | if (!empty($site_config->single_page_link)) { | ||
1072 | $splink = $site_config->single_page_link; | ||
1073 | } elseif (!empty($site_config->single_page_link_in_feed)) { | ||
1074 | // single page link xpath is targeted at feed | ||
1075 | $splink = $site_config->single_page_link_in_feed; | ||
1076 | // so let's replace HTML with feed item description | ||
1077 | $html = $item->get_description(); | ||
1078 | } | ||
1079 | if (isset($splink)) { | ||
1080 | // Build DOM tree from HTML | ||
1081 | $readability = new Readability($html, $url); | ||
1082 | $xpath = new DOMXPath($readability->dom); | ||
1083 | // Loop through single_page_link xpath expressions | ||
1084 | $single_page_url = null; | ||
1085 | foreach ($splink as $pattern) { | ||
1086 | $elems = @$xpath->evaluate($pattern, $readability->dom); | ||
1087 | if (is_string($elems)) { | ||
1088 | $single_page_url = trim($elems); | ||
1089 | break; | ||
1090 | } elseif ($elems instanceof DOMNodeList && $elems->length > 0) { | ||
1091 | foreach ($elems as $item) { | ||
1092 | if ($item instanceof DOMElement && $item->hasAttribute('href')) { | ||
1093 | $single_page_url = $item->getAttribute('href'); | ||
1094 | break 2; | ||
1095 | } elseif ($item instanceof DOMAttr && $item->value) { | ||
1096 | $single_page_url = $item->value; | ||
1097 | break 2; | ||
1098 | } | ||
1099 | } | ||
1100 | } | ||
1101 | } | ||
1102 | // If we've got URL, resolve against $url | ||
1103 | if (isset($single_page_url) && ($single_page_url = makeAbsoluteStr($url, $single_page_url))) { | ||
1104 | // check it's not what we have already! | ||
1105 | if ($single_page_url != $url) { | ||
1106 | // it's not, so let's try to fetch it... | ||
1107 | $_prev_ref = $http->referer; | ||
1108 | $http->referer = $single_page_url; | ||
1109 | if (($response = $http->get($single_page_url, true)) && $response['status_code'] < 300) { | ||
1110 | $http->referer = $_prev_ref; | ||
1111 | return $response; | ||
1112 | } | ||
1113 | $http->referer = $_prev_ref; | ||
1114 | } | ||
1115 | } | ||
1116 | } | ||
1117 | return false; | ||
1118 | } | ||
1119 | |||
1120 | // based on content-type http header, decide what to do | ||
1121 | // param: HTTP headers string | ||
1122 | // return: array with keys: 'mime', 'type', 'subtype', 'action', 'name' | ||
1123 | // e.g. array('mime'=>'image/jpeg', 'type'=>'image', 'subtype'=>'jpeg', 'action'=>'link', 'name'=>'Image') | ||
1124 | function get_mime_action_info($headers) { | ||
1125 | global $options; | ||
1126 | // check if action defined for returned Content-Type | ||
1127 | $info = array(); | ||
1128 | if (preg_match('!^Content-Type:\s*(([-\w]+)/([-\w\+]+))!im', $headers, $match)) { | ||
1129 | // look for full mime type (e.g. image/jpeg) or just type (e.g. image) | ||
1130 | // match[1] = full mime type, e.g. image/jpeg | ||
1131 | // match[2] = first part, e.g. image | ||
1132 | // match[3] = last part, e.g. jpeg | ||
1133 | $info['mime'] = strtolower(trim($match[1])); | ||
1134 | $info['type'] = strtolower(trim($match[2])); | ||
1135 | $info['subtype'] = strtolower(trim($match[3])); | ||
1136 | foreach (array($info['mime'], $info['type']) as $_mime) { | ||
1137 | if (isset($options->content_type_exc[$_mime])) { | ||
1138 | $info['action'] = $options->content_type_exc[$_mime]['action']; | ||
1139 | $info['name'] = $options->content_type_exc[$_mime]['name']; | ||
1140 | break; | ||
1141 | } | ||
1142 | } | ||
1143 | } | ||
1144 | return $info; | ||
1145 | } | ||
1146 | |||
1147 | function remove_url_cruft($url) { | ||
1148 | // remove google analytics for the time being | ||
1149 | // regex adapted from http://navitronic.co.uk/2010/12/removing-google-analytics-cruft-from-urls/ | ||
1150 | // https://gist.github.com/758177 | ||
1151 | return preg_replace('/(\?|\&)utm_[a-z]+=[^\&]+/', '', $url); | ||
1152 | } | ||
1153 | |||
1154 | function make_substitutions($string) { | ||
1155 | if ($string == '') return $string; | ||
1156 | global $item, $effective_url; | ||
1157 | $string = str_replace('{url}', htmlspecialchars($item->get_permalink()), $string); | ||
1158 | $string = str_replace('{effective-url}', htmlspecialchars($effective_url), $string); | ||
1159 | return $string; | ||
1160 | } | ||
1161 | |||
1162 | function get_cache() { | ||
1163 | global $options, $valid_key; | ||
1164 | static $cache = null; | ||
1165 | if ($cache === null) { | ||
1166 | $frontendOptions = array( | ||
1167 | 'lifetime' => 10*60, // cache lifetime of 10 minutes | ||
1168 | 'automatic_serialization' => false, | ||
1169 | 'write_control' => false, | ||
1170 | 'automatic_cleaning_factor' => $options->cache_cleanup, | ||
1171 | 'ignore_user_abort' => false | ||
1172 | ); | ||
1173 | $backendOptions = array( | ||
1174 | 'cache_dir' => ($valid_key) ? $options->cache_dir.'/rss-with-key/' : $options->cache_dir.'/rss/', // directory where to put the cache files | ||
1175 | 'file_locking' => false, | ||
1176 | 'read_control' => true, | ||
1177 | 'read_control_type' => 'strlen', | ||
1178 | 'hashed_directory_level' => $options->cache_directory_level, | ||
1179 | 'hashed_directory_perm' => 0777, | ||
1180 | 'cache_file_perm' => 0664, | ||
1181 | 'file_name_prefix' => 'ff' | ||
1182 | ); | ||
1183 | // getting a Zend_Cache_Core object | ||
1184 | $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); | ||
1185 | } | ||
1186 | return $cache; | ||
1187 | } | ||
1188 | |||
1189 | function debug($msg) { | ||
1190 | global $debug_mode; | ||
1191 | if ($debug_mode) { | ||
1192 | echo '* ',$msg,"\n"; | ||
1193 | ob_flush(); | ||
1194 | flush(); | ||
1195 | } | ||
1196 | } \ No newline at end of file | ||
diff --git a/inc/3rdparty/makefulltextfeedHelpers.php b/inc/3rdparty/makefulltextfeedHelpers.php new file mode 100755 index 00000000..1c11b8f6 --- /dev/null +++ b/inc/3rdparty/makefulltextfeedHelpers.php | |||
@@ -0,0 +1,355 @@ | |||
1 | <?php | ||
2 | |||
3 | // Autoloading of classes allows us to include files only when they're | ||
4 | // needed. If we've got a cached copy, for example, only Zend_Cache is loaded. | ||
5 | function autoload($class_name) { | ||
6 | static $dir = null; | ||
7 | if ($dir === null) $dir = dirname(__FILE__).'/libraries/'; | ||
8 | static $mapping = array( | ||
9 | // Include FeedCreator for RSS/Atom creation | ||
10 | 'FeedWriter' => 'feedwriter/FeedWriter.php', | ||
11 | 'FeedItem' => 'feedwriter/FeedItem.php', | ||
12 | // Include ContentExtractor and Readability for identifying and extracting content from URLs | ||
13 | 'ContentExtractor' => 'content-extractor/ContentExtractor.php', | ||
14 | 'SiteConfig' => 'content-extractor/SiteConfig.php', | ||
15 | 'Readability' => 'readability/Readability.php', | ||
16 | // Include Humble HTTP Agent to allow parallel requests and response caching | ||
17 | 'HumbleHttpAgent' => 'humble-http-agent/HumbleHttpAgent.php', | ||
18 | 'SimplePie_HumbleHttpAgent' => 'humble-http-agent/SimplePie_HumbleHttpAgent.php', | ||
19 | 'CookieJar' => 'humble-http-agent/CookieJar.php', | ||
20 | // Include Zend Cache to improve performance (cache results) | ||
21 | 'Zend_Cache' => 'Zend/Cache.php', | ||
22 | // Language detect | ||
23 | 'Text_LanguageDetect' => 'language-detect/LanguageDetect.php', | ||
24 | // HTML5 Lib | ||
25 | 'HTML5_Parser' => 'html5/Parser.php', | ||
26 | // htmLawed - used if XSS filter is enabled (xss_filter) | ||
27 | 'htmLawed' => 'htmLawed/htmLawed.php' | ||
28 | ); | ||
29 | if (isset($mapping[$class_name])) { | ||
30 | debug("** Loading class $class_name ({$mapping[$class_name]})"); | ||
31 | require $dir.$mapping[$class_name]; | ||
32 | return true; | ||
33 | } else { | ||
34 | return false; | ||
35 | } | ||
36 | } | ||
37 | spl_autoload_register('autoload'); | ||
38 | require dirname(__FILE__).'/libraries/simplepie/autoloader.php'; | ||
39 | |||
40 | |||
41 | class DummySingleItemFeed { | ||
42 | public $item; | ||
43 | function __construct($url) { $this->item = new DummySingleItem($url); } | ||
44 | public function get_title() { return ''; } | ||
45 | public function get_description() { return 'Content extracted from '.$this->item->url; } | ||
46 | public function get_link() { return $this->item->url; } | ||
47 | public function get_language() { return false; } | ||
48 | public function get_image_url() { return false; } | ||
49 | public function get_items($start=0, $max=1) { return array(0=>$this->item); } | ||
50 | } | ||
51 | class DummySingleItem { | ||
52 | public $url; | ||
53 | function __construct($url) { $this->url = $url; } | ||
54 | public function get_permalink() { return $this->url; } | ||
55 | public function get_title() { return null; } | ||
56 | public function get_date($format='') { return false; } | ||
57 | public function get_author($key=0) { return null; } | ||
58 | public function get_authors() { return null; } | ||
59 | public function get_description() { return ''; } | ||
60 | public function get_enclosure($key=0, $prefer=null) { return null; } | ||
61 | public function get_enclosures() { return null; } | ||
62 | public function get_categories() { return null; } | ||
63 | } | ||
64 | |||
65 | /////////////////////////////// | ||
66 | // HELPER FUNCTIONS | ||
67 | /////////////////////////////// | ||
68 | |||
69 | function url_allowed($url) { | ||
70 | global $options; | ||
71 | if (!empty($options->allowed_urls)) { | ||
72 | $allowed = false; | ||
73 | foreach ($options->allowed_urls as $allowurl) { | ||
74 | if (stristr($url, $allowurl) !== false) { | ||
75 | $allowed = true; | ||
76 | break; | ||
77 | } | ||
78 | } | ||
79 | if (!$allowed) return false; | ||
80 | } else { | ||
81 | foreach ($options->blocked_urls as $blockurl) { | ||
82 | if (stristr($url, $blockurl) !== false) { | ||
83 | return false; | ||
84 | } | ||
85 | } | ||
86 | } | ||
87 | return true; | ||
88 | } | ||
89 | |||
90 | ////////////////////////////////////////////// | ||
91 | // Convert $html to UTF8 | ||
92 | // (uses HTTP headers and HTML to find encoding) | ||
93 | // adapted from http://stackoverflow.com/questions/910793/php-detect-encoding-and-make-everything-utf-8 | ||
94 | ////////////////////////////////////////////// | ||
95 | function convert_to_utf8($html, $header=null) | ||
96 | { | ||
97 | $encoding = null; | ||
98 | if ($html || $header) { | ||
99 | if (is_array($header)) $header = implode("\n", $header); | ||
100 | if (!$header || !preg_match_all('/^Content-Type:\s+([^;]+)(?:;\s*charset=["\']?([^;"\'\n]*))?/im', $header, $match, PREG_SET_ORDER)) { | ||
101 | // error parsing the response | ||
102 | debug('Could not find Content-Type header in HTTP response'); | ||
103 | } else { | ||
104 | $match = end($match); // get last matched element (in case of redirects) | ||
105 | if (isset($match[2])) $encoding = trim($match[2], "\"' \r\n\0\x0B\t"); | ||
106 | } | ||
107 | // TODO: check to see if encoding is supported (can we convert it?) | ||
108 | // If it's not, result will be empty string. | ||
109 | // For now we'll check for invalid encoding types returned by some sites, e.g. 'none' | ||
110 | // Problem URL: http://facta.co.jp/blog/archives/20111026001026.html | ||
111 | if (!$encoding || $encoding == 'none') { | ||
112 | // search for encoding in HTML - only look at the first 50000 characters | ||
113 | // Why 50000? See, for example, http://www.lemonde.fr/festival-de-cannes/article/2012/05/23/deux-cretes-en-goguette-sur-la-croisette_1705732_766360.html | ||
114 | // TODO: improve this so it looks at smaller chunks first | ||
115 | $html_head = substr($html, 0, 50000); | ||
116 | if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $html_head, $match)) { | ||
117 | $encoding = trim($match[1], '"\''); | ||
118 | } elseif (preg_match('/<meta\s+http-equiv=["\']?Content-Type["\']? content=["\'][^;]+;\s*charset=["\']?([^;"\'>]+)/i', $html_head, $match)) { | ||
119 | $encoding = trim($match[1]); | ||
120 | } elseif (preg_match_all('/<meta\s+([^>]+)>/i', $html_head, $match)) { | ||
121 | foreach ($match[1] as $_test) { | ||
122 | if (preg_match('/charset=["\']?([^"\']+)/i', $_test, $_m)) { | ||
123 | $encoding = trim($_m[1]); | ||
124 | break; | ||
125 | } | ||
126 | } | ||
127 | } | ||
128 | } | ||
129 | if (isset($encoding)) $encoding = trim($encoding); | ||
130 | // trim is important here! | ||
131 | if (!$encoding || (strtolower($encoding) == 'iso-8859-1')) { | ||
132 | // replace MS Word smart qutoes | ||
133 | $trans = array(); | ||
134 | $trans[chr(130)] = '‚'; // Single Low-9 Quotation Mark | ||
135 | $trans[chr(131)] = 'ƒ'; // Latin Small Letter F With Hook | ||
136 | $trans[chr(132)] = '„'; // Double Low-9 Quotation Mark | ||
137 | $trans[chr(133)] = '…'; // Horizontal Ellipsis | ||
138 | $trans[chr(134)] = '†'; // Dagger | ||
139 | $trans[chr(135)] = '‡'; // Double Dagger | ||
140 | $trans[chr(136)] = 'ˆ'; // Modifier Letter Circumflex Accent | ||
141 | $trans[chr(137)] = '‰'; // Per Mille Sign | ||
142 | $trans[chr(138)] = 'Š'; // Latin Capital Letter S With Caron | ||
143 | $trans[chr(139)] = '‹'; // Single Left-Pointing Angle Quotation Mark | ||
144 | $trans[chr(140)] = 'Œ'; // Latin Capital Ligature OE | ||
145 | $trans[chr(145)] = '‘'; // Left Single Quotation Mark | ||
146 | $trans[chr(146)] = '’'; // Right Single Quotation Mark | ||
147 | $trans[chr(147)] = '“'; // Left Double Quotation Mark | ||
148 | $trans[chr(148)] = '”'; // Right Double Quotation Mark | ||
149 | $trans[chr(149)] = '•'; // Bullet | ||
150 | $trans[chr(150)] = '–'; // En Dash | ||
151 | $trans[chr(151)] = '—'; // Em Dash | ||
152 | $trans[chr(152)] = '˜'; // Small Tilde | ||
153 | $trans[chr(153)] = '™'; // Trade Mark Sign | ||
154 | $trans[chr(154)] = 'š'; // Latin Small Letter S With Caron | ||
155 | $trans[chr(155)] = '›'; // Single Right-Pointing Angle Quotation Mark | ||
156 | $trans[chr(156)] = 'œ'; // Latin Small Ligature OE | ||
157 | $trans[chr(159)] = 'Ÿ'; // Latin Capital Letter Y With Diaeresis | ||
158 | $html = strtr($html, $trans); | ||
159 | } | ||
160 | if (!$encoding) { | ||
161 | debug('No character encoding found, so treating as UTF-8'); | ||
162 | $encoding = 'utf-8'; | ||
163 | } else { | ||
164 | debug('Character encoding: '.$encoding); | ||
165 | if (strtolower($encoding) != 'utf-8') { | ||
166 | debug('Converting to UTF-8'); | ||
167 | $html = SimplePie_Misc::change_encoding($html, $encoding, 'utf-8'); | ||
168 | /* | ||
169 | if (function_exists('iconv')) { | ||
170 | // iconv appears to handle certain character encodings better than mb_convert_encoding | ||
171 | $html = iconv($encoding, 'utf-8', $html); | ||
172 | } else { | ||
173 | $html = mb_convert_encoding($html, 'utf-8', $encoding); | ||
174 | } | ||
175 | */ | ||
176 | } | ||
177 | } | ||
178 | } | ||
179 | return $html; | ||
180 | } | ||
181 | |||
182 | function makeAbsolute($base, $elem) { | ||
183 | $base = new SimplePie_IRI($base); | ||
184 | // remove '//' in URL path (used to prevent URLs from resolving properly) | ||
185 | // TODO: check if this is still the case | ||
186 | if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path); | ||
187 | foreach(array('a'=>'href', 'img'=>'src') as $tag => $attr) { | ||
188 | $elems = $elem->getElementsByTagName($tag); | ||
189 | for ($i = $elems->length-1; $i >= 0; $i--) { | ||
190 | $e = $elems->item($i); | ||
191 | //$e->parentNode->replaceChild($articleContent->ownerDocument->createTextNode($e->textContent), $e); | ||
192 | makeAbsoluteAttr($base, $e, $attr); | ||
193 | } | ||
194 | if (strtolower($elem->tagName) == $tag) makeAbsoluteAttr($base, $elem, $attr); | ||
195 | } | ||
196 | } | ||
197 | function makeAbsoluteAttr($base, $e, $attr) { | ||
198 | if ($e->hasAttribute($attr)) { | ||
199 | // Trim leading and trailing white space. I don't really like this but | ||
200 | // unfortunately it does appear on some sites. e.g. <img src=" /path/to/image.jpg" /> | ||
201 | $url = trim(str_replace('%20', ' ', $e->getAttribute($attr))); | ||
202 | $url = str_replace(' ', '%20', $url); | ||
203 | if (!preg_match('!https?://!i', $url)) { | ||
204 | if ($absolute = SimplePie_IRI::absolutize($base, $url)) { | ||
205 | $e->setAttribute($attr, $absolute); | ||
206 | } | ||
207 | } | ||
208 | } | ||
209 | } | ||
210 | function makeAbsoluteStr($base, $url) { | ||
211 | $base = new SimplePie_IRI($base); | ||
212 | // remove '//' in URL path (causes URLs not to resolve properly) | ||
213 | if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path); | ||
214 | if (preg_match('!^https?://!i', $url)) { | ||
215 | // already absolute | ||
216 | return $url; | ||
217 | } else { | ||
218 | if ($absolute = SimplePie_IRI::absolutize($base, $url)) { | ||
219 | return $absolute; | ||
220 | } | ||
221 | return false; | ||
222 | } | ||
223 | } | ||
224 | // returns single page response, or false if not found | ||
225 | function getSinglePage($item, $html, $url) { | ||
226 | global $http, $extractor; | ||
227 | debug('Looking for site config files to see if single page link exists'); | ||
228 | $site_config = $extractor->buildSiteConfig($url, $html); | ||
229 | $splink = null; | ||
230 | if (!empty($site_config->single_page_link)) { | ||
231 | $splink = $site_config->single_page_link; | ||
232 | } elseif (!empty($site_config->single_page_link_in_feed)) { | ||
233 | // single page link xpath is targeted at feed | ||
234 | $splink = $site_config->single_page_link_in_feed; | ||
235 | // so let's replace HTML with feed item description | ||
236 | $html = $item->get_description(); | ||
237 | } | ||
238 | if (isset($splink)) { | ||
239 | // Build DOM tree from HTML | ||
240 | $readability = new Readability($html, $url); | ||
241 | $xpath = new DOMXPath($readability->dom); | ||
242 | // Loop through single_page_link xpath expressions | ||
243 | $single_page_url = null; | ||
244 | foreach ($splink as $pattern) { | ||
245 | $elems = @$xpath->evaluate($pattern, $readability->dom); | ||
246 | if (is_string($elems)) { | ||
247 | $single_page_url = trim($elems); | ||
248 | break; | ||
249 | } elseif ($elems instanceof DOMNodeList && $elems->length > 0) { | ||
250 | foreach ($elems as $item) { | ||
251 | if ($item instanceof DOMElement && $item->hasAttribute('href')) { | ||
252 | $single_page_url = $item->getAttribute('href'); | ||
253 | break 2; | ||
254 | } elseif ($item instanceof DOMAttr && $item->value) { | ||
255 | $single_page_url = $item->value; | ||
256 | break 2; | ||
257 | } | ||
258 | } | ||
259 | } | ||
260 | } | ||
261 | // If we've got URL, resolve against $url | ||
262 | if (isset($single_page_url) && ($single_page_url = makeAbsoluteStr($url, $single_page_url))) { | ||
263 | // check it's not what we have already! | ||
264 | if ($single_page_url != $url) { | ||
265 | // it's not, so let's try to fetch it... | ||
266 | $_prev_ref = $http->referer; | ||
267 | $http->referer = $single_page_url; | ||
268 | if (($response = $http->get($single_page_url, true)) && $response['status_code'] < 300) { | ||
269 | $http->referer = $_prev_ref; | ||
270 | return $response; | ||
271 | } | ||
272 | $http->referer = $_prev_ref; | ||
273 | } | ||
274 | } | ||
275 | } | ||
276 | return false; | ||
277 | } | ||
278 | |||
279 | // based on content-type http header, decide what to do | ||
280 | // param: HTTP headers string | ||
281 | // return: array with keys: 'mime', 'type', 'subtype', 'action', 'name' | ||
282 | // e.g. array('mime'=>'image/jpeg', 'type'=>'image', 'subtype'=>'jpeg', 'action'=>'link', 'name'=>'Image') | ||
283 | function get_mime_action_info($headers) { | ||
284 | global $options; | ||
285 | // check if action defined for returned Content-Type | ||
286 | $info = array(); | ||
287 | if (preg_match('!^Content-Type:\s*(([-\w]+)/([-\w\+]+))!im', $headers, $match)) { | ||
288 | // look for full mime type (e.g. image/jpeg) or just type (e.g. image) | ||
289 | // match[1] = full mime type, e.g. image/jpeg | ||
290 | // match[2] = first part, e.g. image | ||
291 | // match[3] = last part, e.g. jpeg | ||
292 | $info['mime'] = strtolower(trim($match[1])); | ||
293 | $info['type'] = strtolower(trim($match[2])); | ||
294 | $info['subtype'] = strtolower(trim($match[3])); | ||
295 | foreach (array($info['mime'], $info['type']) as $_mime) { | ||
296 | if (isset($options->content_type_exc[$_mime])) { | ||
297 | $info['action'] = $options->content_type_exc[$_mime]['action']; | ||
298 | $info['name'] = $options->content_type_exc[$_mime]['name']; | ||
299 | break; | ||
300 | } | ||
301 | } | ||
302 | } | ||
303 | return $info; | ||
304 | } | ||
305 | |||
306 | function remove_url_cruft($url) { | ||
307 | // remove google analytics for the time being | ||
308 | // regex adapted from http://navitronic.co.uk/2010/12/removing-google-analytics-cruft-from-urls/ | ||
309 | // https://gist.github.com/758177 | ||
310 | return preg_replace('/(\?|\&)utm_[a-z]+=[^\&]+/', '', $url); | ||
311 | } | ||
312 | |||
313 | function make_substitutions($string) { | ||
314 | if ($string == '') return $string; | ||
315 | global $item, $effective_url; | ||
316 | $string = str_replace('{url}', htmlspecialchars($item->get_permalink()), $string); | ||
317 | $string = str_replace('{effective-url}', htmlspecialchars($effective_url), $string); | ||
318 | return $string; | ||
319 | } | ||
320 | |||
321 | function get_cache() { | ||
322 | global $options, $valid_key; | ||
323 | static $cache = null; | ||
324 | if ($cache === null) { | ||
325 | $frontendOptions = array( | ||
326 | 'lifetime' => 10*60, // cache lifetime of 10 minutes | ||
327 | 'automatic_serialization' => false, | ||
328 | 'write_control' => false, | ||
329 | 'automatic_cleaning_factor' => $options->cache_cleanup, | ||
330 | 'ignore_user_abort' => false | ||
331 | ); | ||
332 | $backendOptions = array( | ||
333 | 'cache_dir' => ($valid_key) ? $options->cache_dir.'/rss-with-key/' : $options->cache_dir.'/rss/', // directory where to put the cache files | ||
334 | 'file_locking' => false, | ||
335 | 'read_control' => true, | ||
336 | 'read_control_type' => 'strlen', | ||
337 | 'hashed_directory_level' => $options->cache_directory_level, | ||
338 | 'hashed_directory_perm' => 0777, | ||
339 | 'cache_file_perm' => 0664, | ||
340 | 'file_name_prefix' => 'ff' | ||
341 | ); | ||
342 | // getting a Zend_Cache_Core object | ||
343 | $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); | ||
344 | } | ||
345 | return $cache; | ||
346 | } | ||
347 | |||
348 | function debug($msg) { | ||
349 | global $debug_mode; | ||
350 | if ($debug_mode) { | ||
351 | echo '* ',$msg,"\n"; | ||
352 | ob_flush(); | ||
353 | flush(); | ||
354 | } | ||
355 | } | ||
diff --git a/inc/poche/Database.class.php b/inc/poche/Database.class.php index c998fe14..6244df88 100755 --- a/inc/poche/Database.class.php +++ b/inc/poche/Database.class.php | |||
@@ -18,7 +18,7 @@ class Database { | |||
18 | 'default' => 'ORDER BY entries.id' | 18 | 'default' => 'ORDER BY entries.id' |
19 | ); | 19 | ); |
20 | 20 | ||
21 | function __construct() | 21 | function __construct() |
22 | { | 22 | { |
23 | switch (STORAGE) { | 23 | switch (STORAGE) { |
24 | case 'sqlite': | 24 | case 'sqlite': |
@@ -27,11 +27,11 @@ class Database { | |||
27 | break; | 27 | break; |
28 | case 'mysql': | 28 | case 'mysql': |
29 | $db_path = 'mysql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB; | 29 | $db_path = 'mysql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB; |
30 | $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD); | 30 | $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD); |
31 | break; | 31 | break; |
32 | case 'postgres': | 32 | case 'postgres': |
33 | $db_path = 'pgsql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB; | 33 | $db_path = 'pgsql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB; |
34 | $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD); | 34 | $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD); |
35 | break; | 35 | break; |
36 | } | 36 | } |
37 | 37 | ||
@@ -51,7 +51,7 @@ class Database { | |||
51 | } | 51 | } |
52 | $hasAdmin = count($query->fetchAll()); | 52 | $hasAdmin = count($query->fetchAll()); |
53 | 53 | ||
54 | if ($hasAdmin == 0) | 54 | if ($hasAdmin == 0) |
55 | return false; | 55 | return false; |
56 | 56 | ||
57 | return true; | 57 | return true; |
@@ -140,7 +140,7 @@ class Database { | |||
140 | $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)'; | 140 | $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)'; |
141 | $params = array($id_user, 'language', LANG); | 141 | $params = array($id_user, 'language', LANG); |
142 | $query = $this->executeQuery($sql, $params); | 142 | $query = $this->executeQuery($sql, $params); |
143 | 143 | ||
144 | $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)'; | 144 | $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)'; |
145 | $params = array($id_user, 'theme', DEFAULT_THEME); | 145 | $params = array($id_user, 'theme', DEFAULT_THEME); |
146 | $query = $this->executeQuery($sql, $params); | 146 | $query = $this->executeQuery($sql, $params); |
@@ -153,7 +153,7 @@ class Database { | |||
153 | $query = $this->executeQuery($sql, array($id)); | 153 | $query = $this->executeQuery($sql, array($id)); |
154 | $result = $query->fetchAll(); | 154 | $result = $query->fetchAll(); |
155 | $user_config = array(); | 155 | $user_config = array(); |
156 | 156 | ||
157 | foreach ($result as $key => $value) { | 157 | foreach ($result as $key => $value) { |
158 | $user_config[$value['name']] = $value['value']; | 158 | $user_config[$value['name']] = $value['value']; |
159 | } | 159 | } |
@@ -201,10 +201,10 @@ class Database { | |||
201 | $params_update = array($password, $userId); | 201 | $params_update = array($password, $userId); |
202 | $query = $this->executeQuery($sql_update, $params_update); | 202 | $query = $this->executeQuery($sql_update, $params_update); |
203 | } | 203 | } |
204 | 204 | ||
205 | public function updateUserConfig($userId, $key, $value) { | 205 | public function updateUserConfig($userId, $key, $value) { |
206 | $config = $this->getConfigUser($userId); | 206 | $config = $this->getConfigUser($userId); |
207 | 207 | ||
208 | if (! isset($config[$key])) { | 208 | if (! isset($config[$key])) { |
209 | $sql = "INSERT INTO users_config (value, user_id, name) VALUES (?, ?, ?)"; | 209 | $sql = "INSERT INTO users_config (value, user_id, name) VALUES (?, ?, ?)"; |
210 | } | 210 | } |
@@ -230,6 +230,36 @@ class Database { | |||
230 | } | 230 | } |
231 | } | 231 | } |
232 | 232 | ||
233 | public function updateContentAndTitle($id, $title, $body, $user_id) { | ||
234 | $sql_action = 'UPDATE entries SET content = ?, title = ? WHERE id=? AND user_id=?'; | ||
235 | $params_action = array($body, $title, $id, $user_id); | ||
236 | $query = $this->executeQuery($sql_action, $params_action); | ||
237 | |||
238 | return $query; | ||
239 | } | ||
240 | |||
241 | public function retrieveUnfetchedEntries($user_id, $limit) { | ||
242 | |||
243 | $sql_limit = "LIMIT 0,".$limit; | ||
244 | if (STORAGE == 'postgres') { | ||
245 | $sql_limit = "LIMIT ".$limit." OFFSET 0"; | ||
246 | } | ||
247 | |||
248 | $sql = "SELECT * FROM entries WHERE (content = '' OR content IS NULL) AND user_id=? ORDER BY id " . $sql_limit; | ||
249 | $query = $this->executeQuery($sql, array($user_id)); | ||
250 | $entries = $query->fetchAll(); | ||
251 | |||
252 | return $entries; | ||
253 | } | ||
254 | |||
255 | public function retrieveUnfetchedEntriesCount($user_id) { | ||
256 | $sql = "SELECT count(*) FROM entries WHERE (content = '' OR content IS NULL) AND user_id=?"; | ||
257 | $query = $this->executeQuery($sql, array($user_id)); | ||
258 | list($count) = $query->fetch(); | ||
259 | |||
260 | return $count; | ||
261 | } | ||
262 | |||
233 | public function retrieveAll($user_id) { | 263 | public function retrieveAll($user_id) { |
234 | $sql = "SELECT * FROM entries WHERE user_id=? ORDER BY id"; | 264 | $sql = "SELECT * FROM entries WHERE user_id=? ORDER BY id"; |
235 | $query = $this->executeQuery($sql, array($user_id)); | 265 | $query = $this->executeQuery($sql, array($user_id)); |
@@ -294,24 +324,24 @@ class Database { | |||
294 | return $entries; | 324 | return $entries; |
295 | } | 325 | } |
296 | 326 | ||
297 | public function getEntriesByViewCount($view, $user_id, $tag_id = 0) { | 327 | public function getEntriesByViewCount($view, $user_id, $tag_id = 0) { |
298 | switch ($view) { | 328 | switch ($view) { |
299 | case 'archive': | 329 | case 'archive': |
300 | $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? "; | 330 | $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? "; |
301 | $params = array($user_id, 1); | 331 | $params = array($user_id, 1); |
302 | break; | 332 | break; |
303 | case 'fav' : | 333 | case 'fav' : |
304 | $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_fav=? "; | 334 | $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_fav=? "; |
305 | $params = array($user_id, 1); | 335 | $params = array($user_id, 1); |
306 | break; | 336 | break; |
307 | case 'tag' : | 337 | case 'tag' : |
308 | $sql = "SELECT count(*) FROM entries | 338 | $sql = "SELECT count(*) FROM entries |
309 | LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id | 339 | LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id |
310 | WHERE entries.user_id=? AND tags_entries.tag_id = ? "; | 340 | WHERE entries.user_id=? AND tags_entries.tag_id = ? "; |
311 | $params = array($user_id, $tag_id); | 341 | $params = array($user_id, $tag_id); |
312 | break; | 342 | break; |
313 | default: | 343 | default: |
314 | $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? "; | 344 | $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? "; |
315 | $params = array($user_id, 0); | 345 | $params = array($user_id, 0); |
316 | break; | 346 | break; |
317 | } | 347 | } |
@@ -319,7 +349,7 @@ class Database { | |||
319 | $query = $this->executeQuery($sql, $params); | 349 | $query = $this->executeQuery($sql, $params); |
320 | list($count) = $query->fetch(); | 350 | list($count) = $query->fetch(); |
321 | 351 | ||
322 | return $count; | 352 | return $count; |
323 | } | 353 | } |
324 | 354 | ||
325 | public function updateContent($id, $content, $user_id) { | 355 | public function updateContent($id, $content, $user_id) { |
@@ -329,11 +359,24 @@ class Database { | |||
329 | return $query; | 359 | return $query; |
330 | } | 360 | } |
331 | 361 | ||
332 | public function add($url, $title, $content, $user_id) { | 362 | /** |
333 | $sql_action = 'INSERT INTO entries ( url, title, content, user_id ) VALUES (?, ?, ?, ?)'; | 363 | * |
334 | $params_action = array($url, $title, $content, $user_id); | 364 | * @param string $url |
335 | $query = $this->executeQuery($sql_action, $params_action); | 365 | * @param string $title |
336 | return $query; | 366 | * @param string $content |
367 | * @param integer $user_id | ||
368 | * @return integer $id of inserted record | ||
369 | */ | ||
370 | public function add($url, $title, $content, $user_id, $isFavorite=0, $isRead=0) { | ||
371 | $sql_action = 'INSERT INTO entries ( url, title, content, user_id, is_fav, is_read ) VALUES (?, ?, ?, ?, ?, ?)'; | ||
372 | $params_action = array($url, $title, $content, $user_id, $isFavorite, $isRead); | ||
373 | if ( !$this->executeQuery($sql_action, $params_action) ) { | ||
374 | $id = null; | ||
375 | } | ||
376 | else { | ||
377 | $id = intval($this->getLastId( (STORAGE == 'postgres') ? 'users_id_seq' : '' )); | ||
378 | } | ||
379 | return $id; | ||
337 | } | 380 | } |
338 | 381 | ||
339 | public function deleteById($id, $user_id) { | 382 | public function deleteById($id, $user_id) { |
@@ -364,13 +407,25 @@ class Database { | |||
364 | public function getLastId($column = '') { | 407 | public function getLastId($column = '') { |
365 | return $this->getHandle()->lastInsertId($column); | 408 | return $this->getHandle()->lastInsertId($column); |
366 | } | 409 | } |
410 | |||
411 | public function search($term, $user_id, $limit = '') { | ||
412 | $search = '%'.$term.'%'; | ||
413 | $sql_action = "SELECT * FROM entries WHERE user_id=? AND (content LIKE ? OR title LIKE ? OR url LIKE ?) "; //searches in content, title and URL | ||
414 | $sql_action .= $this->getEntriesOrder().' ' . $limit; | ||
415 | $params_action = array($user_id, $search, $search, $search); | ||
416 | $query = $this->executeQuery($sql_action, $params_action); | ||
417 | return $query->fetchAll(); | ||
418 | } | ||
367 | 419 | ||
368 | public function retrieveAllTags($user_id) { | 420 | public function retrieveAllTags($user_id, $term = null) { |
369 | $sql = "SELECT DISTINCT tags.* FROM tags | 421 | $sql = "SELECT DISTINCT tags.*, count(entries.id) AS entriescount FROM tags |
370 | LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id | 422 | LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id |
371 | LEFT JOIN entries ON tags_entries.entry_id=entries.id | 423 | LEFT JOIN entries ON tags_entries.entry_id=entries.id |
372 | WHERE entries.user_id=?"; | 424 | WHERE entries.user_id=? |
373 | $query = $this->executeQuery($sql, array($user_id)); | 425 | ". (($term) ? "AND lower(tags.value) LIKE ?" : '') ." |
426 | GROUP BY tags.id, tags.value | ||
427 | ORDER BY tags.value"; | ||
428 | $query = $this->executeQuery($sql, (($term)? array($user_id, strtolower('%'.$term.'%')) : array($user_id) )); | ||
374 | $tags = $query->fetchAll(); | 429 | $tags = $query->fetchAll(); |
375 | 430 | ||
376 | return $tags; | 431 | return $tags; |
@@ -390,7 +445,7 @@ class Database { | |||
390 | } | 445 | } |
391 | 446 | ||
392 | public function retrieveEntriesByTag($tag_id, $user_id) { | 447 | public function retrieveEntriesByTag($tag_id, $user_id) { |
393 | $sql = | 448 | $sql = |
394 | "SELECT entries.* FROM entries | 449 | "SELECT entries.* FROM entries |
395 | LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id | 450 | LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id |
396 | WHERE tags_entries.tag_id = ? AND entries.user_id=?"; | 451 | WHERE tags_entries.tag_id = ? AND entries.user_id=?"; |
@@ -401,7 +456,7 @@ class Database { | |||
401 | } | 456 | } |
402 | 457 | ||
403 | public function retrieveTagsByEntry($entry_id) { | 458 | public function retrieveTagsByEntry($entry_id) { |
404 | $sql = | 459 | $sql = |
405 | "SELECT tags.* FROM tags | 460 | "SELECT tags.* FROM tags |
406 | LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id | 461 | LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id |
407 | WHERE tags_entries.entry_id = ?"; | 462 | WHERE tags_entries.entry_id = ?"; |
diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php index 34f2ff5a..a662f695 100755 --- a/inc/poche/Poche.class.php +++ b/inc/poche/Poche.class.php | |||
@@ -18,7 +18,7 @@ class Poche | |||
18 | public $tpl; | 18 | public $tpl; |
19 | public $messages; | 19 | public $messages; |
20 | public $pagination; | 20 | public $pagination; |
21 | 21 | ||
22 | private $currentTheme = ''; | 22 | private $currentTheme = ''; |
23 | private $currentLanguage = ''; | 23 | private $currentLanguage = ''; |
24 | private $notInstalledMessage = array(); | 24 | private $notInstalledMessage = array(); |
@@ -32,20 +32,21 @@ class Poche | |||
32 | 'fr_FR.utf8' => 'Français', | 32 | 'fr_FR.utf8' => 'Français', |
33 | 'it_IT.utf8' => 'Italiano', | 33 | 'it_IT.utf8' => 'Italiano', |
34 | 'pl_PL.utf8' => 'Polski', | 34 | 'pl_PL.utf8' => 'Polski', |
35 | 'pt_BR.utf8' => 'Português (Brasil)', | ||
35 | 'ru_RU.utf8' => 'Pусский', | 36 | 'ru_RU.utf8' => 'Pусский', |
36 | 'sl_SI.utf8' => 'Slovenščina', | 37 | 'sl_SI.utf8' => 'Slovenščina', |
37 | 'uk_UA.utf8' => 'Українськ��й', | 38 | 'uk_UA.utf8' => 'Українськ��', |
38 | ); | 39 | ); |
39 | public function __construct() | 40 | public function __construct() |
40 | { | 41 | { |
41 | if ($this->configFileIsAvailable()) { | 42 | if ($this->configFileIsAvailable()) { |
42 | $this->init(); | 43 | $this->init(); |
43 | } | 44 | } |
44 | 45 | ||
45 | if ($this->themeIsInstalled()) { | 46 | if ($this->themeIsInstalled()) { |
46 | $this->initTpl(); | 47 | $this->initTpl(); |
47 | } | 48 | } |
48 | 49 | ||
49 | if ($this->systemIsInstalled()) { | 50 | if ($this->systemIsInstalled()) { |
50 | $this->store = new Database(); | 51 | $this->store = new Database(); |
51 | $this->messages = new Messages(); | 52 | $this->messages = new Messages(); |
@@ -56,12 +57,10 @@ class Poche | |||
56 | $this->store->checkTags(); | 57 | $this->store->checkTags(); |
57 | } | 58 | } |
58 | } | 59 | } |
59 | 60 | ||
60 | private function init() | 61 | private function init() |
61 | { | 62 | { |
62 | Tools::initPhp(); | 63 | Tools::initPhp(); |
63 | Session::$sessionName = 'poche'; | ||
64 | Session::init(); | ||
65 | 64 | ||
66 | if (isset($_SESSION['poche_user']) && $_SESSION['poche_user'] != array()) { | 65 | if (isset($_SESSION['poche_user']) && $_SESSION['poche_user'] != array()) { |
67 | $this->user = $_SESSION['poche_user']; | 66 | $this->user = $_SESSION['poche_user']; |
@@ -75,28 +74,28 @@ class Poche | |||
75 | $language = $this->user->getConfigValue('language'); | 74 | $language = $this->user->getConfigValue('language'); |
76 | putenv('LC_ALL=' . $language); | 75 | putenv('LC_ALL=' . $language); |
77 | setlocale(LC_ALL, $language); | 76 | setlocale(LC_ALL, $language); |
78 | bindtextdomain($language, LOCALE); | 77 | bindtextdomain($language, LOCALE); |
79 | textdomain($language); | 78 | textdomain($language); |
80 | 79 | ||
81 | # Pagination | 80 | # Pagination |
82 | $this->pagination = new Paginator($this->user->getConfigValue('pager'), 'p'); | 81 | $this->pagination = new Paginator($this->user->getConfigValue('pager'), 'p'); |
83 | 82 | ||
84 | # Set up theme | 83 | # Set up theme |
85 | $themeDirectory = $this->user->getConfigValue('theme'); | 84 | $themeDirectory = $this->user->getConfigValue('theme'); |
86 | 85 | ||
87 | if ($themeDirectory === false) { | 86 | if ($themeDirectory === false) { |
88 | $themeDirectory = DEFAULT_THEME; | 87 | $themeDirectory = DEFAULT_THEME; |
89 | } | 88 | } |
90 | 89 | ||
91 | $this->currentTheme = $themeDirectory; | 90 | $this->currentTheme = $themeDirectory; |
92 | 91 | ||
93 | # Set up language | 92 | # Set up language |
94 | $languageDirectory = $this->user->getConfigValue('language'); | 93 | $languageDirectory = $this->user->getConfigValue('language'); |
95 | 94 | ||
96 | if ($languageDirectory === false) { | 95 | if ($languageDirectory === false) { |
97 | $languageDirectory = DEFAULT_THEME; | 96 | $languageDirectory = DEFAULT_THEME; |
98 | } | 97 | } |
99 | 98 | ||
100 | $this->currentLanguage = $languageDirectory; | 99 | $this->currentLanguage = $languageDirectory; |
101 | } | 100 | } |
102 | 101 | ||
@@ -109,7 +108,7 @@ class Poche | |||
109 | 108 | ||
110 | return true; | 109 | return true; |
111 | } | 110 | } |
112 | 111 | ||
113 | public function themeIsInstalled() { | 112 | public function themeIsInstalled() { |
114 | $passTheme = TRUE; | 113 | $passTheme = TRUE; |
115 | # Twig is an absolute requirement for Poche to function. Abort immediately if the Composer installer hasn't been run yet | 114 | # Twig is an absolute requirement for Poche to function. Abort immediately if the Composer installer hasn't been run yet |
@@ -124,27 +123,27 @@ class Poche | |||
124 | self::$canRenderTemplates = false; | 123 | self::$canRenderTemplates = false; |
125 | 124 | ||
126 | $passTheme = FALSE; | 125 | $passTheme = FALSE; |
127 | } | 126 | } |
128 | 127 | ||
129 | # Check if the selected theme and its requirements are present | 128 | # Check if the selected theme and its requirements are present |
130 | $theme = $this->getTheme(); | 129 | $theme = $this->getTheme(); |
131 | 130 | ||
132 | if ($theme != '' && ! is_dir(THEME . '/' . $theme)) { | 131 | if ($theme != '' && ! is_dir(THEME . '/' . $theme)) { |
133 | $this->notInstalledMessage[] = 'The currently selected theme (' . $theme . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $theme . ')'; | 132 | $this->notInstalledMessage[] = 'The currently selected theme (' . $theme . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $theme . ')'; |
134 | 133 | ||
135 | self::$canRenderTemplates = false; | 134 | self::$canRenderTemplates = false; |
136 | 135 | ||
137 | $passTheme = FALSE; | 136 | $passTheme = FALSE; |
138 | } | 137 | } |
139 | 138 | ||
140 | $themeInfo = $this->getThemeInfo($theme); | 139 | $themeInfo = $this->getThemeInfo($theme); |
141 | if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { | 140 | if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { |
142 | foreach ($themeInfo['requirements'] as $requiredTheme) { | 141 | foreach ($themeInfo['requirements'] as $requiredTheme) { |
143 | if (! is_dir(THEME . '/' . $requiredTheme)) { | 142 | if (! is_dir(THEME . '/' . $requiredTheme)) { |
144 | $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'; | 143 | $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'; |
145 | 144 | ||
146 | self::$canRenderTemplates = false; | 145 | self::$canRenderTemplates = false; |
147 | 146 | ||
148 | $passTheme = FALSE; | 147 | $passTheme = FALSE; |
149 | } | 148 | } |
150 | } | 149 | } |
@@ -154,21 +153,21 @@ class Poche | |||
154 | return FALSE; | 153 | return FALSE; |
155 | } | 154 | } |
156 | 155 | ||
157 | 156 | ||
158 | return true; | 157 | return true; |
159 | } | 158 | } |
160 | 159 | ||
161 | /** | 160 | /** |
162 | * all checks before installation. | 161 | * all checks before installation. |
163 | * @todo move HTML to template | 162 | * @todo move HTML to template |
164 | * @return boolean | 163 | * @return boolean |
165 | */ | 164 | */ |
166 | public function systemIsInstalled() | 165 | public function systemIsInstalled() |
167 | { | 166 | { |
168 | $msg = TRUE; | 167 | $msg = TRUE; |
169 | 168 | ||
170 | $configSalt = defined('SALT') ? constant('SALT') : ''; | 169 | $configSalt = defined('SALT') ? constant('SALT') : ''; |
171 | 170 | ||
172 | if (empty($configSalt)) { | 171 | if (empty($configSalt)) { |
173 | $this->notInstalledMessage[] = 'You have not yet filled in the SALT value in the config.inc.php file.'; | 172 | $this->notInstalledMessage[] = 'You have not yet filled in the SALT value in the config.inc.php file.'; |
174 | $msg = FALSE; | 173 | $msg = FALSE; |
@@ -194,7 +193,7 @@ class Poche | |||
194 | 193 | ||
195 | return true; | 194 | return true; |
196 | } | 195 | } |
197 | 196 | ||
198 | public function getNotInstalledMessage() { | 197 | public function getNotInstalledMessage() { |
199 | return $this->notInstalledMessage; | 198 | return $this->notInstalledMessage; |
200 | } | 199 | } |
@@ -203,7 +202,7 @@ class Poche | |||
203 | { | 202 | { |
204 | $loaderChain = new Twig_Loader_Chain(); | 203 | $loaderChain = new Twig_Loader_Chain(); |
205 | $theme = $this->getTheme(); | 204 | $theme = $this->getTheme(); |
206 | 205 | ||
207 | # add the current theme as first to the loader chain so Twig will look there first for overridden template files | 206 | # add the current theme as first to the loader chain so Twig will look there first for overridden template files |
208 | try { | 207 | try { |
209 | $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $theme)); | 208 | $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $theme)); |
@@ -211,7 +210,7 @@ class Poche | |||
211 | # @todo isInstalled() should catch this, inject Twig later | 210 | # @todo isInstalled() should catch this, inject Twig later |
212 | die('The currently selected theme (' . $theme . ') does not seem to be properly installed (' . THEME . '/' . $theme .' is missing)'); | 211 | die('The currently selected theme (' . $theme . ') does not seem to be properly installed (' . THEME . '/' . $theme .' is missing)'); |
213 | } | 212 | } |
214 | 213 | ||
215 | # add all required themes to the loader chain | 214 | # add all required themes to the loader chain |
216 | $themeInfo = $this->getThemeInfo($theme); | 215 | $themeInfo = $this->getThemeInfo($theme); |
217 | if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { | 216 | if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { |
@@ -224,16 +223,16 @@ class Poche | |||
224 | } | 223 | } |
225 | } | 224 | } |
226 | } | 225 | } |
227 | 226 | ||
228 | if (DEBUG_POCHE) { | 227 | if (DEBUG_POCHE) { |
229 | $twigParams = array(); | 228 | $twigParams = array(); |
230 | } else { | 229 | } else { |
231 | $twigParams = array('cache' => CACHE); | 230 | $twigParams = array('cache' => CACHE); |
232 | } | 231 | } |
233 | 232 | ||
234 | $this->tpl = new Twig_Environment($loaderChain, $twigParams); | 233 | $this->tpl = new Twig_Environment($loaderChain, $twigParams); |
235 | $this->tpl->addExtension(new Twig_Extensions_Extension_I18n()); | 234 | $this->tpl->addExtension(new Twig_Extensions_Extension_I18n()); |
236 | 235 | ||
237 | # filter to display domain name of an url | 236 | # filter to display domain name of an url |
238 | $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain'); | 237 | $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain'); |
239 | $this->tpl->addFilter($filter); | 238 | $this->tpl->addFilter($filter); |
@@ -252,7 +251,7 @@ class Poche | |||
252 | 'poche_url' => Tools::getPocheUrl() | 251 | 'poche_url' => Tools::getPocheUrl() |
253 | )); | 252 | )); |
254 | if (isset($_GET['install'])) { | 253 | if (isset($_GET['install'])) { |
255 | if (($_POST['password'] == $_POST['password_repeat']) | 254 | if (($_POST['password'] == $_POST['password_repeat']) |
256 | && $_POST['password'] != "" && $_POST['login'] != "") { | 255 | && $_POST['password'] != "" && $_POST['login'] != "") { |
257 | # let's rock, install poche baby ! | 256 | # let's rock, install poche baby ! |
258 | if ($this->store->install($_POST['login'], Tools::encodeString($_POST['password'] . $_POST['login']))) | 257 | if ($this->store->install($_POST['login'], Tools::encodeString($_POST['password'] . $_POST['login']))) |
@@ -269,7 +268,7 @@ class Poche | |||
269 | } | 268 | } |
270 | exit(); | 269 | exit(); |
271 | } | 270 | } |
272 | 271 | ||
273 | public function getTheme() { | 272 | public function getTheme() { |
274 | return $this->currentTheme; | 273 | return $this->currentTheme; |
275 | } | 274 | } |
@@ -294,7 +293,7 @@ class Poche | |||
294 | if (is_file($themeIniFile) && is_readable($themeIniFile)) { | 293 | if (is_file($themeIniFile) && is_readable($themeIniFile)) { |
295 | $themeInfo = parse_ini_file($themeIniFile); | 294 | $themeInfo = parse_ini_file($themeIniFile); |
296 | } | 295 | } |
297 | 296 | ||
298 | if ($themeInfo === false) { | 297 | if ($themeInfo === false) { |
299 | $themeInfo = array(); | 298 | $themeInfo = array(); |
300 | } | 299 | } |
@@ -305,7 +304,7 @@ class Poche | |||
305 | 304 | ||
306 | return $themeInfo; | 305 | return $themeInfo; |
307 | } | 306 | } |
308 | 307 | ||
309 | public function getInstalledThemes() { | 308 | public function getInstalledThemes() { |
310 | $handle = opendir(THEME); | 309 | $handle = opendir(THEME); |
311 | $themes = array(); | 310 | $themes = array(); |
@@ -332,28 +331,28 @@ class Poche | |||
332 | public function getInstalledLanguages() { | 331 | public function getInstalledLanguages() { |
333 | $handle = opendir(LOCALE); | 332 | $handle = opendir(LOCALE); |
334 | $languages = array(); | 333 | $languages = array(); |
335 | 334 | ||
336 | while (($language = readdir($handle)) !== false) { | 335 | while (($language = readdir($handle)) !== false) { |
337 | # Languages are stored in a directory, so all directory names are languages | 336 | # Languages are stored in a directory, so all directory names are languages |
338 | # @todo move language installation data to database | 337 | # @todo move language installation data to database |
339 | if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.'))) { | 338 | if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.', 'tools'))) { |
340 | continue; | 339 | continue; |
341 | } | 340 | } |
342 | 341 | ||
343 | $current = false; | 342 | $current = false; |
344 | 343 | ||
345 | if ($language === $this->getLanguage()) { | 344 | if ($language === $this->getLanguage()) { |
346 | $current = true; | 345 | $current = true; |
347 | } | 346 | } |
348 | 347 | ||
349 | $languages[] = array('name' => $this->language_names[$language], 'value' => $language, 'current' => $current); | 348 | $languages[] = array('name' => (isset($this->language_names[$language]) ? $this->language_names[$language] : $language), 'value' => $language, 'current' => $current); |
350 | } | 349 | } |
351 | 350 | ||
352 | return $languages; | 351 | return $languages; |
353 | } | 352 | } |
354 | 353 | ||
355 | public function getDefaultConfig() | 354 | public function getDefaultConfig() |
356 | { | 355 | { |
357 | return array( | 356 | return array( |
358 | 'pager' => PAGINATION, | 357 | 'pager' => PAGINATION, |
359 | 'language' => LANG, | 358 | 'language' => LANG, |
@@ -361,60 +360,6 @@ class Poche | |||
361 | ); | 360 | ); |
362 | } | 361 | } |
363 | 362 | ||
364 | protected function getPageContent(Url $url) | ||
365 | { | ||
366 | // Saving and clearing context | ||
367 | $REAL = array(); | ||
368 | foreach( $GLOBALS as $key => $value ) { | ||
369 | if( $key != "GLOBALS" && $key != "_SESSION" ) { | ||
370 | $GLOBALS[$key] = array(); | ||
371 | $REAL[$key] = $value; | ||
372 | } | ||
373 | } | ||
374 | // Saving and clearing session | ||
375 | $REAL_SESSION = array(); | ||
376 | foreach( $_SESSION as $key => $value ) { | ||
377 | $REAL_SESSION[$key] = $value; | ||
378 | unset($_SESSION[$key]); | ||
379 | } | ||
380 | |||
381 | // Running code in different context | ||
382 | $scope = function() { | ||
383 | extract( func_get_arg(1) ); | ||
384 | $_GET = $_REQUEST = array( | ||
385 | "url" => $url->getUrl(), | ||
386 | "max" => 5, | ||
387 | "links" => "preserve", | ||
388 | "exc" => "", | ||
389 | "format" => "json", | ||
390 | "submit" => "Create Feed" | ||
391 | ); | ||
392 | ob_start(); | ||
393 | require func_get_arg(0); | ||
394 | $json = ob_get_flush(); | ||
395 | return $json; | ||
396 | }; | ||
397 | $json = $scope( "inc/3rdparty/makefulltextfeed.php", array("url" => $url) ); | ||
398 | |||
399 | // Clearing and restoring context | ||
400 | foreach( $GLOBALS as $key => $value ) { | ||
401 | if( $key != "GLOBALS" && $key != "_SESSION" ) { | ||
402 | unset($GLOBALS[$key]); | ||
403 | } | ||
404 | } | ||
405 | foreach( $REAL as $key => $value ) { | ||
406 | $GLOBALS[$key] = $value; | ||
407 | } | ||
408 | // Clearing and restoring session | ||
409 | foreach( $_SESSION as $key => $value ) { | ||
410 | unset($_SESSION[$key]); | ||
411 | } | ||
412 | foreach( $REAL_SESSION as $key => $value ) { | ||
413 | $_SESSION[$key] = $value; | ||
414 | } | ||
415 | return json_decode($json, true); | ||
416 | } | ||
417 | |||
418 | /** | 363 | /** |
419 | * Call action (mark as fav, archive, delete, etc.) | 364 | * Call action (mark as fav, archive, delete, etc.) |
420 | */ | 365 | */ |
@@ -423,28 +368,24 @@ class Poche | |||
423 | switch ($action) | 368 | switch ($action) |
424 | { | 369 | { |
425 | case 'add': | 370 | case 'add': |
426 | $content = $this->getPageContent($url); | 371 | $content = Tools::getPageContent($url); |
427 | $title = ($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled'); | 372 | $title = ($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled'); |
428 | $body = $content['rss']['channel']['item']['description']; | 373 | $body = $content['rss']['channel']['item']['description']; |
429 | 374 | ||
430 | // clean content from prevent xss attack | 375 | // clean content from prevent xss attack |
431 | $config = HTMLPurifier_Config::createDefault(); | 376 | $config = HTMLPurifier_Config::createDefault(); |
377 | $config->set('Cache.SerializerPath', CACHE); | ||
432 | $purifier = new HTMLPurifier($config); | 378 | $purifier = new HTMLPurifier($config); |
433 | $title = $purifier->purify($title); | 379 | $title = $purifier->purify($title); |
434 | $body = $purifier->purify($body); | 380 | $body = $purifier->purify($body); |
435 | 381 | ||
436 | //search for possible duplicate if not in import mode | 382 | //search for possible duplicate |
437 | if (!$import) { | 383 | $duplicate = NULL; |
438 | $duplicate = $this->store->retrieveOneByURL($url->getUrl(), $this->user->getId()); | 384 | $duplicate = $this->store->retrieveOneByURL($url->getUrl(), $this->user->getId()); |
439 | } | ||
440 | 385 | ||
441 | if ($this->store->add($url->getUrl(), $title, $body, $this->user->getId())) { | 386 | $last_id = $this->store->add($url->getUrl(), $title, $body, $this->user->getId()); |
387 | if ( $last_id ) { | ||
442 | Tools::logm('add link ' . $url->getUrl()); | 388 | Tools::logm('add link ' . $url->getUrl()); |
443 | $sequence = ''; | ||
444 | if (STORAGE == 'postgres') { | ||
445 | $sequence = 'entries_id_seq'; | ||
446 | } | ||
447 | $last_id = $this->store->getLastId($sequence); | ||
448 | if (DOWNLOAD_PICTURES) { | 389 | if (DOWNLOAD_PICTURES) { |
449 | $content = filtre_picture($body, $url->getUrl(), $last_id); | 390 | $content = filtre_picture($body, $url->getUrl(), $last_id); |
450 | Tools::logm('updating content article'); | 391 | Tools::logm('updating content article'); |
@@ -464,23 +405,17 @@ class Poche | |||
464 | } | 405 | } |
465 | } | 406 | } |
466 | 407 | ||
467 | if (!$import) { | 408 | $this->messages->add('s', _('the link has been added successfully')); |
468 | $this->messages->add('s', _('the link has been added successfully')); | ||
469 | } | ||
470 | } | 409 | } |
471 | else { | 410 | else { |
472 | if (!$import) { | 411 | $this->messages->add('e', _('error during insertion : the link wasn\'t added')); |
473 | $this->messages->add('e', _('error during insertion : the link wasn\'t added')); | 412 | Tools::logm('error during insertion : the link wasn\'t added ' . $url->getUrl()); |
474 | Tools::logm('error during insertion : the link wasn\'t added ' . $url->getUrl()); | ||
475 | } | ||
476 | } | 413 | } |
477 | 414 | ||
478 | if (!$import) { | 415 | if ($autoclose == TRUE) { |
479 | if ($autoclose == TRUE) { | 416 | Tools::redirect('?view=home'); |
480 | Tools::redirect('?view=home'); | 417 | } else { |
481 | } else { | 418 | Tools::redirect('?view=home&closewin=true'); |
482 | Tools::redirect('?view=home&closewin=true'); | ||
483 | } | ||
484 | } | 419 | } |
485 | break; | 420 | break; |
486 | case 'delete': | 421 | case 'delete': |
@@ -501,62 +436,56 @@ class Poche | |||
501 | case 'toggle_fav' : | 436 | case 'toggle_fav' : |
502 | $this->store->favoriteById($id, $this->user->getId()); | 437 | $this->store->favoriteById($id, $this->user->getId()); |
503 | Tools::logm('mark as favorite link #' . $id); | 438 | Tools::logm('mark as favorite link #' . $id); |
504 | if (!$import) { | 439 | Tools::redirect(); |
505 | Tools::redirect(); | ||
506 | } | ||
507 | break; | 440 | break; |
508 | case 'toggle_archive' : | 441 | case 'toggle_archive' : |
509 | $this->store->archiveById($id, $this->user->getId()); | 442 | $this->store->archiveById($id, $this->user->getId()); |
510 | Tools::logm('archive link #' . $id); | 443 | Tools::logm('archive link #' . $id); |
511 | if (!$import) { | 444 | Tools::redirect(); |
512 | Tools::redirect(); | ||
513 | } | ||
514 | break; | 445 | break; |
515 | case 'archive_all' : | 446 | case 'archive_all' : |
516 | $this->store->archiveAll($this->user->getId()); | 447 | $this->store->archiveAll($this->user->getId()); |
517 | Tools::logm('archive all links'); | 448 | Tools::logm('archive all links'); |
518 | if (!$import) { | 449 | Tools::redirect(); |
519 | Tools::redirect(); | ||
520 | } | ||
521 | break; | 450 | break; |
522 | case 'add_tag' : | 451 | case 'add_tag' : |
523 | if($import){ | 452 | $tags = explode(',', $_POST['value']); |
524 | $entry_id = $id; | 453 | $entry_id = $_POST['entry_id']; |
525 | $tags = explode(',', $tags); | ||
526 | } | ||
527 | else{ | ||
528 | $tags = explode(',', $_POST['value']); | ||
529 | $entry_id = $_POST['entry_id']; | ||
530 | } | ||
531 | $entry = $this->store->retrieveOneById($entry_id, $this->user->getId()); | 454 | $entry = $this->store->retrieveOneById($entry_id, $this->user->getId()); |
532 | if (!$entry) { | 455 | if (!$entry) { |
533 | $this->messages->add('e', _('Article not found!')); | 456 | $this->messages->add('e', _('Article not found!')); |
534 | Tools::logm('error : article not found'); | 457 | Tools::logm('error : article not found'); |
535 | Tools::redirect(); | 458 | Tools::redirect(); |
536 | } | 459 | } |
460 | //get all already set tags to preven duplicates | ||
461 | $already_set_tags = array(); | ||
462 | $entry_tags = $this->store->retrieveTagsByEntry($entry_id); | ||
463 | foreach ($entry_tags as $tag) { | ||
464 | $already_set_tags[] = $tag['value']; | ||
465 | } | ||
537 | foreach($tags as $key => $tag_value) { | 466 | foreach($tags as $key => $tag_value) { |
538 | $value = trim($tag_value); | 467 | $value = trim($tag_value); |
539 | $tag = $this->store->retrieveTagByValue($value); | 468 | if ($value && !in_array($value, $already_set_tags)) { |
540 | 469 | $tag = $this->store->retrieveTagByValue($value); | |
541 | if (is_null($tag)) { | 470 | |
542 | # we create the tag | 471 | if (is_null($tag)) { |
543 | $tag = $this->store->createTag($value); | 472 | # we create the tag |
544 | $sequence = ''; | 473 | $tag = $this->store->createTag($value); |
545 | if (STORAGE == 'postgres') { | 474 | $sequence = ''; |
546 | $sequence = 'tags_id_seq'; | 475 | if (STORAGE == 'postgres') { |
547 | } | 476 | $sequence = 'tags_id_seq'; |
548 | $tag_id = $this->store->getLastId($sequence); | 477 | } |
549 | } | 478 | $tag_id = $this->store->getLastId($sequence); |
550 | else { | 479 | } |
551 | $tag_id = $tag['id']; | 480 | else { |
481 | $tag_id = $tag['id']; | ||
482 | } | ||
483 | |||
484 | # we assign the tag to the article | ||
485 | $this->store->setTagToEntry($tag_id, $entry_id); | ||
552 | } | 486 | } |
553 | |||
554 | # we assign the tag to the article | ||
555 | $this->store->setTagToEntry($tag_id, $entry_id); | ||
556 | } | ||
557 | if(!$import) { | ||
558 | Tools::redirect(); | ||
559 | } | 487 | } |
488 | Tools::redirect(); | ||
560 | break; | 489 | break; |
561 | case 'remove_tag' : | 490 | case 'remove_tag' : |
562 | $tag_id = $_GET['tag_id']; | 491 | $tag_id = $_GET['tag_id']; |
@@ -581,8 +510,12 @@ class Poche | |||
581 | switch ($view) | 510 | switch ($view) |
582 | { | 511 | { |
583 | case 'config': | 512 | case 'config': |
584 | $dev = trim($this->getPocheVersion('dev')); | 513 | $dev_infos = $this->getPocheVersion('dev'); |
585 | $prod = trim($this->getPocheVersion('prod')); | 514 | $dev = trim($dev_infos[0]); |
515 | $check_time_dev = date('d-M-Y H:i', $dev_infos[1]); | ||
516 | $prod_infos = $this->getPocheVersion('prod'); | ||
517 | $prod = trim($prod_infos[0]); | ||
518 | $check_time_prod = date('d-M-Y H:i', $prod_infos[1]); | ||
586 | $compare_dev = version_compare(POCHE, $dev); | 519 | $compare_dev = version_compare(POCHE, $dev); |
587 | $compare_prod = version_compare(POCHE, $prod); | 520 | $compare_prod = version_compare(POCHE, $prod); |
588 | $themes = $this->getInstalledThemes(); | 521 | $themes = $this->getInstalledThemes(); |
@@ -594,6 +527,8 @@ class Poche | |||
594 | 'languages' => $languages, | 527 | 'languages' => $languages, |
595 | 'dev' => $dev, | 528 | 'dev' => $dev, |
596 | 'prod' => $prod, | 529 | 'prod' => $prod, |
530 | 'check_time_dev' => $check_time_dev, | ||
531 | 'check_time_prod' => $check_time_prod, | ||
597 | 'compare_dev' => $compare_dev, | 532 | 'compare_dev' => $compare_dev, |
598 | 'compare_prod' => $compare_prod, | 533 | 'compare_prod' => $compare_prod, |
599 | 'token' => $token, | 534 | 'token' => $token, |
@@ -619,13 +554,36 @@ class Poche | |||
619 | break; | 554 | break; |
620 | case 'tags': | 555 | case 'tags': |
621 | $token = $this->user->getConfigValue('token'); | 556 | $token = $this->user->getConfigValue('token'); |
622 | $tags = $this->store->retrieveAllTags($this->user->getId()); | 557 | //if term is set - search tags for this term |
558 | $term = Tools::checkVar('term'); | ||
559 | $tags = $this->store->retrieveAllTags($this->user->getId(), $term); | ||
560 | if (Tools::isAjaxRequest()) { | ||
561 | $result = array(); | ||
562 | foreach ($tags as $tag) { | ||
563 | $result[] = $tag['value']; | ||
564 | } | ||
565 | echo json_encode($result); | ||
566 | exit; | ||
567 | } | ||
623 | $tpl_vars = array( | 568 | $tpl_vars = array( |
624 | 'token' => $token, | 569 | 'token' => $token, |
625 | 'user_id' => $this->user->getId(), | 570 | 'user_id' => $this->user->getId(), |
626 | 'tags' => $tags, | 571 | 'tags' => $tags, |
627 | ); | 572 | ); |
628 | break; | 573 | break; |
574 | case 'search': | ||
575 | if (isset($_GET['search'])) { | ||
576 | $search = filter_var($_GET['search'], FILTER_SANITIZE_STRING); | ||
577 | $tpl_vars['entries'] = $this->store->search($search, $this->user->getId()); | ||
578 | $count = count($tpl_vars['entries']); | ||
579 | $this->pagination->set_total($count); | ||
580 | $page_links = str_replace(array('previous', 'next'), array(_('previous'), _('next')), | ||
581 | $this->pagination->page_links('?view=' . $view . '?search=' . $search . '&sort=' . $_SESSION['sort'] . '&' )); | ||
582 | $tpl_vars['page_links'] = $page_links; | ||
583 | $tpl_vars['nb_results'] = $count; | ||
584 | $tpl_vars['search_term'] = $search; | ||
585 | } | ||
586 | break; | ||
629 | case 'view': | 587 | case 'view': |
630 | $entry = $this->store->retrieveOneById($id, $this->user->getId()); | 588 | $entry = $this->store->retrieveOneById($id, $this->user->getId()); |
631 | if ($entry != NULL) { | 589 | if ($entry != NULL) { |
@@ -660,8 +618,9 @@ class Poche | |||
660 | 'entries' => '', | 618 | 'entries' => '', |
661 | 'page_links' => '', | 619 | 'page_links' => '', |
662 | 'nb_results' => '', | 620 | 'nb_results' => '', |
621 | 'listmode' => (isset($_COOKIE['listmode']) ? true : false), | ||
663 | ); | 622 | ); |
664 | 623 | ||
665 | //if id is given - we retrive entries by tag: id is tag id | 624 | //if id is given - we retrive entries by tag: id is tag id |
666 | if ($id) { | 625 | if ($id) { |
667 | $tpl_vars['tag'] = $this->store->retrieveTag($id, $this->user->getId()); | 626 | $tpl_vars['tag'] = $this->store->retrieveTag($id, $this->user->getId()); |
@@ -686,8 +645,8 @@ class Poche | |||
686 | } | 645 | } |
687 | 646 | ||
688 | /** | 647 | /** |
689 | * update the password of the current user. | 648 | * update the password of the current user. |
690 | * if MODE_DEMO is TRUE, the password can't be updated. | 649 | * if MODE_DEMO is TRUE, the password can't be updated. |
691 | * @todo add the return value | 650 | * @todo add the return value |
692 | * @todo set the new password in function header like this updatePassword($newPassword) | 651 | * @todo set the new password in function header like this updatePassword($newPassword) |
693 | * @return boolean | 652 | * @return boolean |
@@ -715,42 +674,44 @@ class Poche | |||
715 | } | 674 | } |
716 | } | 675 | } |
717 | } | 676 | } |
718 | 677 | ||
719 | public function updateTheme() | 678 | public function updateTheme() |
720 | { | 679 | { |
721 | # no data | 680 | # no data |
722 | if (empty($_POST['theme'])) { | 681 | if (empty($_POST['theme'])) { |
723 | } | 682 | } |
724 | 683 | ||
725 | # we are not going to change it to the current theme... | 684 | # we are not going to change it to the current theme... |
726 | if ($_POST['theme'] == $this->getTheme()) { | 685 | if ($_POST['theme'] == $this->getTheme()) { |
727 | $this->messages->add('w', _('still using the "' . $this->getTheme() . '" theme!')); | 686 | $this->messages->add('w', _('still using the "' . $this->getTheme() . '" theme!')); |
728 | Tools::redirect('?view=config'); | 687 | Tools::redirect('?view=config'); |
729 | } | 688 | } |
730 | 689 | ||
731 | $themes = $this->getInstalledThemes(); | 690 | $themes = $this->getInstalledThemes(); |
732 | $actualTheme = false; | 691 | $actualTheme = false; |
733 | 692 | ||
734 | foreach (array_keys($themes) as $theme) { | 693 | foreach (array_keys($themes) as $theme) { |
735 | if ($theme == $_POST['theme']) { | 694 | if ($theme == $_POST['theme']) { |
736 | $actualTheme = true; | 695 | $actualTheme = true; |
737 | break; | 696 | break; |
738 | } | 697 | } |
739 | } | 698 | } |
740 | 699 | ||
741 | if (! $actualTheme) { | 700 | if (! $actualTheme) { |
742 | $this->messages->add('e', _('that theme does not seem to be installed')); | 701 | $this->messages->add('e', _('that theme does not seem to be installed')); |
743 | Tools::redirect('?view=config'); | 702 | Tools::redirect('?view=config'); |
744 | } | 703 | } |
745 | 704 | ||
746 | $this->store->updateUserConfig($this->user->getId(), 'theme', $_POST['theme']); | 705 | $this->store->updateUserConfig($this->user->getId(), 'theme', $_POST['theme']); |
747 | $this->messages->add('s', _('you have changed your theme preferences')); | 706 | $this->messages->add('s', _('you have changed your theme preferences')); |
748 | 707 | ||
749 | $currentConfig = $_SESSION['poche_user']->config; | 708 | $currentConfig = $_SESSION['poche_user']->config; |
750 | $currentConfig['theme'] = $_POST['theme']; | 709 | $currentConfig['theme'] = $_POST['theme']; |
751 | 710 | ||
752 | $_SESSION['poche_user']->setConfig($currentConfig); | 711 | $_SESSION['poche_user']->setConfig($currentConfig); |
753 | 712 | ||
713 | $this->emptyCache(); | ||
714 | |||
754 | Tools::redirect('?view=config'); | 715 | Tools::redirect('?view=config'); |
755 | } | 716 | } |
756 | 717 | ||
@@ -759,39 +720,40 @@ class Poche | |||
759 | # no data | 720 | # no data |
760 | if (empty($_POST['language'])) { | 721 | if (empty($_POST['language'])) { |
761 | } | 722 | } |
762 | 723 | ||
763 | # we are not going to change it to the current language... | 724 | # we are not going to change it to the current language... |
764 | if ($_POST['language'] == $this->getLanguage()) { | 725 | if ($_POST['language'] == $this->getLanguage()) { |
765 | $this->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!')); | 726 | $this->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!')); |
766 | Tools::redirect('?view=config'); | 727 | Tools::redirect('?view=config'); |
767 | } | 728 | } |
768 | 729 | ||
769 | $languages = $this->getInstalledLanguages(); | 730 | $languages = $this->getInstalledLanguages(); |
770 | $actualLanguage = false; | 731 | $actualLanguage = false; |
771 | 732 | ||
772 | foreach ($languages as $language) { | 733 | foreach ($languages as $language) { |
773 | if ($language['value'] == $_POST['language']) { | 734 | if ($language['value'] == $_POST['language']) { |
774 | $actualLanguage = true; | 735 | $actualLanguage = true; |
775 | break; | 736 | break; |
776 | } | 737 | } |
777 | } | 738 | } |
778 | 739 | ||
779 | if (! $actualLanguage) { | 740 | if (! $actualLanguage) { |
780 | $this->messages->add('e', _('that language does not seem to be installed')); | 741 | $this->messages->add('e', _('that language does not seem to be installed')); |
781 | Tools::redirect('?view=config'); | 742 | Tools::redirect('?view=config'); |
782 | } | 743 | } |
783 | 744 | ||
784 | $this->store->updateUserConfig($this->user->getId(), 'language', $_POST['language']); | 745 | $this->store->updateUserConfig($this->user->getId(), 'language', $_POST['language']); |
785 | $this->messages->add('s', _('you have changed your language preferences')); | 746 | $this->messages->add('s', _('you have changed your language preferences')); |
786 | 747 | ||
787 | $currentConfig = $_SESSION['poche_user']->config; | 748 | $currentConfig = $_SESSION['poche_user']->config; |
788 | $currentConfig['language'] = $_POST['language']; | 749 | $currentConfig['language'] = $_POST['language']; |
789 | 750 | ||
790 | $_SESSION['poche_user']->setConfig($currentConfig); | 751 | $_SESSION['poche_user']->setConfig($currentConfig); |
791 | 752 | ||
753 | $this->emptyCache(); | ||
754 | |||
792 | Tools::redirect('?view=config'); | 755 | Tools::redirect('?view=config'); |
793 | } | 756 | } |
794 | |||
795 | /** | 757 | /** |
796 | * get credentials from differents sources | 758 | * get credentials from differents sources |
797 | * it redirects the user to the $referer link | 759 | * it redirects the user to the $referer link |
@@ -846,7 +808,7 @@ class Poche | |||
846 | /** | 808 | /** |
847 | * log out the poche user. It cleans the session. | 809 | * log out the poche user. It cleans the session. |
848 | * @todo add the return value | 810 | * @todo add the return value |
849 | * @return boolean | 811 | * @return boolean |
850 | */ | 812 | */ |
851 | public function logout() | 813 | public function logout() |
852 | { | 814 | { |
@@ -857,225 +819,123 @@ class Poche | |||
857 | } | 819 | } |
858 | 820 | ||
859 | /** | 821 | /** |
860 | * import from Instapaper. poche needs a ./instapaper-export.html file | 822 | * import datas into your poche |
861 | * @todo add the return value | ||
862 | * @param string $targetFile the file used for importing | ||
863 | * @return boolean | 823 | * @return boolean |
864 | */ | 824 | */ |
865 | private function importFromInstapaper($targetFile) | 825 | public function import() { |
866 | { | 826 | |
867 | # TODO gestion des articles favs | 827 | if (!defined('IMPORT_LIMIT')) { |
868 | $html = new simple_html_dom(); | 828 | define('IMPORT_LIMIT', 5); |
869 | $html->load_file($targetFile); | 829 | } |
870 | Tools::logm('starting import from instapaper'); | 830 | if (!defined('IMPORT_DELAY')) { |
871 | 831 | define('IMPORT_DELAY', 5); | |
872 | $read = 0; | 832 | } |
873 | $errors = array(); | 833 | |
874 | foreach($html->find('ol') as $ul) | 834 | if ( isset($_FILES['file']) ) { |
875 | { | 835 | // assume, that file is in json format |
876 | foreach($ul->find('li') as $li) | 836 | $str_data = file_get_contents($_FILES['file']['tmp_name']); |
877 | { | 837 | $data = json_decode($str_data, true); |
878 | $a = $li->find('a'); | 838 | |
879 | $url = new Url(base64_encode($a[0]->href)); | 839 | if ( $data === null ) { |
880 | $this->action('add', $url, 0, TRUE); | 840 | //not json - assume html |
881 | if ($read == '1') { | 841 | $html = new simple_html_dom(); |
882 | $sequence = ''; | 842 | $html->load_file($_FILES['file']['tmp_name']); |
883 | if (STORAGE == 'postgres') { | 843 | $data = array(); |
884 | $sequence = 'entries_id_seq'; | 844 | $read = 0; |
885 | } | 845 | foreach (array('ol','ul') as $list) { |
886 | $last_id = $this->store->getLastId($sequence); | 846 | foreach ($html->find($list) as $ul) { |
887 | $this->action('toggle_archive', $url, $last_id, TRUE); | 847 | foreach ($ul->find('li') as $li) { |
888 | } | 848 | $tmpEntry = array(); |
849 | $a = $li->find('a'); | ||
850 | $tmpEntry['url'] = $a[0]->href; | ||
851 | $tmpEntry['tags'] = $a[0]->tags; | ||
852 | $tmpEntry['is_read'] = $read; | ||
853 | if ($tmpEntry['url']) { | ||
854 | $data[] = $tmpEntry; | ||
855 | } | ||
856 | } | ||
857 | # the second <ol/ul> is for read links | ||
858 | $read = ((sizeof($data) && $read)?0:1); | ||
889 | } | 859 | } |
890 | 860 | } | |
891 | # the second <ol> is for read links | ||
892 | $read = 1; | ||
893 | } | 861 | } |
894 | $this->messages->add('s', _('import from instapaper completed')); | ||
895 | Tools::logm('import from instapaper completed'); | ||
896 | Tools::redirect(); | ||
897 | } | ||
898 | 862 | ||
899 | /** | 863 | //for readability structure |
900 | * import from Pocket. poche needs a ./ril_export.html file | 864 | foreach ($data as $record) { |
901 | * @todo add the return value | 865 | if (is_array($record)) { |
902 | * @param string $targetFile the file used for importing | 866 | $data[] = $record; |
903 | * @return boolean | 867 | foreach ($record as $record2) { |
904 | */ | 868 | if (is_array($record2)) { |
905 | private function importFromPocket($targetFile) | 869 | $data[] = $record2; |
906 | { | 870 | } |
907 | # TODO gestion des articles favs | 871 | } |
908 | $html = new simple_html_dom(); | 872 | } |
909 | $html->load_file($targetFile); | 873 | } |
910 | Tools::logm('starting import from pocket'); | 874 | |
911 | 875 | $i = 0; //counter for articles inserted | |
912 | $read = 0; | 876 | foreach ($data as $record) { |
913 | $errors = array(); | 877 | $url = trim( isset($record['article__url']) ? $record['article__url'] : (isset($record['url']) ? $record['url'] : '') ); |
914 | foreach($html->find('ul') as $ul) | 878 | if ( $url ) { |
915 | { | 879 | $title = (isset($record['title']) ? $record['title'] : _('Untitled - Import - ').'</a> <a href="./?import">'._('click to finish import').'</a><a>'); |
916 | foreach($ul->find('li') as $li) | 880 | $body = (isset($record['content']) ? $record['content'] : ''); |
917 | { | 881 | $isRead = (isset($record['is_read']) ? intval($record['is_read']) : (isset($record['archive'])?intval($record['archive']):0)); |
918 | $a = $li->find('a'); | 882 | $isFavorite = (isset($record['is_fav']) ? intval($record['is_fav']) : (isset($record['favorite'])?intval($record['favorite']):0) ); |
919 | $url = new Url(base64_encode($a[0]->href)); | 883 | //insert new record |
920 | $this->action('add', $url, 0, TRUE); | 884 | $id = $this->store->add($url, $title, $body, $this->user->getId(), $isFavorite, $isRead); |
921 | $sequence = ''; | 885 | if ( $id ) { |
922 | if (STORAGE == 'postgres') { | 886 | //increment no of records inserted |
923 | $sequence = 'entries_id_seq'; | 887 | $i++; |
924 | } | 888 | if ( isset($record['tags']) && trim($record['tags']) ) { |
925 | $last_id = $this->store->getLastId($sequence); | 889 | //@TODO: set tags |
926 | if ($read == '1') { | 890 | |
927 | $this->action('toggle_archive', $url, $last_id, TRUE); | 891 | } |
928 | } | ||
929 | $tags = $a[0]->tags; | ||
930 | if(!empty($tags)) { | ||
931 | $this->action('add_tag',$url,$last_id,true,false,$tags); | ||
932 | } | ||
933 | } | 892 | } |
934 | 893 | } | |
935 | # the second <ul> is for read links | ||
936 | $read = 1; | ||
937 | } | 894 | } |
938 | $this->messages->add('s', _('import from pocket completed')); | ||
939 | Tools::logm('import from pocket completed'); | ||
940 | Tools::redirect(); | ||
941 | } | ||
942 | 895 | ||
943 | /** | 896 | if ( $i > 0 ) { |
944 | * import from Readability. poche needs a ./readability file | 897 | $this->messages->add('s', _('Articles inserted: ').$i._('. Please note, that some may be marked as "read".')); |
945 | * @todo add the return value | ||
946 | * @param string $targetFile the file used for importing | ||
947 | * @return boolean | ||
948 | */ | ||
949 | private function importFromReadability($targetFile) | ||
950 | { | ||
951 | # TODO gestion des articles lus / favs | ||
952 | $str_data = file_get_contents($targetFile); | ||
953 | $data = json_decode($str_data,true); | ||
954 | Tools::logm('starting import from Readability'); | ||
955 | $count = 0; | ||
956 | foreach ($data as $key => $value) { | ||
957 | $url = NULL; | ||
958 | $favorite = FALSE; | ||
959 | $archive = FALSE; | ||
960 | foreach ($value as $item) { | ||
961 | foreach ($item as $attr => $value) { | ||
962 | if ($attr == 'article__url') { | ||
963 | $url = new Url(base64_encode($value)); | ||
964 | } | ||
965 | $sequence = ''; | ||
966 | if (STORAGE == 'postgres') { | ||
967 | $sequence = 'entries_id_seq'; | ||
968 | } | ||
969 | if ($value == 'true') { | ||
970 | if ($attr == 'favorite') { | ||
971 | $favorite = TRUE; | ||
972 | } | ||
973 | if ($attr == 'archive') { | ||
974 | $archive = TRUE; | ||
975 | } | ||
976 | } | ||
977 | } | ||
978 | |||
979 | # we can add the url | ||
980 | if (!is_null($url) && $url->isCorrect()) { | ||
981 | $this->action('add', $url, 0, TRUE); | ||
982 | $count++; | ||
983 | if ($favorite) { | ||
984 | $last_id = $this->store->getLastId($sequence); | ||
985 | $this->action('toggle_fav', $url, $last_id, TRUE); | ||
986 | } | ||
987 | if ($archive) { | ||
988 | $last_id = $this->store->getLastId($sequence); | ||
989 | $this->action('toggle_archive', $url, $last_id, TRUE); | ||
990 | } | ||
991 | } | ||
992 | } | ||
993 | } | 898 | } |
994 | $this->messages->add('s', _('import from Readability completed. ' . $count . ' new links.')); | 899 | } |
995 | Tools::logm('import from Readability completed'); | 900 | //file parsing finished here |
901 | |||
902 | //now download article contents if any | ||
903 | |||
904 | //check if we need to download any content | ||
905 | $recordsDownloadRequired = $this->store->retrieveUnfetchedEntriesCount($this->user->getId()); | ||
906 | if ( $recordsDownloadRequired == 0 ) { | ||
907 | //nothing to download | ||
908 | $this->messages->add('s', _('Import finished.')); | ||
996 | Tools::redirect(); | 909 | Tools::redirect(); |
997 | } | 910 | } |
911 | else { | ||
912 | //if just inserted - don't download anything, download will start in next reload | ||
913 | if ( !isset($_FILES['file']) ) { | ||
914 | //download next batch | ||
915 | $items = $this->store->retrieveUnfetchedEntries($this->user->getId(), IMPORT_LIMIT); | ||
998 | 916 | ||
999 | /** | 917 | $config = HTMLPurifier_Config::createDefault(); |
1000 | * import from Poche exported file | 918 | $config->set('Cache.SerializerPath', CACHE); |
1001 | * @param string $targetFile the file used for importing | 919 | $purifier = new HTMLPurifier($config); |
1002 | * @return boolean | ||
1003 | */ | ||
1004 | private function importFromPoche($targetFile) | ||
1005 | { | ||
1006 | $str_data = file_get_contents($targetFile); | ||
1007 | $data = json_decode($str_data,true); | ||
1008 | Tools::logm('starting import from Poche'); | ||
1009 | 920 | ||
921 | foreach ($items as $item) { | ||
922 | $url = new Url(base64_encode($item['url'])); | ||
923 | $content = Tools::getPageContent($url); | ||
1010 | 924 | ||
1011 | $sequence = ''; | 925 | $title = (($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled')); |
1012 | if (STORAGE == 'postgres') { | 926 | $body = (($content['rss']['channel']['item']['description'] != '') ? $content['rss']['channel']['item']['description'] : _('Undefined')); |
1013 | $sequence = 'entries_id_seq'; | ||
1014 | } | ||
1015 | 927 | ||
1016 | $count = 0; | 928 | //clean content to prevent xss attack |
1017 | foreach ($data as $value) { | 929 | $title = $purifier->purify($title); |
1018 | 930 | $body = $purifier->purify($body); | |
1019 | $url = new Url(base64_encode($value['url'])); | 931 | |
1020 | $favorite = ($value['is_fav'] == -1); | 932 | $this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId()); |
1021 | $archive = ($value['is_read'] == -1); | 933 | } |
1022 | |||
1023 | # we can add the url | ||
1024 | if (!is_null($url) && $url->isCorrect()) { | ||
1025 | |||
1026 | $this->action('add', $url, 0, TRUE); | ||
1027 | |||
1028 | $count++; | ||
1029 | if ($favorite) { | ||
1030 | $last_id = $this->store->getLastId($sequence); | ||
1031 | $this->action('toggle_fav', $url, $last_id, TRUE); | ||
1032 | } | ||
1033 | if ($archive) { | ||
1034 | $last_id = $this->store->getLastId($sequence); | ||
1035 | $this->action('toggle_archive', $url, $last_id, TRUE); | ||
1036 | } | ||
1037 | } | ||
1038 | |||
1039 | } | ||
1040 | $this->messages->add('s', _('import from Poche completed. ' . $count . ' new links.')); | ||
1041 | Tools::logm('import from Poche completed'); | ||
1042 | Tools::redirect(); | ||
1043 | } | ||
1044 | 934 | ||
1045 | /** | ||
1046 | * import datas into your poche | ||
1047 | * @param string $from name of the service to import : pocket, instapaper or readability | ||
1048 | * @todo add the return value | ||
1049 | * @return boolean | ||
1050 | */ | ||
1051 | public function import($from) | ||
1052 | { | ||
1053 | $providers = array( | ||
1054 | 'pocket' => 'importFromPocket', | ||
1055 | 'readability' => 'importFromReadability', | ||
1056 | 'instapaper' => 'importFromInstapaper', | ||
1057 | 'poche' => 'importFromPoche', | ||
1058 | ); | ||
1059 | |||
1060 | if (! isset($providers[$from])) { | ||
1061 | $this->messages->add('e', _('Unknown import provider.')); | ||
1062 | Tools::redirect(); | ||
1063 | } | ||
1064 | |||
1065 | $targetDefinition = 'IMPORT_' . strtoupper($from) . '_FILE'; | ||
1066 | $targetFile = constant($targetDefinition); | ||
1067 | |||
1068 | if (! defined($targetDefinition)) { | ||
1069 | $this->messages->add('e', _('Incomplete inc/poche/define.inc.php file, please define "' . $targetDefinition . '".')); | ||
1070 | Tools::redirect(); | ||
1071 | } | ||
1072 | |||
1073 | if (! file_exists($targetFile)) { | ||
1074 | $this->messages->add('e', _('Could not find required "' . $targetFile . '" import file.')); | ||
1075 | Tools::redirect(); | ||
1076 | } | 935 | } |
1077 | 936 | } | |
1078 | $this->$providers[$from]($targetFile); | 937 | |
938 | return array('includeImport'=>true, 'import'=>array('recordsDownloadRequired'=>$recordsDownloadRequired, 'recordsUnderDownload'=> IMPORT_LIMIT, 'delay'=> IMPORT_DELAY * 1000) ); | ||
1079 | } | 939 | } |
1080 | 940 | ||
1081 | /** | 941 | /** |
@@ -1084,6 +944,9 @@ class Poche | |||
1084 | */ | 944 | */ |
1085 | public function export() | 945 | public function export() |
1086 | { | 946 | { |
947 | $filename = "wallabag-export-".$this->user->getId()."-".date("Y-m-d").".json"; | ||
948 | header('Content-Disposition: attachment; filename='.$filename); | ||
949 | |||
1087 | $entries = $this->store->retrieveAll($this->user->getId()); | 950 | $entries = $this->store->retrieveAll($this->user->getId()); |
1088 | echo $this->tpl->render('export.twig', array( | 951 | echo $this->tpl->render('export.twig', array( |
1089 | 'export' => Tools::renderJson($entries), | 952 | 'export' => Tools::renderJson($entries), |
@@ -1099,21 +962,29 @@ class Poche | |||
1099 | private function getPocheVersion($which = 'prod') | 962 | private function getPocheVersion($which = 'prod') |
1100 | { | 963 | { |
1101 | $cache_file = CACHE . '/' . $which; | 964 | $cache_file = CACHE . '/' . $which; |
965 | $check_time = time(); | ||
1102 | 966 | ||
1103 | # checks if the cached version file exists | 967 | # checks if the cached version file exists |
1104 | if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) { | 968 | if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) { |
1105 | $version = file_get_contents($cache_file); | 969 | $version = file_get_contents($cache_file); |
970 | $check_time = filemtime($cache_file); | ||
1106 | } else { | 971 | } else { |
1107 | $version = file_get_contents('http://static.wallabag.org/versions/' . $which); | 972 | $version = file_get_contents('http://static.wallabag.org/versions/' . $which); |
1108 | file_put_contents($cache_file, $version, LOCK_EX); | 973 | file_put_contents($cache_file, $version, LOCK_EX); |
1109 | } | 974 | } |
1110 | return $version; | 975 | return array($version, $check_time); |
1111 | } | 976 | } |
1112 | 977 | ||
1113 | public function generateToken() | 978 | public function generateToken() |
1114 | { | 979 | { |
1115 | if (ini_get('open_basedir') === '') { | 980 | if (ini_get('open_basedir') === '') { |
1116 | $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15); | 981 | if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { |
982 | echo 'This is a server using Windows!'; | ||
983 | // alternative to /dev/urandom for Windows | ||
984 | $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); | ||
985 | } else { | ||
986 | $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15); | ||
987 | } | ||
1117 | } | 988 | } |
1118 | else { | 989 | else { |
1119 | $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); | 990 | $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); |
@@ -1124,6 +995,7 @@ class Poche | |||
1124 | $currentConfig = $_SESSION['poche_user']->config; | 995 | $currentConfig = $_SESSION['poche_user']->config; |
1125 | $currentConfig['token'] = $token; | 996 | $currentConfig['token'] = $token; |
1126 | $_SESSION['poche_user']->setConfig($currentConfig); | 997 | $_SESSION['poche_user']->setConfig($currentConfig); |
998 | Tools::redirect(); | ||
1127 | } | 999 | } |
1128 | 1000 | ||
1129 | public function generateFeeds($token, $user_id, $tag_id, $type = 'home') | 1001 | public function generateFeeds($token, $user_id, $tag_id, $type = 'home') |
@@ -1131,6 +1003,10 @@ class Poche | |||
1131 | $allowed_types = array('home', 'fav', 'archive', 'tag'); | 1003 | $allowed_types = array('home', 'fav', 'archive', 'tag'); |
1132 | $config = $this->store->getConfigUser($user_id); | 1004 | $config = $this->store->getConfigUser($user_id); |
1133 | 1005 | ||
1006 | if ($config == null) { | ||
1007 | die(_('User with this id (' . $user_id . ') does not exist.')); | ||
1008 | } | ||
1009 | |||
1134 | if (!in_array($type, $allowed_types) || | 1010 | if (!in_array($type, $allowed_types) || |
1135 | $token != $config['token']) { | 1011 | $token != $config['token']) { |
1136 | die(_('Uh, there is a problem while generating feeds.')); | 1012 | die(_('Uh, there is a problem while generating feeds.')); |
@@ -1140,8 +1016,9 @@ class Poche | |||
1140 | $feed = new FeedWriter(RSS2); | 1016 | $feed = new FeedWriter(RSS2); |
1141 | $feed->setTitle('wallabag — ' . $type . ' feed'); | 1017 | $feed->setTitle('wallabag — ' . $type . ' feed'); |
1142 | $feed->setLink(Tools::getPocheUrl()); | 1018 | $feed->setLink(Tools::getPocheUrl()); |
1143 | $feed->setChannelElement('updated', date(DATE_RSS , time())); | 1019 | $feed->setChannelElement('pubDate', date(DATE_RSS , time())); |
1144 | $feed->setChannelElement('author', 'wallabag'); | 1020 | $feed->setChannelElement('generator', 'wallabag'); |
1021 | $feed->setDescription('wallabag ' . $type . ' elements'); | ||
1145 | 1022 | ||
1146 | if ($type == 'tag') { | 1023 | if ($type == 'tag') { |
1147 | $entries = $this->store->retrieveEntriesByTag($tag_id, $user_id); | 1024 | $entries = $this->store->retrieveEntriesByTag($tag_id, $user_id); |
@@ -1154,7 +1031,7 @@ class Poche | |||
1154 | foreach ($entries as $entry) { | 1031 | foreach ($entries as $entry) { |
1155 | $newItem = $feed->createNewItem(); | 1032 | $newItem = $feed->createNewItem(); |
1156 | $newItem->setTitle($entry['title']); | 1033 | $newItem->setTitle($entry['title']); |
1157 | $newItem->setLink(Tools::getPocheUrl() . '?view=view&id=' . $entry['id']); | 1034 | $newItem->setLink($entry['url']); |
1158 | $newItem->setDate(time()); | 1035 | $newItem->setDate(time()); |
1159 | $newItem->setDescription($entry['content']); | 1036 | $newItem->setDescription($entry['content']); |
1160 | $feed->addItem($newItem); | 1037 | $feed->addItem($newItem); |
diff --git a/inc/poche/Tools.class.php b/inc/poche/Tools.class.php index 4ed28ed1..a130e94b 100644..100755 --- a/inc/poche/Tools.class.php +++ b/inc/poche/Tools.class.php | |||
@@ -7,7 +7,7 @@ | |||
7 | * @copyright 2013 | 7 | * @copyright 2013 |
8 | * @license http://www.wtfpl.net/ see COPYING file | 8 | * @license http://www.wtfpl.net/ see COPYING file |
9 | */ | 9 | */ |
10 | 10 | ||
11 | class Tools | 11 | class Tools |
12 | { | 12 | { |
13 | public static function initPhp() | 13 | public static function initPhp() |
@@ -42,7 +42,7 @@ class Tools | |||
42 | && (strtolower($_SERVER['HTTPS']) == 'on')) | 42 | && (strtolower($_SERVER['HTTPS']) == 'on')) |
43 | || (isset($_SERVER["SERVER_PORT"]) | 43 | || (isset($_SERVER["SERVER_PORT"]) |
44 | && $_SERVER["SERVER_PORT"] == '443') // HTTPS detection. | 44 | && $_SERVER["SERVER_PORT"] == '443') // HTTPS detection. |
45 | || (isset($_SERVER["SERVER_PORT"]) //Custom HTTPS port detection | 45 | || (isset($_SERVER["SERVER_PORT"]) //Custom HTTPS port detection |
46 | && $_SERVER["SERVER_PORT"] == SSL_PORT) | 46 | && $_SERVER["SERVER_PORT"] == SSL_PORT) |
47 | || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) | 47 | || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) |
48 | && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'); | 48 | && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'); |
@@ -148,7 +148,7 @@ class Tools | |||
148 | ); | 148 | ); |
149 | 149 | ||
150 | # only download page lesser than 4MB | 150 | # only download page lesser than 4MB |
151 | $data = @file_get_contents($url, false, $context, -1, 4000000); | 151 | $data = @file_get_contents($url, false, $context, -1, 4000000); |
152 | 152 | ||
153 | if (isset($http_response_header) and isset($http_response_header[0])) { | 153 | if (isset($http_response_header) and isset($http_response_header[0])) { |
154 | $httpcodeOK = isset($http_response_header) and isset($http_response_header[0]) and ((strpos($http_response_header[0], '200 OK') !== FALSE) or (strpos($http_response_header[0], '301 Moved Permanently') !== FALSE)); | 154 | $httpcodeOK = isset($http_response_header) and isset($http_response_header[0]) and ((strpos($http_response_header[0], '200 OK') !== FALSE) or (strpos($http_response_header[0], '301 Moved Permanently') !== FALSE)); |
@@ -193,14 +193,14 @@ class Tools | |||
193 | 193 | ||
194 | public static function logm($message) | 194 | public static function logm($message) |
195 | { | 195 | { |
196 | if (DEBUG_POCHE) { | 196 | if (DEBUG_POCHE && php_sapi_name() != 'cli') { |
197 | $t = strval(date('Y/m/d_H:i:s')) . ' - ' . $_SERVER["REMOTE_ADDR"] . ' - ' . strval($message) . "\n"; | 197 | $t = strval(date('Y/m/d_H:i:s')) . ' - ' . $_SERVER["REMOTE_ADDR"] . ' - ' . strval($message) . "\n"; |
198 | file_put_contents(CACHE . '/log.txt', $t, FILE_APPEND); | 198 | file_put_contents(CACHE . '/log.txt', $t, FILE_APPEND); |
199 | error_log('DEBUG POCHE : ' . $message); | 199 | error_log('DEBUG POCHE : ' . $message); |
200 | } | 200 | } |
201 | } | 201 | } |
202 | 202 | ||
203 | public static function encodeString($string) | 203 | public static function encodeString($string) |
204 | { | 204 | { |
205 | return sha1($string . SALT); | 205 | return sha1($string . SALT); |
206 | } | 206 | } |
@@ -241,7 +241,6 @@ class Tools | |||
241 | } | 241 | } |
242 | } | 242 | } |
243 | 243 | ||
244 | |||
245 | public static function download_db() { | 244 | public static function download_db() { |
246 | header('Content-Disposition: attachment; filename="poche.sqlite.gz"'); | 245 | header('Content-Disposition: attachment; filename="poche.sqlite.gz"'); |
247 | self::status(200); | 246 | self::status(200); |
@@ -252,4 +251,74 @@ class Tools | |||
252 | 251 | ||
253 | exit; | 252 | exit; |
254 | } | 253 | } |
254 | |||
255 | public static function getPageContent(Url $url) | ||
256 | { | ||
257 | // Saving and clearing context | ||
258 | $REAL = array(); | ||
259 | foreach( $GLOBALS as $key => $value ) { | ||
260 | if( $key != 'GLOBALS' && $key != '_SESSION' && $key != 'HTTP_SESSION_VARS' ) { | ||
261 | $GLOBALS[$key] = array(); | ||
262 | $REAL[$key] = $value; | ||
263 | } | ||
264 | } | ||
265 | // Saving and clearing session | ||
266 | if ( isset($_SESSION) ) { | ||
267 | $REAL_SESSION = array(); | ||
268 | foreach( $_SESSION as $key => $value ) { | ||
269 | $REAL_SESSION[$key] = $value; | ||
270 | unset($_SESSION[$key]); | ||
271 | } | ||
272 | } | ||
273 | |||
274 | // Running code in different context | ||
275 | $scope = function() { | ||
276 | extract( func_get_arg(1) ); | ||
277 | $_GET = $_REQUEST = array( | ||
278 | "url" => $url->getUrl(), | ||
279 | "max" => 5, | ||
280 | "links" => "preserve", | ||
281 | "exc" => "", | ||
282 | "format" => "json", | ||
283 | "submit" => "Create Feed" | ||
284 | ); | ||
285 | ob_start(); | ||
286 | require func_get_arg(0); | ||
287 | $json = ob_get_contents(); | ||
288 | ob_end_clean(); | ||
289 | return $json; | ||
290 | }; | ||
291 | $json = $scope( "inc/3rdparty/makefulltextfeed.php", array("url" => $url) ); | ||
292 | |||
293 | // Clearing and restoring context | ||
294 | foreach( $GLOBALS as $key => $value ) { | ||
295 | if( $key != "GLOBALS" && $key != "_SESSION" ) { | ||
296 | unset($GLOBALS[$key]); | ||
297 | } | ||
298 | } | ||
299 | foreach( $REAL as $key => $value ) { | ||
300 | $GLOBALS[$key] = $value; | ||
301 | } | ||
302 | // Clearing and restoring session | ||
303 | if ( isset($REAL_SESSION) ) { | ||
304 | foreach( $_SESSION as $key => $value ) { | ||
305 | unset($_SESSION[$key]); | ||
306 | } | ||
307 | foreach( $REAL_SESSION as $key => $value ) { | ||
308 | $_SESSION[$key] = $value; | ||
309 | } | ||
310 | } | ||
311 | |||
312 | return json_decode($json, true); | ||
313 | } | ||
314 | |||
315 | /** | ||
316 | * Returns whether we handle an AJAX (XMLHttpRequest) request. | ||
317 | * @return boolean whether we handle an AJAX (XMLHttpRequest) request. | ||
318 | */ | ||
319 | public static function isAjaxRequest() | ||
320 | { | ||
321 | return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; | ||
322 | } | ||
323 | |||
255 | } | 324 | } |
diff --git a/inc/poche/config.inc.php.new b/inc/poche/config.inc.php.new index 8d52497b..83b3c4c0 100755 --- a/inc/poche/config.inc.php.new +++ b/inc/poche/config.inc.php.new | |||
@@ -52,12 +52,8 @@ define ('CACHE', ROOT . '/cache'); | |||
52 | 52 | ||
53 | define ('PAGINATION', '10'); | 53 | define ('PAGINATION', '10'); |
54 | 54 | ||
55 | define ('POCKET_FILE', '/ril_export.html'); | 55 | //limit for download of articles during import |
56 | define ('READABILITY_FILE', '/readability'); | 56 | define ('IMPORT_LIMIT', 5); |
57 | define ('INSTAPAPER_FILE', '/instapaper-export.html'); | 57 | //delay between downloads (in sec) |
58 | define ('POCHE_FILE', '/poche-export'); | 58 | define ('IMPORT_DELAY', 5); |
59 | 59 | ||
60 | define ('IMPORT_POCKET_FILE', ROOT . POCKET_FILE); | ||
61 | define ('IMPORT_READABILITY_FILE', ROOT . READABILITY_FILE); | ||
62 | define ('IMPORT_INSTAPAPER_FILE', ROOT . INSTAPAPER_FILE); | ||
63 | define ('IMPORT_POCHE_FILE', ROOT . POCHE_FILE); \ No newline at end of file | ||
diff --git a/inc/poche/global.inc.php b/inc/poche/global.inc.php index d22b0588..15091387 100644 --- a/inc/poche/global.inc.php +++ b/inc/poche/global.inc.php | |||
@@ -38,7 +38,7 @@ if (! file_exists(ROOT . '/vendor/autoload.php')) { | |||
38 | require_once ROOT . '/vendor/autoload.php'; | 38 | require_once ROOT . '/vendor/autoload.php'; |
39 | } | 39 | } |
40 | 40 | ||
41 | # system configuration; database credentials et cetera | 41 | # system configuration; database credentials et caetera |
42 | if (! file_exists(INCLUDES . '/poche/config.inc.php')) { | 42 | if (! file_exists(INCLUDES . '/poche/config.inc.php')) { |
43 | Poche::$configFileAvailable = false; | 43 | Poche::$configFileAvailable = false; |
44 | } else { | 44 | } else { |
@@ -8,10 +8,13 @@ | |||
8 | * @license http://www.wtfpl.net/ see COPYING file | 8 | * @license http://www.wtfpl.net/ see COPYING file |
9 | */ | 9 | */ |
10 | 10 | ||
11 | define ('POCHE', '1.5.2'); | 11 | define ('POCHE', '1.6.0'); |
12 | require 'check_setup.php'; | 12 | require 'check_setup.php'; |
13 | require_once 'inc/poche/global.inc.php'; | 13 | require_once 'inc/poche/global.inc.php'; |
14 | session_start(); | 14 | |
15 | # Start session | ||
16 | Session::$sessionName = 'poche'; | ||
17 | Session::init(); | ||
15 | 18 | ||
16 | # Start Poche | 19 | # Start Poche |
17 | $poche = new Poche(); | 20 | $poche = new Poche(); |
@@ -30,14 +33,14 @@ $tpl_vars = array( | |||
30 | 'referer' => $referer, | 33 | 'referer' => $referer, |
31 | 'view' => $view, | 34 | 'view' => $view, |
32 | 'poche_url' => Tools::getPocheUrl(), | 35 | 'poche_url' => Tools::getPocheUrl(), |
33 | 'title' => _('poche, a read it later open source system'), | 36 | 'title' => _('wallabag, a read it later open source system'), |
34 | 'token' => Session::getToken(), | 37 | 'token' => Session::getToken(), |
35 | 'theme' => $poche->getTheme() | 38 | 'theme' => $poche->getTheme() |
36 | ); | 39 | ); |
37 | 40 | ||
38 | if (! empty($notInstalledMessage)) { | 41 | if (! empty($notInstalledMessage)) { |
39 | if (! Poche::$canRenderTemplates || ! Poche::$configFileAvailable) { | 42 | if (! Poche::$canRenderTemplates || ! Poche::$configFileAvailable) { |
40 | # We cannot use Twig to display the error message | 43 | # We cannot use Twig to display the error message |
41 | echo '<h1>Errors</h1><ol>'; | 44 | echo '<h1>Errors</h1><ol>'; |
42 | foreach ($notInstalledMessage as $message) { | 45 | foreach ($notInstalledMessage as $message) { |
43 | echo '<li>' . $message . '</li>'; | 46 | echo '<li>' . $message . '</li>'; |
@@ -64,7 +67,8 @@ if (isset($_GET['login'])) { | |||
64 | # Update password | 67 | # Update password |
65 | $poche->updatePassword(); | 68 | $poche->updatePassword(); |
66 | } elseif (isset($_GET['import'])) { | 69 | } elseif (isset($_GET['import'])) { |
67 | $import = $poche->import($_GET['from']); | 70 | $import = $poche->import(); |
71 | $tpl_vars = array_merge($tpl_vars, $import); | ||
68 | } elseif (isset($_GET['download'])) { | 72 | } elseif (isset($_GET['download'])) { |
69 | Tools::download_db(); | 73 | Tools::download_db(); |
70 | } elseif (isset($_GET['empty-cache'])) { | 74 | } elseif (isset($_GET['empty-cache'])) { |
@@ -75,6 +79,8 @@ if (isset($_GET['login'])) { | |||
75 | $poche->updateTheme(); | 79 | $poche->updateTheme(); |
76 | } elseif (isset($_GET['updatelanguage'])) { | 80 | } elseif (isset($_GET['updatelanguage'])) { |
77 | $poche->updateLanguage(); | 81 | $poche->updateLanguage(); |
82 | } elseif (isset($_GET['uploadfile'])) { | ||
83 | $poche->uploadFile(); | ||
78 | } elseif (isset($_GET['feed'])) { | 84 | } elseif (isset($_GET['feed'])) { |
79 | if (isset($_GET['action']) && $_GET['action'] == 'generate') { | 85 | if (isset($_GET['action']) && $_GET['action'] == 'generate') { |
80 | $poche->generateToken(); | 86 | $poche->generateToken(); |
@@ -115,6 +121,7 @@ if (Session::isLogged()) { | |||
115 | } else { | 121 | } else { |
116 | $tpl_file = Tools::getTplFile('login'); | 122 | $tpl_file = Tools::getTplFile('login'); |
117 | $tpl_vars['http_auth'] = 0; | 123 | $tpl_vars['http_auth'] = 0; |
124 | Session::logout(); | ||
118 | } | 125 | } |
119 | 126 | ||
120 | # because messages can be added in $poche->action(), we have to add this entry now (we can add it before) | 127 | # because messages can be added in $poche->action(), we have to add this entry now (we can add it before) |
diff --git a/install/index.php b/install/index.php index 975b997f..e02952e0 100644 --- a/install/index.php +++ b/install/index.php | |||
@@ -1,9 +1,30 @@ | |||
1 | <?php | 1 | <?php |
2 | $errors = array(); | 2 | $errors = array(); |
3 | $successes = array(); | 3 | $successes = array(); |
4 | if ($_POST['download']) { | 4 | |
5 | /* Function taken from at http://php.net/manual/en/function.rmdir.php#110489 | ||
6 | * Idea : nbari at dalmp dot com | ||
7 | * Rights unknown | ||
8 | * Here in case of .gitignore files | ||
9 | */ | ||
10 | function delTree($dir) { | ||
11 | $files = array_diff(scandir($dir), array('.','..')); | ||
12 | foreach ($files as $file) { | ||
13 | (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); | ||
14 | } | ||
15 | return rmdir($dir); | ||
16 | } | ||
17 | |||
18 | if (isset($_GET['clean'])) { | ||
19 | if (is_dir('install')){ | ||
20 | delTree('install'); | ||
21 | header('Location: index.php'); | ||
22 | } | ||
23 | } | ||
24 | |||
25 | if (isset($_POST['download'])) { | ||
5 | if (!file_put_contents("cache/vendor.zip", fopen("http://static.wallabag.org/files/vendor.zip", 'r'))) { | 26 | if (!file_put_contents("cache/vendor.zip", fopen("http://static.wallabag.org/files/vendor.zip", 'r'))) { |
6 | $errors[] = 'Impossible to download vendor.zip. Please <a href="http://wllbg.org/vendor">download it manually<∕a> and unzip it in your wallabag folder.'; | 27 | $errors[] = 'Impossible to download vendor.zip. Please <a href="http://wllbg.org/vendor">download it manually</a> and unzip it in your wallabag folder.'; |
7 | } | 28 | } |
8 | else { | 29 | else { |
9 | if (extension_loaded('zip')) { | 30 | if (extension_loaded('zip')) { |
@@ -25,7 +46,7 @@ if ($_POST['download']) { | |||
25 | } | 46 | } |
26 | } | 47 | } |
27 | } | 48 | } |
28 | else if ($_POST['install']) { | 49 | else if (isset($_POST['install'])) { |
29 | if (!is_dir('vendor')) { | 50 | if (!is_dir('vendor')) { |
30 | $errors[] = 'You must install twig before.'; | 51 | $errors[] = 'You must install twig before.'; |
31 | } | 52 | } |
@@ -64,6 +85,7 @@ else if ($_POST['install']) { | |||
64 | else { | 85 | else { |
65 | $db_path = 'sqlite:' . realpath('') . '/db/poche.sqlite'; | 86 | $db_path = 'sqlite:' . realpath('') . '/db/poche.sqlite'; |
66 | $handle = new PDO($db_path); | 87 | $handle = new PDO($db_path); |
88 | $sql_structure = ""; | ||
67 | } | 89 | } |
68 | } | 90 | } |
69 | else { | 91 | else { |
@@ -129,7 +151,7 @@ else if ($_POST['install']) { | |||
129 | $params = array($id_user, 'language', 'en_EN.UTF8'); | 151 | $params = array($id_user, 'language', 'en_EN.UTF8'); |
130 | $query = executeQuery($handle, $sql, $params); | 152 | $query = executeQuery($handle, $sql, $params); |
131 | 153 | ||
132 | $successes[] = 'wallabag is now installed. Don\'t forget to delete install folder. Then, <a href="index.php">reload this page</a>.'; | 154 | $successes[] = 'wallabag is now installed. You can now <a href="index.php?clean=0">access it !</a>'; |
133 | } | 155 | } |
134 | } | 156 | } |
135 | } | 157 | } |
@@ -143,7 +165,7 @@ else if ($_POST['install']) { | |||
143 | <!--[if IE]> | 165 | <!--[if IE]> |
144 | <meta http-equiv="X-UA-Compatible" content="IE=10"> | 166 | <meta http-equiv="X-UA-Compatible" content="IE=10"> |
145 | <![endif]--> | 167 | <![endif]--> |
146 | <title>wallabag — installation</title> | 168 | <title>wallabag - installation</title> |
147 | <link rel="shortcut icon" type="image/x-icon" href="themes/baggy/img/favicon.ico" /> | 169 | <link rel="shortcut icon" type="image/x-icon" href="themes/baggy/img/favicon.ico" /> |
148 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="themes/baggy/img/apple-touch-icon-144x144-precomposed.png"> | 170 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="themes/baggy/img/apple-touch-icon-144x144-precomposed.png"> |
149 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="themes/baggy/img/apple-touch-icon-72x72-precomposed.png"> | 171 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="themes/baggy/img/apple-touch-icon-72x72-precomposed.png"> |
@@ -154,7 +176,7 @@ else if ($_POST['install']) { | |||
154 | <link rel="stylesheet" href="themes/baggy/css/main.css" media="all"> | 176 | <link rel="stylesheet" href="themes/baggy/css/main.css" media="all"> |
155 | <link rel="stylesheet" href="themes/baggy/css/messages.css" media="all"> | 177 | <link rel="stylesheet" href="themes/baggy/css/messages.css" media="all"> |
156 | <link rel="stylesheet" href="themes/baggy/css/print.css" media="print"> | 178 | <link rel="stylesheet" href="themes/baggy/css/print.css" media="print"> |
157 | <script src="themes/baggy/js/jquery-2.0.3.min.js"></script> | 179 | <script src="themes/default/js/jquery-2.0.3.min.js"></script> |
158 | <script src="themes/baggy/js/init.js"></script> | 180 | <script src="themes/baggy/js/init.js"></script> |
159 | </head> | 181 | </head> |
160 | <body> | 182 | <body> |
@@ -198,18 +220,18 @@ else if ($_POST['install']) { | |||
198 | <?php if (file_exists('inc/poche/config.inc.php') && is_dir('vendor')) : ?> | 220 | <?php if (file_exists('inc/poche/config.inc.php') && is_dir('vendor')) : ?> |
199 | <div class='messages success install'> | 221 | <div class='messages success install'> |
200 | <p> | 222 | <p> |
201 | wallabag seems already installed. If you want to update it, you only have to delete install folder. | 223 | wallabag seems already installed. If you want to update it, you only have to delete install folder, then <a href="index.php">reload this page</a>. |
202 | </p> | 224 | </p> |
203 | </div> | 225 | </div> |
204 | <?php endif; ?> | 226 | <?php endif; ?> |
205 | <?php endif; ?> | 227 | <?php endif; ?> |
206 | <p>To install wallabag, you just have to fill the following fields. That's all.</p> | 228 | <p>To install wallabag, you just have to fill the following fields. That's all.</p> |
207 | <p>Don't forget to check your server compatibility <a href="wallabag_compatibility_test.php">here</a>.</p> | 229 | <p>Don't forget to check your server compatibility <a href="wallabag_compatibility_test.php?from=install">here</a>.</p> |
208 | <form method="post"> | 230 | <form method="post"> |
209 | <fieldset> | 231 | <fieldset> |
210 | <legend><strong>Technical settings</strong></legend> | 232 | <legend><strong>Technical settings</strong></legend> |
211 | <?php if (!is_dir('vendor')) : ?> | 233 | <?php if (!is_dir('vendor')) : ?> |
212 | <div class='messages notice install'>wallabag needs twig, a template engine (<a href="http://twig.sensiolabs.org/">?</a>). Two ways to install it: | 234 | <div class='messages notice install'>wallabag needs twig, a template engine (<a href="http://twig.sensiolabs.org/">?</a>). Two ways to install it:<br /> |
213 | <ul> | 235 | <ul> |
214 | <li>automatically download and extract vendor.zip into your wallabag folder. | 236 | <li>automatically download and extract vendor.zip into your wallabag folder. |
215 | <p><input type="submit" name="download" value="Download vendor.zip" /></p> | 237 | <p><input type="submit" name="download" value="Download vendor.zip" /></p> |
@@ -225,7 +247,11 @@ php composer.phar install</code></pre></li> | |||
225 | <p> | 247 | <p> |
226 | Database engine: | 248 | Database engine: |
227 | <ul> | 249 | <ul> |
228 | <li><label for="sqlite">SQLite</label> <input name="db_engine" type="radio" checked="" id="sqlite" value="sqlite" /></li> | 250 | <li><label for="sqlite">SQLite</label> <input name="db_engine" type="radio" checked="" id="sqlite" value="sqlite" /> |
251 | <div id="pdo_sqlite" class='messages error install'> | ||
252 | <p>You have to enable <a href="http://php.net/manual/ref.pdo-sqlite.php">pdo_sqlite extension</a>.</p> | ||
253 | </div> | ||
254 | </li> | ||
229 | <li> | 255 | <li> |
230 | <label for="mysql">MySQL</label> <input name="db_engine" type="radio" id="mysql" value="mysql" /> | 256 | <label for="mysql">MySQL</label> <input name="db_engine" type="radio" id="mysql" value="mysql" /> |
231 | <ul id="mysql_infos"> | 257 | <ul id="mysql_infos"> |
@@ -241,7 +267,7 @@ php composer.phar install</code></pre></li> | |||
241 | <li><label for="pg_server">Server</label> <input type="text" placeholder="localhost" id="pg_server" name="pg_server" /></li> | 267 | <li><label for="pg_server">Server</label> <input type="text" placeholder="localhost" id="pg_server" name="pg_server" /></li> |
242 | <li><label for="pg_database">Database</label> <input type="text" placeholder="wallabag" id="pg_database" name="pg_database" /></li> | 268 | <li><label for="pg_database">Database</label> <input type="text" placeholder="wallabag" id="pg_database" name="pg_database" /></li> |
243 | <li><label for="pg_user">User</label> <input type="text" placeholder="user" id="pg_user" name="pg_user" /></li> | 269 | <li><label for="pg_user">User</label> <input type="text" placeholder="user" id="pg_user" name="pg_user" /></li> |
244 | id <li><label for="pg_password">Password</label> <input type="text" placeholder="p4ssw0rd" id="pg_password" name="pg_password" /></li> | 270 | <li><label for="pg_password">Password</label> <input type="text" placeholder="p4ssw0rd" id="pg_password" name="pg_password" /></li> |
245 | </ul> | 271 | </ul> |
246 | </li> | 272 | </li> |
247 | </ul> | 273 | </ul> |
@@ -263,26 +289,49 @@ php composer.phar install</code></pre></li> | |||
263 | </p> | 289 | </p> |
264 | </fieldset> | 290 | </fieldset> |
265 | 291 | ||
266 | <input type="submit" value="Install wallabag" name="install" /> | 292 | <input type="submit" id="install_button" value="Install wallabag" name="install" /> |
267 | </form> | 293 | </form> |
268 | </div> | 294 | </div> |
269 | <script> | 295 | <script> |
270 | $("#mysql_infos").hide(); | 296 | $("#mysql_infos").hide(); |
271 | $("#pg_infos").hide(); | 297 | $("#pg_infos").hide(); |
298 | |||
299 | <?php | ||
300 | if (!extension_loaded('pdo_sqlite')) : ?> | ||
301 | $("#install_button").hide(); | ||
302 | <?php | ||
303 | else : | ||
304 | ?> | ||
305 | $("#pdo_sqlite").hide(); | ||
306 | <?php | ||
307 | endif; | ||
308 | ?> | ||
309 | |||
272 | $("input[name=db_engine]").click(function() | 310 | $("input[name=db_engine]").click(function() |
273 | { | 311 | { |
274 | if ( $("#mysql").prop('checked')) { | 312 | if ( $("#mysql").prop('checked')) { |
275 | $("#mysql_infos").show(); | 313 | $("#mysql_infos").show(); |
276 | $("#pg_infos").hide(); | 314 | $("#pg_infos").hide(); |
315 | $("#pdo_sqlite").hide(); | ||
316 | $("#install_button").show(); | ||
277 | } | 317 | } |
278 | else { | 318 | else { |
279 | if ( $("#postgresql").prop('checked')) { | 319 | if ( $("#postgresql").prop('checked')) { |
280 | $("#mysql_infos").hide(); | 320 | $("#mysql_infos").hide(); |
281 | $("#pg_infos").show(); | 321 | $("#pg_infos").show(); |
322 | $("#pdo_sqlite").hide(); | ||
323 | $("#install_button").show(); | ||
282 | } | 324 | } |
283 | else { | 325 | else { |
284 | $("#mysql_infos").hide(); | 326 | $("#mysql_infos").hide(); |
285 | $("#pg_infos").hide(); | 327 | $("#pg_infos").hide(); |
328 | <?php | ||
329 | if (!extension_loaded('pdo_sqlite')) : ?> | ||
330 | $("#pdo_sqlite").show(); | ||
331 | $("#install_button").hide(); | ||
332 | <?php | ||
333 | endif; | ||
334 | ?> | ||
286 | } | 335 | } |
287 | } | 336 | } |
288 | }); | 337 | }); |
diff --git a/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po b/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po index 8209a9cd..cf727432 100644 --- a/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po +++ b/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po | |||
@@ -4,54 +4,137 @@ | |||
4 | msgid "" | 4 | msgid "" |
5 | msgstr "" | 5 | msgstr "" |
6 | "Project-Id-Version: poche\n" | 6 | "Project-Id-Version: poche\n" |
7 | "POT-Creation-Date: \n" | 7 | "Report-Msgid-Bugs-To: \n" |
8 | "PO-Revision-Date: 2013-10-08 13:25+0100\n" | 8 | "POT-Creation-Date: 2014-02-25 15:28+0300\n" |
9 | "Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" | 9 | "PO-Revision-Date: 2014-02-25 15:29+0300\n" |
10 | "Language-Team: Czech (http://www.transifex.com/projects/p/poche/language/" | 10 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
11 | "cs/)\n" | 11 | "Language-Team: Czech (http://www.transifex.com/projects/p/poche/language/cs/)\n" |
12 | "Language: cs\n" | ||
12 | "MIME-Version: 1.0\n" | 13 | "MIME-Version: 1.0\n" |
13 | "Content-Type: text/plain; charset=UTF-8\n" | 14 | "Content-Type: text/plain; charset=UTF-8\n" |
14 | "Content-Transfer-Encoding: 8bit\n" | 15 | "Content-Transfer-Encoding: 8bit\n" |
15 | "Language: cs\n" | ||
16 | "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" | 16 | "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" |
17 | "X-Generator: Poedit 1.5.4\n" | 17 | "X-Generator: Poedit 1.5.4\n" |
18 | "X-Poedit-Language: Czech\n" | ||
19 | "X-Poedit-Basepath: .\n" | ||
20 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" | ||
21 | |||
22 | msgid "wallabag, a read it later open source system" | ||
23 | msgstr "" | ||
24 | |||
25 | msgid "login failed: user doesn't exist" | ||
26 | msgstr "" | ||
27 | |||
28 | msgid "return home" | ||
29 | msgstr "" | ||
18 | 30 | ||
19 | msgid "config" | 31 | msgid "config" |
20 | msgstr "nastavení" | 32 | msgstr "nastavení" |
21 | 33 | ||
22 | msgid "Poching a link" | 34 | msgid "Saving articles" |
23 | msgstr "Odkaz se ukládá" | 35 | msgstr "" |
36 | |||
37 | msgid "There are several ways to save an article:" | ||
38 | msgstr "" | ||
24 | 39 | ||
25 | msgid "read the documentation" | 40 | msgid "read the documentation" |
26 | msgstr "číst dokumentaci" | 41 | msgstr "číst dokumentaci" |
27 | 42 | ||
28 | msgid "by filling this field" | 43 | msgid "download the extension" |
44 | msgstr "" | ||
45 | |||
46 | msgid "via F-Droid" | ||
47 | msgstr "" | ||
48 | |||
49 | msgid " or " | ||
50 | msgstr "" | ||
51 | |||
52 | msgid "via Google Play" | ||
53 | msgstr "" | ||
54 | |||
55 | msgid "download the application" | ||
56 | msgstr "" | ||
57 | |||
58 | #, fuzzy | ||
59 | msgid "By filling this field" | ||
29 | msgstr "vyplněním tohoto pole" | 60 | msgstr "vyplněním tohoto pole" |
30 | 61 | ||
31 | msgid "poche it!" | 62 | msgid "bag it!" |
32 | msgstr "uložit!" | 63 | msgstr "" |
33 | 64 | ||
34 | msgid "Updating poche" | 65 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
35 | msgstr "Poche se aktualizuje" | 66 | msgstr "" |
36 | 67 | ||
37 | msgid "your version" | 68 | msgid "Upgrading wallabag" |
38 | msgstr "vaše verze" | 69 | msgstr "" |
39 | 70 | ||
40 | msgid "latest stable version" | 71 | #, fuzzy |
72 | msgid "Installed version" | ||
41 | msgstr "poslední stabilní verze" | 73 | msgstr "poslední stabilní verze" |
42 | 74 | ||
43 | msgid "a more recent stable version is available." | 75 | #, fuzzy |
76 | msgid "Latest stable version" | ||
77 | msgstr "poslední stabilní verze" | ||
78 | |||
79 | #, fuzzy | ||
80 | msgid "A more recent stable version is available." | ||
44 | msgstr "je k dispozici novější stabilní verze." | 81 | msgstr "je k dispozici novější stabilní verze." |
45 | 82 | ||
46 | msgid "you are up to date." | 83 | #, fuzzy |
84 | msgid "You are up to date." | ||
47 | msgstr "je aktuální" | 85 | msgstr "je aktuální" |
48 | 86 | ||
49 | msgid "latest dev version" | 87 | #, fuzzy |
88 | msgid "Latest dev version" | ||
50 | msgstr "poslední vývojová verze" | 89 | msgstr "poslední vývojová verze" |
51 | 90 | ||
52 | msgid "a more recent development version is available." | 91 | #, fuzzy |
92 | msgid "A more recent development version is available." | ||
53 | msgstr "je k dispozici novější vývojová verze." | 93 | msgstr "je k dispozici novější vývojová verze." |
54 | 94 | ||
95 | msgid "Feeds" | ||
96 | msgstr "" | ||
97 | |||
98 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
99 | msgstr "" | ||
100 | |||
101 | msgid "Unread feed" | ||
102 | msgstr "" | ||
103 | |||
104 | #, fuzzy | ||
105 | msgid "Favorites feed" | ||
106 | msgstr "oblíbené" | ||
107 | |||
108 | #, fuzzy | ||
109 | msgid "Archive feed" | ||
110 | msgstr "archív" | ||
111 | |||
112 | msgid "Your token:" | ||
113 | msgstr "" | ||
114 | |||
115 | msgid "Your user id:" | ||
116 | msgstr "" | ||
117 | |||
118 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
119 | msgstr "" | ||
120 | |||
121 | #, fuzzy | ||
122 | msgid "Change your theme" | ||
123 | msgstr "Změnit heslo" | ||
124 | |||
125 | msgid "Theme:" | ||
126 | msgstr "" | ||
127 | |||
128 | msgid "Update" | ||
129 | msgstr "Aktualizovat" | ||
130 | |||
131 | #, fuzzy | ||
132 | msgid "Change your language" | ||
133 | msgstr "Změnit heslo" | ||
134 | |||
135 | msgid "Language:" | ||
136 | msgstr "" | ||
137 | |||
55 | msgid "Change your password" | 138 | msgid "Change your password" |
56 | msgstr "Změnit heslo" | 139 | msgstr "Změnit heslo" |
57 | 140 | ||
@@ -64,65 +147,68 @@ msgstr "Heslo" | |||
64 | msgid "Repeat your new password:" | 147 | msgid "Repeat your new password:" |
65 | msgstr "Znovu nové heslo:" | 148 | msgstr "Znovu nové heslo:" |
66 | 149 | ||
67 | msgid "Update" | ||
68 | msgstr "Aktualizovat" | ||
69 | |||
70 | msgid "Import" | 150 | msgid "Import" |
71 | msgstr "Importovat" | 151 | msgstr "Importovat" |
72 | 152 | ||
73 | msgid "Please execute the import script locally, it can take a very long time." | 153 | #, fuzzy |
154 | msgid "Please execute the import script locally as it can take a very long time." | ||
74 | msgstr "Spusťte importní skript lokálně, může to dlouho trvat." | 155 | msgstr "Spusťte importní skript lokálně, může to dlouho trvat." |
75 | 156 | ||
76 | msgid "More info in the official doc:" | 157 | #, fuzzy |
158 | msgid "More info in the official documentation:" | ||
77 | msgstr "Více informací v oficiální dokumentaci:" | 159 | msgstr "Více informací v oficiální dokumentaci:" |
78 | 160 | ||
79 | msgid "import from Pocket" | 161 | #, fuzzy |
162 | msgid "Import from Pocket" | ||
80 | msgstr "importovat z Pocket" | 163 | msgstr "importovat z Pocket" |
81 | 164 | ||
82 | msgid "import from Readability" | 165 | #, php-format |
166 | msgid "(you must have a %s file on your server)" | ||
167 | msgstr "" | ||
168 | |||
169 | #, fuzzy | ||
170 | msgid "Import from Readability" | ||
83 | msgstr "importovat z Readability" | 171 | msgstr "importovat z Readability" |
84 | 172 | ||
85 | msgid "import from Instapaper" | 173 | #, fuzzy |
174 | msgid "Import from Instapaper" | ||
86 | msgstr "importovat z Instapaper" | 175 | msgstr "importovat z Instapaper" |
87 | 176 | ||
88 | msgid "Export your poche data" | 177 | #, fuzzy |
178 | msgid "Import from wallabag" | ||
179 | msgstr "importovat z Readability" | ||
180 | |||
181 | #, fuzzy | ||
182 | msgid "Export your wallabag data" | ||
89 | msgstr "Export dat" | 183 | msgstr "Export dat" |
90 | 184 | ||
91 | msgid "Click here" | 185 | msgid "Click here" |
92 | msgstr "Klikněte zde" | 186 | msgstr "Klikněte zde" |
93 | 187 | ||
94 | msgid "to export your poche data." | 188 | msgid "to download your database." |
95 | msgstr "pro export vašich dat." | 189 | msgstr "" |
96 | |||
97 | msgid "back to home" | ||
98 | msgstr "zpět na úvod" | ||
99 | 190 | ||
100 | msgid "installation" | 191 | #, fuzzy |
101 | msgstr "instalace" | 192 | msgid "to export your wallabag data." |
193 | msgstr "pro export vašich dat." | ||
102 | 194 | ||
103 | msgid "install your poche" | 195 | msgid "Cache" |
104 | msgstr "instalovat" | 196 | msgstr "" |
105 | 197 | ||
106 | msgid "" | 198 | msgid "to delete cache." |
107 | "poche is still not installed. Please fill the below form to install it. " | ||
108 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
109 | "on poche website</a>." | ||
110 | msgstr "" | 199 | msgstr "" |
111 | "poche ještě není nainstalováno. Pro instalaci vyplňte níže uvedený formulář. " | ||
112 | "Nezapomeňte <a href='http://doc.inthepoche.com'>si přečíst dokumentaci</a> " | ||
113 | "na stránkách programu." | ||
114 | 200 | ||
115 | msgid "Login" | 201 | msgid "You can enter multiple tags, separated by commas." |
116 | msgstr "Jméno" | 202 | msgstr "" |
117 | 203 | ||
118 | msgid "Repeat your password" | 204 | msgid "return to article" |
119 | msgstr "Zopakujte heslo" | 205 | msgstr "" |
120 | 206 | ||
121 | msgid "Install" | 207 | msgid "plop" |
122 | msgstr "Instalovat" | 208 | msgstr "" |
123 | 209 | ||
124 | msgid "back to top" | 210 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
125 | msgstr "zpět na začátek" | 211 | msgstr "" |
126 | 212 | ||
127 | msgid "favoris" | 213 | msgid "favoris" |
128 | msgstr "oblíbené" | 214 | msgstr "oblíbené" |
@@ -151,10 +237,14 @@ msgstr "podle nadpisu" | |||
151 | msgid "by title desc" | 237 | msgid "by title desc" |
152 | msgstr "podle nadpisu sestupně" | 238 | msgstr "podle nadpisu sestupně" |
153 | 239 | ||
154 | msgid "No link available here!" | 240 | msgid "Tag" |
155 | msgstr "Není k dispozici žádný odkaz!" | 241 | msgstr "" |
156 | 242 | ||
157 | msgid "toggle mark as read" | 243 | msgid "No articles found." |
244 | msgstr "" | ||
245 | |||
246 | #, fuzzy | ||
247 | msgid "Toggle mark as read" | ||
158 | msgstr "označit jako přečtené" | 248 | msgstr "označit jako přečtené" |
159 | 249 | ||
160 | msgid "toggle favorite" | 250 | msgid "toggle favorite" |
@@ -166,13 +256,95 @@ msgstr "smazat" | |||
166 | msgid "original" | 256 | msgid "original" |
167 | msgstr "originál" | 257 | msgstr "originál" |
168 | 258 | ||
259 | msgid "estimated reading time:" | ||
260 | msgstr "" | ||
261 | |||
262 | msgid "mark all the entries as read" | ||
263 | msgstr "" | ||
264 | |||
169 | msgid "results" | 265 | msgid "results" |
170 | msgstr "výsledky" | 266 | msgstr "výsledky" |
171 | 267 | ||
172 | msgid "tweet" | 268 | msgid "installation" |
269 | msgstr "instalace" | ||
270 | |||
271 | #, fuzzy | ||
272 | msgid "install your wallabag" | ||
273 | msgstr "instalovat" | ||
274 | |||
275 | #, fuzzy | ||
276 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
277 | msgstr "poche ještě není nainstalováno. Pro instalaci vyplňte níže uvedený formulář. Nezapomeňte <a href='http://doc.inthepoche.com'>si přečíst dokumentaci</a> na stránkách programu." | ||
278 | |||
279 | msgid "Login" | ||
280 | msgstr "Jméno" | ||
281 | |||
282 | msgid "Repeat your password" | ||
283 | msgstr "Zopakujte heslo" | ||
284 | |||
285 | msgid "Install" | ||
286 | msgstr "Instalovat" | ||
287 | |||
288 | #, fuzzy | ||
289 | msgid "login to your wallabag" | ||
290 | msgstr "přihlásit se k poche" | ||
291 | |||
292 | msgid "Login to wallabag" | ||
293 | msgstr "" | ||
294 | |||
295 | msgid "you are in demo mode, some features may be disabled." | ||
296 | msgstr "používáte ukázkový mód, některé funkce jsou zakázány." | ||
297 | |||
298 | msgid "Username" | ||
299 | msgstr "" | ||
300 | |||
301 | msgid "Stay signed in" | ||
302 | msgstr "Zůstat přihlášen(a)" | ||
303 | |||
304 | msgid "(Do not check on public computers)" | ||
305 | msgstr "(Nezaškrtávejte na veřejně dostupných počítačích)" | ||
306 | |||
307 | msgid "Sign in" | ||
308 | msgstr "Přihlásit se" | ||
309 | |||
310 | msgid "favorites" | ||
311 | msgstr "oblíbené" | ||
312 | |||
313 | msgid "estimated reading time :" | ||
314 | msgstr "" | ||
315 | |||
316 | msgid "Mark all the entries as read" | ||
317 | msgstr "" | ||
318 | |||
319 | msgid "Return home" | ||
320 | msgstr "" | ||
321 | |||
322 | #, fuzzy | ||
323 | msgid "Back to top" | ||
324 | msgstr "zpět na začátek" | ||
325 | |||
326 | #, fuzzy | ||
327 | msgid "Mark as read" | ||
328 | msgstr "označit jako přečtené" | ||
329 | |||
330 | #, fuzzy | ||
331 | msgid "Favorite" | ||
332 | msgstr "oblíbené" | ||
333 | |||
334 | #, fuzzy | ||
335 | msgid "Toggle favorite" | ||
336 | msgstr "označit jako oblíbené" | ||
337 | |||
338 | #, fuzzy | ||
339 | msgid "Delete" | ||
340 | msgstr "smazat" | ||
341 | |||
342 | #, fuzzy | ||
343 | msgid "Tweet" | ||
173 | msgstr "tweetnout" | 344 | msgstr "tweetnout" |
174 | 345 | ||
175 | msgid "email" | 346 | #, fuzzy |
347 | msgid "Email" | ||
176 | msgstr "email" | 348 | msgstr "email" |
177 | 349 | ||
178 | msgid "shaarli" | 350 | msgid "shaarli" |
@@ -181,26 +353,24 @@ msgstr "shaarli" | |||
181 | msgid "flattr" | 353 | msgid "flattr" |
182 | msgstr "flattr" | 354 | msgstr "flattr" |
183 | 355 | ||
184 | msgid "this article appears wrong?" | 356 | #, fuzzy |
357 | msgid "Does this article appear wrong?" | ||
185 | msgstr "vypadá tento článek špatně?" | 358 | msgstr "vypadá tento článek špatně?" |
186 | 359 | ||
187 | msgid "create an issue" | 360 | msgid "tags:" |
188 | msgstr "odeslat požadavek" | 361 | msgstr "" |
189 | |||
190 | msgid "or" | ||
191 | msgstr "nebo" | ||
192 | 362 | ||
193 | msgid "contact us by mail" | 363 | msgid "Edit tags" |
194 | msgstr "kontaktovat e-mailem" | 364 | msgstr "" |
195 | 365 | ||
196 | msgid "plop" | 366 | msgid "save link!" |
197 | msgstr "" | 367 | msgstr "" |
198 | 368 | ||
199 | msgid "home" | 369 | msgid "home" |
200 | msgstr "domů" | 370 | msgstr "domů" |
201 | 371 | ||
202 | msgid "favorites" | 372 | msgid "tags" |
203 | msgstr "oblíbené" | 373 | msgstr "" |
204 | 374 | ||
205 | msgid "logout" | 375 | msgid "logout" |
206 | msgstr "odhlásit se" | 376 | msgstr "odhlásit se" |
@@ -211,23 +381,187 @@ msgstr "běží na" | |||
211 | msgid "debug mode is on so cache is off." | 381 | msgid "debug mode is on so cache is off." |
212 | msgstr "je zapnut ladicí mód, proto je keš vypnuta." | 382 | msgstr "je zapnut ladicí mód, proto je keš vypnuta." |
213 | 383 | ||
214 | msgid "your poche version:" | 384 | #, fuzzy |
215 | msgstr "verze:" | 385 | msgid "your wallabag version:" |
386 | msgstr "vaše verze" | ||
216 | 387 | ||
217 | msgid "storage:" | 388 | msgid "storage:" |
218 | msgstr "úložiště:" | 389 | msgstr "úložiště:" |
219 | 390 | ||
220 | msgid "login to your poche" | 391 | msgid "save a link" |
221 | msgstr "přihlásit se k poche" | 392 | msgstr "" |
222 | 393 | ||
223 | msgid "you are in demo mode, some features may be disabled." | 394 | msgid "back to home" |
224 | msgstr "používáte ukázkový mód, některé funkce jsou zak��zány." | 395 | msgstr "zpět na ��vod" |
225 | 396 | ||
226 | msgid "Stay signed in" | 397 | msgid "toggle mark as read" |
227 | msgstr "Zůstat přihlášen(a)" | 398 | msgstr "označit jako přečtené" |
228 | 399 | ||
229 | msgid "(Do not check on public computers)" | 400 | msgid "tweet" |
230 | msgstr "(Nezaškrtávejte na veřejně dostupných počítačích)" | 401 | msgstr "tweetnout" |
231 | 402 | ||
232 | msgid "Sign in" | 403 | msgid "email" |
233 | msgstr "Přihlásit se" | 404 | msgstr "email" |
405 | |||
406 | msgid "this article appears wrong?" | ||
407 | msgstr "vypadá tento článek špatně?" | ||
408 | |||
409 | msgid "No link available here!" | ||
410 | msgstr "Není k dispozici žádný odkaz!" | ||
411 | |||
412 | msgid "Poching a link" | ||
413 | msgstr "Odkaz se ukládá" | ||
414 | |||
415 | msgid "by filling this field" | ||
416 | msgstr "vyplněním tohoto pole" | ||
417 | |||
418 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
419 | msgstr "" | ||
420 | |||
421 | msgid "your version" | ||
422 | msgstr "vaše verze" | ||
423 | |||
424 | msgid "latest stable version" | ||
425 | msgstr "poslední stabilní verze" | ||
426 | |||
427 | msgid "a more recent stable version is available." | ||
428 | msgstr "je k dispozici novější stabilní verze." | ||
429 | |||
430 | msgid "you are up to date." | ||
431 | msgstr "je aktuální" | ||
432 | |||
433 | msgid "latest dev version" | ||
434 | msgstr "poslední vývojová verze" | ||
435 | |||
436 | msgid "a more recent development version is available." | ||
437 | msgstr "je k dispozici novější vývojová verze." | ||
438 | |||
439 | msgid "Please execute the import script locally, it can take a very long time." | ||
440 | msgstr "Spusťte importní skript lokálně, může to dlouho trvat." | ||
441 | |||
442 | #, fuzzy | ||
443 | msgid "More infos in the official doc:" | ||
444 | msgstr "Více informací v oficiální dokumentaci:" | ||
445 | |||
446 | msgid "import from Pocket" | ||
447 | msgstr "importovat z Pocket" | ||
448 | |||
449 | msgid "import from Readability" | ||
450 | msgstr "importovat z Readability" | ||
451 | |||
452 | msgid "import from Instapaper" | ||
453 | msgstr "importovat z Instapaper" | ||
454 | |||
455 | msgid "Tags" | ||
456 | msgstr "" | ||
457 | |||
458 | #, fuzzy | ||
459 | msgid "Untitled" | ||
460 | msgstr "podle nadpisu" | ||
461 | |||
462 | msgid "the link has been added successfully" | ||
463 | msgstr "" | ||
464 | |||
465 | msgid "error during insertion : the link wasn't added" | ||
466 | msgstr "" | ||
467 | |||
468 | msgid "the link has been deleted successfully" | ||
469 | msgstr "" | ||
470 | |||
471 | msgid "the link wasn't deleted" | ||
472 | msgstr "" | ||
473 | |||
474 | msgid "Article not found!" | ||
475 | msgstr "" | ||
476 | |||
477 | msgid "previous" | ||
478 | msgstr "" | ||
479 | |||
480 | msgid "next" | ||
481 | msgstr "" | ||
482 | |||
483 | msgid "in demo mode, you can't update your password" | ||
484 | msgstr "" | ||
485 | |||
486 | msgid "your password has been updated" | ||
487 | msgstr "" | ||
488 | |||
489 | msgid "the two fields have to be filled & the password must be the same in the two fields" | ||
490 | msgstr "" | ||
491 | |||
492 | msgid "still using the \"" | ||
493 | msgstr "" | ||
494 | |||
495 | msgid "that theme does not seem to be installed" | ||
496 | msgstr "" | ||
497 | |||
498 | msgid "you have changed your theme preferences" | ||
499 | msgstr "" | ||
500 | |||
501 | msgid "that language does not seem to be installed" | ||
502 | msgstr "" | ||
503 | |||
504 | msgid "you have changed your language preferences" | ||
505 | msgstr "" | ||
506 | |||
507 | msgid "login failed: you have to fill all fields" | ||
508 | msgstr "" | ||
509 | |||
510 | msgid "welcome to your wallabag" | ||
511 | msgstr "" | ||
512 | |||
513 | msgid "login failed: bad login or password" | ||
514 | msgstr "" | ||
515 | |||
516 | #, fuzzy | ||
517 | msgid "import from instapaper completed" | ||
518 | msgstr "importovat z Instapaper" | ||
519 | |||
520 | #, fuzzy | ||
521 | msgid "import from pocket completed" | ||
522 | msgstr "importovat z Pocket" | ||
523 | |||
524 | #, fuzzy | ||
525 | msgid "import from Readability completed. " | ||
526 | msgstr "importovat z Readability" | ||
527 | |||
528 | #, fuzzy | ||
529 | msgid "import from Poche completed. " | ||
530 | msgstr "importovat z Pocket" | ||
531 | |||
532 | msgid "Unknown import provider." | ||
533 | msgstr "" | ||
534 | |||
535 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
536 | msgstr "" | ||
537 | |||
538 | msgid "Could not find required \"" | ||
539 | msgstr "" | ||
540 | |||
541 | msgid "Uh, there is a problem while generating feeds." | ||
542 | msgstr "" | ||
543 | |||
544 | #, fuzzy | ||
545 | msgid "Cache deleted." | ||
546 | msgstr "smazat" | ||
547 | |||
548 | msgid "Oops, it seems you don't have PHP 5." | ||
549 | msgstr "" | ||
550 | |||
551 | #~ msgid "poche it!" | ||
552 | #~ msgstr "uložit!" | ||
553 | |||
554 | #~ msgid "Updating poche" | ||
555 | #~ msgstr "Poche se aktualizuje" | ||
556 | |||
557 | #~ msgid "create an issue" | ||
558 | #~ msgstr "odeslat požadavek" | ||
559 | |||
560 | #~ msgid "or" | ||
561 | #~ msgstr "nebo" | ||
562 | |||
563 | #~ msgid "contact us by mail" | ||
564 | #~ msgstr "kontaktovat e-mailem" | ||
565 | |||
566 | #~ msgid "your poche version:" | ||
567 | #~ msgstr "verze:" | ||
diff --git a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo index 375e923f..bd18817f 100644 --- a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo +++ b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo | |||
Binary files differ | |||
diff --git a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po index 5b30d3d7..8b82721d 100644 --- a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po +++ b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po | |||
@@ -1,51 +1,130 @@ | |||
1 | msgid "" | 1 | msgid "" |
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: \n" | 3 | "Project-Id-Version: Wallabag\n" |
4 | "POT-Creation-Date: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-03-27 13:41+0100\n" | ||
5 | "PO-Revision-Date: \n" | 6 | "PO-Revision-Date: \n" |
6 | "Last-Translator: Square252\n" | 7 | "Last-Translator: Kevin Meyer <wallabag@kevin-meyer.de>\n" |
7 | "Language-Team: \n" | 8 | "Language-Team: \n" |
9 | "Language: de\n" | ||
8 | "MIME-Version: 1.0\n" | 10 | "MIME-Version: 1.0\n" |
9 | "Content-Type: text/plain; charset=UTF-8\n" | 11 | "Content-Type: text/plain; charset=UTF-8\n" |
10 | "Content-Transfer-Encoding: 8bit\n" | 12 | "Content-Transfer-Encoding: 8bit\n" |
11 | "X-Generator: Poedit 1.5.7\n" | 13 | "X-Generator: Poedit 1.6.4\n" |
14 | "X-Poedit-Basepath: .\n" | ||
15 | "X-Poedit-SearchPath-0: /Users/kevinmeyer/Dropbox/dev_web/wallabag-dev\n" | ||
12 | 16 | ||
13 | msgid "config" | 17 | msgid "config" |
14 | msgstr "Konfiguration" | 18 | msgstr "Konfiguration" |
15 | 19 | ||
16 | msgid "Poching a link" | 20 | msgid "Saving articles" |
17 | msgstr "Poche einen Link" | 21 | msgstr "Artikel speichern" |
22 | |||
23 | msgid "There are several ways to save an article:" | ||
24 | msgstr "Es gibt viele Methoden um Artikel zu speichern:" | ||
18 | 25 | ||
19 | msgid "read the documentation" | 26 | msgid "read the documentation" |
20 | msgstr "Die Dokumentation lesen" | 27 | msgstr "Die Dokumentation lesen" |
21 | 28 | ||
22 | msgid "by filling this field" | 29 | msgid "download the extension" |
23 | msgstr "durch das ausfüllen dieses Feldes:" | 30 | msgstr "installiere die Erweiterung" |
31 | |||
32 | msgid "via F-Droid" | ||
33 | msgstr "via F-Droid" | ||
34 | |||
35 | msgid " or " | ||
36 | msgstr " oder " | ||
37 | |||
38 | msgid "via Google Play" | ||
39 | msgstr "via Google Play" | ||
40 | |||
41 | msgid "download the application" | ||
42 | msgstr "lade die App" | ||
43 | |||
44 | msgid "By filling this field" | ||
45 | msgstr "Durch Ausfüllen dieses Feldes" | ||
24 | 46 | ||
25 | msgid "poche it!" | 47 | msgid "bag it!" |
26 | msgstr "Poche es!" | 48 | msgstr "bag it!" |
27 | 49 | ||
28 | msgid "Updating poche" | 50 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
29 | msgstr "Poche aktualisieren" | 51 | msgstr "Bookmarklet: Ziehe diesen Link in deine Lesezeichen-Leiste" |
30 | 52 | ||
31 | msgid "your version" | 53 | msgid "Upgrading wallabag" |
32 | msgstr "Deine Version" | 54 | msgstr "wallabag aktualisieren" |
33 | 55 | ||
34 | msgid "latest stable version" | 56 | msgid "Installed version" |
57 | msgstr "Installierte Version" | ||
58 | |||
59 | msgid "Latest stable version" | ||
35 | msgstr "Neuste stabile Version" | 60 | msgstr "Neuste stabile Version" |
36 | 61 | ||
37 | msgid "a more recent stable version is available." | 62 | msgid "A more recent stable version is available." |
38 | msgstr "Eine neuere stabile Version ist verfügbar." | 63 | msgstr "Eine neuere stabile Version ist verfügbar." |
39 | 64 | ||
40 | msgid "you are up to date." | 65 | msgid "You are up to date." |
41 | msgstr "Du bist auf den neuesten Stand." | 66 | msgstr "Du bist auf den neuesten Stand." |
42 | 67 | ||
43 | msgid "latest dev version" | 68 | msgid "Last check:" |
69 | msgstr "Zuletzt geprüft:" | ||
70 | |||
71 | msgid "Latest dev version" | ||
44 | msgstr "Neuste Entwicklungsversion" | 72 | msgstr "Neuste Entwicklungsversion" |
45 | 73 | ||
46 | msgid "a more recent development version is available." | 74 | msgid "A more recent development version is available." |
47 | msgstr "Eine neuere Entwicklungsversion ist verfügbar." | 75 | msgstr "Eine neuere Entwicklungsversion ist verfügbar." |
48 | 76 | ||
77 | msgid "You can clear cache to check the latest release." | ||
78 | msgstr "Leere den Cache um die neueste Version zu prüfen." | ||
79 | |||
80 | msgid "Feeds" | ||
81 | msgstr "Feeds" | ||
82 | |||
83 | msgid "" | ||
84 | "Your feed token is currently empty and must first be generated to enable " | ||
85 | "feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
86 | msgstr "" | ||
87 | "Dein Feed Token ist noch nicht vorhanden und muss zunächst generiert werden, " | ||
88 | "um deine Feeds zu aktivieren. Klicke <a href='?feed&" | ||
89 | "action=generate'>hier um ihn zu generieren</a>." | ||
90 | |||
91 | msgid "Unread feed" | ||
92 | msgstr "Ungelesen Feed" | ||
93 | |||
94 | msgid "Favorites feed" | ||
95 | msgstr "Favoriten Feed" | ||
96 | |||
97 | msgid "Archive feed" | ||
98 | msgstr "Archiv Feed" | ||
99 | |||
100 | msgid "Your token:" | ||
101 | msgstr "Dein Token:" | ||
102 | |||
103 | msgid "Your user id:" | ||
104 | msgstr "Deine User ID:" | ||
105 | |||
106 | msgid "" | ||
107 | "You can regenerate your token: <a href='?feed&action=generate'>generate!" | ||
108 | "</a>." | ||
109 | msgstr "" | ||
110 | "Hier kannst du dein Token erzeugen: <a href='?feed&" | ||
111 | "action=generate'>Generieren!</a>." | ||
112 | |||
113 | msgid "Change your theme" | ||
114 | msgstr "Theme ändern" | ||
115 | |||
116 | msgid "Theme:" | ||
117 | msgstr "Theme:" | ||
118 | |||
119 | msgid "Update" | ||
120 | msgstr "Aktualisieren" | ||
121 | |||
122 | msgid "Change your language" | ||
123 | msgstr "Sprache ändern" | ||
124 | |||
125 | msgid "Language:" | ||
126 | msgstr "Sprache:" | ||
127 | |||
49 | msgid "Change your password" | 128 | msgid "Change your password" |
50 | msgstr "Passwort ändern" | 129 | msgstr "Passwort ändern" |
51 | 130 | ||
@@ -58,75 +137,86 @@ msgstr "Passwort" | |||
58 | msgid "Repeat your new password:" | 137 | msgid "Repeat your new password:" |
59 | msgstr "Neues Passwort wiederholen:" | 138 | msgstr "Neues Passwort wiederholen:" |
60 | 139 | ||
61 | msgid "Update" | ||
62 | msgstr "Aktualisieren" | ||
63 | |||
64 | msgid "Import" | 140 | msgid "Import" |
65 | msgstr "Import" | 141 | msgstr "Import" |
66 | 142 | ||
67 | msgid "Please execute the import script locally, it can take a very long time." | 143 | msgid "" |
68 | msgstr "Bitte führe das Import Script lokal aus, dies kann eine Weile dauern." | 144 | "Importing from other services can be quite long, and webservers default " |
145 | "configuration often prevents long scripts execution time, so it must be done " | ||
146 | "in multiple parts." | ||
147 | msgstr "" | ||
148 | "Der Import von anderen Diensten kann sehr lange dauern. Deswegen bricht der " | ||
149 | "Webserver diesen in vielen Konfigurationen ab. Daher muss der Import in " | ||
150 | "mehrere Teile aufgeteilt werden." | ||
151 | |||
152 | msgid "First, select the export file on your computer and upload it." | ||
153 | msgstr "Wähle eine Datei von deinem Computer aus und lade sie hoch." | ||
154 | |||
155 | msgid "File:" | ||
156 | msgstr "Datei:" | ||
157 | |||
158 | msgid "Upload" | ||
159 | msgstr "Hochladen" | ||
69 | 160 | ||
70 | msgid "More info in the official doc:" | 161 | msgid "Then, click on the right link below." |
71 | msgstr "Mehr Informationen in der offiziellen Dokumentation:" | 162 | msgstr "Klicke dann unten auf den entsprechenden Link." |
72 | 163 | ||
73 | msgid "import from Pocket" | 164 | msgid "Import from Pocket" |
74 | msgstr "Import aus Pocket" | 165 | msgstr "Import aus Pocket" |
75 | 166 | ||
76 | msgid "import from Readability" | 167 | #, php-format |
168 | msgid "(after uploaded %s file)" | ||
169 | msgstr "(nach Upload der Datei %s)" | ||
170 | |||
171 | msgid "Import from Readability" | ||
77 | msgstr "Import aus Readability" | 172 | msgstr "Import aus Readability" |
78 | 173 | ||
79 | msgid "import from Instapaper" | 174 | msgid "Import from Instapaper" |
80 | msgstr "Import aus Instapaper" | 175 | msgstr "Import aus Instapaper" |
81 | 176 | ||
82 | msgid "Export your poche data" | 177 | msgid "Import from wallabag" |
83 | msgstr "Exportieren Sie Ihre Poche Daten." | 178 | msgstr "Import aus Readability" |
84 | |||
85 | msgid "Click here" | ||
86 | msgstr "Klicke hier" | ||
87 | 179 | ||
88 | msgid "to export your poche data." | 180 | msgid "" |
89 | msgstr "um deine Daten aus Poche zu exportieren." | 181 | "3. Your feed token is currently empty and must first be generated to fetch " |
182 | "content. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
183 | msgstr "" | ||
184 | "3. Dein Feed Token ist noch nicht vorhanden und muss zunächst generiert " | ||
185 | "werden, um Inhalt abrufen zu können. Klicke <a href='?feed&" | ||
186 | "action=generate'>hier um ihn zu generieren</a>." | ||
90 | 187 | ||
91 | msgid "back to home" | 188 | msgid "Finally, you have to fetch content for imported items." |
92 | msgstr "züruck zur Hauptseite" | 189 | msgstr "Jetzt musst du den Inhalt der importierten Artikel abrufen." |
93 | 190 | ||
94 | msgid "installation" | 191 | msgid "Click here" |
95 | msgstr "Installieren" | 192 | msgstr "Klicke hier" |
96 | 193 | ||
97 | msgid "install your poche" | 194 | msgid "to fetch content for 10 articles" |
98 | msgstr "Installiere dein Poche" | 195 | msgstr "um den Inhalt von 10 Artikeln abzurufen" |
99 | 196 | ||
100 | msgid "" | 197 | msgid "" |
101 | "poche is still not installed. Please fill the below form to install it. " | 198 | "If you have console access to your server, you can also create a cron task:" |
102 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
103 | "on poche website</a>." | ||
104 | msgstr "" | 199 | msgstr "" |
105 | "Poche ist noch nicht installiert. Bitte fülle die Felder unten aus, um die " | 200 | "Wenn du Konsolenzugang zu deinem Server hast kannst du auch einen cron " |
106 | "Installation durchzuführen. Zögere nicht, <a href='http://inthepoche.com/" | 201 | "erstellen:" |
107 | "doc'>die Dokumentation auf der Website von Poche zu lesen falls du Probleme " | ||
108 | "haben solltest." | ||
109 | 202 | ||
110 | msgid "Login" | 203 | msgid "Export your wallabag data" |
111 | msgstr "Benutzername" | 204 | msgstr "Exportieren deine wallabag Daten" |
112 | 205 | ||
113 | msgid "Repeat your password" | 206 | msgid "to download your database." |
114 | msgstr "Wiederhole dein Passwort" | 207 | msgstr "um deine Datenbank herunterzuladen" |
115 | 208 | ||
116 | msgid "Install" | 209 | msgid "to export your wallabag data." |
117 | msgstr "Installieren" | 210 | msgstr "um deine Daten aus wallabag zu exportieren." |
118 | 211 | ||
119 | msgid "back to top" | 212 | msgid "Cache" |
120 | msgstr "Nach Oben" | 213 | msgstr "Cache" |
121 | 214 | ||
122 | msgid "favoris" | 215 | msgid "to delete cache." |
123 | msgstr "" | 216 | msgstr "um den Cache zu löschen." |
124 | |||
125 | msgid "archive" | ||
126 | msgstr "Archiv" | ||
127 | 217 | ||
128 | msgid "unread" | 218 | msgid "Tags" |
129 | msgstr "ungelesen" | 219 | msgstr "Tags" |
130 | 220 | ||
131 | msgid "by date asc" | 221 | msgid "by date asc" |
132 | msgstr "nach Datum aufsteigend" | 222 | msgstr "nach Datum aufsteigend" |
@@ -146,10 +236,72 @@ msgstr "nach Titel" | |||
146 | msgid "by title desc" | 236 | msgid "by title desc" |
147 | msgstr "nach Titel absteigend" | 237 | msgstr "nach Titel absteigend" |
148 | 238 | ||
149 | msgid "No link available here!" | 239 | #, fuzzy |
150 | msgstr "Kein Link verfügbar!" | 240 | msgid "toggle view mode" |
241 | msgstr "Favorit" | ||
242 | |||
243 | msgid "home" | ||
244 | msgstr "Start" | ||
245 | |||
246 | msgid "favorites" | ||
247 | msgstr "Favoriten" | ||
248 | |||
249 | msgid "archive" | ||
250 | msgstr "Archiv" | ||
251 | |||
252 | msgid "tags" | ||
253 | msgstr "Tags" | ||
254 | |||
255 | msgid "save a link" | ||
256 | msgstr "Speichere einen Link" | ||
257 | |||
258 | msgid "search" | ||
259 | msgstr "Suche" | ||
260 | |||
261 | msgid "logout" | ||
262 | msgstr "Logout" | ||
263 | |||
264 | msgid "return home" | ||
265 | msgstr "Zurück zum Start" | ||
266 | |||
267 | #, fuzzy | ||
268 | msgid "Search" | ||
269 | msgstr "Archiv" | ||
270 | |||
271 | msgid "powered by" | ||
272 | msgstr "bereitgestellt von" | ||
273 | |||
274 | msgid "debug mode is on so cache is off." | ||
275 | msgstr "Debug Modus ist aktiviert, das Caching ist somit deaktiviert" | ||
276 | |||
277 | msgid "your wallabag version:" | ||
278 | msgstr "Deine wallabag Version" | ||
279 | |||
280 | msgid "storage:" | ||
281 | msgstr "Speicher:" | ||
282 | |||
283 | msgid "Save a link" | ||
284 | msgstr "Speichere einen Link" | ||
285 | |||
286 | msgid "save link!" | ||
287 | msgstr "Link speichern!" | ||
288 | |||
289 | msgid "unread" | ||
290 | msgstr "ungelesen" | ||
291 | |||
292 | msgid "Tag" | ||
293 | msgstr "Tag" | ||
294 | |||
295 | msgid "No articles found." | ||
296 | msgstr "Keine Artikel gefunden." | ||
151 | 297 | ||
152 | msgid "toggle mark as read" | 298 | msgid "estimated reading time:" |
299 | msgstr "geschätzte Lesezeit:" | ||
300 | |||
301 | msgid "estimated reading time :" | ||
302 | msgstr "geschätzte Lesezeit:" | ||
303 | |||
304 | msgid "Toggle mark as read" | ||
153 | msgstr "Als gelesen markieren" | 305 | msgstr "Als gelesen markieren" |
154 | 306 | ||
155 | msgid "toggle favorite" | 307 | msgid "toggle favorite" |
@@ -161,69 +313,346 @@ msgstr "Löschen" | |||
161 | msgid "original" | 313 | msgid "original" |
162 | msgstr "Original" | 314 | msgstr "Original" |
163 | 315 | ||
316 | msgid "Mark all the entries as read" | ||
317 | msgstr "Markiere alle als gelesen" | ||
318 | |||
164 | msgid "results" | 319 | msgid "results" |
165 | msgstr "Ergebnisse" | 320 | msgstr "Ergebnisse" |
166 | 321 | ||
167 | msgid "tweet" | 322 | msgid "Uh, there is a problem with the cron." |
168 | msgstr "Twittern" | 323 | msgstr "Oh, es gab ein Problem mit dem cron." |
169 | 324 | ||
170 | msgid "email" | 325 | msgid "Untitled" |
171 | msgstr "senden per E-Mail" | 326 | msgstr "Ohne Titel" |
172 | 327 | ||
173 | msgid "shaarli" | 328 | msgid "the link has been added successfully" |
174 | msgstr "Shaarli" | 329 | msgstr "Speichern des Links erfolgreich" |
175 | 330 | ||
176 | msgid "flattr" | 331 | msgid "error during insertion : the link wasn't added" |
177 | msgstr "flattr" | 332 | msgstr "Fehler beim Einfügen: Der Link wurde nicht hinzugefügt" |
178 | 333 | ||
179 | msgid "this article appears wrong?" | 334 | msgid "the link has been deleted successfully" |
180 | msgstr "dieser Artikel erscheint falsch?" | 335 | msgstr "Löschen des Links erfolgreich" |
181 | 336 | ||
182 | msgid "create an issue" | 337 | msgid "the link wasn't deleted" |
183 | msgstr "ein Ticket erstellen" | 338 | msgstr "Der Link wurde nicht entfernt" |
184 | 339 | ||
185 | msgid "or" | 340 | msgid "Article not found!" |
186 | msgstr "oder" | 341 | msgstr "Artikel nicht gefunden!" |
187 | 342 | ||
188 | msgid "contact us by mail" | 343 | msgid "previous" |
189 | msgstr "kontaktieren Sie uns per E-Mail" | 344 | msgstr "vorherige" |
190 | 345 | ||
191 | msgid "plop" | 346 | msgid "next" |
192 | msgstr "plop" | 347 | msgstr "nächste" |
193 | 348 | ||
194 | msgid "home" | 349 | msgid "in demo mode, you can't update your password" |
195 | msgstr "Start" | 350 | msgstr "im Demo-Modus kann das Passwort nicht geändert werden" |
196 | 351 | ||
197 | msgid "favorites" | 352 | msgid "your password has been updated" |
198 | msgstr "Favoriten" | 353 | msgstr "Dein Passwort wurde geändert" |
199 | 354 | ||
200 | msgid "logout" | 355 | msgid "" |
201 | msgstr "Logout" | 356 | "the two fields have to be filled & the password must be the same in the two " |
357 | "fields" | ||
358 | msgstr "Beide Felder müssen mit selbem Inhalt ausgefüllt sein" | ||
202 | 359 | ||
203 | msgid "powered by" | 360 | msgid "still using the \"" |
204 | msgstr "bereitgestellt von" | 361 | msgstr "nutze immernoch die \"" |
205 | 362 | ||
206 | msgid "debug mode is on so cache is off." | 363 | msgid "that theme does not seem to be installed" |
207 | msgstr "Debug Modus ist aktiviert, das Caching ist somit deaktiviert" | 364 | msgstr "dieses Theme scheint nicht installiert zu sein" |
208 | 365 | ||
209 | msgid "your poche version:" | 366 | msgid "you have changed your theme preferences" |
210 | msgstr "Deine Poche Version" | 367 | msgstr "Du hast deine Theme Einstellungen geändert" |
211 | 368 | ||
212 | msgid "storage:" | 369 | msgid "that language does not seem to be installed" |
213 | msgstr "Speicher:" | 370 | msgstr "Diese Sprache scheint nicht installiert zu sein" |
371 | |||
372 | msgid "you have changed your language preferences" | ||
373 | msgstr "Du hast deine Spracheinstellungen geändert" | ||
374 | |||
375 | msgid "login failed: you have to fill all fields" | ||
376 | msgstr "Anmeldung fehlgeschlagen: Alle Felder müssen ausgefüllt werden" | ||
377 | |||
378 | msgid "welcome to your wallabag" | ||
379 | msgstr "Willkommen bei deiner wallabag" | ||
380 | |||
381 | msgid "login failed: bad login or password" | ||
382 | msgstr "Anmeldung fehlgeschlagen: Falscher Benutzername oder Passwort" | ||
383 | |||
384 | msgid "" | ||
385 | "import from instapaper completed. You have to execute the cron to fetch " | ||
386 | "content." | ||
387 | msgstr "" | ||
388 | "Import aus Instapaper vollständig. Führe den cronjob aus um den Inhalt " | ||
389 | "abzurufen." | ||
390 | |||
391 | msgid "" | ||
392 | "import from pocket completed. You have to execute the cron to fetch content." | ||
393 | msgstr "" | ||
394 | "Import aus Pocket vollständig. Führe den cronjob aus um den Inhalt abzurufen." | ||
214 | 395 | ||
215 | msgid "login to your poche" | 396 | msgid "" |
216 | msgstr "Bei Poche anmelden" | 397 | "import from Readability completed. You have to execute the cron to fetch " |
398 | "content." | ||
399 | msgstr "" | ||
400 | "Import aus Readability vollständig. Führe den cronjob aus um den Inhalt " | ||
401 | "abzurufen." | ||
217 | 402 | ||
218 | msgid "you are in demo mode, some features may be disabled." | 403 | msgid "" |
404 | "import from Poche completed. You have to execute the cron to fetch content." | ||
219 | msgstr "" | 405 | msgstr "" |
220 | "Du befindest dich im Demomodus, einige Funktionen könnten deaktiviert sein." | 406 | "Import aus Poche vollständig. Führe den cronjob aus um den Inhalt abzurufen." |
407 | |||
408 | msgid "Unknown import provider." | ||
409 | msgstr "Unbekannter Import Anbieter." | ||
410 | |||
411 | msgid "Could not find required \"" | ||
412 | msgstr "Nicht gefunden: \"" | ||
413 | |||
414 | msgid "File uploaded. You can now execute import." | ||
415 | msgstr "Datei hochgeladen. Du kannst nun importieren." | ||
416 | |||
417 | msgid "Error while importing file. Do you have access to upload it?" | ||
418 | msgstr "Fehler beim Importieren. Hast du das Recht zum Hochladen?" | ||
419 | |||
420 | msgid "User with this id (" | ||
421 | msgstr "Nutzer mit dieser id (" | ||
422 | |||
423 | msgid "Uh, there is a problem while generating feeds." | ||
424 | msgstr "Oh, es gab ein Problem beim Erstellen des Feeds." | ||
425 | |||
426 | msgid "Cache deleted." | ||
427 | msgstr "Cache gelöscht" | ||
428 | |||
429 | msgid "Oops, it seems you don't have PHP 5." | ||
430 | msgstr "Oops, es scheint als würde PHP 5 fehlen." | ||
431 | |||
432 | msgid "wallabag, a read it later open source system" | ||
433 | msgstr "wallabag, ein Später-Lesen Open Source System" | ||
434 | |||
435 | msgid "login failed: user doesn't exist" | ||
436 | msgstr "Anmeldung fehlgeschlagen: Benutzer existiert nicht" | ||
437 | |||
438 | #~ msgid "You can enter multiple tags, separated by commas." | ||
439 | #~ msgstr "Du kannst mehrere Tags, durch Kommata getrennt, eingeben." | ||
440 | |||
441 | #~ msgid "return to article" | ||
442 | #~ msgstr "zurück zum Artikel" | ||
443 | |||
444 | #, fuzzy | ||
445 | #~ msgid "favoris" | ||
446 | #~ msgstr "Favoriten" | ||
447 | |||
448 | #~ msgid "mark all the entries as read" | ||
449 | #~ msgstr "Markiere alle als gelesen" | ||
450 | |||
451 | #~ msgid "Back to top" | ||
452 | #~ msgstr "Nach Oben" | ||
453 | |||
454 | #~ msgid "Mark as read" | ||
455 | #~ msgstr "Als gelesen markieren" | ||
456 | |||
457 | #~ msgid "Favorite" | ||
458 | #~ msgstr "Favoriten" | ||
459 | |||
460 | #~ msgid "Toggle favorite" | ||
461 | #~ msgstr "Favorit" | ||
462 | |||
463 | #~ msgid "Delete" | ||
464 | #~ msgstr "Löschen" | ||
465 | |||
466 | #~ msgid "Tweet" | ||
467 | #~ msgstr "Twittern" | ||
468 | |||
469 | #~ msgid "Email" | ||
470 | #~ msgstr "per E-Mail senden" | ||
471 | |||
472 | #~ msgid "shaarli" | ||
473 | #~ msgstr "Shaarli" | ||
474 | |||
475 | #~ msgid "flattr" | ||
476 | #~ msgstr "flattr" | ||
477 | |||
478 | #~ msgid "Does this article appear wrong?" | ||
479 | #~ msgstr "Erscheint dieser Artikel falsch?" | ||
480 | |||
481 | #~ msgid "Edit tags" | ||
482 | #~ msgstr "Tags bearbeiten" | ||
483 | |||
484 | #~ msgid "Start typing for auto complete." | ||
485 | #~ msgstr "Beginne zu tippen für die Autovervollständigung." | ||
486 | |||
487 | #~ msgid "Return home" | ||
488 | #~ msgstr "Zurück zum Start" | ||
489 | |||
490 | #~ msgid "tags:" | ||
491 | #~ msgstr "Tags:" | ||
492 | |||
493 | #~ msgid "login to your wallabag" | ||
494 | #~ msgstr "Bei wallabag anmelden" | ||
495 | |||
496 | #~ msgid "you are in demo mode, some features may be disabled." | ||
497 | #~ msgstr "" | ||
498 | #~ "Du befindest dich im Demomodus, einige Funktionen könnten deaktiviert " | ||
499 | #~ "sein." | ||
500 | |||
501 | #~ msgid "Login" | ||
502 | #~ msgstr "Benutzername" | ||
503 | |||
504 | #~ msgid "Stay signed in" | ||
505 | #~ msgstr "Angemeldet bleiben" | ||
506 | |||
507 | #~ msgid "(Do not check on public computers)" | ||
508 | #~ msgstr "(nicht auf einem öffentlichen Computer anhaken)" | ||
509 | |||
510 | #~ msgid "plop" | ||
511 | #~ msgstr "plop" | ||
512 | |||
513 | #~ msgid "Login to wallabag" | ||
514 | #~ msgstr "Bei wallabag anmelden" | ||
515 | |||
516 | #~ msgid "Username" | ||
517 | #~ msgstr "Benutzername" | ||
518 | |||
519 | #~ msgid "Sign in" | ||
520 | #~ msgstr "Einloggen" | ||
521 | |||
522 | #~ msgid "Enter your search here" | ||
523 | #~ msgstr "Gib hier deine Suchanfrage ein" | ||
524 | |||
525 | #~ msgid "installation" | ||
526 | #~ msgstr "Installieren" | ||
527 | |||
528 | #~ msgid "install your wallabag" | ||
529 | #~ msgstr "Installiere deine wallabag" | ||
530 | |||
531 | #~ msgid "" | ||
532 | #~ "wallabag is still not installed. Please fill the below form to install " | ||
533 | #~ "it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the " | ||
534 | #~ "documentation on wallabag website</a>." | ||
535 | #~ msgstr "" | ||
536 | #~ "wallabag ist noch nicht installiert. Bitte fülle die Felder unten aus, um " | ||
537 | #~ "die Installation durchzuführen. Zögere nicht, <a href='http://doc." | ||
538 | #~ "wallabag.org/'>die Dokumentation auf der Website von wallabag zu lesen, " | ||
539 | #~ "falls du Probleme haben solltest." | ||
540 | |||
541 | #~ msgid "Repeat your password" | ||
542 | #~ msgstr "Wiederhole dein Passwort" | ||
543 | |||
544 | #~ msgid "Install" | ||
545 | #~ msgstr "Installieren" | ||
546 | |||
547 | #~ msgid "No link available here!" | ||
548 | #~ msgstr "Kein Link verfügbar!" | ||
549 | |||
550 | #~ msgid "toggle mark as read" | ||
551 | #~ msgstr "Als gelesen markieren" | ||
552 | |||
553 | #~ msgid "" | ||
554 | #~ "You can <a href='wallabag_compatibility_test.php'>check your " | ||
555 | #~ "configuration here</a>." | ||
556 | #~ msgstr "" | ||
557 | #~ "Du kannst deine Konfiguration <a href='wallabag_compatibility_test." | ||
558 | #~ "php'>hier testen</a>." | ||
559 | |||
560 | #~ msgid "back to home" | ||
561 | #~ msgstr "züruck zur Hauptseite" | ||
562 | |||
563 | #~ msgid "tweet" | ||
564 | #~ msgstr "Twittern" | ||
565 | |||
566 | #~ msgid "email" | ||
567 | #~ msgstr "senden per E-Mail" | ||
568 | |||
569 | #~ msgid "this article appears wrong?" | ||
570 | #~ msgstr "dieser Artikel erscheint falsch?" | ||
571 | |||
572 | #~ msgid "Poching a link" | ||
573 | #~ msgstr "Poche einen Link" | ||
574 | |||
575 | #~ msgid "by filling this field" | ||
576 | #~ msgstr "durch das ausfüllen dieses Feldes:" | ||
577 | |||
578 | #~ msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
579 | #~ msgstr "Bookmarklet: Ziehe diesen Link in deine Lesezeichen-Leiste" | ||
580 | |||
581 | #~ msgid "your version" | ||
582 | #~ msgstr "Deine Version" | ||
583 | |||
584 | #~ msgid "latest stable version" | ||
585 | #~ msgstr "Neuste stabile Version" | ||
586 | |||
587 | #~ msgid "a more recent stable version is available." | ||
588 | #~ msgstr "Eine neuere stabile Version ist verfügbar." | ||
589 | |||
590 | #~ msgid "you are up to date." | ||
591 | #~ msgstr "Du bist auf den neuesten Stand." | ||
592 | |||
593 | #~ msgid "latest dev version" | ||
594 | #~ msgstr "Neuste Entwicklungsversion" | ||
595 | |||
596 | #~ msgid "a more recent development version is available." | ||
597 | #~ msgstr "Eine neuere Entwicklungsversion ist verfügbar." | ||
598 | |||
599 | #~ msgid "" | ||
600 | #~ "Please execute the import script locally, it can take a very long time." | ||
601 | #~ msgstr "" | ||
602 | #~ "Bitte führe das Import Script lokal aus, dies kann eine Weile dauern." | ||
603 | |||
604 | #~ msgid "More infos in the official doc:" | ||
605 | #~ msgstr "Mehr Informationen in der offiziellen Dokumentation:" | ||
606 | |||
607 | #~ msgid "import from Pocket" | ||
608 | #~ msgstr "Import aus Pocket" | ||
609 | |||
610 | #~ msgid "(you must have a %s file on your server)" | ||
611 | #~ msgstr "(du brauchst eine %s Datei auf deinem Server)" | ||
612 | |||
613 | #~ msgid "import from Readability" | ||
614 | #~ msgstr "Import aus Readability" | ||
615 | |||
616 | #~ msgid "import from Instapaper" | ||
617 | #~ msgstr "Import aus Instapaper" | ||
618 | |||
619 | #~ msgid "You can also create a cron task:" | ||
620 | #~ msgstr "Du kannst auch einen cronjob anlegen:" | ||
621 | |||
622 | #~ msgid "" | ||
623 | #~ "Please execute the import script locally as it can take a very long time." | ||
624 | #~ msgstr "" | ||
625 | #~ "Bitte führe das Import Script lokal aus, da dies eine Weile dauern kann." | ||
626 | |||
627 | #~ msgid "More info in the official documentation:" | ||
628 | #~ msgstr "Mehr Informationen in der offiziellen Dokumentation:" | ||
629 | |||
630 | #~ msgid "import from instapaper completed" | ||
631 | #~ msgstr "Import aus Instapaper erfolgreich" | ||
632 | |||
633 | #~ msgid "import from pocket completed" | ||
634 | #~ msgstr "Import aus Pocket erfolgreich" | ||
635 | |||
636 | #~ msgid "import from Poche completed. " | ||
637 | #~ msgstr "Import aus Poche erfolgreich" | ||
638 | |||
639 | #~ msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
640 | #~ msgstr "Unvollständige inc/poche/define.inc.php Datei, bitte setze \"" | ||
641 | |||
642 | #~ msgid "poche it!" | ||
643 | #~ msgstr "Poche es!" | ||
644 | |||
645 | #~ msgid "Updating poche" | ||
646 | #~ msgstr "Poche aktualisieren" | ||
647 | |||
648 | #~ msgid "create an issue" | ||
649 | #~ msgstr "ein Ticket erstellen" | ||
221 | 650 | ||
222 | msgid "Stay signed in" | 651 | #~ msgid "or" |
223 | msgstr "Angemeldet bleiben" | 652 | #~ msgstr "oder" |
224 | 653 | ||
225 | msgid "(Do not check on public computers)" | 654 | #~ msgid "contact us by mail" |
226 | msgstr "(nicht auf einem öffentlichen Computer anhaken)" | 655 | #~ msgstr "kontaktieren Sie uns per E-Mail" |
227 | 656 | ||
228 | msgid "Sign in" | 657 | #~ msgid "your poche version:" |
229 | msgstr "Einloggen" | 658 | #~ msgstr "Deine Poche Version" |
diff --git a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo index 83d0a85f..bf5f69e7 100644 --- a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo +++ b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo | |||
Binary files differ | |||
diff --git a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po index b78759f5..119fb060 100644 --- a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po +++ b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po | |||
@@ -1,50 +1,124 @@ | |||
1 | msgid "" | 1 | msgid "" |
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: \n" | 3 | "Project-Id-Version: \n" |
4 | "POT-Creation-Date: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-02-25 15:17+0300\n" | ||
5 | "PO-Revision-Date: \n" | 6 | "PO-Revision-Date: \n" |
6 | "Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" | 7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
7 | "Language-Team: \n" | 8 | "Language-Team: \n" |
9 | "Language: \n" | ||
8 | "MIME-Version: 1.0\n" | 10 | "MIME-Version: 1.0\n" |
9 | "Content-Type: text/plain; charset=UTF-8\n" | 11 | "Content-Type: text/plain; charset=UTF-8\n" |
10 | "Content-Transfer-Encoding: 8bit\n" | 12 | "Content-Transfer-Encoding: 8bit\n" |
11 | "X-Generator: Poedit 1.5.4\n" | 13 | "X-Generator: Poedit 1.5.4\n" |
14 | "X-Poedit-Language: English\n" | ||
15 | "X-Poedit-Basepath: .\n" | ||
16 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" | ||
17 | |||
18 | msgid "wallabag, a read it later open source system" | ||
19 | msgstr "wallabag, a read it later open source system" | ||
20 | |||
21 | msgid "login failed: user doesn't exist" | ||
22 | msgstr "login failed: user doesn't exist" | ||
23 | |||
24 | msgid "return home" | ||
25 | msgstr "return home" | ||
12 | 26 | ||
13 | msgid "config" | 27 | msgid "config" |
14 | msgstr "config" | 28 | msgstr "config" |
15 | 29 | ||
16 | msgid "Poching a link" | 30 | msgid "Saving articles" |
17 | msgstr "Poching a link" | 31 | msgstr "Saving articles" |
32 | |||
33 | msgid "There are several ways to save an article:" | ||
34 | msgstr "There are several ways to save an article:" | ||
18 | 35 | ||
19 | msgid "read the documentation" | 36 | msgid "read the documentation" |
20 | msgstr "read the documentation" | 37 | msgstr "read the documentation" |
21 | 38 | ||
22 | msgid "by filling this field" | 39 | msgid "download the extension" |
23 | msgstr "by filling this field" | 40 | msgstr "download the extension" |
24 | 41 | ||
25 | msgid "poche it!" | 42 | msgid "via F-Droid" |
26 | msgstr "poche it!" | 43 | msgstr "via F-Droid" |
27 | 44 | ||
28 | msgid "Updating poche" | 45 | msgid " or " |
29 | msgstr "Updating poche" | 46 | msgstr " or " |
30 | 47 | ||
31 | msgid "your version" | 48 | msgid "via Google Play" |
32 | msgstr "your version" | 49 | msgstr "via Google Play" |
33 | 50 | ||
34 | msgid "latest stable version" | 51 | msgid "download the application" |
35 | msgstr "latest stable version" | 52 | msgstr "download the application" |
36 | 53 | ||
37 | msgid "a more recent stable version is available." | 54 | msgid "By filling this field" |
38 | msgstr "a more recent stable version is available." | 55 | msgstr "By filling this field" |
39 | 56 | ||
40 | msgid "you are up to date." | 57 | msgid "bag it!" |
41 | msgstr "you are up to date." | 58 | msgstr "bag it!" |
42 | 59 | ||
43 | msgid "latest dev version" | 60 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
44 | msgstr "latest dev version" | 61 | msgstr "Bookmarklet: drag & drop this link to your bookmarks bar" |
45 | 62 | ||
46 | msgid "a more recent development version is available." | 63 | msgid "Upgrading wallabag" |
47 | msgstr "a more recent development version is available." | 64 | msgstr "Upgrading wallabag" |
65 | |||
66 | msgid "Installed version" | ||
67 | msgstr "Installed version" | ||
68 | |||
69 | msgid "Latest stable version" | ||
70 | msgstr "Latest stable version" | ||
71 | |||
72 | msgid "A more recent stable version is available." | ||
73 | msgstr "A more recent stable version is available." | ||
74 | |||
75 | msgid "You are up to date." | ||
76 | msgstr "You are up to date." | ||
77 | |||
78 | msgid "Latest dev version" | ||
79 | msgstr "Latest dev version" | ||
80 | |||
81 | msgid "A more recent development version is available." | ||
82 | msgstr "A more recent development version is available." | ||
83 | |||
84 | msgid "Feeds" | ||
85 | msgstr "Feeds" | ||
86 | |||
87 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
88 | msgstr "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
89 | |||
90 | msgid "Unread feed" | ||
91 | msgstr "Unread feed" | ||
92 | |||
93 | msgid "Favorites feed" | ||
94 | msgstr "Favorites feed" | ||
95 | |||
96 | msgid "Archive feed" | ||
97 | msgstr "Archive feed" | ||
98 | |||
99 | msgid "Your token:" | ||
100 | msgstr "Your token:" | ||
101 | |||
102 | msgid "Your user id:" | ||
103 | msgstr "Your user id:" | ||
104 | |||
105 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
106 | msgstr "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
107 | |||
108 | msgid "Change your theme" | ||
109 | msgstr "Change your theme" | ||
110 | |||
111 | msgid "Theme:" | ||
112 | msgstr "Theme:" | ||
113 | |||
114 | msgid "Update" | ||
115 | msgstr "Update" | ||
116 | |||
117 | msgid "Change your language" | ||
118 | msgstr "Change your language" | ||
119 | |||
120 | msgid "Language:" | ||
121 | msgstr "Language:" | ||
48 | 122 | ||
49 | msgid "Change your password" | 123 | msgid "Change your password" |
50 | msgstr "Change your password" | 124 | msgstr "Change your password" |
@@ -58,66 +132,60 @@ msgstr "Password" | |||
58 | msgid "Repeat your new password:" | 132 | msgid "Repeat your new password:" |
59 | msgstr "Repeat your new password:" | 133 | msgstr "Repeat your new password:" |
60 | 134 | ||
61 | msgid "Update" | ||
62 | msgstr "Update" | ||
63 | |||
64 | msgid "Import" | 135 | msgid "Import" |
65 | msgstr "Import" | 136 | msgstr "Import" |
66 | 137 | ||
67 | msgid "Please execute the import script locally, it can take a very long time." | 138 | msgid "Please execute the import script locally as it can take a very long time." |
68 | msgstr "" | 139 | msgstr "Please execute the import script locally as it can take a very long time." |
69 | "Please execute the import script locally, it can take a very long time." | ||
70 | 140 | ||
71 | msgid "More info in the official doc:" | 141 | msgid "More info in the official documentation:" |
72 | msgstr "More info in the official doc:" | 142 | msgstr "More info in the official documentation:" |
73 | 143 | ||
74 | msgid "import from Pocket" | 144 | msgid "Import from Pocket" |
75 | msgstr "import from Pocket" | 145 | msgstr "Import from Pocket" |
76 | 146 | ||
77 | msgid "import from Readability" | 147 | #, php-format |
78 | msgstr "import from Readability" | 148 | msgid "(you must have a %s file on your server)" |
149 | msgstr "(you must have a %s file on your server)" | ||
79 | 150 | ||
80 | msgid "import from Instapaper" | 151 | msgid "Import from Readability" |
81 | msgstr "import from Instapaper" | 152 | msgstr "Import from Readability" |
153 | |||
154 | msgid "Import from Instapaper" | ||
155 | msgstr "Import from Instapaper" | ||
82 | 156 | ||
83 | msgid "Export your poche data" | 157 | msgid "Import from wallabag" |
84 | msgstr "Export your poche data" | 158 | msgstr "Import from wallabag" |
159 | |||
160 | msgid "Export your wallabag data" | ||
161 | msgstr "Export your wallabag data" | ||
85 | 162 | ||
86 | msgid "Click here" | 163 | msgid "Click here" |
87 | msgstr "Click here" | 164 | msgstr "Click here" |
88 | 165 | ||
89 | msgid "to export your poche data." | 166 | msgid "to download your database." |
90 | msgstr "to export your poche data." | 167 | msgstr "to download your database." |
91 | 168 | ||
92 | msgid "back to home" | 169 | msgid "to export your wallabag data." |
93 | msgstr "back to home" | 170 | msgstr "to export your wallabag data." |
94 | 171 | ||
95 | msgid "installation" | 172 | msgid "Cache" |
96 | msgstr "installation" | 173 | msgstr "Cache" |
97 | 174 | ||
98 | msgid "install your poche" | 175 | msgid "to delete cache." |
99 | msgstr "install your poche" | 176 | msgstr "to delete cache." |
100 | 177 | ||
101 | msgid "" | 178 | msgid "You can enter multiple tags, separated by commas." |
102 | "poche is still not installed. Please fill the below form to install it. " | 179 | msgstr "You can enter multiple tags, separated by commas." |
103 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
104 | "on poche website</a>." | ||
105 | msgstr "" | ||
106 | "poche is still not installed. Please fill the below form to install it. " | ||
107 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
108 | "on poche website</a>." | ||
109 | |||
110 | msgid "Login" | ||
111 | msgstr "Login" | ||
112 | 180 | ||
113 | msgid "Repeat your password" | 181 | msgid "return to article" |
114 | msgstr "Repeat your password" | 182 | msgstr "return to article" |
115 | 183 | ||
116 | msgid "Install" | 184 | msgid "plop" |
117 | msgstr "Install" | 185 | msgstr "plop" |
118 | 186 | ||
119 | msgid "back to top" | 187 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
120 | msgstr "back to top" | 188 | msgstr "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
121 | 189 | ||
122 | msgid "favoris" | 190 | msgid "favoris" |
123 | msgstr "favoris" | 191 | msgstr "favoris" |
@@ -146,11 +214,14 @@ msgstr "by title" | |||
146 | msgid "by title desc" | 214 | msgid "by title desc" |
147 | msgstr "by title desc" | 215 | msgstr "by title desc" |
148 | 216 | ||
149 | msgid "No link available here!" | 217 | msgid "Tag" |
150 | msgstr "No link available here!" | 218 | msgstr "Tag" |
151 | 219 | ||
152 | msgid "toggle mark as read" | 220 | msgid "No articles found." |
153 | msgstr "toggle mark as read" | 221 | msgstr "No articles found." |
222 | |||
223 | msgid "Toggle mark as read" | ||
224 | msgstr "Toggle mark as read" | ||
154 | 225 | ||
155 | msgid "toggle favorite" | 226 | msgid "toggle favorite" |
156 | msgstr "toggle favorite" | 227 | msgstr "toggle favorite" |
@@ -161,14 +232,86 @@ msgstr "delete" | |||
161 | msgid "original" | 232 | msgid "original" |
162 | msgstr "original" | 233 | msgstr "original" |
163 | 234 | ||
235 | msgid "estimated reading time:" | ||
236 | msgstr "estimated reading time:" | ||
237 | |||
238 | msgid "mark all the entries as read" | ||
239 | msgstr "mark all the entries as read" | ||
240 | |||
164 | msgid "results" | 241 | msgid "results" |
165 | msgstr "results" | 242 | msgstr "results" |
166 | 243 | ||
167 | msgid "tweet" | 244 | msgid "installation" |
168 | msgstr "tweet" | 245 | msgstr "installation" |
169 | 246 | ||
170 | msgid "email" | 247 | msgid "install your wallabag" |
171 | msgstr "email" | 248 | msgstr "install your wallabag" |
249 | |||
250 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
251 | msgstr "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
252 | |||
253 | msgid "Login" | ||
254 | msgstr "Login" | ||
255 | |||
256 | msgid "Repeat your password" | ||
257 | msgstr "Repeat your password" | ||
258 | |||
259 | msgid "Install" | ||
260 | msgstr "Install" | ||
261 | |||
262 | msgid "login to your wallabag" | ||
263 | msgstr "login to your wallabag" | ||
264 | |||
265 | msgid "Login to wallabag" | ||
266 | msgstr "Login to wallabag" | ||
267 | |||
268 | msgid "you are in demo mode, some features may be disabled." | ||
269 | msgstr "you are in demo mode, some features may be disabled." | ||
270 | |||
271 | msgid "Username" | ||
272 | msgstr "Username" | ||
273 | |||
274 | msgid "Stay signed in" | ||
275 | msgstr "Stay signed in" | ||
276 | |||
277 | msgid "(Do not check on public computers)" | ||
278 | msgstr "(Do not check on public computers)" | ||
279 | |||
280 | msgid "Sign in" | ||
281 | msgstr "Sign in" | ||
282 | |||
283 | msgid "favorites" | ||
284 | msgstr "favorites" | ||
285 | |||
286 | msgid "estimated reading time :" | ||
287 | msgstr "estimated reading time :" | ||
288 | |||
289 | msgid "Mark all the entries as read" | ||
290 | msgstr "Mark all the entries as read" | ||
291 | |||
292 | msgid "Return home" | ||
293 | msgstr "Return home" | ||
294 | |||
295 | msgid "Back to top" | ||
296 | msgstr "Back to top" | ||
297 | |||
298 | msgid "Mark as read" | ||
299 | msgstr "Mark as read" | ||
300 | |||
301 | msgid "Favorite" | ||
302 | msgstr "Favorite" | ||
303 | |||
304 | msgid "Toggle favorite" | ||
305 | msgstr "Toggle favorite" | ||
306 | |||
307 | msgid "Delete" | ||
308 | msgstr "Delete" | ||
309 | |||
310 | msgid "Tweet" | ||
311 | msgstr "Tweet" | ||
312 | |||
313 | msgid "Email" | ||
314 | msgstr "Email" | ||
172 | 315 | ||
173 | msgid "shaarli" | 316 | msgid "shaarli" |
174 | msgstr "shaarli" | 317 | msgstr "shaarli" |
@@ -176,26 +319,23 @@ msgstr "shaarli" | |||
176 | msgid "flattr" | 319 | msgid "flattr" |
177 | msgstr "flattr" | 320 | msgstr "flattr" |
178 | 321 | ||
179 | msgid "this article appears wrong?" | 322 | msgid "Does this article appear wrong?" |
180 | msgstr "this article appears wrong?" | 323 | msgstr "Does this article appear wrong?" |
181 | 324 | ||
182 | msgid "create an issue" | 325 | msgid "tags:" |
183 | msgstr "create an issue" | 326 | msgstr "tags:" |
184 | 327 | ||
185 | msgid "or" | 328 | msgid "Edit tags" |
186 | msgstr "or" | 329 | msgstr "Edit tags" |
187 | 330 | ||
188 | msgid "contact us by mail" | 331 | msgid "save link!" |
189 | msgstr "contact us by mail" | 332 | msgstr "save link!" |
190 | |||
191 | msgid "plop" | ||
192 | msgstr "plop" | ||
193 | 333 | ||
194 | msgid "home" | 334 | msgid "home" |
195 | msgstr "home" | 335 | msgstr "home" |
196 | 336 | ||
197 | msgid "favorites" | 337 | msgid "tags" |
198 | msgstr "favorites" | 338 | msgstr "tags" |
199 | 339 | ||
200 | msgid "logout" | 340 | msgid "logout" |
201 | msgstr "logout" | 341 | msgstr "logout" |
@@ -206,23 +346,179 @@ msgstr "powered by" | |||
206 | msgid "debug mode is on so cache is off." | 346 | msgid "debug mode is on so cache is off." |
207 | msgstr "debug mode is on so cache is off." | 347 | msgstr "debug mode is on so cache is off." |
208 | 348 | ||
209 | msgid "your poche version:" | 349 | msgid "your wallabag version:" |
210 | msgstr "your poche version:" | 350 | msgstr "your wallabag version:" |
211 | 351 | ||
212 | msgid "storage:" | 352 | msgid "storage:" |
213 | msgstr "storage:" | 353 | msgstr "storage:" |
214 | 354 | ||
215 | msgid "login to your poche" | 355 | msgid "save a link" |
216 | msgstr "login to your poche" | 356 | msgstr "save a link" |
217 | 357 | ||
218 | msgid "you are in demo mode, some features may be disabled." | 358 | msgid "back to home" |
219 | msgstr "you are in demo mode, some features may be disabled." | 359 | msgstr "back to home" |
220 | 360 | ||
221 | msgid "Stay signed in" | 361 | msgid "toggle mark as read" |
222 | msgstr "Stay signed in" | 362 | msgstr "toggle mark as read" |
223 | 363 | ||
224 | msgid "(Do not check on public computers)" | 364 | msgid "tweet" |
225 | msgstr "(Do not check on public computers)" | 365 | msgstr "tweet" |
226 | 366 | ||
227 | msgid "Sign in" | 367 | msgid "email" |
228 | msgstr "Sign in" | 368 | msgstr "email" |
369 | |||
370 | msgid "this article appears wrong?" | ||
371 | msgstr "this article appears wrong?" | ||
372 | |||
373 | msgid "No link available here!" | ||
374 | msgstr "No link available here!" | ||
375 | |||
376 | msgid "Poching a link" | ||
377 | msgstr "Poching a link" | ||
378 | |||
379 | msgid "by filling this field" | ||
380 | msgstr "by filling this field" | ||
381 | |||
382 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
383 | msgstr "bookmarklet: drag & drop this link to your bookmarks bar" | ||
384 | |||
385 | msgid "your version" | ||
386 | msgstr "your version" | ||
387 | |||
388 | msgid "latest stable version" | ||
389 | msgstr "latest stable version" | ||
390 | |||
391 | msgid "a more recent stable version is available." | ||
392 | msgstr "a more recent stable version is available." | ||
393 | |||
394 | msgid "you are up to date." | ||
395 | msgstr "you are up to date." | ||
396 | |||
397 | msgid "latest dev version" | ||
398 | msgstr "latest dev version" | ||
399 | |||
400 | msgid "a more recent development version is available." | ||
401 | msgstr "a more recent development version is available." | ||
402 | |||
403 | msgid "Please execute the import script locally, it can take a very long time." | ||
404 | msgstr "Please execute the import script locally, it can take a very long time." | ||
405 | |||
406 | msgid "More infos in the official doc:" | ||
407 | msgstr "More infos in the official doc:" | ||
408 | |||
409 | msgid "import from Pocket" | ||
410 | msgstr "import from Pocket" | ||
411 | |||
412 | msgid "import from Readability" | ||
413 | msgstr "import from Readability" | ||
414 | |||
415 | msgid "import from Instapaper" | ||
416 | msgstr "import from Instapaper" | ||
417 | |||
418 | msgid "Tags" | ||
419 | msgstr "Tags" | ||
420 | |||
421 | msgid "Untitled" | ||
422 | msgstr "Untitled" | ||
423 | |||
424 | msgid "the link has been added successfully" | ||
425 | msgstr "the link has been added successfully" | ||
426 | |||
427 | msgid "error during insertion : the link wasn't added" | ||
428 | msgstr "error during insertion : the link wasn't added" | ||
429 | |||
430 | msgid "the link has been deleted successfully" | ||
431 | msgstr "the link has been deleted successfully" | ||
432 | |||
433 | msgid "the link wasn't deleted" | ||
434 | msgstr "the link wasn't deleted" | ||
435 | |||
436 | msgid "Article not found!" | ||
437 | msgstr "Article not found!" | ||
438 | |||
439 | msgid "previous" | ||
440 | msgstr "previous" | ||
441 | |||
442 | msgid "next" | ||
443 | msgstr "next" | ||
444 | |||
445 | msgid "in demo mode, you can't update your password" | ||
446 | msgstr "in demo mode, you can't update your password" | ||
447 | |||
448 | msgid "your password has been updated" | ||
449 | msgstr "your password has been updated" | ||
450 | |||
451 | msgid "the two fields have to be filled & the password must be the same in the two fields" | ||
452 | msgstr "the two fields have to be filled & the password must be the same in the two fields" | ||
453 | |||
454 | msgid "still using the \"" | ||
455 | msgstr "still using the \"" | ||
456 | |||
457 | msgid "that theme does not seem to be installed" | ||
458 | msgstr "that theme does not seem to be installed" | ||
459 | |||
460 | msgid "you have changed your theme preferences" | ||
461 | msgstr "you have changed your theme preferences" | ||
462 | |||
463 | msgid "that language does not seem to be installed" | ||
464 | msgstr "that language does not seem to be installed" | ||
465 | |||
466 | msgid "you have changed your language preferences" | ||
467 | msgstr "you have changed your language preferences" | ||
468 | |||
469 | msgid "login failed: you have to fill all fields" | ||
470 | msgstr "login failed: you have to fill all fields" | ||
471 | |||
472 | msgid "welcome to your wallabag" | ||
473 | msgstr "welcome to your wallabag" | ||
474 | |||
475 | msgid "login failed: bad login or password" | ||
476 | msgstr "login failed: bad login or password" | ||
477 | |||
478 | msgid "import from instapaper completed" | ||
479 | msgstr "import from instapaper completed" | ||
480 | |||
481 | msgid "import from pocket completed" | ||
482 | msgstr "import from pocket completed" | ||
483 | |||
484 | msgid "import from Readability completed. " | ||
485 | msgstr "import from Readability completed. " | ||
486 | |||
487 | msgid "import from Poche completed. " | ||
488 | msgstr "import from Poche completed. " | ||
489 | |||
490 | msgid "Unknown import provider." | ||
491 | msgstr "Unknown import provider." | ||
492 | |||
493 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
494 | msgstr "Incomplete inc/poche/define.inc.php file, please define \"" | ||
495 | |||
496 | msgid "Could not find required \"" | ||
497 | msgstr "Could not find required \"" | ||
498 | |||
499 | msgid "Uh, there is a problem while generating feeds." | ||
500 | msgstr "Uh, there is a problem while generating feeds." | ||
501 | |||
502 | msgid "Cache deleted." | ||
503 | msgstr "Cache deleted." | ||
504 | |||
505 | msgid "Oops, it seems you don't have PHP 5." | ||
506 | msgstr "Oops, it seems you don't have PHP 5." | ||
507 | |||
508 | #~ msgid "poche it!" | ||
509 | #~ msgstr "poche it!" | ||
510 | |||
511 | #~ msgid "Updating poche" | ||
512 | #~ msgstr "Updating poche" | ||
513 | |||
514 | #~ msgid "create an issue" | ||
515 | #~ msgstr "create an issue" | ||
516 | |||
517 | #~ msgid "or" | ||
518 | #~ msgstr "or" | ||
519 | |||
520 | #~ msgid "contact us by mail" | ||
521 | #~ msgstr "contact us by mail" | ||
522 | |||
523 | #~ msgid "your poche version:" | ||
524 | #~ msgstr "your poche version:" | ||
diff --git a/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po b/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po index afe0595d..c08decfe 100644 --- a/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po +++ b/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po | |||
@@ -1,51 +1,136 @@ | |||
1 | msgid "" | 1 | msgid "" |
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: \n" | 3 | "Project-Id-Version: \n" |
4 | "POT-Creation-Date: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-02-25 15:16+0300\n" | ||
5 | "PO-Revision-Date: \n" | 6 | "PO-Revision-Date: \n" |
6 | "Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" | 7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
7 | "Language-Team: \n" | 8 | "Language-Team: \n" |
9 | "Language: \n" | ||
8 | "MIME-Version: 1.0\n" | 10 | "MIME-Version: 1.0\n" |
9 | "Content-Type: text/plain; charset=UTF-8\n" | 11 | "Content-Type: text/plain; charset=UTF-8\n" |
10 | "Content-Transfer-Encoding: 8bit\n" | 12 | "Content-Transfer-Encoding: 8bit\n" |
11 | "X-Generator: Poedit 1.5.4\n" | 13 | "X-Generator: Poedit 1.5.4\n" |
14 | "X-Poedit-Language: Spanish\n" | ||
15 | "X-Poedit-Basepath: .\n" | ||
16 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" | ||
17 | |||
18 | msgid "wallabag, a read it later open source system" | ||
19 | msgstr "" | ||
20 | |||
21 | msgid "login failed: user doesn't exist" | ||
22 | msgstr "" | ||
23 | |||
24 | msgid "return home" | ||
25 | msgstr "" | ||
12 | 26 | ||
13 | msgid "config" | 27 | msgid "config" |
14 | msgstr "configuración" | 28 | msgstr "configuración" |
15 | 29 | ||
16 | msgid "Poching a link" | 30 | msgid "Saving articles" |
17 | msgstr "Pochear un enlace" | 31 | msgstr "" |
32 | |||
33 | msgid "There are several ways to save an article:" | ||
34 | msgstr "" | ||
18 | 35 | ||
19 | msgid "read the documentation" | 36 | msgid "read the documentation" |
20 | msgstr "leer la documentación" | 37 | msgstr "leer la documentación" |
21 | 38 | ||
22 | msgid "by filling this field" | 39 | msgid "download the extension" |
40 | msgstr "" | ||
41 | |||
42 | msgid "via F-Droid" | ||
43 | msgstr "" | ||
44 | |||
45 | msgid " or " | ||
46 | msgstr "" | ||
47 | |||
48 | msgid "via Google Play" | ||
49 | msgstr "" | ||
50 | |||
51 | msgid "download the application" | ||
52 | msgstr "" | ||
53 | |||
54 | #, fuzzy | ||
55 | msgid "By filling this field" | ||
23 | msgstr "rellenando este campo" | 56 | msgstr "rellenando este campo" |
24 | 57 | ||
25 | msgid "poche it!" | 58 | msgid "bag it!" |
26 | msgstr "pochéalo!" | 59 | msgstr "" |
27 | 60 | ||
28 | msgid "Updating poche" | 61 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
29 | msgstr "Actualizar" | 62 | msgstr "" |
30 | 63 | ||
31 | msgid "your version" | 64 | msgid "Upgrading wallabag" |
32 | msgstr "su versión" | 65 | msgstr "" |
33 | 66 | ||
34 | msgid "latest stable version" | 67 | #, fuzzy |
68 | msgid "Installed version" | ||
35 | msgstr "ultima versión estable" | 69 | msgstr "ultima versión estable" |
36 | 70 | ||
37 | msgid "a more recent stable version is available." | 71 | #, fuzzy |
72 | msgid "Latest stable version" | ||
73 | msgstr "ultima versión estable" | ||
74 | |||
75 | #, fuzzy | ||
76 | msgid "A more recent stable version is available." | ||
38 | msgstr "una versión estable más reciente está disponible." | 77 | msgstr "una versión estable más reciente está disponible." |
39 | 78 | ||
40 | msgid "you are up to date." | 79 | #, fuzzy |
80 | msgid "You are up to date." | ||
41 | msgstr "estás actualizado." | 81 | msgstr "estás actualizado." |
42 | 82 | ||
43 | msgid "latest dev version" | 83 | #, fuzzy |
84 | msgid "Latest dev version" | ||
44 | msgstr "ultima versión de desarollo" | 85 | msgstr "ultima versión de desarollo" |
45 | 86 | ||
46 | msgid "a more recent development version is available." | 87 | #, fuzzy |
88 | msgid "A more recent development version is available." | ||
47 | msgstr "una versión de desarollo más reciente está disponible." | 89 | msgstr "una versión de desarollo más reciente está disponible." |
48 | 90 | ||
91 | msgid "Feeds" | ||
92 | msgstr "" | ||
93 | |||
94 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
95 | msgstr "" | ||
96 | |||
97 | msgid "Unread feed" | ||
98 | msgstr "" | ||
99 | |||
100 | #, fuzzy | ||
101 | msgid "Favorites feed" | ||
102 | msgstr "preferidos" | ||
103 | |||
104 | #, fuzzy | ||
105 | msgid "Archive feed" | ||
106 | msgstr "archivos" | ||
107 | |||
108 | msgid "Your token:" | ||
109 | msgstr "" | ||
110 | |||
111 | msgid "Your user id:" | ||
112 | msgstr "" | ||
113 | |||
114 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
115 | msgstr "" | ||
116 | |||
117 | #, fuzzy | ||
118 | msgid "Change your theme" | ||
119 | msgstr "Modificar tu contraseña" | ||
120 | |||
121 | msgid "Theme:" | ||
122 | msgstr "" | ||
123 | |||
124 | msgid "Update" | ||
125 | msgstr "Actualizar" | ||
126 | |||
127 | #, fuzzy | ||
128 | msgid "Change your language" | ||
129 | msgstr "Modificar tu contraseña" | ||
130 | |||
131 | msgid "Language:" | ||
132 | msgstr "" | ||
133 | |||
49 | msgid "Change your password" | 134 | msgid "Change your password" |
50 | msgstr "Modificar tu contraseña" | 135 | msgstr "Modificar tu contraseña" |
51 | 136 | ||
@@ -58,66 +143,68 @@ msgstr "Contraseña" | |||
58 | msgid "Repeat your new password:" | 143 | msgid "Repeat your new password:" |
59 | msgstr "Repetir la nueva contraseña :" | 144 | msgstr "Repetir la nueva contraseña :" |
60 | 145 | ||
61 | msgid "Update" | ||
62 | msgstr "Actualizar" | ||
63 | |||
64 | msgid "Import" | 146 | msgid "Import" |
65 | msgstr "Importar" | 147 | msgstr "Importar" |
66 | 148 | ||
67 | msgid "Please execute the import script locally, it can take a very long time." | 149 | #, fuzzy |
68 | msgstr "" | 150 | msgid "Please execute the import script locally as it can take a very long time." |
69 | "Por favor, ejecute la importación en local, esto puede demorar un tiempo." | 151 | msgstr "Por favor, ejecute la importación en local, esto puede demorar un tiempo." |
70 | 152 | ||
71 | msgid "More info in the official doc:" | 153 | #, fuzzy |
154 | msgid "More info in the official documentation:" | ||
72 | msgstr "Más información en la documentación oficial :" | 155 | msgstr "Más información en la documentación oficial :" |
73 | 156 | ||
74 | msgid "import from Pocket" | 157 | #, fuzzy |
158 | msgid "Import from Pocket" | ||
75 | msgstr "importación desde Pocket" | 159 | msgstr "importación desde Pocket" |
76 | 160 | ||
77 | msgid "import from Readability" | 161 | #, php-format |
162 | msgid "(you must have a %s file on your server)" | ||
163 | msgstr "" | ||
164 | |||
165 | #, fuzzy | ||
166 | msgid "Import from Readability" | ||
78 | msgstr "importación desde Readability" | 167 | msgstr "importación desde Readability" |
79 | 168 | ||
80 | msgid "import from Instapaper" | 169 | #, fuzzy |
170 | msgid "Import from Instapaper" | ||
81 | msgstr "importación desde Instapaper" | 171 | msgstr "importación desde Instapaper" |
82 | 172 | ||
83 | msgid "Export your poche data" | 173 | #, fuzzy |
174 | msgid "Import from wallabag" | ||
175 | msgstr "importación desde Readability" | ||
176 | |||
177 | #, fuzzy | ||
178 | msgid "Export your wallabag data" | ||
84 | msgstr "Exportar sus datos de poche" | 179 | msgstr "Exportar sus datos de poche" |
85 | 180 | ||
86 | msgid "Click here" | 181 | msgid "Click here" |
87 | msgstr "Haga clic aquí" | 182 | msgstr "Haga clic aquí" |
88 | 183 | ||
89 | msgid "to export your poche data." | 184 | msgid "to download your database." |
90 | msgstr "para exportar sus datos de poche." | 185 | msgstr "" |
91 | |||
92 | msgid "back to home" | ||
93 | msgstr "volver a la página de inicio" | ||
94 | 186 | ||
95 | msgid "installation" | 187 | #, fuzzy |
96 | msgstr "instalación" | 188 | msgid "to export your wallabag data." |
189 | msgstr "para exportar sus datos de poche." | ||
97 | 190 | ||
98 | msgid "install your poche" | 191 | msgid "Cache" |
99 | msgstr "instala tu Poche" | 192 | msgstr "" |
100 | 193 | ||
101 | msgid "" | 194 | msgid "to delete cache." |
102 | "Poche is still not installed. Please fill the below form to install it. " | ||
103 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
104 | "on poche website</a>." | ||
105 | msgstr "" | 195 | msgstr "" |
106 | "Poche todavia no està instalado. Por favor, completa los campos siguientes " | ||
107 | "para instalarlo. No dudes de <a href='http://doc.inthepoche.com'>leer la " | ||
108 | "documentación en el sitio de Poche</a>." | ||
109 | 196 | ||
110 | msgid "Login" | 197 | msgid "You can enter multiple tags, separated by commas." |
111 | msgstr "Nombre de usuario" | 198 | msgstr "" |
112 | 199 | ||
113 | msgid "Repeat your password" | 200 | msgid "return to article" |
114 | msgstr "Repita su contraseña" | 201 | msgstr "" |
115 | 202 | ||
116 | msgid "Install" | 203 | msgid "plop" |
117 | msgstr "Instalar" | 204 | msgstr "plop" |
118 | 205 | ||
119 | msgid "back to top" | 206 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
120 | msgstr "volver arriba" | 207 | msgstr "" |
121 | 208 | ||
122 | msgid "favoris" | 209 | msgid "favoris" |
123 | msgstr "preferidos" | 210 | msgstr "preferidos" |
@@ -146,10 +233,14 @@ msgstr "por título" | |||
146 | msgid "by title desc" | 233 | msgid "by title desc" |
147 | msgstr "por título descendiente" | 234 | msgstr "por título descendiente" |
148 | 235 | ||
149 | msgid "No link available here!" | 236 | msgid "Tag" |
150 | msgstr "¡No hay ningún enlace disponible por aquí!" | 237 | msgstr "" |
151 | 238 | ||
152 | msgid "toggle mark as read" | 239 | msgid "No articles found." |
240 | msgstr "" | ||
241 | |||
242 | #, fuzzy | ||
243 | msgid "Toggle mark as read" | ||
153 | msgstr "marcar como leído" | 244 | msgstr "marcar como leído" |
154 | 245 | ||
155 | msgid "toggle favorite" | 246 | msgid "toggle favorite" |
@@ -161,13 +252,95 @@ msgstr "eliminar" | |||
161 | msgid "original" | 252 | msgid "original" |
162 | msgstr "original" | 253 | msgstr "original" |
163 | 254 | ||
255 | msgid "estimated reading time:" | ||
256 | msgstr "" | ||
257 | |||
258 | msgid "mark all the entries as read" | ||
259 | msgstr "" | ||
260 | |||
164 | msgid "results" | 261 | msgid "results" |
165 | msgstr "resultados" | 262 | msgstr "resultados" |
166 | 263 | ||
167 | msgid "tweet" | 264 | msgid "installation" |
265 | msgstr "instalación" | ||
266 | |||
267 | #, fuzzy | ||
268 | msgid "install your wallabag" | ||
269 | msgstr "instala tu Poche" | ||
270 | |||
271 | #, fuzzy | ||
272 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
273 | msgstr "Poche todavia no està instalado. Por favor, completa los campos siguientes para instalarlo. No dudes de <a href='http://doc.inthepoche.com'>leer la documentación en el sitio de Poche</a>." | ||
274 | |||
275 | msgid "Login" | ||
276 | msgstr "Nombre de usuario" | ||
277 | |||
278 | msgid "Repeat your password" | ||
279 | msgstr "Repita su contraseña" | ||
280 | |||
281 | msgid "Install" | ||
282 | msgstr "Instalar" | ||
283 | |||
284 | #, fuzzy | ||
285 | msgid "login to your wallabag" | ||
286 | msgstr "conectarse a tu Poche" | ||
287 | |||
288 | msgid "Login to wallabag" | ||
289 | msgstr "" | ||
290 | |||
291 | msgid "you are in demo mode, some features may be disabled." | ||
292 | msgstr "este es el modo de demostración, algunas funcionalidades pueden estar desactivadas." | ||
293 | |||
294 | msgid "Username" | ||
295 | msgstr "" | ||
296 | |||
297 | msgid "Stay signed in" | ||
298 | msgstr "Seguir conectado" | ||
299 | |||
300 | msgid "(Do not check on public computers)" | ||
301 | msgstr "(no marcar en un ordenador público)" | ||
302 | |||
303 | msgid "Sign in" | ||
304 | msgstr "Iniciar sesión" | ||
305 | |||
306 | msgid "favorites" | ||
307 | msgstr "preferidos" | ||
308 | |||
309 | msgid "estimated reading time :" | ||
310 | msgstr "" | ||
311 | |||
312 | msgid "Mark all the entries as read" | ||
313 | msgstr "" | ||
314 | |||
315 | msgid "Return home" | ||
316 | msgstr "" | ||
317 | |||
318 | #, fuzzy | ||
319 | msgid "Back to top" | ||
320 | msgstr "volver arriba" | ||
321 | |||
322 | #, fuzzy | ||
323 | msgid "Mark as read" | ||
324 | msgstr "marcar como leído" | ||
325 | |||
326 | #, fuzzy | ||
327 | msgid "Favorite" | ||
328 | msgstr "preferidos" | ||
329 | |||
330 | #, fuzzy | ||
331 | msgid "Toggle favorite" | ||
332 | msgstr "preferido" | ||
333 | |||
334 | #, fuzzy | ||
335 | msgid "Delete" | ||
336 | msgstr "eliminar" | ||
337 | |||
338 | #, fuzzy | ||
339 | msgid "Tweet" | ||
168 | msgstr "tweetear" | 340 | msgstr "tweetear" |
169 | 341 | ||
170 | msgid "email" | 342 | #, fuzzy |
343 | msgid "Email" | ||
171 | msgstr "enviar por mail" | 344 | msgstr "enviar por mail" |
172 | 345 | ||
173 | msgid "shaarli" | 346 | msgid "shaarli" |
@@ -176,26 +349,24 @@ msgstr "shaarli" | |||
176 | msgid "flattr" | 349 | msgid "flattr" |
177 | msgstr "flattr" | 350 | msgstr "flattr" |
178 | 351 | ||
179 | msgid "this article appears wrong?" | 352 | #, fuzzy |
353 | msgid "Does this article appear wrong?" | ||
180 | msgstr "este articulo no se ve bien?" | 354 | msgstr "este articulo no se ve bien?" |
181 | 355 | ||
182 | msgid "create an issue" | 356 | msgid "tags:" |
183 | msgstr "crear un ticket" | 357 | msgstr "" |
184 | |||
185 | msgid "or" | ||
186 | msgstr "o" | ||
187 | 358 | ||
188 | msgid "contact us by mail" | 359 | msgid "Edit tags" |
189 | msgstr "contactarnos por mail" | 360 | msgstr "" |
190 | 361 | ||
191 | msgid "plop" | 362 | msgid "save link!" |
192 | msgstr "plop" | 363 | msgstr "" |
193 | 364 | ||
194 | msgid "home" | 365 | msgid "home" |
195 | msgstr "inicio" | 366 | msgstr "inicio" |
196 | 367 | ||
197 | msgid "favorites" | 368 | msgid "tags" |
198 | msgstr "preferidos" | 369 | msgstr "" |
199 | 370 | ||
200 | msgid "logout" | 371 | msgid "logout" |
201 | msgstr "cerrar sesión" | 372 | msgstr "cerrar sesión" |
@@ -206,25 +377,187 @@ msgstr "hecho con" | |||
206 | msgid "debug mode is on so cache is off." | 377 | msgid "debug mode is on so cache is off." |
207 | msgstr "el modo de depuración está activado, así que la cache está desactivada." | 378 | msgstr "el modo de depuración está activado, así que la cache está desactivada." |
208 | 379 | ||
209 | msgid "your poche version:" | 380 | #, fuzzy |
210 | msgstr "tu versión de Poche:" | 381 | msgid "your wallabag version:" |
382 | msgstr "su versión" | ||
211 | 383 | ||
212 | msgid "storage:" | 384 | msgid "storage:" |
213 | msgstr "almacenamiento:" | 385 | msgstr "almacenamiento:" |
214 | 386 | ||
215 | msgid "login to your poche" | 387 | msgid "save a link" |
216 | msgstr "conectarse a tu Poche" | 388 | msgstr "" |
217 | 389 | ||
218 | msgid "you are in demo mode, some features may be disabled." | 390 | msgid "back to home" |
391 | msgstr "volver a la página de inicio" | ||
392 | |||
393 | msgid "toggle mark as read" | ||
394 | msgstr "marcar como leído" | ||
395 | |||
396 | msgid "tweet" | ||
397 | msgstr "tweetear" | ||
398 | |||
399 | msgid "email" | ||
400 | msgstr "enviar por mail" | ||
401 | |||
402 | msgid "this article appears wrong?" | ||
403 | msgstr "este articulo no se ve bien?" | ||
404 | |||
405 | msgid "No link available here!" | ||
406 | msgstr "¡No hay ningún enlace disponible por aquí!" | ||
407 | |||
408 | msgid "Poching a link" | ||
409 | msgstr "Pochear un enlace" | ||
410 | |||
411 | msgid "by filling this field" | ||
412 | msgstr "rellenando este campo" | ||
413 | |||
414 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
219 | msgstr "" | 415 | msgstr "" |
220 | "este es el modo de demostración, algunas funcionalidades pueden estar " | ||
221 | "desactivadas." | ||
222 | 416 | ||
223 | msgid "Stay signed in" | 417 | msgid "your version" |
224 | msgstr "Seguir conectado" | 418 | msgstr "su versión" |
225 | 419 | ||
226 | msgid "(Do not check on public computers)" | 420 | msgid "latest stable version" |
227 | msgstr "(no marcar en un ordenador público)" | 421 | msgstr "ultima versión estable" |
228 | 422 | ||
229 | msgid "Sign in" | 423 | msgid "a more recent stable version is available." |
230 | msgstr "Iniciar sesión" | 424 | msgstr "una versión estable más reciente está disponible." |
425 | |||
426 | msgid "you are up to date." | ||
427 | msgstr "estás actualizado." | ||
428 | |||
429 | msgid "latest dev version" | ||
430 | msgstr "ultima versión de desarollo" | ||
431 | |||
432 | msgid "a more recent development version is available." | ||
433 | msgstr "una versión de desarollo más reciente está disponible." | ||
434 | |||
435 | msgid "Please execute the import script locally, it can take a very long time." | ||
436 | msgstr "Por favor, ejecute la importación en local, esto puede demorar un tiempo." | ||
437 | |||
438 | #, fuzzy | ||
439 | msgid "More infos in the official doc:" | ||
440 | msgstr "Más información en la documentación oficial :" | ||
441 | |||
442 | msgid "import from Pocket" | ||
443 | msgstr "importación desde Pocket" | ||
444 | |||
445 | msgid "import from Readability" | ||
446 | msgstr "importación desde Readability" | ||
447 | |||
448 | msgid "import from Instapaper" | ||
449 | msgstr "importación desde Instapaper" | ||
450 | |||
451 | msgid "Tags" | ||
452 | msgstr "" | ||
453 | |||
454 | #, fuzzy | ||
455 | msgid "Untitled" | ||
456 | msgstr "por título" | ||
457 | |||
458 | msgid "the link has been added successfully" | ||
459 | msgstr "" | ||
460 | |||
461 | msgid "error during insertion : the link wasn't added" | ||
462 | msgstr "" | ||
463 | |||
464 | msgid "the link has been deleted successfully" | ||
465 | msgstr "" | ||
466 | |||
467 | msgid "the link wasn't deleted" | ||
468 | msgstr "" | ||
469 | |||
470 | msgid "Article not found!" | ||
471 | msgstr "" | ||
472 | |||
473 | msgid "previous" | ||
474 | msgstr "" | ||
475 | |||
476 | msgid "next" | ||
477 | msgstr "" | ||
478 | |||
479 | msgid "in demo mode, you can't update your password" | ||
480 | msgstr "" | ||
481 | |||
482 | msgid "your password has been updated" | ||
483 | msgstr "" | ||
484 | |||
485 | msgid "the two fields have to be filled & the password must be the same in the two fields" | ||
486 | msgstr "" | ||
487 | |||
488 | msgid "still using the \"" | ||
489 | msgstr "" | ||
490 | |||
491 | msgid "that theme does not seem to be installed" | ||
492 | msgstr "" | ||
493 | |||
494 | msgid "you have changed your theme preferences" | ||
495 | msgstr "" | ||
496 | |||
497 | msgid "that language does not seem to be installed" | ||
498 | msgstr "" | ||
499 | |||
500 | msgid "you have changed your language preferences" | ||
501 | msgstr "" | ||
502 | |||
503 | msgid "login failed: you have to fill all fields" | ||
504 | msgstr "" | ||
505 | |||
506 | msgid "welcome to your wallabag" | ||
507 | msgstr "" | ||
508 | |||
509 | msgid "login failed: bad login or password" | ||
510 | msgstr "" | ||
511 | |||
512 | #, fuzzy | ||
513 | msgid "import from instapaper completed" | ||
514 | msgstr "importación desde Instapaper" | ||
515 | |||
516 | #, fuzzy | ||
517 | msgid "import from pocket completed" | ||
518 | msgstr "importación desde Pocket" | ||
519 | |||
520 | #, fuzzy | ||
521 | msgid "import from Readability completed. " | ||
522 | msgstr "importación desde Readability" | ||
523 | |||
524 | #, fuzzy | ||
525 | msgid "import from Poche completed. " | ||
526 | msgstr "importación desde Pocket" | ||
527 | |||
528 | msgid "Unknown import provider." | ||
529 | msgstr "" | ||
530 | |||
531 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
532 | msgstr "" | ||
533 | |||
534 | msgid "Could not find required \"" | ||
535 | msgstr "" | ||
536 | |||
537 | msgid "Uh, there is a problem while generating feeds." | ||
538 | msgstr "" | ||
539 | |||
540 | #, fuzzy | ||
541 | msgid "Cache deleted." | ||
542 | msgstr "eliminar" | ||
543 | |||
544 | msgid "Oops, it seems you don't have PHP 5." | ||
545 | msgstr "" | ||
546 | |||
547 | #~ msgid "poche it!" | ||
548 | #~ msgstr "pochéalo!" | ||
549 | |||
550 | #~ msgid "Updating poche" | ||
551 | #~ msgstr "Actualizar" | ||
552 | |||
553 | #~ msgid "create an issue" | ||
554 | #~ msgstr "crear un ticket" | ||
555 | |||
556 | #~ msgid "or" | ||
557 | #~ msgstr "o" | ||
558 | |||
559 | #~ msgid "contact us by mail" | ||
560 | #~ msgstr "contactarnos por mail" | ||
561 | |||
562 | #~ msgid "your poche version:" | ||
563 | #~ msgstr "tu versión de Poche:" | ||
diff --git a/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po b/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po index 74a763c6..f24814d5 100644 --- a/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po +++ b/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po | |||
@@ -1,51 +1,136 @@ | |||
1 | msgid "" | 1 | msgid "" |
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: \n" | 3 | "Project-Id-Version: \n" |
4 | "POT-Creation-Date: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-02-25 15:15+0300\n" | ||
5 | "PO-Revision-Date: \n" | 6 | "PO-Revision-Date: \n" |
6 | "Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" | 7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
7 | "Language-Team: \n" | 8 | "Language-Team: \n" |
9 | "Language: \n" | ||
8 | "MIME-Version: 1.0\n" | 10 | "MIME-Version: 1.0\n" |
9 | "Content-Type: text/plain; charset=UTF-8\n" | 11 | "Content-Type: text/plain; charset=UTF-8\n" |
10 | "Content-Transfer-Encoding: 8bit\n" | 12 | "Content-Transfer-Encoding: 8bit\n" |
11 | "X-Generator: Poedit 1.5.4\n" | 13 | "X-Generator: Poedit 1.5.4\n" |
14 | "X-Poedit-Language: Persian\n" | ||
15 | "X-Poedit-Basepath: .\n" | ||
16 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" | ||
17 | |||
18 | msgid "wallabag, a read it later open source system" | ||
19 | msgstr "" | ||
20 | |||
21 | msgid "login failed: user doesn't exist" | ||
22 | msgstr "" | ||
23 | |||
24 | msgid "return home" | ||
25 | msgstr "" | ||
12 | 26 | ||
13 | msgid "config" | 27 | msgid "config" |
14 | msgstr "تنظیمات" | 28 | msgstr "تنظیمات" |
15 | 29 | ||
16 | msgid "Poching a link" | 30 | msgid "Saving articles" |
17 | msgstr "پیوندی را poche کنید" | 31 | msgstr "" |
32 | |||
33 | msgid "There are several ways to save an article:" | ||
34 | msgstr "" | ||
18 | 35 | ||
19 | msgid "read the documentation" | 36 | msgid "read the documentation" |
20 | msgstr "راهنما را بخوانید" | 37 | msgstr "راهنما را بخوانید" |
21 | 38 | ||
22 | msgid "by filling this field" | 39 | msgid "download the extension" |
40 | msgstr "" | ||
41 | |||
42 | msgid "via F-Droid" | ||
43 | msgstr "" | ||
44 | |||
45 | msgid " or " | ||
46 | msgstr "" | ||
47 | |||
48 | msgid "via Google Play" | ||
49 | msgstr "" | ||
50 | |||
51 | msgid "download the application" | ||
52 | msgstr "" | ||
53 | |||
54 | #, fuzzy | ||
55 | msgid "By filling this field" | ||
23 | msgstr "با پرکردن این بخش" | 56 | msgstr "با پرکردن این بخش" |
24 | 57 | ||
25 | msgid "poche it!" | 58 | msgid "bag it!" |
26 | msgstr "poche کنید!" | 59 | msgstr "" |
27 | 60 | ||
28 | msgid "Updating poche" | 61 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
29 | msgstr "بهروزرسانی poche" | 62 | msgstr "" |
30 | 63 | ||
31 | msgid "your version" | 64 | msgid "Upgrading wallabag" |
32 | msgstr "نسخهٔ شما" | 65 | msgstr "" |
33 | 66 | ||
34 | msgid "latest stable version" | 67 | #, fuzzy |
68 | msgid "Installed version" | ||
35 | msgstr "آخرین نسخهٔ پایدار" | 69 | msgstr "آخرین نسخهٔ پایدار" |
36 | 70 | ||
37 | msgid "a more recent stable version is available." | 71 | #, fuzzy |
72 | msgid "Latest stable version" | ||
73 | msgstr "آخرین نسخهٔ پایدار" | ||
74 | |||
75 | #, fuzzy | ||
76 | msgid "A more recent stable version is available." | ||
38 | msgstr "نسخهٔ پایدار تازهای منتشر شده است." | 77 | msgstr "نسخهٔ پایدار تازهای منتشر شده است." |
39 | 78 | ||
40 | msgid "you are up to date." | 79 | #, fuzzy |
80 | msgid "You are up to date." | ||
41 | msgstr "شما بهروز هستید." | 81 | msgstr "شما بهروز هستید." |
42 | 82 | ||
43 | msgid "latest dev version" | 83 | #, fuzzy |
84 | msgid "Latest dev version" | ||
44 | msgstr "آخرین نسخهٔ آزمایشی" | 85 | msgstr "آخرین نسخهٔ آزمایشی" |
45 | 86 | ||
46 | msgid "a more recent development version is available." | 87 | #, fuzzy |
88 | msgid "A more recent development version is available." | ||
47 | msgstr "نسخهٔ آزمایشی تازهای منتشر شده است." | 89 | msgstr "نسخهٔ آزمایشی تازهای منتشر شده است." |
48 | 90 | ||
91 | msgid "Feeds" | ||
92 | msgstr "" | ||
93 | |||
94 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
95 | msgstr "" | ||
96 | |||
97 | msgid "Unread feed" | ||
98 | msgstr "" | ||
99 | |||
100 | #, fuzzy | ||
101 | msgid "Favorites feed" | ||
102 | msgstr "بهترینها" | ||
103 | |||
104 | #, fuzzy | ||
105 | msgid "Archive feed" | ||
106 | msgstr "بایگانی" | ||
107 | |||
108 | msgid "Your token:" | ||
109 | msgstr "" | ||
110 | |||
111 | msgid "Your user id:" | ||
112 | msgstr "" | ||
113 | |||
114 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
115 | msgstr "" | ||
116 | |||
117 | #, fuzzy | ||
118 | msgid "Change your theme" | ||
119 | msgstr "گذرواژهٔ خود را تغییر دهید" | ||
120 | |||
121 | msgid "Theme:" | ||
122 | msgstr "" | ||
123 | |||
124 | msgid "Update" | ||
125 | msgstr "بهروزرسانی" | ||
126 | |||
127 | #, fuzzy | ||
128 | msgid "Change your language" | ||
129 | msgstr "گذرواژهٔ خود را تغییر دهید" | ||
130 | |||
131 | msgid "Language:" | ||
132 | msgstr "" | ||
133 | |||
49 | msgid "Change your password" | 134 | msgid "Change your password" |
50 | msgstr "گذرواژهٔ خود را تغییر دهید" | 135 | msgstr "گذرواژهٔ خود را تغییر دهید" |
51 | 136 | ||
@@ -58,64 +143,68 @@ msgstr "گذرواژه" | |||
58 | msgid "Repeat your new password:" | 143 | msgid "Repeat your new password:" |
59 | msgstr "گذرواژهٔ تازه را دوباره وارد کنید" | 144 | msgstr "گذرواژهٔ تازه را دوباره وارد کنید" |
60 | 145 | ||
61 | msgid "Update" | ||
62 | msgstr "بهروزرسانی" | ||
63 | |||
64 | msgid "Import" | 146 | msgid "Import" |
65 | msgstr "درونریزی" | 147 | msgstr "درونریزی" |
66 | 148 | ||
67 | msgid "Please execute the import script locally, it can take a very long time." | 149 | #, fuzzy |
150 | msgid "Please execute the import script locally as it can take a very long time." | ||
68 | msgstr "لطفاً برنامهٔ درونریزی را بهطور محلی اجرا کنید، شاید خیلی طول بکشد." | 151 | msgstr "لطفاً برنامهٔ درونریزی را بهطور محلی اجرا کنید، شاید خیلی طول بکشد." |
69 | 152 | ||
70 | msgid "More info in the official doc:" | 153 | #, fuzzy |
154 | msgid "More info in the official documentation:" | ||
71 | msgstr "اطلاعات بیشتر در راهنمای رسمی:" | 155 | msgstr "اطلاعات بیشتر در راهنمای رسمی:" |
72 | 156 | ||
73 | msgid "import from Pocket" | 157 | #, fuzzy |
158 | msgid "Import from Pocket" | ||
74 | msgstr "درونریزی از Pocket" | 159 | msgstr "درونریزی از Pocket" |
75 | 160 | ||
76 | msgid "import from Readability" | 161 | #, php-format |
162 | msgid "(you must have a %s file on your server)" | ||
163 | msgstr "" | ||
164 | |||
165 | #, fuzzy | ||
166 | msgid "Import from Readability" | ||
77 | msgstr "درونریزی از Readability" | 167 | msgstr "درونریزی از Readability" |
78 | 168 | ||
79 | msgid "import from Instapaper" | 169 | #, fuzzy |
170 | msgid "Import from Instapaper" | ||
80 | msgstr "درونریزی از Instapaper" | 171 | msgstr "درونریزی از Instapaper" |
81 | 172 | ||
82 | msgid "Export your poche data" | 173 | #, fuzzy |
174 | msgid "Import from wallabag" | ||
175 | msgstr "درونریزی از Readability" | ||
176 | |||
177 | #, fuzzy | ||
178 | msgid "Export your wallabag data" | ||
83 | msgstr "دادههای poche خود را برونبری کنید" | 179 | msgstr "دادههای poche خود را برونبری کنید" |
84 | 180 | ||
85 | msgid "Click here" | 181 | msgid "Click here" |
86 | msgstr "اینجا را کلیک کنید" | 182 | msgstr "اینجا را کلیک کنید" |
87 | 183 | ||
88 | msgid "to export your poche data." | 184 | msgid "to download your database." |
89 | msgstr "برای برونبری دادههای poche شما" | 185 | msgstr "" |
90 | |||
91 | msgid "back to home" | ||
92 | msgstr "بازگشت به خانه" | ||
93 | 186 | ||
94 | msgid "installation" | 187 | #, fuzzy |
95 | msgstr "نصب" | 188 | msgid "to export your wallabag data." |
189 | msgstr "برای برونبری دادههای poche شما" | ||
96 | 190 | ||
97 | msgid "install your poche" | 191 | msgid "Cache" |
98 | msgstr "poche خود را نصب کنید" | 192 | msgstr "" |
99 | 193 | ||
100 | msgid "" | 194 | msgid "to delete cache." |
101 | "poche is still not installed. Please fill the below form to install it. " | ||
102 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
103 | "on poche website</a>." | ||
104 | msgstr "" | 195 | msgstr "" |
105 | "poche هنوز نصب نیست. برای نصب لطفاً فرم زیر را پر کنید. خواندن <a " | ||
106 | "href='http://doc.inthepoche.com'>راهنما در وبگاه poche</a> را از یاد نبرید." | ||
107 | 196 | ||
108 | msgid "Login" | 197 | msgid "You can enter multiple tags, separated by commas." |
109 | msgstr "ورود" | 198 | msgstr "" |
110 | 199 | ||
111 | msgid "Repeat your password" | 200 | msgid "return to article" |
112 | msgstr "گذرواژه را دوباره وارد کنید" | 201 | msgstr "" |
113 | 202 | ||
114 | msgid "Install" | 203 | msgid "plop" |
115 | msgstr "نصب" | 204 | msgstr "plop" |
116 | 205 | ||
117 | msgid "back to top" | 206 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
118 | msgstr "بازگشت به بالای صفحه" | 207 | msgstr "" |
119 | 208 | ||
120 | msgid "favoris" | 209 | msgid "favoris" |
121 | msgstr "بهترینها" | 210 | msgstr "بهترینها" |
@@ -144,10 +233,14 @@ msgstr "با عنوان" | |||
144 | msgid "by title desc" | 233 | msgid "by title desc" |
145 | msgstr "با عنوان (الفبایی معکوس)" | 234 | msgstr "با عنوان (الفبایی معکوس)" |
146 | 235 | ||
147 | msgid "No link available here!" | 236 | msgid "Tag" |
148 | msgstr "اینجا پیوندی موجود نیست!" | 237 | msgstr "" |
149 | 238 | ||
150 | msgid "toggle mark as read" | 239 | msgid "No articles found." |
240 | msgstr "" | ||
241 | |||
242 | #, fuzzy | ||
243 | msgid "Toggle mark as read" | ||
151 | msgstr "خواندهشده/خواندهنشده" | 244 | msgstr "خواندهشده/خواندهنشده" |
152 | 245 | ||
153 | msgid "toggle favorite" | 246 | msgid "toggle favorite" |
@@ -159,13 +252,95 @@ msgstr "پاککردن" | |||
159 | msgid "original" | 252 | msgid "original" |
160 | msgstr "اصلی" | 253 | msgstr "اصلی" |
161 | 254 | ||
255 | msgid "estimated reading time:" | ||
256 | msgstr "" | ||
257 | |||
258 | msgid "mark all the entries as read" | ||
259 | msgstr "" | ||
260 | |||
162 | msgid "results" | 261 | msgid "results" |
163 | msgstr "نتایج" | 262 | msgstr "نتایج" |
164 | 263 | ||
165 | msgid "tweet" | 264 | msgid "installation" |
265 | msgstr "نصب" | ||
266 | |||
267 | #, fuzzy | ||
268 | msgid "install your wallabag" | ||
269 | msgstr "poche خود را نصب کنید" | ||
270 | |||
271 | #, fuzzy | ||
272 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
273 | msgstr "poche هنوز نصب نیست. برای نصب لطفاً فرم زیر را پر کنید. خواندن <a href='http://doc.inthepoche.com'>راهنما در وبگاه poche</a> را از یاد نبرید." | ||
274 | |||
275 | msgid "Login" | ||
276 | msgstr "ورود" | ||
277 | |||
278 | msgid "Repeat your password" | ||
279 | msgstr "گذرواژه را دوباره وارد کنید" | ||
280 | |||
281 | msgid "Install" | ||
282 | msgstr "نصب" | ||
283 | |||
284 | #, fuzzy | ||
285 | msgid "login to your wallabag" | ||
286 | msgstr "به poche خود وارد شوید" | ||
287 | |||
288 | msgid "Login to wallabag" | ||
289 | msgstr "" | ||
290 | |||
291 | msgid "you are in demo mode, some features may be disabled." | ||
292 | msgstr "این تنها نسخهٔ نمایشی است، برخی از ویژگیها کار نمیکنند." | ||
293 | |||
294 | msgid "Username" | ||
295 | msgstr "" | ||
296 | |||
297 | msgid "Stay signed in" | ||
298 | msgstr "مرا به خاطر بسپار" | ||
299 | |||
300 | msgid "(Do not check on public computers)" | ||
301 | msgstr "(روی رایانههای عمومی این کار را نکنید)" | ||
302 | |||
303 | msgid "Sign in" | ||
304 | msgstr "ورود" | ||
305 | |||
306 | msgid "favorites" | ||
307 | msgstr "بهترینها" | ||
308 | |||
309 | msgid "estimated reading time :" | ||
310 | msgstr "" | ||
311 | |||
312 | msgid "Mark all the entries as read" | ||
313 | msgstr "" | ||
314 | |||
315 | msgid "Return home" | ||
316 | msgstr "" | ||
317 | |||
318 | #, fuzzy | ||
319 | msgid "Back to top" | ||
320 | msgstr "بازگشت به بالای صفحه" | ||
321 | |||
322 | #, fuzzy | ||
323 | msgid "Mark as read" | ||
324 | msgstr "خواندهشده/خواندهنشده" | ||
325 | |||
326 | #, fuzzy | ||
327 | msgid "Favorite" | ||
328 | msgstr "بهترینها" | ||
329 | |||
330 | #, fuzzy | ||
331 | msgid "Toggle favorite" | ||
332 | msgstr "جزء بهترینها هست/نیست" | ||
333 | |||
334 | #, fuzzy | ||
335 | msgid "Delete" | ||
336 | msgstr "پاککردن" | ||
337 | |||
338 | #, fuzzy | ||
339 | msgid "Tweet" | ||
166 | msgstr "توییت" | 340 | msgstr "توییت" |
167 | 341 | ||
168 | msgid "email" | 342 | #, fuzzy |
343 | msgid "Email" | ||
169 | msgstr "ایمیل" | 344 | msgstr "ایمیل" |
170 | 345 | ||
171 | msgid "shaarli" | 346 | msgid "shaarli" |
@@ -174,26 +349,24 @@ msgstr "shaarli" | |||
174 | msgid "flattr" | 349 | msgid "flattr" |
175 | msgstr "flattr" | 350 | msgstr "flattr" |
176 | 351 | ||
177 | msgid "this article appears wrong?" | 352 | #, fuzzy |
353 | msgid "Does this article appear wrong?" | ||
178 | msgstr "این مطلب اشتباه نمایش داده شده؟" | 354 | msgstr "این مطلب اشتباه نمایش داده شده؟" |
179 | 355 | ||
180 | msgid "create an issue" | 356 | msgid "tags:" |
181 | msgstr "یک درخواست رفعمشکل بنویسید" | 357 | msgstr "" |
182 | |||
183 | msgid "or" | ||
184 | msgstr "یا" | ||
185 | 358 | ||
186 | msgid "contact us by mail" | 359 | msgid "Edit tags" |
187 | msgstr "به ما ایمیل بزنید" | 360 | msgstr "" |
188 | 361 | ||
189 | msgid "plop" | 362 | msgid "save link!" |
190 | msgstr "plop" | 363 | msgstr "" |
191 | 364 | ||
192 | msgid "home" | 365 | msgid "home" |
193 | msgstr "خانه" | 366 | msgstr "خانه" |
194 | 367 | ||
195 | msgid "favorites" | 368 | msgid "tags" |
196 | msgstr "بهترینها" | 369 | msgstr "" |
197 | 370 | ||
198 | msgid "logout" | 371 | msgid "logout" |
199 | msgstr "بیرون رفتن" | 372 | msgstr "بیرون رفتن" |
@@ -204,23 +377,187 @@ msgstr "نیروگرفته از" | |||
204 | msgid "debug mode is on so cache is off." | 377 | msgid "debug mode is on so cache is off." |
205 | msgstr "حالت عیبیابی فعال است، پس کاشه خاموش است." | 378 | msgstr "حالت عیبیابی فعال است، پس کاشه خاموش است." |
206 | 379 | ||
207 | msgid "your poche version:" | 380 | #, fuzzy |
208 | msgstr "نسخهٔ poche شما:" | 381 | msgid "your wallabag version:" |
382 | msgstr "نسخهٔ شما" | ||
209 | 383 | ||
210 | msgid "storage:" | 384 | msgid "storage:" |
211 | msgstr "ذخیرهسازی:" | 385 | msgstr "ذخیرهسازی:" |
212 | 386 | ||
213 | msgid "login to your poche" | 387 | msgid "save a link" |
214 | msgstr "به poche خود وارد شوید" | 388 | msgstr "" |
215 | 389 | ||
216 | msgid "you are in demo mode, some features may be disabled." | 390 | msgid "back to home" |
217 | msgstr "��ین ��نه�� ن����هٔ نمای��ی ��س��، برخی از ��یژگی��ا ک���� ن��یکنند." | 391 | msgstr "��ا��گشت به ����ن��" |
218 | 392 | ||
219 | msgid "Stay signed in" | 393 | msgid "toggle mark as read" |
220 | msgstr "م��ا ��ه �������� ��س������" | 394 | msgstr "��وان��ه����ه/��و��ن����ن����ه" |
221 | 395 | ||
222 | msgid "(Do not check on public computers)" | 396 | msgid "tweet" |
223 | msgstr "(��وی رای��نههای عمومی این کار را نکنید)" | 397 | msgstr "��ویی��" |
224 | 398 | ||
225 | msgid "Sign in" | 399 | msgid "email" |
226 | msgstr "ورود" | 400 | msgstr "ایمیل" |
401 | |||
402 | msgid "this article appears wrong?" | ||
403 | msgstr "این مطلب اشتباه نمایش داده شده؟" | ||
404 | |||
405 | msgid "No link available here!" | ||
406 | msgstr "اینجا پیوندی موجود نیست!" | ||
407 | |||
408 | msgid "Poching a link" | ||
409 | msgstr "پیوندی را poche کنید" | ||
410 | |||
411 | msgid "by filling this field" | ||
412 | msgstr "با پرکردن این بخش" | ||
413 | |||
414 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
415 | msgstr "" | ||
416 | |||
417 | msgid "your version" | ||
418 | msgstr "نسخهٔ شما" | ||
419 | |||
420 | msgid "latest stable version" | ||
421 | msgstr "آخرین نسخهٔ پایدار" | ||
422 | |||
423 | msgid "a more recent stable version is available." | ||
424 | msgstr "نسخهٔ پایدار تازهای منتشر شده است." | ||
425 | |||
426 | msgid "you are up to date." | ||
427 | msgstr "شما بهروز هستید." | ||
428 | |||
429 | msgid "latest dev version" | ||
430 | msgstr "آخرین نسخهٔ آزمایشی" | ||
431 | |||
432 | msgid "a more recent development version is available." | ||
433 | msgstr "نسخهٔ آزمایشی تازهای منتشر شده است." | ||
434 | |||
435 | msgid "Please execute the import script locally, it can take a very long time." | ||
436 | msgstr "لطفاً برنامهٔ درونریزی را بهطور محلی اجرا کنید، شاید خیلی طول بکشد." | ||
437 | |||
438 | #, fuzzy | ||
439 | msgid "More infos in the official doc:" | ||
440 | msgstr "اطلاعات بیشتر در راهنمای رسمی:" | ||
441 | |||
442 | msgid "import from Pocket" | ||
443 | msgstr "درونریزی از Pocket" | ||
444 | |||
445 | msgid "import from Readability" | ||
446 | msgstr "درونریزی از Readability" | ||
447 | |||
448 | msgid "import from Instapaper" | ||
449 | msgstr "درونریزی از Instapaper" | ||
450 | |||
451 | msgid "Tags" | ||
452 | msgstr "" | ||
453 | |||
454 | #, fuzzy | ||
455 | msgid "Untitled" | ||
456 | msgstr "با عنوان" | ||
457 | |||
458 | msgid "the link has been added successfully" | ||
459 | msgstr "" | ||
460 | |||
461 | msgid "error during insertion : the link wasn't added" | ||
462 | msgstr "" | ||
463 | |||
464 | msgid "the link has been deleted successfully" | ||
465 | msgstr "" | ||
466 | |||
467 | msgid "the link wasn't deleted" | ||
468 | msgstr "" | ||
469 | |||
470 | msgid "Article not found!" | ||
471 | msgstr "" | ||
472 | |||
473 | msgid "previous" | ||
474 | msgstr "" | ||
475 | |||
476 | msgid "next" | ||
477 | msgstr "" | ||
478 | |||
479 | msgid "in demo mode, you can't update your password" | ||
480 | msgstr "" | ||
481 | |||
482 | msgid "your password has been updated" | ||
483 | msgstr "" | ||
484 | |||
485 | msgid "the two fields have to be filled & the password must be the same in the two fields" | ||
486 | msgstr "" | ||
487 | |||
488 | msgid "still using the \"" | ||
489 | msgstr "" | ||
490 | |||
491 | msgid "that theme does not seem to be installed" | ||
492 | msgstr "" | ||
493 | |||
494 | msgid "you have changed your theme preferences" | ||
495 | msgstr "" | ||
496 | |||
497 | msgid "that language does not seem to be installed" | ||
498 | msgstr "" | ||
499 | |||
500 | msgid "you have changed your language preferences" | ||
501 | msgstr "" | ||
502 | |||
503 | msgid "login failed: you have to fill all fields" | ||
504 | msgstr "" | ||
505 | |||
506 | msgid "welcome to your wallabag" | ||
507 | msgstr "" | ||
508 | |||
509 | msgid "login failed: bad login or password" | ||
510 | msgstr "" | ||
511 | |||
512 | #, fuzzy | ||
513 | msgid "import from instapaper completed" | ||
514 | msgstr "درونریزی از Instapaper" | ||
515 | |||
516 | #, fuzzy | ||
517 | msgid "import from pocket completed" | ||
518 | msgstr "درونریزی از Pocket" | ||
519 | |||
520 | #, fuzzy | ||
521 | msgid "import from Readability completed. " | ||
522 | msgstr "درونریزی از Readability" | ||
523 | |||
524 | #, fuzzy | ||
525 | msgid "import from Poche completed. " | ||
526 | msgstr "درونریزی از Pocket" | ||
527 | |||
528 | msgid "Unknown import provider." | ||
529 | msgstr "" | ||
530 | |||
531 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
532 | msgstr "" | ||
533 | |||
534 | msgid "Could not find required \"" | ||
535 | msgstr "" | ||
536 | |||
537 | msgid "Uh, there is a problem while generating feeds." | ||
538 | msgstr "" | ||
539 | |||
540 | #, fuzzy | ||
541 | msgid "Cache deleted." | ||
542 | msgstr "پاککردن" | ||
543 | |||
544 | msgid "Oops, it seems you don't have PHP 5." | ||
545 | msgstr "" | ||
546 | |||
547 | #~ msgid "poche it!" | ||
548 | #~ msgstr "poche کنید!" | ||
549 | |||
550 | #~ msgid "Updating poche" | ||
551 | #~ msgstr "بهروزرسانی poche" | ||
552 | |||
553 | #~ msgid "create an issue" | ||
554 | #~ msgstr "یک درخواست رفعمشکل بنویسید" | ||
555 | |||
556 | #~ msgid "or" | ||
557 | #~ msgstr "یا" | ||
558 | |||
559 | #~ msgid "contact us by mail" | ||
560 | #~ msgstr "به ما ایمیل بزنید" | ||
561 | |||
562 | #~ msgid "your poche version:" | ||
563 | #~ msgstr "نسخهٔ poche شما:" | ||
diff --git a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo index 76872b5a..600b3281 100644 --- a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo +++ b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo | |||
Binary files differ | |||
diff --git a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po index f105d180..5053e9e3 100644 --- a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po +++ b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po | |||
@@ -1,50 +1,125 @@ | |||
1 | msgid "" | 1 | msgid "" |
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: \n" | 3 | "Project-Id-Version: \n" |
4 | "POT-Creation-Date: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-02-25 18:33+0300\n" | ||
5 | "PO-Revision-Date: \n" | 6 | "PO-Revision-Date: \n" |
6 | "Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" | 7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
7 | "Language-Team: \n" | 8 | "Language-Team: \n" |
9 | "Language: \n" | ||
8 | "MIME-Version: 1.0\n" | 10 | "MIME-Version: 1.0\n" |
9 | "Content-Type: text/plain; charset=UTF-8\n" | 11 | "Content-Type: text/plain; charset=UTF-8\n" |
10 | "Content-Transfer-Encoding: 8bit\n" | 12 | "Content-Transfer-Encoding: 8bit\n" |
11 | "X-Generator: Poedit 1.5.4\n" | 13 | "X-Poedit-KeywordsList: _;gettext;gettext_noop\n" |
14 | "X-Poedit-Basepath: .\n" | ||
15 | "X-Poedit-SourceCharset: utf-8\n" | ||
16 | "X-Generator: Poedit 1.5.7\n" | ||
17 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" | ||
18 | |||
19 | msgid "wallabag, a read it later open source system" | ||
20 | msgstr "wallabag, un système open source de lecture différé" | ||
21 | |||
22 | msgid "login failed: user doesn't exist" | ||
23 | msgstr "identification échouée : l'utilisateur n'existe pas" | ||
24 | |||
25 | msgid "return home" | ||
26 | msgstr "retour à l'accueil" | ||
12 | 27 | ||
13 | msgid "config" | 28 | msgid "config" |
14 | msgstr "configuration" | 29 | msgstr "configuration" |
15 | 30 | ||
16 | msgid "Poching a link" | 31 | msgid "Saving articles" |
17 | msgstr "Pocher un lien" | 32 | msgstr "Sauvegarde des articles" |
33 | |||
34 | msgid "There are several ways to save an article:" | ||
35 | msgstr "Il y a plusieurs façons de sauver un article :" | ||
18 | 36 | ||
19 | msgid "read the documentation" | 37 | msgid "read the documentation" |
20 | msgstr "lisez la documentation" | 38 | msgstr "lisez la documentation" |
21 | 39 | ||
22 | msgid "by filling this field" | 40 | msgid "download the extension" |
23 | msgstr "en remplissant ce champ" | 41 | msgstr "télécharger l'extension" |
24 | 42 | ||
25 | msgid "poche it!" | 43 | msgid "via F-Droid" |
26 | msgstr "pochez-le !" | 44 | msgstr "via F-Droid" |
27 | 45 | ||
28 | msgid "Updating poche" | 46 | msgid " or " |
29 | msgstr "Mettre à jour poche" | 47 | msgstr "ou" |
30 | 48 | ||
31 | msgid "your version" | 49 | msgid "via Google Play" |
32 | msgstr "votre version" | 50 | msgstr "via Google PlayStore" |
33 | 51 | ||
34 | msgid "latest stable version" | 52 | msgid "download the application" |
35 | msgstr "derni��re version stable" | 53 | msgstr "t��lécharger l'application" |
36 | 54 | ||
37 | msgid "a more recent stable version is available." | 55 | msgid "By filling this field" |
38 | msgstr "une version stable plus récente est disponible." | 56 | msgstr "En remplissant ce champ" |
39 | 57 | ||
40 | msgid "you are up to date." | 58 | msgid "bag it!" |
41 | msgstr "vous êtes à jour." | 59 | msgstr "bag it !" |
42 | 60 | ||
43 | msgid "latest dev version" | 61 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
44 | msgstr "derni��re version de développement" | 62 | msgstr "Bookmarklet : glissez-d��posez ce lien dans votre barre de favoris" |
45 | 63 | ||
46 | msgid "a more recent development version is available." | 64 | msgid "Upgrading wallabag" |
47 | msgstr "une version de développement plus récente est disponible." | 65 | msgstr "Mise à jour de wallabag" |
66 | |||
67 | msgid "Installed version" | ||
68 | msgstr "Version installée" | ||
69 | |||
70 | msgid "Latest stable version" | ||
71 | msgstr "Dernière version stable" | ||
72 | |||
73 | msgid "A more recent stable version is available." | ||
74 | msgstr "Une version stable plus récente est disponible." | ||
75 | |||
76 | msgid "You are up to date." | ||
77 | msgstr "Vous êtes à jour." | ||
78 | |||
79 | msgid "Latest dev version" | ||
80 | msgstr "Dernière version de développement" | ||
81 | |||
82 | msgid "A more recent development version is available." | ||
83 | msgstr "Une version de développement plus récente est disponible." | ||
84 | |||
85 | msgid "Feeds" | ||
86 | msgstr "Flux" | ||
87 | |||
88 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
89 | msgstr "Votre jeton de flux est actuellement vide doit d'abord être généré pour activer les flux. Cliquez <a href='?feed&action=generate'>ici</a> pour le générer." | ||
90 | |||
91 | msgid "Unread feed" | ||
92 | msgstr "Flux des non lus" | ||
93 | |||
94 | msgid "Favorites feed" | ||
95 | msgstr "Flux des favoris" | ||
96 | |||
97 | msgid "Archive feed" | ||
98 | msgstr "Flux des archives" | ||
99 | |||
100 | msgid "Your token:" | ||
101 | msgstr "Votre jeton :" | ||
102 | |||
103 | msgid "Your user id:" | ||
104 | msgstr "Votre ID utilisateur :" | ||
105 | |||
106 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
107 | msgstr "Vous pouvez regénérer votre jeton : <a href='?feed&action=generate'>génération !</a>." | ||
108 | |||
109 | msgid "Change your theme" | ||
110 | msgstr "Changer votre thème" | ||
111 | |||
112 | msgid "Theme:" | ||
113 | msgstr "Thème :" | ||
114 | |||
115 | msgid "Update" | ||
116 | msgstr "Mettre à jour" | ||
117 | |||
118 | msgid "Change your language" | ||
119 | msgstr "Changer votre langue" | ||
120 | |||
121 | msgid "Language:" | ||
122 | msgstr "Langue :" | ||
48 | 123 | ||
49 | msgid "Change your password" | 124 | msgid "Change your password" |
50 | msgstr "Modifier votre mot de passe" | 125 | msgstr "Modifier votre mot de passe" |
@@ -58,65 +133,60 @@ msgstr "Mot de passe" | |||
58 | msgid "Repeat your new password:" | 133 | msgid "Repeat your new password:" |
59 | msgstr "Répétez votre nouveau mot de passe :" | 134 | msgstr "Répétez votre nouveau mot de passe :" |
60 | 135 | ||
61 | msgid "Update" | ||
62 | msgstr "Mettre à jour" | ||
63 | |||
64 | msgid "Import" | 136 | msgid "Import" |
65 | msgstr "Importer" | 137 | msgstr "Importer" |
66 | 138 | ||
67 | msgid "Please execute the import script locally, it can take a very long time." | 139 | msgid "Please execute the import script locally as it can take a very long time." |
68 | msgstr "Merci d'exécuter l'import en local, cela peut prendre du temps." | 140 | msgstr "Merci d'exécuter l'import en local car cela peut prendre du temps." |
69 | 141 | ||
70 | msgid "More info in the official doc:" | 142 | msgid "More info in the official documentation:" |
71 | msgstr "Plus d'infos sur la documentation officielle" | 143 | msgstr "Plus d'infos dans la documentation officielle :" |
72 | 144 | ||
73 | msgid "import from Pocket" | 145 | msgid "Import from Pocket" |
74 | msgstr "import depuis Pocket" | 146 | msgstr "Import depuis Pocket" |
75 | 147 | ||
76 | msgid "import from Readability" | 148 | #, php-format |
77 | msgstr "import depuis Readability" | 149 | msgid "(you must have a %s file on your server)" |
150 | msgstr "(le fichier %s doit être présent sur le serveur)" | ||
78 | 151 | ||
79 | msgid "import from Instapaper" | 152 | msgid "Import from Readability" |
80 | msgstr "import depuis Instapaper" | 153 | msgstr "Import depuis Readability" |
81 | 154 | ||
82 | msgid "Export your poche data" | 155 | msgid "Import from Instapaper" |
83 | msgstr "Exporter vos données de poche" | 156 | msgstr "Import depuis Instapaper" |
84 | 157 | ||
85 | msgid "Click here" | 158 | msgid "Import from wallabag" |
86 | msgstr "Cliquez-ici" | 159 | msgstr "Import depuis wallabag" |
87 | 160 | ||
88 | msgid "to export your poche data." | 161 | msgid "Export your wallabag data" |
89 | msgstr "pour exporter vos données de poche." | 162 | msgstr "Exporter vos données de wallabag" |
90 | 163 | ||
91 | msgid "back to home" | 164 | msgid "Click here" |
92 | msgstr "retour à l'accueil" | 165 | msgstr "Cliquez ici" |
93 | 166 | ||
94 | msgid "installation" | 167 | msgid "to download your database." |
95 | msgstr "installation" | 168 | msgstr "pour télécharger votre base de données." |
96 | 169 | ||
97 | msgid "install your poche" | 170 | msgid "to export your wallabag data." |
98 | msgstr "installez votre poche" | 171 | msgstr "pour exporter vos données de wallabag." |
99 | 172 | ||
100 | msgid "" | 173 | msgid "Cache" |
101 | "poche is still not installed. Please fill the below form to install it. " | 174 | msgstr "Cache" |
102 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
103 | "on poche website</a>." | ||
104 | msgstr "" | ||
105 | "poche n'est pas encore installé. Merci de remplir le formulaire suivant pour " | ||
106 | "l'installer. N'hésitez pas à <a href='http://doc.inthepoche.com'>lire la " | ||
107 | "documentation sur le site de poche</a>." | ||
108 | 175 | ||
109 | msgid "Login" | 176 | msgid "to delete cache." |
110 | msgstr "Nom d'utilisateur" | 177 | msgstr "pour effacer le cache." |
111 | 178 | ||
112 | msgid "Repeat your password" | 179 | msgid "You can enter multiple tags, separated by commas." |
113 | msgstr "Répétez votre mot de passe" | 180 | msgstr "Vous pouvez entrer plusieurs tags, séparés par des virgules." |
114 | 181 | ||
115 | msgid "Install" | 182 | msgid "return to article" |
116 | msgstr "Installer" | 183 | msgstr "retourner à l'article" |
117 | 184 | ||
118 | msgid "back to top" | 185 | msgid "plop" |
119 | msgstr "retour en haut de page" | 186 | msgstr "plop" |
187 | |||
188 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." | ||
189 | msgstr "Vous pouvez vérifier votre configuration <a href='wallabag_compatibility_test.php'>ici</a>." | ||
120 | 190 | ||
121 | msgid "favoris" | 191 | msgid "favoris" |
122 | msgstr "favoris" | 192 | msgstr "favoris" |
@@ -145,14 +215,17 @@ msgstr "par titre" | |||
145 | msgid "by title desc" | 215 | msgid "by title desc" |
146 | msgstr "par titre desc" | 216 | msgstr "par titre desc" |
147 | 217 | ||
148 | msgid "No link available here!" | 218 | msgid "Tag" |
149 | msgstr "Aucun lien n'est disponible ici !" | 219 | msgstr "Tag" |
150 | 220 | ||
151 | msgid "toggle mark as read" | 221 | msgid "No articles found." |
152 | msgstr "marquer comme lu / non lu" | 222 | msgstr "Aucun article trouvé." |
223 | |||
224 | msgid "Toggle mark as read" | ||
225 | msgstr "Marquer comme lu / non lu" | ||
153 | 226 | ||
154 | msgid "toggle favorite" | 227 | msgid "toggle favorite" |
155 | msgstr "marquer comme favori" | 228 | msgstr "marquer / enlever comme favori" |
156 | 229 | ||
157 | msgid "delete" | 230 | msgid "delete" |
158 | msgstr "supprimer" | 231 | msgstr "supprimer" |
@@ -160,35 +233,107 @@ msgstr "supprimer" | |||
160 | msgid "original" | 233 | msgid "original" |
161 | msgstr "original" | 234 | msgstr "original" |
162 | 235 | ||
236 | msgid "estimated reading time:" | ||
237 | msgstr "temps de lecture estimé :" | ||
238 | |||
239 | msgid "mark all the entries as read" | ||
240 | msgstr "marquer tous les articles comme lus" | ||
241 | |||
163 | msgid "results" | 242 | msgid "results" |
164 | msgstr "résultats" | 243 | msgstr "résultats" |
165 | 244 | ||
166 | msgid "tweet" | 245 | msgid "installation" |
167 | msgstr "tweet" | 246 | msgstr "installation" |
168 | 247 | ||
169 | msgid "email" | 248 | msgid "install your wallabag" |
170 | msgstr "email" | 249 | msgstr "installez votre wallabag" |
250 | |||
251 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
252 | msgstr "wallabag n'est pas encore installé. Merci de remplir le formulaire suivant pour l'installer. N'hésitez pas à <a href='http://doc.wallabag.org'>lire la documentation sur le site de wallabag</a>." | ||
253 | |||
254 | msgid "Login" | ||
255 | msgstr "Nom d'utilisateur" | ||
256 | |||
257 | msgid "Repeat your password" | ||
258 | msgstr "Répétez votre mot de passe" | ||
259 | |||
260 | msgid "Install" | ||
261 | msgstr "Installer" | ||
262 | |||
263 | msgid "login to your wallabag" | ||
264 | msgstr "se connecter à votre wallabag" | ||
265 | |||
266 | msgid "Login to wallabag" | ||
267 | msgstr "Se connecter à wallabag" | ||
268 | |||
269 | msgid "you are in demo mode, some features may be disabled." | ||
270 | msgstr "vous êtes en mode démo, certaines fonctionnalités peuvent être désactivées." | ||
271 | |||
272 | msgid "Username" | ||
273 | msgstr "Nom d'utilisateur" | ||
274 | |||
275 | msgid "Stay signed in" | ||
276 | msgstr "Rester connecté" | ||
277 | |||
278 | msgid "(Do not check on public computers)" | ||
279 | msgstr "(Ne pas cocher sur un ordinateur public)" | ||
280 | |||
281 | msgid "Sign in" | ||
282 | msgstr "Se connecter" | ||
283 | |||
284 | msgid "Return home" | ||
285 | msgstr "Retour accueil" | ||
286 | |||
287 | msgid "Back to top" | ||
288 | msgstr "Haut de page" | ||
289 | |||
290 | msgid "Mark as read" | ||
291 | msgstr "Marquer comme lu / non lu" | ||
292 | |||
293 | msgid "Favorite" | ||
294 | msgstr "Favoris" | ||
295 | |||
296 | msgid "Toggle favorite" | ||
297 | msgstr "Marquer / enlever comme favori" | ||
298 | |||
299 | msgid "Delete" | ||
300 | msgstr "Effacer" | ||
301 | |||
302 | msgid "Tweet" | ||
303 | msgstr "Tweet" | ||
304 | |||
305 | msgid "Email" | ||
306 | msgstr "E-mail" | ||
171 | 307 | ||
172 | msgid "shaarli" | 308 | msgid "shaarli" |
173 | msgstr "shaarli" | 309 | msgstr "Shaarli" |
174 | 310 | ||
175 | msgid "flattr" | 311 | msgid "flattr" |
176 | msgstr "flattr" | 312 | msgstr "Flattr" |
177 | 313 | ||
178 | msgid "this article appears wrong?" | 314 | msgid "Does this article appear wrong?" |
179 | msgstr "cet article s'affiche mal ?" | 315 | msgstr "Cet article s'affiche mal ?" |
180 | 316 | ||
181 | msgid "create an issue" | 317 | msgid "tags:" |
182 | msgstr "créez un ticket" | 318 | msgstr "tags :" |
183 | 319 | ||
184 | msgid "or" | 320 | msgid "Edit tags" |
185 | msgstr "ou" | 321 | msgstr "Editer les tags" |
186 | 322 | ||
187 | msgid "contact us by mail" | 323 | msgid "save link!" |
188 | msgstr "contactez-nous par email" | 324 | msgstr "sauver le lien !" |
189 | 325 | ||
190 | msgid "plop" | 326 | msgid "powered by" |
191 | msgstr "plop" | 327 | msgstr "propulsé par" |
328 | |||
329 | msgid "debug mode is on so cache is off." | ||
330 | msgstr "le mode de debug est actif, le cache est donc désactivé." | ||
331 | |||
332 | msgid "your wallabag version:" | ||
333 | msgstr "votre version de wallabag :" | ||
334 | |||
335 | msgid "storage:" | ||
336 | msgstr "stockage :" | ||
192 | 337 | ||
193 | msgid "home" | 338 | msgid "home" |
194 | msgstr "accueil" | 339 | msgstr "accueil" |
@@ -196,33 +341,193 @@ msgstr "accueil" | |||
196 | msgid "favorites" | 341 | msgid "favorites" |
197 | msgstr "favoris" | 342 | msgstr "favoris" |
198 | 343 | ||
344 | msgid "tags" | ||
345 | msgstr "tags" | ||
346 | |||
347 | msgid "save a link" | ||
348 | msgstr "sauver un lien" | ||
349 | |||
199 | msgid "logout" | 350 | msgid "logout" |
200 | msgstr "déconnexion" | 351 | msgstr "déconnexion" |
201 | 352 | ||
202 | msgid "powered by" | 353 | msgid "back to home" |
203 | msgstr "propuls�� par" | 354 | msgstr "retour �� l'accueil" |
204 | 355 | ||
205 | msgid "debug mode is on so cache is off." | 356 | msgid "toggle mark as read" |
206 | msgstr "le mode de debug est actif, le cache est donc désactivé." | 357 | msgstr "marquer comme lu / non lu" |
207 | 358 | ||
208 | msgid "your poche version:" | 359 | msgid "tweet" |
209 | msgstr "votre version de poche :" | 360 | msgstr "tweet" |
210 | 361 | ||
211 | msgid "storage:" | 362 | msgid "email" |
212 | msgstr "stockage :" | 363 | msgstr "ee-mail" |
213 | 364 | ||
214 | msgid "login to your poche" | 365 | msgid "this article appears wrong?" |
215 | msgstr "se connecter à votre poche" | 366 | msgstr "cet article s'affiche mal ?" |
216 | 367 | ||
217 | msgid "you are in demo mode, some features may be disabled." | 368 | msgid "No link available here!" |
218 | msgstr "" | 369 | msgstr "Aucun lien n'est disponible ici !" |
219 | "vous êtes en mode démo, certaines fonctionnalités peuvent être désactivées." | ||
220 | 370 | ||
221 | msgid "Stay signed in" | 371 | msgid "Poching a link" |
222 | msgstr "Rester connecté" | 372 | msgstr "Sauver un lien" |
223 | 373 | ||
224 | msgid "(Do not check on public computers)" | 374 | msgid "by filling this field" |
225 | msgstr "(ne pas cocher sur un ordinateur public)" | 375 | msgstr "en remplissant ce champ" |
226 | 376 | ||
227 | msgid "Sign in" | 377 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" |
228 | msgstr "Se connecter" | 378 | msgstr "bookmarklet : glissez-déposez ce lien dans votre barre de favoris" |
379 | |||
380 | msgid "your version" | ||
381 | msgstr "votre version" | ||
382 | |||
383 | msgid "latest stable version" | ||
384 | msgstr "dernière version stable" | ||
385 | |||
386 | msgid "a more recent stable version is available." | ||
387 | msgstr "une version stable plus récente est disponible." | ||
388 | |||
389 | msgid "you are up to date." | ||
390 | msgstr "vous êtes à jour." | ||
391 | |||
392 | msgid "latest dev version" | ||
393 | msgstr "dernière version de développement" | ||
394 | |||
395 | msgid "a more recent development version is available." | ||
396 | msgstr "une version de développement plus récente est disponible." | ||
397 | |||
398 | msgid "Please execute the import script locally, it can take a very long time." | ||
399 | msgstr "Merci d'exécuter l'import en local car cela peut prendre du temps." | ||
400 | |||
401 | msgid "More infos in the official doc:" | ||
402 | msgstr "Plus d'infos dans la documentation officielle :" | ||
403 | |||
404 | msgid "import from Pocket" | ||
405 | msgstr "import depuis Pocket" | ||
406 | |||
407 | msgid "import from Readability" | ||
408 | msgstr "import depuis Readability" | ||
409 | |||
410 | msgid "import from Instapaper" | ||
411 | msgstr "import depuis Instapaper" | ||
412 | |||
413 | msgid "estimated reading time :" | ||
414 | msgstr "temps de lecture estimé :" | ||
415 | |||
416 | msgid "Mark all the entries as read" | ||
417 | msgstr "Marquer tous les articles comme lus" | ||
418 | |||
419 | msgid "Tags" | ||
420 | msgstr "Tags" | ||
421 | |||
422 | msgid "Untitled" | ||
423 | msgstr "Sans titre" | ||
424 | |||
425 | msgid "the link has been added successfully" | ||
426 | msgstr "le lien a été ajouté avec succès" | ||
427 | |||
428 | msgid "error during insertion : the link wasn't added" | ||
429 | msgstr "erreur pendant l'insertion : le lien n'a pas été ajouté" | ||
430 | |||
431 | msgid "the link has been deleted successfully" | ||
432 | msgstr "le lien a été effacé avec succès" | ||
433 | |||
434 | msgid "the link wasn't deleted" | ||
435 | msgstr "le lien n'a pas été effacé" | ||
436 | |||
437 | msgid "Article not found!" | ||
438 | msgstr "Article non trouvé !" | ||
439 | |||
440 | msgid "previous" | ||
441 | msgstr "précédent" | ||
442 | |||
443 | msgid "next" | ||
444 | msgstr "suivant" | ||
445 | |||
446 | msgid "in demo mode, you can't update your password" | ||
447 | msgstr "en mode démo, vous ne pouvez pas mettre à jour le mot de passe" | ||
448 | |||
449 | msgid "your password has been updated" | ||
450 | msgstr "votre mot de passe a été mis à jour" | ||
451 | |||
452 | msgid "the two fields have to be filled & the password must be the same in the two fields" | ||
453 | msgstr "les deux champs doivent être remplis & le mot de passe doit être le même dans les deux" | ||
454 | |||
455 | msgid "still using the \"" | ||
456 | msgstr "utilise encore \"" | ||
457 | |||
458 | msgid "that theme does not seem to be installed" | ||
459 | msgstr "ce thème ne semble pas installé" | ||
460 | |||
461 | msgid "you have changed your theme preferences" | ||
462 | msgstr "vous avez changez vos préférences de thème" | ||
463 | |||
464 | msgid "that language does not seem to be installed" | ||
465 | msgstr "cette langue ne semble pas être installée" | ||
466 | |||
467 | msgid "you have changed your language preferences" | ||
468 | msgstr "vous avez changé vos préférences de langue" | ||
469 | |||
470 | msgid "login failed: you have to fill all fields" | ||
471 | msgstr "identification échouée : vous devez remplir tous les champs" | ||
472 | |||
473 | msgid "welcome to your wallabag" | ||
474 | msgstr "bienvenue dans votre wallabag" | ||
475 | |||
476 | msgid "login failed: bad login or password" | ||
477 | msgstr "identification échouée : mauvais identifiant ou mot de passe" | ||
478 | |||
479 | msgid "import from instapaper completed" | ||
480 | msgstr "Import depuis Instapaper complété" | ||
481 | |||
482 | msgid "import from pocket completed" | ||
483 | msgstr "Import depuis Pocket complété" | ||
484 | |||
485 | msgid "import from Readability completed. " | ||
486 | msgstr "Import depuis Readability complété" | ||
487 | |||
488 | msgid "import from Poche completed. " | ||
489 | msgstr "Import depuis Pocket complété" | ||
490 | |||
491 | msgid "Unknown import provider." | ||
492 | msgstr "Fournisseur d'import inconnu." | ||
493 | |||
494 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
495 | msgstr "Fichier inc/poche/define.inc.php incomplet, merci de définir \"" | ||
496 | |||
497 | msgid "Could not find required \"" | ||
498 | msgstr "Ne peut pas trouver \"" | ||
499 | |||
500 | msgid "Uh, there is a problem while generating feeds." | ||
501 | msgstr "Ih, il y a un problème lors de la génération des flux." | ||
502 | |||
503 | msgid "Cache deleted." | ||
504 | msgstr "Cache effacé." | ||
505 | |||
506 | msgid "Oops, it seems you don't have PHP 5." | ||
507 | msgstr "Oups, vous ne semblez pas avoir PHP 5." | ||
508 | |||
509 | #~ msgid "poche it!" | ||
510 | #~ msgstr "pochez-le !" | ||
511 | |||
512 | #~ msgid "Updating poche" | ||
513 | #~ msgstr "Mettre à jour poche" | ||
514 | |||
515 | #, fuzzy | ||
516 | #~ msgid "Export your poche datas" | ||
517 | #~ msgstr "Exporter vos données de poche" | ||
518 | |||
519 | #, fuzzy | ||
520 | #~ msgid "to export your poche datas." | ||
521 | #~ msgstr "pour exporter vos données de poche." | ||
522 | |||
523 | #~ msgid "create an issue" | ||
524 | #~ msgstr "créez un ticket" | ||
525 | |||
526 | #~ msgid "or" | ||
527 | #~ msgstr "ou" | ||
528 | |||
529 | #~ msgid "contact us by mail" | ||
530 | #~ msgstr "contactez-nous par email" | ||
531 | |||
532 | #~ msgid "your poche version:" | ||
533 | #~ msgstr "votre version de poche :" | ||
diff --git a/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po b/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po index 429d5d55..41cc01e0 100644 --- a/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po +++ b/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po | |||
@@ -4,54 +4,138 @@ | |||
4 | msgid "" | 4 | msgid "" |
5 | msgstr "" | 5 | msgstr "" |
6 | "Project-Id-Version: poche\n" | 6 | "Project-Id-Version: poche\n" |
7 | "POT-Creation-Date: \n" | 7 | "Report-Msgid-Bugs-To: \n" |
8 | "PO-Revision-Date: 2013-11-25 09:47+0100\n" | 8 | "POT-Creation-Date: 2014-02-25 15:13+0300\n" |
9 | "Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" | 9 | "PO-Revision-Date: 2014-02-25 15:13+0300\n" |
10 | "Language-Team: Italian (http://www.transifex.com/projects/p/poche/language/" | 10 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
11 | "it/)\n" | 11 | "Language-Team: Italian (http://www.transifex.com/projects/p/poche/language/it/)\n" |
12 | "Language: it\n" | ||
12 | "MIME-Version: 1.0\n" | 13 | "MIME-Version: 1.0\n" |
13 | "Content-Type: text/plain; charset=UTF-8\n" | 14 | "Content-Type: text/plain; charset=UTF-8\n" |
14 | "Content-Transfer-Encoding: 8bit\n" | 15 | "Content-Transfer-Encoding: 8bit\n" |
15 | "Language: it\n" | ||
16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | 16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
17 | "X-Generator: Poedit 1.5.4\n" | 17 | "X-Generator: Poedit 1.5.4\n" |
18 | "X-Poedit-Language: Italian\n" | ||
19 | "X-Poedit-Country: ITALY\n" | ||
20 | "X-Poedit-Basepath: .\n" | ||
21 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" | ||
22 | |||
23 | msgid "wallabag, a read it later open source system" | ||
24 | msgstr "" | ||
25 | |||
26 | msgid "login failed: user doesn't exist" | ||
27 | msgstr "" | ||
28 | |||
29 | msgid "return home" | ||
30 | msgstr "" | ||
18 | 31 | ||
19 | msgid "config" | 32 | msgid "config" |
20 | msgstr "configurazione" | 33 | msgstr "configurazione" |
21 | 34 | ||
22 | msgid "Poching a link" | 35 | msgid "Saving articles" |
23 | msgstr "Pochare un link" | 36 | msgstr "" |
37 | |||
38 | msgid "There are several ways to save an article:" | ||
39 | msgstr "" | ||
24 | 40 | ||
25 | msgid "read the documentation" | 41 | msgid "read the documentation" |
26 | msgstr "leggi la documentazione" | 42 | msgstr "leggi la documentazione" |
27 | 43 | ||
28 | msgid "by filling this field" | 44 | msgid "download the extension" |
45 | msgstr "" | ||
46 | |||
47 | msgid "via F-Droid" | ||
48 | msgstr "" | ||
49 | |||
50 | msgid " or " | ||
51 | msgstr "" | ||
52 | |||
53 | msgid "via Google Play" | ||
54 | msgstr "" | ||
55 | |||
56 | msgid "download the application" | ||
57 | msgstr "" | ||
58 | |||
59 | #, fuzzy | ||
60 | msgid "By filling this field" | ||
29 | msgstr "compilando questo campo" | 61 | msgstr "compilando questo campo" |
30 | 62 | ||
31 | msgid "poche it!" | 63 | msgid "bag it!" |
32 | msgstr "pochalo!" | 64 | msgstr "" |
33 | 65 | ||
34 | msgid "Updating poche" | 66 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
35 | msgstr "Aggiornamento poche" | 67 | msgstr "" |
36 | 68 | ||
37 | msgid "your version" | 69 | msgid "Upgrading wallabag" |
38 | msgstr "la tua versione" | 70 | msgstr "" |
39 | 71 | ||
40 | msgid "latest stable version" | 72 | #, fuzzy |
73 | msgid "Installed version" | ||
41 | msgstr "ultima versione stabile" | 74 | msgstr "ultima versione stabile" |
42 | 75 | ||
43 | msgid "a more recent stable version is available." | 76 | #, fuzzy |
77 | msgid "Latest stable version" | ||
78 | msgstr "ultima versione stabile" | ||
79 | |||
80 | #, fuzzy | ||
81 | msgid "A more recent stable version is available." | ||
44 | msgstr "è disponibile una versione stabile più recente." | 82 | msgstr "è disponibile una versione stabile più recente." |
45 | 83 | ||
46 | msgid "you are up to date." | 84 | #, fuzzy |
85 | msgid "You are up to date." | ||
47 | msgstr "sei aggiornato." | 86 | msgstr "sei aggiornato." |
48 | 87 | ||
49 | msgid "latest dev version" | 88 | #, fuzzy |
89 | msgid "Latest dev version" | ||
50 | msgstr "ultima versione di sviluppo" | 90 | msgstr "ultima versione di sviluppo" |
51 | 91 | ||
52 | msgid "a more recent development version is available." | 92 | #, fuzzy |
93 | msgid "A more recent development version is available." | ||
53 | msgstr "è disponibile una versione di sviluppo più recente." | 94 | msgstr "è disponibile una versione di sviluppo più recente." |
54 | 95 | ||
96 | msgid "Feeds" | ||
97 | msgstr "" | ||
98 | |||
99 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
100 | msgstr "" | ||
101 | |||
102 | msgid "Unread feed" | ||
103 | msgstr "" | ||
104 | |||
105 | #, fuzzy | ||
106 | msgid "Favorites feed" | ||
107 | msgstr "preferiti" | ||
108 | |||
109 | #, fuzzy | ||
110 | msgid "Archive feed" | ||
111 | msgstr "archivio" | ||
112 | |||
113 | msgid "Your token:" | ||
114 | msgstr "" | ||
115 | |||
116 | msgid "Your user id:" | ||
117 | msgstr "" | ||
118 | |||
119 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
120 | msgstr "" | ||
121 | |||
122 | #, fuzzy | ||
123 | msgid "Change your theme" | ||
124 | msgstr "Cambia la tua password" | ||
125 | |||
126 | msgid "Theme:" | ||
127 | msgstr "" | ||
128 | |||
129 | msgid "Update" | ||
130 | msgstr "Aggiorna" | ||
131 | |||
132 | #, fuzzy | ||
133 | msgid "Change your language" | ||
134 | msgstr "Cambia la tua password" | ||
135 | |||
136 | msgid "Language:" | ||
137 | msgstr "" | ||
138 | |||
55 | msgid "Change your password" | 139 | msgid "Change your password" |
56 | msgstr "Cambia la tua password" | 140 | msgstr "Cambia la tua password" |
57 | 141 | ||
@@ -64,67 +148,68 @@ msgstr "Password" | |||
64 | msgid "Repeat your new password:" | 148 | msgid "Repeat your new password:" |
65 | msgstr "Ripeti la nuova password:" | 149 | msgstr "Ripeti la nuova password:" |
66 | 150 | ||
67 | msgid "Update" | ||
68 | msgstr "Aggiorna" | ||
69 | |||
70 | msgid "Import" | 151 | msgid "Import" |
71 | msgstr "Importa" | 152 | msgstr "Importa" |
72 | 153 | ||
73 | msgid "Please execute the import script locally, it can take a very long time." | 154 | #, fuzzy |
74 | msgstr "" | 155 | msgid "Please execute the import script locally as it can take a very long time." |
75 | "Si prega di eseguire lo script di importazione a livello locale, può " | 156 | msgstr "Si prega di eseguire lo script di importazione a livello locale, può richiedere un tempo molto lungo." |
76 | "richiedere un tempo molto lungo." | ||
77 | 157 | ||
78 | msgid "More info in the official doc:" | 158 | #, fuzzy |
159 | msgid "More info in the official documentation:" | ||
79 | msgstr "Maggiori info nella documentazione ufficiale" | 160 | msgstr "Maggiori info nella documentazione ufficiale" |
80 | 161 | ||
81 | msgid "import from Pocket" | 162 | #, fuzzy |
163 | msgid "Import from Pocket" | ||
82 | msgstr "Importa da Pocket" | 164 | msgstr "Importa da Pocket" |
83 | 165 | ||
84 | msgid "import from Readability" | 166 | #, php-format |
167 | msgid "(you must have a %s file on your server)" | ||
168 | msgstr "" | ||
169 | |||
170 | #, fuzzy | ||
171 | msgid "Import from Readability" | ||
85 | msgstr "Importa da Readability" | 172 | msgstr "Importa da Readability" |
86 | 173 | ||
87 | msgid "import from Instapaper" | 174 | #, fuzzy |
175 | msgid "Import from Instapaper" | ||
88 | msgstr "Importa da Instapaper" | 176 | msgstr "Importa da Instapaper" |
89 | 177 | ||
90 | msgid "Export your poche data" | 178 | #, fuzzy |
179 | msgid "Import from wallabag" | ||
180 | msgstr "Importa da Readability" | ||
181 | |||
182 | #, fuzzy | ||
183 | msgid "Export your wallabag data" | ||
91 | msgstr "Esporta i tuoi dati di poche" | 184 | msgstr "Esporta i tuoi dati di poche" |
92 | 185 | ||
93 | msgid "Click here" | 186 | msgid "Click here" |
94 | msgstr "Fai clic qui" | 187 | msgstr "Fai clic qui" |
95 | 188 | ||
96 | msgid "to export your poche data." | 189 | msgid "to download your database." |
97 | msgstr "per esportare i tuoi dati di poche." | 190 | msgstr "" |
98 | |||
99 | msgid "back to home" | ||
100 | msgstr "torna alla home" | ||
101 | 191 | ||
102 | msgid "installation" | 192 | #, fuzzy |
103 | msgstr "installazione" | 193 | msgid "to export your wallabag data." |
194 | msgstr "per esportare i tuoi dati di poche." | ||
104 | 195 | ||
105 | msgid "install your poche" | 196 | msgid "Cache" |
106 | msgstr "installa il tuo poche" | 197 | msgstr "" |
107 | 198 | ||
108 | msgid "" | 199 | msgid "to delete cache." |
109 | "poche is still not installed. Please fill the below form to install it. " | ||
110 | "Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation " | ||
111 | "on poche website</a>." | ||
112 | msgstr "" | 200 | msgstr "" |
113 | "poche non è ancora installato. Si prega di riempire il modulo sottostante " | ||
114 | "per completare l'installazione. <a href='http://doc.inthepoche.com'>Leggere " | ||
115 | "la documentazione sul sito di poche</a>." | ||
116 | 201 | ||
117 | msgid "Login" | 202 | msgid "You can enter multiple tags, separated by commas." |
118 | msgstr "Nome utente" | 203 | msgstr "" |
119 | 204 | ||
120 | msgid "Repeat your password" | 205 | msgid "return to article" |
121 | msgstr "Ripeti la tua password" | 206 | msgstr "" |
122 | 207 | ||
123 | msgid "Install" | 208 | msgid "plop" |
124 | msgstr "Installa" | 209 | msgstr "plop" |
125 | 210 | ||
126 | msgid "back to top" | 211 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
127 | msgstr "torna a inizio pagina" | 212 | msgstr "" |
128 | 213 | ||
129 | msgid "favoris" | 214 | msgid "favoris" |
130 | msgstr "preferiti" | 215 | msgstr "preferiti" |
@@ -153,10 +238,14 @@ msgstr "per titolo" | |||
153 | msgid "by title desc" | 238 | msgid "by title desc" |
154 | msgstr "per titolo decr" | 239 | msgstr "per titolo decr" |
155 | 240 | ||
156 | msgid "No link available here!" | 241 | msgid "Tag" |
157 | msgstr "Nessun link disponibile!" | 242 | msgstr "" |
158 | 243 | ||
159 | msgid "toggle mark as read" | 244 | msgid "No articles found." |
245 | msgstr "" | ||
246 | |||
247 | #, fuzzy | ||
248 | msgid "Toggle mark as read" | ||
160 | msgstr "segna come letto / non letto" | 249 | msgstr "segna come letto / non letto" |
161 | 250 | ||
162 | msgid "toggle favorite" | 251 | msgid "toggle favorite" |
@@ -168,13 +257,95 @@ msgstr "elimina" | |||
168 | msgid "original" | 257 | msgid "original" |
169 | msgstr "originale" | 258 | msgstr "originale" |
170 | 259 | ||
260 | msgid "estimated reading time:" | ||
261 | msgstr "" | ||
262 | |||
263 | msgid "mark all the entries as read" | ||
264 | msgstr "" | ||
265 | |||
171 | msgid "results" | 266 | msgid "results" |
172 | msgstr "risultati" | 267 | msgstr "risultati" |
173 | 268 | ||
174 | msgid "tweet" | 269 | msgid "installation" |
270 | msgstr "installazione" | ||
271 | |||
272 | #, fuzzy | ||
273 | msgid "install your wallabag" | ||
274 | msgstr "installa il tuo poche" | ||
275 | |||
276 | #, fuzzy | ||
277 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
278 | msgstr "poche non è ancora installato. Si prega di riempire il modulo sottostante per completare l'installazione. <a href='http://doc.inthepoche.com'>Leggere la documentazione sul sito di poche</a>." | ||
279 | |||
280 | msgid "Login" | ||
281 | msgstr "Nome utente" | ||
282 | |||
283 | msgid "Repeat your password" | ||
284 | msgstr "Ripeti la tua password" | ||
285 | |||
286 | msgid "Install" | ||
287 | msgstr "Installa" | ||
288 | |||
289 | #, fuzzy | ||
290 | msgid "login to your wallabag" | ||
291 | msgstr "accedi al tuo poche" | ||
292 | |||
293 | msgid "Login to wallabag" | ||
294 | msgstr "" | ||
295 | |||
296 | msgid "you are in demo mode, some features may be disabled." | ||
297 | msgstr "sei in modalità dimostrazione, alcune funzionalità potrebbero essere disattivate." | ||
298 | |||
299 | msgid "Username" | ||
300 | msgstr "" | ||
301 | |||
302 | msgid "Stay signed in" | ||
303 | msgstr "Resta connesso" | ||
304 | |||
305 | msgid "(Do not check on public computers)" | ||
306 | msgstr "(non selezionare su computer pubblici)" | ||
307 | |||
308 | msgid "Sign in" | ||
309 | msgstr "Accedi" | ||
310 | |||
311 | msgid "favorites" | ||
312 | msgstr "preferiti" | ||
313 | |||
314 | msgid "estimated reading time :" | ||
315 | msgstr "" | ||
316 | |||
317 | msgid "Mark all the entries as read" | ||
318 | msgstr "" | ||
319 | |||
320 | msgid "Return home" | ||
321 | msgstr "" | ||
322 | |||
323 | #, fuzzy | ||
324 | msgid "Back to top" | ||
325 | msgstr "torna a inizio pagina" | ||
326 | |||
327 | #, fuzzy | ||
328 | msgid "Mark as read" | ||
329 | msgstr "segna come letto / non letto" | ||
330 | |||
331 | #, fuzzy | ||
332 | msgid "Favorite" | ||
333 | msgstr "preferiti" | ||
334 | |||
335 | #, fuzzy | ||
336 | msgid "Toggle favorite" | ||
337 | msgstr "segna come preferito" | ||
338 | |||
339 | #, fuzzy | ||
340 | msgid "Delete" | ||
341 | msgstr "elimina" | ||
342 | |||
343 | #, fuzzy | ||
344 | msgid "Tweet" | ||
175 | msgstr "twitta" | 345 | msgstr "twitta" |
176 | 346 | ||
177 | msgid "email" | 347 | #, fuzzy |
348 | msgid "Email" | ||
178 | msgstr "email" | 349 | msgstr "email" |
179 | 350 | ||
180 | msgid "shaarli" | 351 | msgid "shaarli" |
@@ -183,26 +354,24 @@ msgstr "shaarli" | |||
183 | msgid "flattr" | 354 | msgid "flattr" |
184 | msgstr "flattr" | 355 | msgstr "flattr" |
185 | 356 | ||
186 | msgid "this article appears wrong?" | 357 | #, fuzzy |
358 | msgid "Does this article appear wrong?" | ||
187 | msgstr "articolo non visualizzato correttamente?" | 359 | msgstr "articolo non visualizzato correttamente?" |
188 | 360 | ||
189 | msgid "create an issue" | 361 | msgid "tags:" |
190 | msgstr "crea una segnalazione" | 362 | msgstr "" |
191 | |||
192 | msgid "or" | ||
193 | msgstr "oppure" | ||
194 | 363 | ||
195 | msgid "contact us by mail" | 364 | msgid "Edit tags" |
196 | msgstr "contattaci via email" | 365 | msgstr "" |
197 | 366 | ||
198 | msgid "plop" | 367 | msgid "save link!" |
199 | msgstr "plop" | 368 | msgstr "" |
200 | 369 | ||
201 | msgid "home" | 370 | msgid "home" |
202 | msgstr "home" | 371 | msgstr "home" |
203 | 372 | ||
204 | msgid "favorites" | 373 | msgid "tags" |
205 | msgstr "preferiti" | 374 | msgstr "" |
206 | 375 | ||
207 | msgid "logout" | 376 | msgid "logout" |
208 | msgstr "esci" | 377 | msgstr "esci" |
@@ -213,25 +382,187 @@ msgstr "realizzato con" | |||
213 | msgid "debug mode is on so cache is off." | 382 | msgid "debug mode is on so cache is off." |
214 | msgstr "modalità di debug attiva, cache disattivata." | 383 | msgstr "modalità di debug attiva, cache disattivata." |
215 | 384 | ||
216 | msgid "your poche version:" | 385 | #, fuzzy |
217 | msgstr "la tua versione di poche:" | 386 | msgid "your wallabag version:" |
387 | msgstr "la tua versione" | ||
218 | 388 | ||
219 | msgid "storage:" | 389 | msgid "storage:" |
220 | msgstr "memoria:" | 390 | msgstr "memoria:" |
221 | 391 | ||
222 | msgid "login to your poche" | 392 | msgid "save a link" |
223 | msgstr "accedi al tuo poche" | 393 | msgstr "" |
224 | 394 | ||
225 | msgid "you are in demo mode, some features may be disabled." | 395 | msgid "back to home" |
396 | msgstr "torna alla home" | ||
397 | |||
398 | msgid "toggle mark as read" | ||
399 | msgstr "segna come letto / non letto" | ||
400 | |||
401 | msgid "tweet" | ||
402 | msgstr "twitta" | ||
403 | |||
404 | msgid "email" | ||
405 | msgstr "email" | ||
406 | |||
407 | msgid "this article appears wrong?" | ||
408 | msgstr "articolo non visualizzato correttamente?" | ||
409 | |||
410 | msgid "No link available here!" | ||
411 | msgstr "Nessun link disponibile!" | ||
412 | |||
413 | msgid "Poching a link" | ||
414 | msgstr "Pochare un link" | ||
415 | |||
416 | msgid "by filling this field" | ||
417 | msgstr "compilando questo campo" | ||
418 | |||
419 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
226 | msgstr "" | 420 | msgstr "" |
227 | "sei in modalità dimostrazione, alcune funzionalità potrebbero essere " | ||
228 | "disattivate." | ||
229 | 421 | ||
230 | msgid "Stay signed in" | 422 | msgid "your version" |
231 | msgstr "Resta connesso" | 423 | msgstr "la tua versione" |
232 | 424 | ||
233 | msgid "(Do not check on public computers)" | 425 | msgid "latest stable version" |
234 | msgstr "(non selezionare su computer pubblici)" | 426 | msgstr "ultima versione stabile" |
235 | 427 | ||
236 | msgid "Sign in" | 428 | msgid "a more recent stable version is available." |
237 | msgstr "Accedi" | 429 | msgstr "è disponibile una versione stabile più recente." |
430 | |||
431 | msgid "you are up to date." | ||
432 | msgstr "sei aggiornato." | ||
433 | |||
434 | msgid "latest dev version" | ||
435 | msgstr "ultima versione di sviluppo" | ||
436 | |||
437 | msgid "a more recent development version is available." | ||
438 | msgstr "è disponibile una versione di sviluppo più recente." | ||
439 | |||
440 | msgid "Please execute the import script locally, it can take a very long time." | ||
441 | msgstr "Si prega di eseguire lo script di importazione a livello locale, può richiedere un tempo molto lungo." | ||
442 | |||
443 | #, fuzzy | ||
444 | msgid "More infos in the official doc:" | ||
445 | msgstr "Maggiori info nella documentazione ufficiale" | ||
446 | |||
447 | msgid "import from Pocket" | ||
448 | msgstr "Importa da Pocket" | ||
449 | |||
450 | msgid "import from Readability" | ||
451 | msgstr "Importa da Readability" | ||
452 | |||
453 | msgid "import from Instapaper" | ||
454 | msgstr "Importa da Instapaper" | ||
455 | |||
456 | msgid "Tags" | ||
457 | msgstr "" | ||
458 | |||
459 | #, fuzzy | ||
460 | msgid "Untitled" | ||
461 | msgstr "per titolo" | ||
462 | |||
463 | msgid "the link has been added successfully" | ||
464 | msgstr "" | ||
465 | |||
466 | msgid "error during insertion : the link wasn't added" | ||
467 | msgstr "" | ||
468 | |||
469 | msgid "the link has been deleted successfully" | ||
470 | msgstr "" | ||
471 | |||
472 | msgid "the link wasn't deleted" | ||
473 | msgstr "" | ||
474 | |||
475 | msgid "Article not found!" | ||
476 | msgstr "" | ||
477 | |||
478 | msgid "previous" | ||
479 | msgstr "" | ||
480 | |||
481 | msgid "next" | ||
482 | msgstr "" | ||
483 | |||
484 | msgid "in demo mode, you can't update your password" | ||
485 | msgstr "" | ||
486 | |||
487 | msgid "your password has been updated" | ||
488 | msgstr "" | ||
489 | |||
490 | msgid "the two fields have to be filled & the password must be the same in the two fields" | ||
491 | msgstr "" | ||
492 | |||
493 | msgid "still using the \"" | ||
494 | msgstr "" | ||
495 | |||
496 | msgid "that theme does not seem to be installed" | ||
497 | msgstr "" | ||
498 | |||
499 | msgid "you have changed your theme preferences" | ||
500 | msgstr "" | ||
501 | |||
502 | msgid "that language does not seem to be installed" | ||
503 | msgstr "" | ||
504 | |||
505 | msgid "you have changed your language preferences" | ||
506 | msgstr "" | ||
507 | |||
508 | msgid "login failed: you have to fill all fields" | ||
509 | msgstr "" | ||
510 | |||
511 | msgid "welcome to your wallabag" | ||
512 | msgstr "" | ||
513 | |||
514 | msgid "login failed: bad login or password" | ||
515 | msgstr "" | ||
516 | |||
517 | #, fuzzy | ||
518 | msgid "import from instapaper completed" | ||
519 | msgstr "Importa da Instapaper" | ||
520 | |||
521 | #, fuzzy | ||
522 | msgid "import from pocket completed" | ||
523 | msgstr "Importa da Pocket" | ||
524 | |||
525 | #, fuzzy | ||
526 | msgid "import from Readability completed. " | ||
527 | msgstr "Importa da Readability" | ||
528 | |||
529 | #, fuzzy | ||
530 | msgid "import from Poche completed. " | ||
531 | msgstr "Importa da Pocket" | ||
532 | |||
533 | msgid "Unknown import provider." | ||
534 | msgstr "" | ||
535 | |||
536 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
537 | msgstr "" | ||
538 | |||
539 | msgid "Could not find required \"" | ||
540 | msgstr "" | ||
541 | |||
542 | msgid "Uh, there is a problem while generating feeds." | ||
543 | msgstr "" | ||
544 | |||
545 | #, fuzzy | ||
546 | msgid "Cache deleted." | ||
547 | msgstr "elimina" | ||
548 | |||
549 | msgid "Oops, it seems you don't have PHP 5." | ||
550 | msgstr "" | ||
551 | |||
552 | #~ msgid "poche it!" | ||
553 | #~ msgstr "pochalo!" | ||
554 | |||
555 | #~ msgid "Updating poche" | ||
556 | #~ msgstr "Aggiornamento poche" | ||
557 | |||
558 | #~ msgid "create an issue" | ||
559 | #~ msgstr "crea una segnalazione" | ||
560 | |||
561 | #~ msgid "or" | ||
562 | #~ msgstr "oppure" | ||
563 | |||
564 | #~ msgid "contact us by mail" | ||
565 | #~ msgstr "contattaci via email" | ||
566 | |||
567 | #~ msgid "your poche version:" | ||
568 | #~ msgstr "la tua versione di poche:" | ||
diff --git a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo index 3e8b132f..b363385a 100755 --- a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo +++ b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo | |||
Binary files differ | |||
diff --git a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po index 0e7cbcf8..1764bd61 100755 --- a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po +++ b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po | |||
@@ -2,8 +2,8 @@ msgid "" | |||
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: wballabag\n" | 3 | "Project-Id-Version: wballabag\n" |
4 | "Report-Msgid-Bugs-To: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-02-07 17:38+0300\n" | 5 | "POT-Creation-Date: 2014-02-24 15:19+0300\n" |
6 | "PO-Revision-Date: 2014-02-07 17:43+0300\n" | 6 | "PO-Revision-Date: 2014-02-24 15:29+0300\n" |
7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" | 7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
8 | "Language-Team: \n" | 8 | "Language-Team: \n" |
9 | "Language: \n" | 9 | "Language: \n" |
@@ -15,7 +15,7 @@ msgstr "" | |||
15 | "X-Poedit-Language: Polish\n" | 15 | "X-Poedit-Language: Polish\n" |
16 | "X-Poedit-Country: POLAND\n" | 16 | "X-Poedit-Country: POLAND\n" |
17 | "X-Poedit-SourceCharset: utf-8\n" | 17 | "X-Poedit-SourceCharset: utf-8\n" |
18 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag\n" | 18 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" |
19 | 19 | ||
20 | msgid "poche, a read it later open source system" | 20 | msgid "poche, a read it later open source system" |
21 | msgstr "poche, serwis odrocznego czytania open source" | 21 | msgstr "poche, serwis odrocznego czytania open source" |
@@ -23,72 +23,158 @@ msgstr "poche, serwis odrocznego czytania open source" | |||
23 | msgid "login failed: user doesn't exist" | 23 | msgid "login failed: user doesn't exist" |
24 | msgstr "logowanie nie udało się: użytkownik nie istnieje" | 24 | msgstr "logowanie nie udało się: użytkownik nie istnieje" |
25 | 25 | ||
26 | msgid "Return home" | 26 | msgid "home" |
27 | msgstr "Wrocic do głównej" | 27 | msgstr "strona domowa" |
28 | 28 | ||
29 | msgid "Back to top" | 29 | msgid "favorites" |
30 | msgstr "Wrócić na górę" | 30 | msgstr "ulubione" |
31 | 31 | ||
32 | msgid "original" | 32 | msgid "archive" |
33 | msgstr "oryginal" | 33 | msgstr "archiwum" |
34 | 34 | ||
35 | msgid "Mark as read" | 35 | msgid "tags" |
36 | msgstr "Zaznacz jako przeczytane" | 36 | msgstr "tagi" |
37 | 37 | ||
38 | msgid "Toggle mark as read" | 38 | msgid "config" |
39 | msgstr "Przełącz jako przeczytane" | 39 | msgstr "ustawienia" |
40 | 40 | ||
41 | msgid "Favorite" | 41 | msgid "logout" |
42 | msgstr "Ulubiony" | 42 | msgstr "wyloguj" |
43 | 43 | ||
44 | msgid "Toggle favorite" | 44 | msgid "back to home" |
45 | msgstr "Zaznacz jako ulubione" | 45 | msgstr "wróć do strony domowej" |
46 | 46 | ||
47 | msgid "Delete" | 47 | msgid "Tags" |
48 | msgstr "Usuń" | 48 | msgstr "Tagi" |
49 | 49 | ||
50 | msgid "Tweet" | 50 | #, fuzzy |
51 | msgstr "Tweet" | 51 | msgid "Poching a link" |
52 | msgstr "Zapisywanie linków" | ||
52 | 53 | ||
53 | msgid "Email" | 54 | msgid "You can poche a link by several methods:" |
54 | msgstr "Wyslij email" | 55 | msgstr "Istnieje kilka sposobów aby zapisać link:" |
55 | 56 | ||
56 | msgid "shaarli" | 57 | msgid "read the documentation" |
57 | msgstr "shaarli" | 58 | msgstr "przeczytaj dokumentację" |
58 | 59 | ||
59 | msgid "flattr" | 60 | msgid "download the extension" |
60 | msgstr "flattr" | 61 | msgstr "pobierz rozszerzenie" |
61 | 62 | ||
62 | msgid "Does this article appear wrong?" | 63 | msgid "download the application" |
63 | msgstr "Czy ten artykuł wygląda nieprawidłowo?" | 64 | msgstr "pobierz aplikację" |
64 | 65 | ||
65 | msgid "tags:" | 66 | #, fuzzy |
66 | msgstr "tegi:" | 67 | msgid "by filling this field" |
68 | msgstr "Poprzez wypełnienie tego pola" | ||
67 | 69 | ||
68 | msgid "Edit tags" | 70 | msgid "poche it!" |
69 | msgstr "Redagowac tegi" | 71 | msgstr "zapisz!" |
70 | 72 | ||
71 | msgid "return home" | 73 | #, fuzzy |
72 | msgstr "wrócić do głównej" | 74 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" |
75 | msgstr "Bookmarklet: przeciągnij i upucs ten link na pasek zakladek" | ||
73 | 76 | ||
74 | msgid "powered by" | 77 | msgid "Updating poche" |
75 | msgstr "zasilany przez" | 78 | msgstr "Aktualizacja poche" |
76 | 79 | ||
77 | msgid "debug mode is on so cache is off." | 80 | msgid "your version" |
78 | msgstr "tryb debugowania jest włączony, więc cash jest wyłączony." | 81 | msgstr "twoja wersja" |
79 | 82 | ||
80 | msgid "your poche version:" | 83 | #, fuzzy |
81 | msgstr "twoja wersja poche:" | 84 | msgid "latest stable version" |
85 | msgstr "Najnowsza stabilna wersja" | ||
82 | 86 | ||
83 | msgid "storage:" | 87 | #, fuzzy |
84 | msgstr "magazyn:" | 88 | msgid "a more recent stable version is available." |
89 | msgstr "Nowsza stabilna wersja jest dostępna." | ||
90 | |||
91 | msgid "you are up to date." | ||
92 | msgstr "brak nowych aktualizacji." | ||
93 | |||
94 | msgid "latest dev version" | ||
95 | msgstr "najnowsza wersja rozwojowa" | ||
96 | |||
97 | msgid "a more recent development version is available." | ||
98 | msgstr "Nowsza wersja rozwojowa jest dostępna." | ||
99 | |||
100 | msgid "Change your theme" | ||
101 | msgstr "Zmień motyw" | ||
102 | |||
103 | msgid "Theme:" | ||
104 | msgstr "Motyw:" | ||
105 | |||
106 | msgid "Update" | ||
107 | msgstr "Aktualizacja" | ||
108 | |||
109 | msgid "Change your password" | ||
110 | msgstr "Zmień hasło" | ||
111 | |||
112 | msgid "New password:" | ||
113 | msgstr "Nowe hasło:" | ||
114 | |||
115 | msgid "Password" | ||
116 | msgstr "Hasło" | ||
117 | |||
118 | msgid "Repeat your new password:" | ||
119 | msgstr "Powtórz hasło jeszcze raz:" | ||
120 | |||
121 | msgid "Import" | ||
122 | msgstr "Import" | ||
123 | |||
124 | msgid "Please execute the import script locally, it can take a very long time." | ||
125 | msgstr "Proszę wykonać skrypt importu lokalnie, ponieważ moze to trwać bardzo długo." | ||
126 | |||
127 | msgid "More infos in the official doc:" | ||
128 | msgstr "Więcej informacji znajduje się w oficjalnej dokumentacji:" | ||
129 | |||
130 | msgid "import from Pocket" | ||
131 | msgstr "Importuj z Pocket'a" | ||
132 | |||
133 | #, php-format | ||
134 | msgid "(you must have a %s file on your server)" | ||
135 | msgstr "(musisz mieć plik %s na serwerze)" | ||
136 | |||
137 | msgid "import from Readability" | ||
138 | msgstr "Importuj z Readability" | ||
139 | |||
140 | msgid "import from Instapaper" | ||
141 | msgstr "Importuj z Instapaper" | ||
142 | |||
143 | #, fuzzy | ||
144 | msgid "Export your poche datas" | ||
145 | msgstr "Exportuj dane poche" | ||
146 | |||
147 | msgid "Click here" | ||
148 | msgstr "Kliknij tu" | ||
149 | |||
150 | #, fuzzy | ||
151 | msgid "to export your poche datas." | ||
152 | msgstr "aby wyeksportować dane poche." | ||
153 | |||
154 | msgid "plop" | ||
155 | msgstr "plop" | ||
156 | |||
157 | msgid "installation" | ||
158 | msgstr "instalacja" | ||
159 | |||
160 | msgid "install your wallabag" | ||
161 | msgstr "zainstaluj wallabag" | ||
162 | |||
163 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
164 | msgstr "wallabag nie jest jeszcze zainstalowany. Proszę wypełnić poniższy formularz, aby go zainstalować. Nie wahaj się <a href='http://doc.wallabag.org/'>zapoznać się z dokumentacją na stronie wallabag</a>." | ||
165 | |||
166 | msgid "Login" | ||
167 | msgstr "Login" | ||
168 | |||
169 | msgid "Repeat your password" | ||
170 | msgstr "Powtórz hasło" | ||
171 | |||
172 | msgid "Install" | ||
173 | msgstr "Instaluj" | ||
85 | 174 | ||
86 | msgid "favoris" | 175 | msgid "favoris" |
87 | msgstr "ulubione" | 176 | msgstr "ulubione" |
88 | 177 | ||
89 | msgid "archive" | ||
90 | msgstr "archiwum" | ||
91 | |||
92 | msgid "unread" | 178 | msgid "unread" |
93 | msgstr "nieprzeczytane" | 179 | msgstr "nieprzeczytane" |
94 | 180 | ||
@@ -99,7 +185,7 @@ msgid "by date" | |||
99 | msgstr "wg daty" | 185 | msgstr "wg daty" |
100 | 186 | ||
101 | msgid "by date desc" | 187 | msgid "by date desc" |
102 | msgstr "według daty spadająco" | 188 | msgstr "według daty malejąco" |
103 | 189 | ||
104 | msgid "by title asc" | 190 | msgid "by title asc" |
105 | msgstr "według tytułu rosnąco" | 191 | msgstr "według tytułu rosnąco" |
@@ -110,14 +196,20 @@ msgstr "wg tytułu" | |||
110 | msgid "by title desc" | 196 | msgid "by title desc" |
111 | msgstr "według tytułu malejąco" | 197 | msgstr "według tytułu malejąco" |
112 | 198 | ||
113 | msgid "No articles found." | 199 | msgid "No link available here!" |
114 | msgstr "Nie znaleziono artykułów." | 200 | msgstr "Brak dostępnych linków!" |
201 | |||
202 | msgid "toggle mark as read" | ||
203 | msgstr "przełącz jako przeczytane" | ||
115 | 204 | ||
116 | msgid "toggle favorite" | 205 | msgid "toggle favorite" |
117 | msgstr "przełączyc ulubione" | 206 | msgstr "przełącz ulubione" |
118 | 207 | ||
119 | msgid "delete" | 208 | msgid "delete" |
120 | msgstr "usunąć" | 209 | msgstr "usuń" |
210 | |||
211 | msgid "original" | ||
212 | msgstr "oryginał" | ||
121 | 213 | ||
122 | msgid "estimated reading time:" | 214 | msgid "estimated reading time:" |
123 | msgstr "szacowany czas odczytu:" | 215 | msgstr "szacowany czas odczytu:" |
@@ -125,32 +217,23 @@ msgstr "szacowany czas odczytu:" | |||
125 | msgid "results" | 217 | msgid "results" |
126 | msgstr "wyniki" | 218 | msgstr "wyniki" |
127 | 219 | ||
128 | msgid "home" | 220 | msgid "login to your wallabag" |
129 | msgstr "główna" | 221 | msgstr "zaloguj się do swojego wallabag" |
130 | |||
131 | msgid "favorites" | ||
132 | msgstr "ulubione" | ||
133 | |||
134 | msgid "tags" | ||
135 | msgstr "tagi" | ||
136 | |||
137 | msgid "config" | ||
138 | msgstr "ustawienia" | ||
139 | 222 | ||
140 | msgid "logout" | 223 | msgid "you are in demo mode, some features may be disabled." |
141 | msgstr "wyloguj" | 224 | msgstr "jesteś w trybie demo, niektóre funkcje mogą być wyłączone." |
142 | 225 | ||
143 | msgid "Poching links" | 226 | msgid "Stay signed in" |
144 | msgstr "Zapisywanie linków" | 227 | msgstr "Pozostań zalogowany" |
145 | 228 | ||
146 | msgid "There are several ways to poche a link:" | 229 | msgid "(Do not check on public computers)" |
147 | msgstr "Istnieje kilka sposobów aby zapisać link:" | 230 | msgstr "(Nie sprawdzaj na publicznych komputerach)" |
148 | 231 | ||
149 | msgid "read the documentation" | 232 | msgid "Saving articles" |
150 | msgstr "zapoznać się z dokumentacją" | 233 | msgstr "Zapisywanie artykułów" |
151 | 234 | ||
152 | msgid "download the extension" | 235 | msgid "There are several ways to save an article:" |
153 | msgstr "pobrać rozszerzenie" | 236 | msgstr "Istnieje kilka sposobów aby zapisać artykuł:" |
154 | 237 | ||
155 | msgid "via F-Droid" | 238 | msgid "via F-Droid" |
156 | msgstr "przez F-Droid" | 239 | msgstr "przez F-Droid" |
@@ -161,20 +244,17 @@ msgstr "albo" | |||
161 | msgid "via Google Play" | 244 | msgid "via Google Play" |
162 | msgstr "przez Google Play" | 245 | msgstr "przez Google Play" |
163 | 246 | ||
164 | msgid "download the application" | ||
165 | msgstr "pobrać aplikację" | ||
166 | |||
167 | msgid "By filling this field" | 247 | msgid "By filling this field" |
168 | msgstr "Poprzez wypełnienie tego pola" | 248 | msgstr "Poprzez wypełnienie tego pola" |
169 | 249 | ||
170 | msgid "poche it!" | 250 | msgid "bag it!" |
171 | msgstr "zapisać!" | 251 | msgstr "zapisz!" |
172 | 252 | ||
173 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" | 253 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
174 | msgstr "Bookmarklet: przeciągnij i upucs ten link na pasek zakladek" | 254 | msgstr "Bookmarklet: przeciągnij i upuść ten link na pasek zakladek" |
175 | 255 | ||
176 | msgid "Updating poche" | 256 | msgid "Upgrading wallabag" |
177 | msgstr "Aktualizacja poche" | 257 | msgstr "Aktualizacja wallabag" |
178 | 258 | ||
179 | msgid "Installed version" | 259 | msgid "Installed version" |
180 | msgstr "Zainstalowana wersja " | 260 | msgstr "Zainstalowana wersja " |
@@ -186,170 +266,195 @@ msgid "A more recent stable version is available." | |||
186 | msgstr "Nowsza stabilna wersja jest dostępna." | 266 | msgstr "Nowsza stabilna wersja jest dostępna." |
187 | 267 | ||
188 | msgid "You are up to date." | 268 | msgid "You are up to date." |
189 | msgstr "Masz wszystko najnowsze." | 269 | msgstr "Brak nowych aktualizacji." |
190 | 270 | ||
191 | msgid "latest dev version" | 271 | msgid "Latest dev version" |
192 | msgstr "najnowsza wersja dev" | 272 | msgstr "Najnowsza wersja rozwojowa" |
193 | 273 | ||
194 | msgid "a more recent development version is available." | 274 | #, fuzzy |
275 | msgid "A more recent development version is available." | ||
195 | msgstr "Nowsza wersja rozwojowa jest dostępna." | 276 | msgstr "Nowsza wersja rozwojowa jest dostępna." |
196 | 277 | ||
197 | msgid "you are up to date." | ||
198 | msgstr "masz wszystko najnowsze." | ||
199 | |||
200 | msgid "Feeds" | 278 | msgid "Feeds" |
201 | msgstr "Kanały (feeds)" | 279 | msgstr "Kanały (feeds)" |
202 | 280 | ||
203 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | 281 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." |
204 | msgstr "Twój znak kanału jest pusty i musi najpierw zostac wygenerowany. Kliknij <a href='?feed&action=generate'>tu dla jego generacji</a>." | 282 | msgstr "Twój token kanału jest pusty i musi najpierw zostać wygenerowany. Kliknij <a href='?feed&action=generate'>tu aby go wygenerować</a>." |
205 | 283 | ||
206 | msgid "Unread feed" | 284 | msgid "Unread feed" |
207 | msgstr "Kanał nieprzeczytanego" | 285 | msgstr "Kanał nieprzeczytanych" |
208 | 286 | ||
209 | msgid "Favorites feed" | 287 | msgid "Favorites feed" |
210 | msgstr "Kanał ulubionego" | 288 | msgstr "Kanał ulubionych" |
211 | 289 | ||
212 | msgid "Archive feed" | 290 | msgid "Archive feed" |
213 | msgstr "Kanał archiwum" | 291 | msgstr "Kanał archiwum" |
214 | 292 | ||
215 | msgid "Your token:" | 293 | msgid "Your token:" |
216 | msgstr "Twój znak (token): " | 294 | msgstr "Twój token: " |
217 | 295 | ||
218 | msgid "Your user id:" | 296 | msgid "Your user id:" |
219 | msgstr "Twój id użytkownika (user id):" | 297 | msgstr "Twój identyfikator użytkownika:" |
220 | 298 | ||
221 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | 299 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." |
222 | msgstr "Mozna zgenerowac nowy znak: kliknij <a href='?feed&action=generate'>zgenerowac!</a>." | 300 | msgstr "Możesz wygenerować token ponownie: kliknij <a href='?feed&action=generate'>generuj!</a>." |
223 | |||
224 | msgid "Change your theme" | ||
225 | msgstr "Zmienic motyw" | ||
226 | |||
227 | msgid "Theme:" | ||
228 | msgstr "Motyw:" | ||
229 | |||
230 | msgid "Update" | ||
231 | msgstr "Aktualizacja" | ||
232 | 301 | ||
233 | msgid "Change your language" | 302 | msgid "Change your language" |
234 | msgstr "Zmienić język" | 303 | msgstr "Zmień język" |
235 | 304 | ||
236 | msgid "Language:" | 305 | msgid "Language:" |
237 | msgstr "Język:" | 306 | msgstr "Język:" |
238 | 307 | ||
239 | msgid "Change your password" | ||
240 | msgstr "Zmień hasło" | ||
241 | |||
242 | msgid "New password:" | ||
243 | msgstr "Nowe hasło:" | ||
244 | |||
245 | msgid "Password" | ||
246 | msgstr "Hasło" | ||
247 | |||
248 | msgid "Repeat your new password:" | ||
249 | msgstr "Powtórz hasło jeszcze raz:" | ||
250 | |||
251 | msgid "Import" | ||
252 | msgstr "Import" | ||
253 | |||
254 | msgid "Please execute the import script locally as it can take a very long time." | 308 | msgid "Please execute the import script locally as it can take a very long time." |
255 | msgstr "Proszę wykonać skrypt import lokalnie, gdyż moze to trwać bardzo długo." | 309 | msgstr "Proszę wykonać skrypt importu lokalnie, gdyż moze to trwać bardzo długo." |
256 | 310 | ||
257 | msgid "More info in the official docs:" | 311 | #, fuzzy |
258 | msgstr "Więcej informacji w oficjalnej dokumentacji:" | 312 | msgid "More info in the official documentation:" |
313 | msgstr "Więcej informacji znajduje się w oficjalnej dokumentacji:" | ||
259 | 314 | ||
260 | msgid "Import from Pocket" | 315 | msgid "Import from Pocket" |
261 | msgstr "Іmport z Pocket'a" | 316 | msgstr "Іmport z Pocket'a" |
262 | 317 | ||
263 | #, php-format | ||
264 | msgid "(you must have a %s file on your server)" | ||
265 | msgstr "(musisz mieć plik %s na serwerze)" | ||
266 | |||
267 | msgid "Import from Readability" | 318 | msgid "Import from Readability" |
268 | msgstr "Import z Readability" | 319 | msgstr "Import z Readability" |
269 | 320 | ||
270 | msgid "Import from Instapaper" | 321 | msgid "Import from Instapaper" |
271 | msgstr "Import z Instapaper" | 322 | msgstr "Import z Instapaper" |
272 | 323 | ||
273 | msgid "Import from poche" | 324 | msgid "Import from wallabag" |
274 | msgstr "Import z poche" | 325 | msgstr "Import z wallabag" |
275 | |||
276 | msgid "Export your poche data" | ||
277 | msgstr "Eksportowac dane poche" | ||
278 | 326 | ||
279 | msgid "Click here" | 327 | msgid "Export your wallabag data" |
280 | msgstr "Kliknij tu" | 328 | msgstr "Eksportowac dane wallabag" |
281 | 329 | ||
282 | msgid "to download your database." | 330 | msgid "to download your database." |
283 | msgstr "aby pobrac bazę danych." | 331 | msgstr "aby pobrac bazę danych." |
284 | 332 | ||
285 | msgid "to export your poche data." | 333 | msgid "to export your wallabag data." |
286 | msgstr "aby eksportować dane poche." | 334 | msgstr "aby eksportować dane wallabag." |
287 | 335 | ||
288 | msgid "Tag" | 336 | msgid "Cache" |
289 | msgstr "Teg" | 337 | msgstr "Cache" |
290 | 338 | ||
291 | msgid "No link available here!" | 339 | msgid "to delete cache." |
292 | msgstr "Brak dostępnych linków!" | 340 | msgstr "aby wyczyścić cache." |
293 | 341 | ||
294 | msgid "toggle mark as read" | 342 | msgid "tweet" |
295 | msgstr "przełączyć znak jako przeczytane" | 343 | msgstr "tweet" |
344 | |||
345 | #, fuzzy | ||
346 | msgid "email" | ||
347 | msgstr "Wyślij email" | ||
348 | |||
349 | msgid "shaarli" | ||
350 | msgstr "shaarli" | ||
351 | |||
352 | msgid "flattr" | ||
353 | msgstr "flattr" | ||
354 | |||
355 | msgid "this article appears wrong?" | ||
356 | msgstr "Czy ten artykuł wyświetla się nieprawidłowo?" | ||
296 | 357 | ||
297 | msgid "You can enter multiple tags, separated by commas." | 358 | msgid "You can enter multiple tags, separated by commas." |
298 | msgstr "Mozna wprowadzić wiele tagów rozdzielajac je przecinkami." | 359 | msgstr "Możesz wprowadzić wiele tagów, rozdzielając je przecinkami." |
299 | 360 | ||
300 | msgid "return to article" | 361 | msgid "return to article" |
301 | msgstr "wrócić do artykułu" | 362 | msgstr "wróć do artykułu" |
302 | 363 | ||
303 | msgid "plop" | 364 | #, fuzzy |
304 | msgstr "plop" | 365 | msgid "powered by" |
366 | msgstr "zasilany przez" | ||
367 | |||
368 | msgid "debug mode is on so cache is off." | ||
369 | msgstr "tryb debugowania jest włączony, więc cashe jest wyłączony." | ||
370 | |||
371 | msgid "your wallabag version:" | ||
372 | msgstr "twoja wersja wallabag:" | ||
373 | |||
374 | msgid "storage:" | ||
375 | msgstr "magazyn:" | ||
376 | |||
377 | msgid "save a link" | ||
378 | msgstr "zapisz link" | ||
379 | |||
380 | msgid "return home" | ||
381 | msgstr "wróć do strony domowej" | ||
305 | 382 | ||
306 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." | 383 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
307 | msgstr "Można <a href='wallabag_compatibility_test.php'>sprawdzić swoją konfigurację tu</a>." | 384 | msgstr "Możesz <a href='wallabag_compatibility_test.php'>sprawdzić swoją konfigurację tu</a>." |
308 | 385 | ||
309 | msgid "installation" | 386 | msgid "Tag" |
310 | msgstr "instalacja" | 387 | msgstr "Tag" |
311 | 388 | ||
312 | msgid "install your wallabag" | 389 | msgid "No articles found." |
313 | msgstr "zainstalować wallabag" | 390 | msgstr "Nie znaleziono artykułów." |
314 | 391 | ||
315 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | 392 | msgid "Toggle mark as read" |
316 | msgstr "wallabag nie jest jeszcze zainstalowany. Proszę wypełnić poniższy formularz, aby go zainstalowac. Nie wahaj się <a href='http://doc.wallabag.org/'>zapoznac się z dokumentacja na stronie wallabag</a>." | 393 | msgstr "Przełącz jako przeczytane" |
317 | 394 | ||
318 | msgid "Login" | 395 | msgid "mark all the entries as read" |
396 | msgstr "zaznacz wszystko jako przeczytane" | ||
397 | |||
398 | msgid "Login to wallabag" | ||
399 | msgstr "Zaloguj się do wallabag" | ||
400 | |||
401 | msgid "Username" | ||
402 | msgstr "Nazwa użytkownika" | ||
403 | |||
404 | msgid "Sign in" | ||
319 | msgstr "Login" | 405 | msgstr "Login" |
320 | 406 | ||
321 | msgid "Repeat your password" | 407 | msgid "Return home" |
322 | msgstr "Powtórz hasło" | 408 | msgstr "Wróć do strony domowej" |
323 | 409 | ||
324 | msgid "Install" | 410 | msgid "Back to top" |
325 | msgstr "Instalowac" | 411 | msgstr "Wróć na górę" |
326 | 412 | ||
327 | msgid "login to your wallabag" | 413 | msgid "Mark as read" |
328 | msgstr "zalogować się do swojego wallabag" | 414 | msgstr "Zaznacz jako przeczytane" |
329 | 415 | ||
330 | msgid "Login to wallabag" | 416 | msgid "Favorite" |
331 | msgstr "Zalogować się do wallabag" | 417 | msgstr "Ulubione" |
332 | 418 | ||
333 | msgid "you are in demo mode, some features may be disabled." | 419 | msgid "Toggle favorite" |
334 | msgstr "jesteś w trybie demo, niektóre funkcje mogą być niedostępne." | 420 | msgstr "Zaznacz jako ulubione" |
335 | 421 | ||
336 | msgid "Username" | 422 | msgid "Delete" |
337 | msgstr "Imię u��ytkownika" | 423 | msgstr "Usu��" |
338 | 424 | ||
339 | msgid "Stay signed in" | 425 | msgid "Tweet" |
340 | msgstr "Pozostań zalogowany" | 426 | msgstr "Tweet" |
341 | 427 | ||
342 | msgid "(Do not check on public computers)" | 428 | msgid "Email" |
343 | msgstr "(Nie sprawdzaj na publicznych komputerach" | 429 | msgstr "Wyślij email" |
430 | |||
431 | msgid "Does this article appear wrong?" | ||
432 | msgstr "Czy ten artykuł wyświetla się nieprawidłowo?" | ||
433 | |||
434 | msgid "tags:" | ||
435 | msgstr "tegi:" | ||
436 | |||
437 | msgid "Edit tags" | ||
438 | msgstr "Edytuj tagi" | ||
439 | |||
440 | msgid "save link!" | ||
441 | msgstr "zapisz link!" | ||
442 | |||
443 | #, fuzzy | ||
444 | msgid "estimated reading time :" | ||
445 | msgstr "szacowany czas odczytu:" | ||
446 | |||
447 | msgid "Mark all the entries as read" | ||
448 | msgstr "Oznacz wszystko jako przeczytane" | ||
344 | 449 | ||
345 | msgid "Untitled" | 450 | msgid "Untitled" |
346 | msgstr "Bez nazwy" | 451 | msgstr "Bez nazwy" |
347 | 452 | ||
348 | msgid "the link has been added successfully" | 453 | msgid "the link has been added successfully" |
349 | msgstr "link pozostał pomyślnie dodany" | 454 | msgstr "link został pomyślnie dodany" |
350 | 455 | ||
351 | msgid "error during insertion : the link wasn't added" | 456 | msgid "error during insertion : the link wasn't added" |
352 | msgstr "błąd podczas wprowadzania: link nie zostal dodany" | 457 | msgstr "błąd podczas wprowadzania: link nie został dodany" |
353 | 458 | ||
354 | msgid "the link has been deleted successfully" | 459 | msgid "the link has been deleted successfully" |
355 | msgstr "link zostal pomyślnie usunięty" | 460 | msgstr "link zostal pomyślnie usunięty" |
@@ -357,6 +462,9 @@ msgstr "link zostal pomyślnie usunięty" | |||
357 | msgid "the link wasn't deleted" | 462 | msgid "the link wasn't deleted" |
358 | msgstr "link nie został usunięty" | 463 | msgstr "link nie został usunięty" |
359 | 464 | ||
465 | msgid "Article not found!" | ||
466 | msgstr "Nie znaleziono artykułu." | ||
467 | |||
360 | msgid "previous" | 468 | msgid "previous" |
361 | msgstr "poprzednia" | 469 | msgstr "poprzednia" |
362 | 470 | ||
@@ -367,7 +475,7 @@ msgid "in demo mode, you can't update your password" | |||
367 | msgstr "w trybie demo, nie można zmieniać hasła" | 475 | msgstr "w trybie demo, nie można zmieniać hasła" |
368 | 476 | ||
369 | msgid "your password has been updated" | 477 | msgid "your password has been updated" |
370 | msgstr "twoje hasło zmienione" | 478 | msgstr "twoje hasło zostało zmienione" |
371 | 479 | ||
372 | msgid "the two fields have to be filled & the password must be the same in the two fields" | 480 | msgid "the two fields have to be filled & the password must be the same in the two fields" |
373 | msgstr "oba pola muszą być wypełnione i hasła muszę być takie same w obu polach" | 481 | msgstr "oba pola muszą być wypełnione i hasła muszę być takie same w obu polach" |
@@ -376,31 +484,28 @@ msgid "still using the \"" | |||
376 | msgstr "nadal w użyciu \"" | 484 | msgstr "nadal w użyciu \"" |
377 | 485 | ||
378 | msgid "that theme does not seem to be installed" | 486 | msgid "that theme does not seem to be installed" |
379 | msgstr "wydaje się że motyw nie był zainstalowany" | 487 | msgstr "wydaje się że ten motyw nie jest zainstalowany" |
380 | 488 | ||
381 | msgid "you have changed your theme preferences" | 489 | msgid "you have changed your theme preferences" |
382 | msgstr "ustawienia motywu zostałe zmienione" | 490 | msgstr "ustawienia motywu zostały zmienione" |
383 | 491 | ||
384 | msgid "that language does not seem to be installed" | 492 | msgid "that language does not seem to be installed" |
385 | msgstr "wydaje się że język nie był zainstalowany" | 493 | msgstr "wydaje się że ten język nie jest zainstalowany" |
386 | 494 | ||
387 | msgid "you have changed your language preferences" | 495 | msgid "you have changed your language preferences" |
388 | msgstr "ustawienia języka zostałe zmienione" | 496 | msgstr "ustawienia języka zostały zmienione" |
389 | 497 | ||
390 | msgid "login failed: you have to fill all fields" | 498 | msgid "login failed: you have to fill all fields" |
391 | msgstr "logowanie nie powiodlo się: musisz wypełnić wszystkie pola" | 499 | msgstr "logowanie nie powiodlo się: musisz wypełnić wszystkie pola" |
392 | 500 | ||
393 | msgid "welcome to your poche" | 501 | msgid "welcome to your wallabag" |
394 | msgstr "witamy w poche" | 502 | msgstr "Witamy w wallabag" |
395 | 503 | ||
396 | msgid "login failed: bad login or password" | 504 | msgid "login failed: bad login or password" |
397 | msgstr "logowanie nie powiodlo się: zly login lub hasło" | 505 | msgstr "logowanie nie powiodlo się: niepoprawny login lub hasło" |
398 | |||
399 | msgid "see you soon!" | ||
400 | msgstr "do zobaczenia wkrótce!" | ||
401 | 506 | ||
402 | msgid "import from instapaper completed" | 507 | msgid "import from instapaper completed" |
403 | msgstr "import з instapaper'a zakończony" | 508 | msgstr "import z instapaper'a zakończony" |
404 | 509 | ||
405 | msgid "import from pocket completed" | 510 | msgid "import from pocket completed" |
406 | msgstr "import z pocket'a zakończony" | 511 | msgstr "import z pocket'a zakończony" |
@@ -415,14 +520,25 @@ msgid "Unknown import provider." | |||
415 | msgstr "Nieznany dostawca importu." | 520 | msgstr "Nieznany dostawca importu." |
416 | 521 | ||
417 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | 522 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" |
418 | msgstr "Niekompletny plik inc/poche/define.inc.php, proszę definiować \"" | 523 | msgstr "Niekompletny plik inc/poche/define.inc.php, proszę zdefiniować \"" |
419 | 524 | ||
420 | msgid "Could not find required \"" | 525 | msgid "Could not find required \"" |
421 | msgstr "Nie znaleziono potrzebnego \"" | 526 | msgstr "Nie znaleziono potrzebnego \"" |
422 | 527 | ||
423 | msgid "Uh, there is a problem while generating feeds." | 528 | msgid "Uh, there is a problem while generating feeds." |
424 | msgstr "Uh, jest problem podczas generowania kanałów (feeds)." | 529 | msgstr "Uh, jest problem podczas generowania kanałów." |
530 | |||
531 | msgid "Cache deleted." | ||
532 | msgstr "Cache wyczyszczony." | ||
425 | 533 | ||
426 | msgid "Oops, it seems you don't have PHP 5." | 534 | msgid "Oops, it seems you don't have PHP 5." |
427 | msgstr "Oops, wygląda ze u was niema PHP 5." | 535 | msgstr "Oops, wygląda ze nie masz PHP 5." |
536 | |||
537 | #~ msgid "Import from poche" | ||
538 | #~ msgstr "Import z poche" | ||
539 | |||
540 | #~ msgid "welcome to your poche" | ||
541 | #~ msgstr "witamy w poche" | ||
428 | 542 | ||
543 | #~ msgid "see you soon!" | ||
544 | #~ msgstr "do zobaczenia wkrótce!" | ||
diff --git a/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.mo b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.mo new file mode 100644 index 00000000..c1ce317f --- /dev/null +++ b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.mo | |||
Binary files differ | |||
diff --git a/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.po b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.po new file mode 100644 index 00000000..e1453922 --- /dev/null +++ b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.po | |||
@@ -0,0 +1,549 @@ | |||
1 | msgid "" | ||
2 | msgstr "" | ||
3 | "Project-Id-Version: wallabag\n" | ||
4 | "Report-Msgid-Bugs-To: \n" | ||
5 | "POT-Creation-Date: 2014-02-25 15:17+0300\n" | ||
6 | "PO-Revision-Date: \n" | ||
7 | "Last-Translator: @iancamporez <ian@camporez.com>\n" | ||
8 | "Language-Team: @iancamporez <ian@camporez.com>\n" | ||
9 | "Language: pt_BR\n" | ||
10 | "MIME-Version: 1.0\n" | ||
11 | "Content-Type: text/plain; charset=UTF-8\n" | ||
12 | "Content-Transfer-Encoding: 8bit\n" | ||
13 | "X-Generator: Poedit 1.6.4\n" | ||
14 | "X-Poedit-Basepath: .\n" | ||
15 | "X-Poedit-SearchPath-0: /home/ian/Projetos/wallabag/locale/en_EN.utf8/" | ||
16 | "LC_MESSAGES\n" | ||
17 | |||
18 | msgid "wallabag, a read it later open source system" | ||
19 | msgstr "wallabag, um \"read it later\" de código aberto" | ||
20 | |||
21 | msgid "login failed: user doesn't exist" | ||
22 | msgstr "falha ao entrar: o usuário não existe" | ||
23 | |||
24 | msgid "return home" | ||
25 | msgstr "retornar à página inicial" | ||
26 | |||
27 | msgid "config" | ||
28 | msgstr "configurar" | ||
29 | |||
30 | msgid "Saving articles" | ||
31 | msgstr "Salvando artigos" | ||
32 | |||
33 | msgid "There are several ways to save an article:" | ||
34 | msgstr "Existem várias maneiras de salvar um artigo:" | ||
35 | |||
36 | msgid "read the documentation" | ||
37 | msgstr "ler a documentação" | ||
38 | |||
39 | msgid "download the extension" | ||
40 | msgstr "baixar a extensão" | ||
41 | |||
42 | msgid "via F-Droid" | ||
43 | msgstr "via F-Droid" | ||
44 | |||
45 | msgid " or " | ||
46 | msgstr "ou " | ||
47 | |||
48 | msgid "via Google Play" | ||
49 | msgstr "via Google Play" | ||
50 | |||
51 | msgid "download the application" | ||
52 | msgstr "baixar o aplicativo" | ||
53 | |||
54 | msgid "By filling this field" | ||
55 | msgstr "Preenchendo esse campo" | ||
56 | |||
57 | msgid "bag it!" | ||
58 | msgstr "adicionar ao wallabag" | ||
59 | |||
60 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" | ||
61 | msgstr "Bookmarklet: arraste esse link para sua barra de favoritos" | ||
62 | |||
63 | msgid "Upgrading wallabag" | ||
64 | msgstr "Atualizando o wallabag" | ||
65 | |||
66 | msgid "Installed version" | ||
67 | msgstr "Versão instalada" | ||
68 | |||
69 | msgid "Latest stable version" | ||
70 | msgstr "Última versão estável" | ||
71 | |||
72 | msgid "A more recent stable version is available." | ||
73 | msgstr "Uma versão estável mais nova está disponível" | ||
74 | |||
75 | msgid "You are up to date." | ||
76 | msgstr "Você está atualizado." | ||
77 | |||
78 | msgid "Latest dev version" | ||
79 | msgstr "Última versão em desenvolvimento" | ||
80 | |||
81 | msgid "A more recent development version is available." | ||
82 | msgstr "Uma versão em desenvolvimento mais recente está disponível" | ||
83 | |||
84 | msgid "Feeds" | ||
85 | msgstr "Feeds" | ||
86 | |||
87 | msgid "" | ||
88 | "Your feed token is currently empty and must first be generated to enable " | ||
89 | "feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
90 | msgstr "" | ||
91 | "Seu token do feed e precisa ser gerado para ativar os feeds. Clique <a " | ||
92 | "href='?feed&action=generate'>aqui para gerar um token</a>." | ||
93 | |||
94 | msgid "Unread feed" | ||
95 | msgstr "Feed de artigos não lidos" | ||
96 | |||
97 | msgid "Favorites feed" | ||
98 | msgstr "Feed dos favoritos" | ||
99 | |||
100 | msgid "Archive feed" | ||
101 | msgstr "Feed de arquivados" | ||
102 | |||
103 | msgid "Your token:" | ||
104 | msgstr "Seu token:" | ||
105 | |||
106 | msgid "Your user id:" | ||
107 | msgstr "Seu código de usuário:" | ||
108 | |||
109 | msgid "" | ||
110 | "You can regenerate your token: <a href='?feed&action=generate'>generate!" | ||
111 | "</a>." | ||
112 | msgstr "" | ||
113 | "Você pode regerar seu token: <a href='?feed&action=generate'>gerar!</a>." | ||
114 | |||
115 | msgid "Change your theme" | ||
116 | msgstr "Mudar seu tema" | ||
117 | |||
118 | msgid "Theme:" | ||
119 | msgstr "Tema:" | ||
120 | |||
121 | msgid "Update" | ||
122 | msgstr "Atualizar" | ||
123 | |||
124 | msgid "Change your language" | ||
125 | msgstr "Alterar seu idioma" | ||
126 | |||
127 | msgid "Language:" | ||
128 | msgstr "Idioma:" | ||
129 | |||
130 | msgid "Change your password" | ||
131 | msgstr "Alterar sua senha" | ||
132 | |||
133 | msgid "New password:" | ||
134 | msgstr "Nova senha:" | ||
135 | |||
136 | msgid "Password" | ||
137 | msgstr "Senha" | ||
138 | |||
139 | msgid "Repeat your new password:" | ||
140 | msgstr "Repetir sua nova senha:" | ||
141 | |||
142 | msgid "Import" | ||
143 | msgstr "Importar" | ||
144 | |||
145 | msgid "" | ||
146 | "Please execute the import script locally as it can take a very long time." | ||
147 | msgstr "" | ||
148 | "Por favor, execute o script de importação localmente, pois pode demorar " | ||
149 | "muito tempo." | ||
150 | |||
151 | msgid "More info in the official documentation:" | ||
152 | msgstr "Mais informações na documentação oficial:" | ||
153 | |||
154 | msgid "Import from Pocket" | ||
155 | msgstr "Importar do Pocket" | ||
156 | |||
157 | #, php-format | ||
158 | msgid "(you must have a %s file on your server)" | ||
159 | msgstr "(você deve ter um arquivo %s no seu servidor)" | ||
160 | |||
161 | msgid "Import from Readability" | ||
162 | msgstr "Importar do Readability" | ||
163 | |||
164 | msgid "Import from Instapaper" | ||
165 | msgstr "Importar do Instapaper" | ||
166 | |||
167 | msgid "Import from wallabag" | ||
168 | msgstr "Importar do wallabag" | ||
169 | |||
170 | msgid "Export your wallabag data" | ||
171 | msgstr "Exportar seus dados do wallabag" | ||
172 | |||
173 | msgid "Click here" | ||
174 | msgstr "Clique aqui" | ||
175 | |||
176 | msgid "to download your database." | ||
177 | msgstr "para baixar seu banco de dados." | ||
178 | |||
179 | msgid "to export your wallabag data." | ||
180 | msgstr "para exportar seus dados do wallabag." | ||
181 | |||
182 | msgid "Cache" | ||
183 | msgstr "Cache" | ||
184 | |||
185 | msgid "to delete cache." | ||
186 | msgstr "para apagar o cache." | ||
187 | |||
188 | msgid "You can enter multiple tags, separated by commas." | ||
189 | msgstr "Você pode inserir várias tags, separadas por vírgulas." | ||
190 | |||
191 | msgid "return to article" | ||
192 | msgstr "retornar ao artigo" | ||
193 | |||
194 | msgid "plop" | ||
195 | msgstr "plop" | ||
196 | |||
197 | msgid "" | ||
198 | "You can <a href='wallabag_compatibility_test.php'>check your configuration " | ||
199 | "here</a>." | ||
200 | msgstr "" | ||
201 | "Você pode <a href='wallabag_compatibility_test.php'>checar suas " | ||
202 | "configurações aqui</a>." | ||
203 | |||
204 | msgid "favoris" | ||
205 | msgstr "favoritos" | ||
206 | |||
207 | msgid "archive" | ||
208 | msgstr "arquivo" | ||
209 | |||
210 | msgid "unread" | ||
211 | msgstr "não lidos" | ||
212 | |||
213 | msgid "by date asc" | ||
214 | msgstr "por data (cresc.)" | ||
215 | |||
216 | msgid "by date" | ||
217 | msgstr "por data" | ||
218 | |||
219 | msgid "by date desc" | ||
220 | msgstr "por data (decr.)" | ||
221 | |||
222 | msgid "by title asc" | ||
223 | msgstr "por título (cresc.)" | ||
224 | |||
225 | msgid "by title" | ||
226 | msgstr "por título" | ||
227 | |||
228 | msgid "by title desc" | ||
229 | msgstr "por título (decr.)" | ||
230 | |||
231 | msgid "Tag" | ||
232 | msgstr "Tag" | ||
233 | |||
234 | msgid "No articles found." | ||
235 | msgstr "Nenhum artigo encontrado." | ||
236 | |||
237 | msgid "Toggle mark as read" | ||
238 | msgstr "Alterar \"marcar como lido\"" | ||
239 | |||
240 | msgid "toggle favorite" | ||
241 | msgstr "alterar \"favorito\"" | ||
242 | |||
243 | msgid "delete" | ||
244 | msgstr "deletar" | ||
245 | |||
246 | msgid "original" | ||
247 | msgstr "original" | ||
248 | |||
249 | msgid "estimated reading time:" | ||
250 | msgstr "tempo estimado de leitura:" | ||
251 | |||
252 | msgid "mark all the entries as read" | ||
253 | msgstr "marcar todas as entradas como lidas" | ||
254 | |||
255 | msgid "results" | ||
256 | msgstr "resultados" | ||
257 | |||
258 | msgid "installation" | ||
259 | msgstr "instalação" | ||
260 | |||
261 | msgid "install your wallabag" | ||
262 | msgstr "instalar seu wallabag" | ||
263 | |||
264 | msgid "" | ||
265 | "wallabag is still not installed. Please fill the below form to install it. " | ||
266 | "Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation " | ||
267 | "on wallabag website</a>." | ||
268 | msgstr "" | ||
269 | "O wallabag ainda não está instalado. Preencha o formulário abaixo para " | ||
270 | "instalá-lo. Não hesite em <a href='http://doc.wallabag.org/'>ler a " | ||
271 | "documentação no site do wallabag</a>." | ||
272 | |||
273 | msgid "Login" | ||
274 | msgstr "Login" | ||
275 | |||
276 | msgid "Repeat your password" | ||
277 | msgstr "Repetir sua senha" | ||
278 | |||
279 | msgid "Install" | ||
280 | msgstr "Instalar" | ||
281 | |||
282 | msgid "login to your wallabag" | ||
283 | msgstr "entrar no seu wallabag" | ||
284 | |||
285 | msgid "Login to wallabag" | ||
286 | msgstr "Entrar no wallabag" | ||
287 | |||
288 | msgid "you are in demo mode, some features may be disabled." | ||
289 | msgstr "você está no modo demo, alguns recursos podem estar desativados." | ||
290 | |||
291 | msgid "Username" | ||
292 | msgstr "Nome de usuário" | ||
293 | |||
294 | msgid "Stay signed in" | ||
295 | msgstr "Continuar conectado" | ||
296 | |||
297 | msgid "(Do not check on public computers)" | ||
298 | msgstr "(Não marque em computadores públicos)" | ||
299 | |||
300 | msgid "Sign in" | ||
301 | msgstr "Entrar" | ||
302 | |||
303 | msgid "favorites" | ||
304 | msgstr "favoritos" | ||
305 | |||
306 | msgid "estimated reading time :" | ||
307 | msgstr "tempo estimado de leitura :" | ||
308 | |||
309 | msgid "Mark all the entries as read" | ||
310 | msgstr "Marcar todas as entradas como lidas" | ||
311 | |||
312 | msgid "Return home" | ||
313 | msgstr "Retornar à página inicial" | ||
314 | |||
315 | msgid "Back to top" | ||
316 | msgstr "Voltar ao topo" | ||
317 | |||
318 | msgid "Mark as read" | ||
319 | msgstr "Marcar como lido" | ||
320 | |||
321 | msgid "Favorite" | ||
322 | msgstr "Favoritar" | ||
323 | |||
324 | msgid "Toggle favorite" | ||
325 | msgstr "Alterar \"favorito\"" | ||
326 | |||
327 | msgid "Delete" | ||
328 | msgstr "Deletar" | ||
329 | |||
330 | msgid "Tweet" | ||
331 | msgstr "Tweetar" | ||
332 | |||
333 | msgid "Email" | ||
334 | msgstr "Email" | ||
335 | |||
336 | msgid "shaarli" | ||
337 | msgstr "shaarli" | ||
338 | |||
339 | msgid "flattr" | ||
340 | msgstr "flattr" | ||
341 | |||
342 | msgid "Does this article appear wrong?" | ||
343 | msgstr "Esse artigo está sendo exibido incorretamente?" | ||
344 | |||
345 | msgid "tags:" | ||
346 | msgstr "tags:" | ||
347 | |||
348 | msgid "Edit tags" | ||
349 | msgstr "Editar tags" | ||
350 | |||
351 | msgid "save link!" | ||
352 | msgstr "salvar link!" | ||
353 | |||
354 | msgid "home" | ||
355 | msgstr "início" | ||
356 | |||
357 | msgid "tags" | ||
358 | msgstr "tags" | ||
359 | |||
360 | msgid "logout" | ||
361 | msgstr "sair" | ||
362 | |||
363 | msgid "powered by" | ||
364 | msgstr "powered by" | ||
365 | |||
366 | msgid "debug mode is on so cache is off." | ||
367 | msgstr "o modo debug está ativo, então o cache foi desativado." | ||
368 | |||
369 | msgid "your wallabag version:" | ||
370 | msgstr "sua versão do wallabag:" | ||
371 | |||
372 | msgid "storage:" | ||
373 | msgstr "armazenamento:" | ||
374 | |||
375 | msgid "save a link" | ||
376 | msgstr "salvar link" | ||
377 | |||
378 | msgid "back to home" | ||
379 | msgstr "voltar à página inicial" | ||
380 | |||
381 | msgid "toggle mark as read" | ||
382 | msgstr "alterar \"marcar como lido\"" | ||
383 | |||
384 | msgid "tweet" | ||
385 | msgstr "tweetar" | ||
386 | |||
387 | msgid "email" | ||
388 | msgstr "email" | ||
389 | |||
390 | msgid "this article appears wrong?" | ||
391 | msgstr "esse artigo está sendo mostrado incorretamente?" | ||
392 | |||
393 | msgid "No link available here!" | ||
394 | msgstr "Nenhum link disponível aqui!" | ||
395 | |||
396 | msgid "Poching a link" | ||
397 | msgstr "Pocheando um link" | ||
398 | |||
399 | msgid "by filling this field" | ||
400 | msgstr "preenchendo esse campo" | ||
401 | |||
402 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
403 | msgstr "bookmarklet: arraste esse link para a sua barra de favoritos" | ||
404 | |||
405 | msgid "your version" | ||
406 | msgstr "sua versão" | ||
407 | |||
408 | msgid "latest stable version" | ||
409 | msgstr "última versão estável" | ||
410 | |||
411 | msgid "a more recent stable version is available." | ||
412 | msgstr "uma versão estável mais nova está disponível" | ||
413 | |||
414 | msgid "you are up to date." | ||
415 | msgstr "você está atualizado." | ||
416 | |||
417 | msgid "latest dev version" | ||
418 | msgstr "última versão em desenvolvimento" | ||
419 | |||
420 | msgid "a more recent development version is available." | ||
421 | msgstr "uma versão em desenvolvimento mais nova está disponível" | ||
422 | |||
423 | msgid "Please execute the import script locally, it can take a very long time." | ||
424 | msgstr "" | ||
425 | "Por favor, execute o script de importação localmente, pois pode demorar " | ||
426 | "muito tempo." | ||
427 | |||
428 | msgid "More infos in the official doc:" | ||
429 | msgstr "Mais informações na documentação oficial:" | ||
430 | |||
431 | msgid "import from Pocket" | ||
432 | msgstr "importar do Pocket" | ||
433 | |||
434 | msgid "import from Readability" | ||
435 | msgstr "importar do Readability" | ||
436 | |||
437 | msgid "import from Instapaper" | ||
438 | msgstr "importar do Instapaper" | ||
439 | |||
440 | msgid "Tags" | ||
441 | msgstr "Tags" | ||
442 | |||
443 | msgid "Untitled" | ||
444 | msgstr "Sem título" | ||
445 | |||
446 | msgid "the link has been added successfully" | ||
447 | msgstr "o link foi adicionado com sucesso" | ||
448 | |||
449 | msgid "error during insertion : the link wasn't added" | ||
450 | msgstr "erro durante a inserção: o link não foi adicionado" | ||
451 | |||
452 | msgid "the link has been deleted successfully" | ||
453 | msgstr "o link foi deletado com sucesso" | ||
454 | |||
455 | msgid "the link wasn't deleted" | ||
456 | msgstr "o link não foi deletado" | ||
457 | |||
458 | msgid "Article not found!" | ||
459 | msgstr "Artigo não encontrado!" | ||
460 | |||
461 | msgid "previous" | ||
462 | msgstr "anterior" | ||
463 | |||
464 | msgid "next" | ||
465 | msgstr "próximo" | ||
466 | |||
467 | msgid "in demo mode, you can't update your password" | ||
468 | msgstr "você não pode alterar a senha no modo demo" | ||
469 | |||
470 | msgid "your password has been updated" | ||
471 | msgstr "sua senha foi atualizada" | ||
472 | |||
473 | msgid "" | ||
474 | "the two fields have to be filled & the password must be the same in the two " | ||
475 | "fields" | ||
476 | msgstr "" | ||
477 | "os dois campos devem estar preenchidos e as senhas devem ser iguais em ambos" | ||
478 | |||
479 | msgid "still using the \"" | ||
480 | msgstr "ainda usando o \"" | ||
481 | |||
482 | msgid "that theme does not seem to be installed" | ||
483 | msgstr "esse tema aparentemente não está instalado" | ||
484 | |||
485 | msgid "you have changed your theme preferences" | ||
486 | msgstr "você alterou suas preferências de tema" | ||
487 | |||
488 | msgid "that language does not seem to be installed" | ||
489 | msgstr "esse idioma aparentemente não está instalado" | ||
490 | |||
491 | msgid "you have changed your language preferences" | ||
492 | msgstr "você alterou suas preferências de idioma" | ||
493 | |||
494 | msgid "login failed: you have to fill all fields" | ||
495 | msgstr "falha ao entrar: você deve preencher todos os campos" | ||
496 | |||
497 | msgid "welcome to your wallabag" | ||
498 | msgstr "bem-vindo ao seu wallabag" | ||
499 | |||
500 | msgid "login failed: bad login or password" | ||
501 | msgstr "falha ao entrar: login ou senha incorretos" | ||
502 | |||
503 | msgid "import from instapaper completed" | ||
504 | msgstr "importação do instapaper completa" | ||
505 | |||
506 | msgid "import from pocket completed" | ||
507 | msgstr "importação do pocket completa" | ||
508 | |||
509 | msgid "import from Readability completed. " | ||
510 | msgstr "importação do Readability completa. " | ||
511 | |||
512 | msgid "import from Poche completed. " | ||
513 | msgstr "importação do Poche completa. " | ||
514 | |||
515 | msgid "Unknown import provider." | ||
516 | msgstr "Serviço de importação desconhecido." | ||
517 | |||
518 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
519 | msgstr "Arquivo inc/poche/define.inc.php incompleto, por favor defina \"" | ||
520 | |||
521 | msgid "Could not find required \"" | ||
522 | msgstr "Não foi possível encontrar o requerido \"" | ||
523 | |||
524 | msgid "Uh, there is a problem while generating feeds." | ||
525 | msgstr "Uh, houve um problema ao gerar os feeds." | ||
526 | |||
527 | msgid "Cache deleted." | ||
528 | msgstr "Cache deletado." | ||
529 | |||
530 | msgid "Oops, it seems you don't have PHP 5." | ||
531 | msgstr "Oops, parece que você não tem o PHP 5." | ||
532 | |||
533 | #~ msgid "poche it!" | ||
534 | #~ msgstr "poche it!" | ||
535 | |||
536 | #~ msgid "Updating poche" | ||
537 | #~ msgstr "Updating poche" | ||
538 | |||
539 | #~ msgid "create an issue" | ||
540 | #~ msgstr "create an issue" | ||
541 | |||
542 | #~ msgid "or" | ||
543 | #~ msgstr "or" | ||
544 | |||
545 | #~ msgid "contact us by mail" | ||
546 | #~ msgstr "contact us by mail" | ||
547 | |||
548 | #~ msgid "your poche version:" | ||
549 | #~ msgstr "your poche version:" | ||
diff --git a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo index c9cf1a55..5cbfad16 100755 --- a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo +++ b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo | |||
Binary files differ | |||
diff --git a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po index aa1769cf..08f12b7c 100755 --- a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po +++ b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po | |||
@@ -2,7 +2,7 @@ msgid "" | |||
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: \n" | 3 | "Project-Id-Version: \n" |
4 | "Report-Msgid-Bugs-To: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-02-07 12:40+0300\n" | 5 | "POT-Creation-Date: 2014-02-25 15:09+0300\n" |
6 | "PO-Revision-Date: \n" | 6 | "PO-Revision-Date: \n" |
7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" | 7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
8 | "Language-Team: \n" | 8 | "Language-Team: \n" |
@@ -14,135 +14,25 @@ msgstr "" | |||
14 | "X-Poedit-Language: Russian\n" | 14 | "X-Poedit-Language: Russian\n" |
15 | "X-Poedit-Country: RUSSIA\n" | 15 | "X-Poedit-Country: RUSSIA\n" |
16 | "X-Poedit-SourceCharset: utf-8\n" | 16 | "X-Poedit-SourceCharset: utf-8\n" |
17 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag\n" | 17 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" |
18 | 18 | ||
19 | msgid "poche, a read it later open source system" | 19 | msgid "wallabag, a read it later open source system" |
20 | msgstr "poche, сервис отложенного чтения с открытым исходным кодом" | 20 | msgstr "wallabag, сервис отложенного чтения с открытым исходным кодом" |
21 | 21 | ||
22 | msgid "login failed: user doesn't exist" | 22 | msgid "login failed: user doesn't exist" |
23 | msgstr "войти не удалось: пользователь не существует" | 23 | msgstr "войти не удалось: пользователь не существует" |
24 | 24 | ||
25 | msgid "Return home" | ||
26 | msgstr "На главную" | ||
27 | |||
28 | msgid "Back to top" | ||
29 | msgstr "Наверх" | ||
30 | |||
31 | msgid "original" | ||
32 | msgstr "источник" | ||
33 | |||
34 | msgid "Mark as read" | ||
35 | msgstr "Отметить как прочитанное" | ||
36 | |||
37 | msgid "Toggle mark as read" | ||
38 | msgstr "Изменить отметку 'прочитано'" | ||
39 | |||
40 | msgid "Favorite" | ||
41 | msgstr "Избранное" | ||
42 | |||
43 | msgid "Toggle favorite" | ||
44 | msgstr "Изменить метку избранного" | ||
45 | |||
46 | msgid "Delete" | ||
47 | msgstr "Удалить" | ||
48 | |||
49 | msgid "Tweet" | ||
50 | msgstr "Твитнуть" | ||
51 | |||
52 | msgid "Email" | ||
53 | msgstr "Отправить по почте" | ||
54 | |||
55 | msgid "shaarli" | ||
56 | msgstr "shaarli" | ||
57 | |||
58 | msgid "flattr" | ||
59 | msgstr "проспонсировать" | ||
60 | |||
61 | msgid "Does this article appear wrong?" | ||
62 | msgstr "Статья выглядит криво?" | ||
63 | |||
64 | msgid "tags:" | ||
65 | msgstr "теги:" | ||
66 | |||
67 | msgid "Edit tags" | ||
68 | msgstr "Редактировать теги" | ||
69 | |||
70 | msgid "return home" | 25 | msgid "return home" |
71 | msgstr "на главную" | 26 | msgstr "на главную" |
72 | 27 | ||
73 | msgid "powered by" | ||
74 | msgstr "при поддержке" | ||
75 | |||
76 | msgid "debug mode is on so cache is off." | ||
77 | msgstr "включён режим отладки - кеш выключен." | ||
78 | |||
79 | msgid "your poche version:" | ||
80 | msgstr "ваша версия poche:" | ||
81 | |||
82 | msgid "storage:" | ||
83 | msgstr "хранилище:" | ||
84 | |||
85 | msgid "favoris" | ||
86 | msgstr "избранное" | ||
87 | |||
88 | msgid "archive" | ||
89 | msgstr "архив" | ||
90 | |||
91 | msgid "unread" | ||
92 | msgstr "непрочитанное" | ||
93 | |||
94 | msgid "by date asc" | ||
95 | msgstr "по дате, сперва старые" | ||
96 | |||
97 | msgid "by date" | ||
98 | msgstr "по дате" | ||
99 | |||
100 | msgid "by date desc" | ||
101 | msgstr "по дате, сперва новые" | ||
102 | |||
103 | msgid "by title asc" | ||
104 | msgstr "по заголовку (прямой)" | ||
105 | |||
106 | msgid "by title" | ||
107 | msgstr "по заголовку" | ||
108 | |||
109 | msgid "by title desc" | ||
110 | msgstr "по заголовку (обратный)" | ||
111 | |||
112 | msgid "No articles found." | ||
113 | msgstr "Статей не найдено." | ||
114 | |||
115 | msgid "toggle favorite" | ||
116 | msgstr "изменить метку избранного" | ||
117 | |||
118 | msgid "delete" | ||
119 | msgstr "удалить" | ||
120 | |||
121 | msgid "estimated reading time:" | ||
122 | msgstr "ориентировочное время чтения:" | ||
123 | |||
124 | msgid "results" | ||
125 | msgstr "найдено" | ||
126 | |||
127 | msgid "home" | ||
128 | msgstr "главная" | ||
129 | |||
130 | msgid "favorites" | ||
131 | msgstr "избранное" | ||
132 | |||
133 | msgid "tags" | ||
134 | msgstr "теги" | ||
135 | |||
136 | msgid "config" | 28 | msgid "config" |
137 | msgstr "настройки" | 29 | msgstr "настройки" |
138 | 30 | ||
139 | msgid "logout" | 31 | msgid "Saving articles" |
140 | msgstr "выход" | 32 | msgstr "Сохранение статей" |
141 | |||
142 | msgid "Poching links" | ||
143 | msgstr "Сохранение ссылок" | ||
144 | 33 | ||
145 | msgid "There are several ways to poche a link:" | 34 | #, fuzzy |
35 | msgid "There are several ways to save an article:" | ||
146 | msgstr "Существует несколько способов сохранить ссылку:" | 36 | msgstr "Существует несколько способов сохранить ссылку:" |
147 | 37 | ||
148 | msgid "read the documentation" | 38 | msgid "read the documentation" |
@@ -166,14 +56,14 @@ msgstr "скачать приложение" | |||
166 | msgid "By filling this field" | 56 | msgid "By filling this field" |
167 | msgstr "Заполнением этого поля" | 57 | msgstr "Заполнением этого поля" |
168 | 58 | ||
169 | msgid "poche it!" | 59 | msgid "bag it!" |
170 | msgstr "прикарманить!" | 60 | msgstr "прикарманить!" |
171 | 61 | ||
172 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" | 62 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
173 | msgstr "Закладка: перетащите и опустите ссылку на панель закладок" | 63 | msgstr "Закладка: перетащите и опустите ссылку на панель закладок" |
174 | 64 | ||
175 | msgid "Updating poche" | 65 | msgid "Upgrading wallabag" |
176 | msgstr "Обновления poche" | 66 | msgstr "Обновление wallabag" |
177 | 67 | ||
178 | msgid "Installed version" | 68 | msgid "Installed version" |
179 | msgstr "Установленная версия" | 69 | msgstr "Установленная версия" |
@@ -187,15 +77,14 @@ msgstr "Доступна новая стабильная версия." | |||
187 | msgid "You are up to date." | 77 | msgid "You are up to date." |
188 | msgstr "У вас всё самое новое." | 78 | msgstr "У вас всё самое новое." |
189 | 79 | ||
190 | msgid "latest dev version" | 80 | #, fuzzy |
81 | msgid "Latest dev version" | ||
191 | msgstr "последняя версия в разработке" | 82 | msgstr "последняя версия в разработке" |
192 | 83 | ||
193 | msgid "a more recent development version is available." | 84 | #, fuzzy |
85 | msgid "A more recent development version is available." | ||
194 | msgstr "есть более свежая версия в разработке." | 86 | msgstr "есть более свежая версия в разработке." |
195 | 87 | ||
196 | msgid "you are up to date." | ||
197 | msgstr "у вас всё самое новое." | ||
198 | |||
199 | msgid "Feeds" | 88 | msgid "Feeds" |
200 | msgstr "Ленты (feeds)" | 89 | msgstr "Ленты (feeds)" |
201 | 90 | ||
@@ -253,7 +142,8 @@ msgstr "Импортировать" | |||
253 | msgid "Please execute the import script locally as it can take a very long time." | 142 | msgid "Please execute the import script locally as it can take a very long time." |
254 | msgstr "Пожалуйста, выполните сценарий импорта локально - это может занять слишком много времени." | 143 | msgstr "Пожалуйста, выполните сценарий импорта локально - это может занять слишком много времени." |
255 | 144 | ||
256 | msgid "More info in the official docs:" | 145 | #, fuzzy |
146 | msgid "More info in the official documentation:" | ||
257 | msgstr "Больше сведений в официальной документации:" | 147 | msgstr "Больше сведений в официальной документации:" |
258 | 148 | ||
259 | msgid "Import from Pocket" | 149 | msgid "Import from Pocket" |
@@ -269,11 +159,11 @@ msgstr "Импортировать из Readability" | |||
269 | msgid "Import from Instapaper" | 159 | msgid "Import from Instapaper" |
270 | msgstr "Импортировать из Instapaper" | 160 | msgstr "Импортировать из Instapaper" |
271 | 161 | ||
272 | msgid "Import from poche" | 162 | msgid "Import from wallabag" |
273 | msgstr "Импортировать из poche" | 163 | msgstr "Импортировать из wallabag" |
274 | 164 | ||
275 | msgid "Export your poche data" | 165 | msgid "Export your wallabag data" |
276 | msgstr "Экспортировать данные poche" | 166 | msgstr "Экспортировать данные wallabag" |
277 | 167 | ||
278 | msgid "Click here" | 168 | msgid "Click here" |
279 | msgstr "Кликните здесь" | 169 | msgstr "Кликните здесь" |
@@ -281,17 +171,14 @@ msgstr "Кликните здесь" | |||
281 | msgid "to download your database." | 171 | msgid "to download your database." |
282 | msgstr "чтобы скачать вашу базу данных" | 172 | msgstr "чтобы скачать вашу базу данных" |
283 | 173 | ||
284 | msgid "to export your poche data." | 174 | msgid "to export your wallabag data." |
285 | msgstr "чтобы экспортировать свои записи из poche." | 175 | msgstr "чтобы экспортировать свои записи из wallabag." |
286 | 176 | ||
287 | msgid "Tag" | 177 | msgid "Cache" |
288 | msgstr "Тег" | 178 | msgstr "Кэш" |
289 | |||
290 | msgid "No link available here!" | ||
291 | msgstr "Здесь нет ссылки!" | ||
292 | 179 | ||
293 | msgid "toggle mark as read" | 180 | msgid "to delete cache." |
294 | msgstr "измени���� о��������ку '��ро��ит��но'" | 181 | msgstr "��т������ с��ро��ить ��эш." |
295 | 182 | ||
296 | msgid "You can enter multiple tags, separated by commas." | 183 | msgid "You can enter multiple tags, separated by commas." |
297 | msgstr "Вы можете ввести несколько тегов, разделяя их запятой." | 184 | msgstr "Вы можете ввести несколько тегов, разделяя их запятой." |
@@ -305,6 +192,60 @@ msgstr "plop" | |||
305 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." | 192 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
306 | msgstr "Вы можете <a href='wallabag_compatibility_test.php'>проверить конфигурацию здесь</a>." | 193 | msgstr "Вы можете <a href='wallabag_compatibility_test.php'>проверить конфигурацию здесь</a>." |
307 | 194 | ||
195 | msgid "favoris" | ||
196 | msgstr "избранное" | ||
197 | |||
198 | msgid "archive" | ||
199 | msgstr "архив" | ||
200 | |||
201 | msgid "unread" | ||
202 | msgstr "непрочитанное" | ||
203 | |||
204 | msgid "by date asc" | ||
205 | msgstr "по дате, сперва старые" | ||
206 | |||
207 | msgid "by date" | ||
208 | msgstr "по дате" | ||
209 | |||
210 | msgid "by date desc" | ||
211 | msgstr "по дате, сперва новые" | ||
212 | |||
213 | msgid "by title asc" | ||
214 | msgstr "по заголовку (прямой)" | ||
215 | |||
216 | msgid "by title" | ||
217 | msgstr "по заголовку" | ||
218 | |||
219 | msgid "by title desc" | ||
220 | msgstr "по заголовку (обратный)" | ||
221 | |||
222 | msgid "Tag" | ||
223 | msgstr "Тег" | ||
224 | |||
225 | msgid "No articles found." | ||
226 | msgstr "Статей не найдено." | ||
227 | |||
228 | msgid "Toggle mark as read" | ||
229 | msgstr "Изменить отметку 'прочитано'" | ||
230 | |||
231 | msgid "toggle favorite" | ||
232 | msgstr "изменить метку избранного" | ||
233 | |||
234 | msgid "delete" | ||
235 | msgstr "удалить" | ||
236 | |||
237 | msgid "original" | ||
238 | msgstr "источник" | ||
239 | |||
240 | msgid "estimated reading time:" | ||
241 | msgstr "ориентировочное время чтения:" | ||
242 | |||
243 | msgid "mark all the entries as read" | ||
244 | msgstr "отметить все статьи как прочитанные " | ||
245 | |||
246 | msgid "results" | ||
247 | msgstr "найдено" | ||
248 | |||
308 | msgid "installation" | 249 | msgid "installation" |
309 | msgstr "установка" | 250 | msgstr "установка" |
310 | 251 | ||
@@ -341,6 +282,159 @@ msgstr "Запомнить меня" | |||
341 | msgid "(Do not check on public computers)" | 282 | msgid "(Do not check on public computers)" |
342 | msgstr "(Не отмечайте на чужих компьютерах)" | 283 | msgstr "(Не отмечайте на чужих компьютерах)" |
343 | 284 | ||
285 | msgid "Sign in" | ||
286 | msgstr "Зарегистрироваться" | ||
287 | |||
288 | msgid "favorites" | ||
289 | msgstr "избранное" | ||
290 | |||
291 | #, fuzzy | ||
292 | msgid "estimated reading time :" | ||
293 | msgstr "ориентировочное время чтения:" | ||
294 | |||
295 | msgid "Mark all the entries as read" | ||
296 | msgstr "Отметить все как прочитанное" | ||
297 | |||
298 | msgid "Return home" | ||
299 | msgstr "На главную" | ||
300 | |||
301 | msgid "Back to top" | ||
302 | msgstr "Наверх" | ||
303 | |||
304 | msgid "Mark as read" | ||
305 | msgstr "Отметить как прочитанное" | ||
306 | |||
307 | msgid "Favorite" | ||
308 | msgstr "Избранное" | ||
309 | |||
310 | msgid "Toggle favorite" | ||
311 | msgstr "Изменить метку избранного" | ||
312 | |||
313 | msgid "Delete" | ||
314 | msgstr "Удалить" | ||
315 | |||
316 | msgid "Tweet" | ||
317 | msgstr "Твитнуть" | ||
318 | |||
319 | msgid "Email" | ||
320 | msgstr "Отправить по почте" | ||
321 | |||
322 | msgid "shaarli" | ||
323 | msgstr "shaarli" | ||
324 | |||
325 | msgid "flattr" | ||
326 | msgstr "проспонсировать" | ||
327 | |||
328 | msgid "Does this article appear wrong?" | ||
329 | msgstr "Статья выглядит криво?" | ||
330 | |||
331 | msgid "tags:" | ||
332 | msgstr "теги:" | ||
333 | |||
334 | msgid "Edit tags" | ||
335 | msgstr "Редактировать теги" | ||
336 | |||
337 | msgid "save link!" | ||
338 | msgstr "сохранить ссылку!" | ||
339 | |||
340 | msgid "home" | ||
341 | msgstr "главная" | ||
342 | |||
343 | msgid "tags" | ||
344 | msgstr "теги" | ||
345 | |||
346 | msgid "logout" | ||
347 | msgstr "выход" | ||
348 | |||
349 | msgid "powered by" | ||
350 | msgstr "при поддержке" | ||
351 | |||
352 | msgid "debug mode is on so cache is off." | ||
353 | msgstr "включён режим отладки - кеш выключен." | ||
354 | |||
355 | msgid "your wallabag version:" | ||
356 | msgstr "Ваша версия wallabag:" | ||
357 | |||
358 | msgid "storage:" | ||
359 | msgstr "хранилище:" | ||
360 | |||
361 | msgid "save a link" | ||
362 | msgstr "сохранить ссылку" | ||
363 | |||
364 | msgid "back to home" | ||
365 | msgstr "домой" | ||
366 | |||
367 | msgid "toggle mark as read" | ||
368 | msgstr "изменить отметку 'прочитано'" | ||
369 | |||
370 | msgid "tweet" | ||
371 | msgstr "твитнуть" | ||
372 | |||
373 | msgid "email" | ||
374 | msgstr "email" | ||
375 | |||
376 | #, fuzzy | ||
377 | msgid "this article appears wrong?" | ||
378 | msgstr "Статья выглядит криво?" | ||
379 | |||
380 | msgid "No link available here!" | ||
381 | msgstr "Здесь нет ссылки!" | ||
382 | |||
383 | #, fuzzy | ||
384 | msgid "Poching a link" | ||
385 | msgstr "Сохранение ссылок" | ||
386 | |||
387 | #, fuzzy | ||
388 | msgid "by filling this field" | ||
389 | msgstr "Заполнением этого поля" | ||
390 | |||
391 | #, fuzzy | ||
392 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
393 | msgstr "Закладка: перетащите и опустите ссылку на панель закладок" | ||
394 | |||
395 | msgid "your version" | ||
396 | msgstr "Ваша версия" | ||
397 | |||
398 | #, fuzzy | ||
399 | msgid "latest stable version" | ||
400 | msgstr "Последняя стабильная версия" | ||
401 | |||
402 | #, fuzzy | ||
403 | msgid "a more recent stable version is available." | ||
404 | msgstr "Доступна новая стабильная версия." | ||
405 | |||
406 | msgid "you are up to date." | ||
407 | msgstr "у вас всё самое новое." | ||
408 | |||
409 | msgid "latest dev version" | ||
410 | msgstr "последняя версия в разработке" | ||
411 | |||
412 | msgid "a more recent development version is available." | ||
413 | msgstr "есть более свежая версия в разработке." | ||
414 | |||
415 | #, fuzzy | ||
416 | msgid "Please execute the import script locally, it can take a very long time." | ||
417 | msgstr "Пожалуйста, выполните сценарий импорта локально - это может занять слишком много времени." | ||
418 | |||
419 | #, fuzzy | ||
420 | msgid "More infos in the official doc:" | ||
421 | msgstr "Больше сведений в официальной документации:" | ||
422 | |||
423 | #, fuzzy | ||
424 | msgid "import from Pocket" | ||
425 | msgstr "Импортировать из Pocket" | ||
426 | |||
427 | #, fuzzy | ||
428 | msgid "import from Readability" | ||
429 | msgstr "Импортировать из Readability" | ||
430 | |||
431 | #, fuzzy | ||
432 | msgid "import from Instapaper" | ||
433 | msgstr "Импортировать из Instapaper" | ||
434 | |||
435 | msgid "Tags" | ||
436 | msgstr "Теги" | ||
437 | |||
344 | msgid "Untitled" | 438 | msgid "Untitled" |
345 | msgstr "Без названия" | 439 | msgstr "Без названия" |
346 | 440 | ||
@@ -356,6 +450,9 @@ msgstr "ссылка успешно удалена" | |||
356 | msgid "the link wasn't deleted" | 450 | msgid "the link wasn't deleted" |
357 | msgstr "ссылка не удалена" | 451 | msgstr "ссылка не удалена" |
358 | 452 | ||
453 | msgid "Article not found!" | ||
454 | msgstr "Статью не найдено." | ||
455 | |||
359 | msgid "previous" | 456 | msgid "previous" |
360 | msgstr "предыдущая" | 457 | msgstr "предыдущая" |
361 | 458 | ||
@@ -389,15 +486,12 @@ msgstr "вы изменили свои настройки языка" | |||
389 | msgid "login failed: you have to fill all fields" | 486 | msgid "login failed: you have to fill all fields" |
390 | msgstr "войти не удалось: вы должны заполнить все поля" | 487 | msgstr "войти не удалось: вы должны заполнить все поля" |
391 | 488 | ||
392 | msgid "welcome to your poche" | 489 | msgid "welcome to your wallabag" |
393 | msgstr "добро пожаловать в ваш poche" | 490 | msgstr "добро пожаловать в wallabag" |
394 | 491 | ||
395 | msgid "login failed: bad login or password" | 492 | msgid "login failed: bad login or password" |
396 | msgstr "войти не удалось: неправильное имя пользователя или пароль" | 493 | msgstr "войти не удалось: неправильное имя пользователя или пароль" |
397 | 494 | ||
398 | msgid "see you soon!" | ||
399 | msgstr "увидимся!" | ||
400 | |||
401 | msgid "import from instapaper completed" | 495 | msgid "import from instapaper completed" |
402 | msgstr "импорт из instapaper завершен" | 496 | msgstr "импорт из instapaper завершен" |
403 | 497 | ||
@@ -422,14 +516,40 @@ msgstr "Не удалось найти требуемый \"" | |||
422 | msgid "Uh, there is a problem while generating feeds." | 516 | msgid "Uh, there is a problem while generating feeds." |
423 | msgstr "Ох, возникла проблема при создании ленты." | 517 | msgstr "Ох, возникла проблема при создании ленты." |
424 | 518 | ||
519 | msgid "Cache deleted." | ||
520 | msgstr "Кэш очищен. " | ||
521 | |||
425 | msgid "Oops, it seems you don't have PHP 5." | 522 | msgid "Oops, it seems you don't have PHP 5." |
426 | msgstr "Упс, кажется у вас не установлен PHP 5." | 523 | msgstr "Упс, кажется у вас не установлен PHP 5." |
427 | 524 | ||
428 | #~ msgid "your version" | 525 | #~ msgid "You can poche a link by several methods:" |
429 | #~ msgstr "Ваша версия" | 526 | #~ msgstr "Вы можете сохранить ссылку несколькими путями:" |
527 | |||
528 | #~ msgid "poche it!" | ||
529 | #~ msgstr "прикарманить!" | ||
530 | |||
531 | #~ msgid "Updating poche" | ||
532 | #~ msgstr "Обновления poche" | ||
533 | |||
534 | #, fuzzy | ||
535 | #~ msgid "Export your poche datas" | ||
536 | #~ msgstr "Экспортировать данные poche" | ||
537 | |||
538 | #, fuzzy | ||
539 | #~ msgid "to export your poche datas." | ||
540 | #~ msgstr "чтобы экспортировать свои записи из poche." | ||
430 | 541 | ||
431 | #~ msgid "back to home" | 542 | #~ msgid "your poche version:" |
432 | #~ msgstr "домой" | 543 | #~ msgstr "ваша версия poche:" |
544 | |||
545 | #~ msgid "Import from poche" | ||
546 | #~ msgstr "Импортировать из poche" | ||
547 | |||
548 | #~ msgid "welcome to your poche" | ||
549 | #~ msgstr "добро пожаловать в ваш poche" | ||
550 | |||
551 | #~ msgid "see you soon!" | ||
552 | #~ msgstr "увидимся!" | ||
433 | 553 | ||
434 | #~ msgid "create an issue" | 554 | #~ msgid "create an issue" |
435 | #~ msgstr "оповестить об ошибке" | 555 | #~ msgstr "оповестить об ошибке" |
@@ -439,6 +559,3 @@ msgstr "Упс, кажется у вас не установлен PHP 5." | |||
439 | 559 | ||
440 | #~ msgid "contact us by mail" | 560 | #~ msgid "contact us by mail" |
441 | #~ msgstr "связаться по почте" | 561 | #~ msgstr "связаться по почте" |
442 | |||
443 | #~ msgid "Sign in" | ||
444 | #~ msgstr "Зарегистрироваться" | ||
diff --git a/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po b/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po index 6eac8e01..8ad2eded 100644 --- a/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po +++ b/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po | |||
@@ -4,55 +4,138 @@ | |||
4 | msgid "" | 4 | msgid "" |
5 | msgstr "" | 5 | msgstr "" |
6 | "Project-Id-Version: wallabag\n" | 6 | "Project-Id-Version: wallabag\n" |
7 | "POT-Creation-Date: \n" | 7 | "Report-Msgid-Bugs-To: \n" |
8 | "PO-Revision-Date: 2014-02-21 15:09+0100\n" | 8 | "POT-Creation-Date: 2014-02-25 15:12+0300\n" |
9 | "Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" | 9 | "PO-Revision-Date: 2014-02-25 15:12+0300\n" |
10 | "Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/" | 10 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
11 | "wallabag/language/sl_SI/)\n" | 11 | "Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/wallabag/language/sl_SI/)\n" |
12 | "Language: sl_SI\n" | ||
12 | "MIME-Version: 1.0\n" | 13 | "MIME-Version: 1.0\n" |
13 | "Content-Type: text/plain; charset=UTF-8\n" | 14 | "Content-Type: text/plain; charset=UTF-8\n" |
14 | "Content-Transfer-Encoding: 8bit\n" | 15 | "Content-Transfer-Encoding: 8bit\n" |
15 | "Language: sl_SI\n" | 16 | "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" |
16 | "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" | ||
17 | "%100==4 ? 2 : 3);\n" | ||
18 | "X-Generator: Poedit 1.5.4\n" | 17 | "X-Generator: Poedit 1.5.4\n" |
18 | "X-Poedit-Language: Slovenian\n" | ||
19 | "X-Poedit-Country: SLOVENIA\n" | ||
20 | "X-Poedit-Basepath: .\n" | ||
21 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" | ||
22 | |||
23 | msgid "wallabag, a read it later open source system" | ||
24 | msgstr "" | ||
25 | |||
26 | msgid "login failed: user doesn't exist" | ||
27 | msgstr "" | ||
28 | |||
29 | msgid "return home" | ||
30 | msgstr "" | ||
19 | 31 | ||
20 | msgid "config" | 32 | msgid "config" |
21 | msgstr "nastavitve" | 33 | msgstr "nastavitve" |
22 | 34 | ||
23 | msgid "Poching a link" | 35 | msgid "Saving articles" |
24 | msgstr "Shrani povezavo" | 36 | msgstr "" |
37 | |||
38 | msgid "There are several ways to save an article:" | ||
39 | msgstr "" | ||
25 | 40 | ||
26 | msgid "read the documentation" | 41 | msgid "read the documentation" |
27 | msgstr "preberite dokumentacijo" | 42 | msgstr "preberite dokumentacijo" |
28 | 43 | ||
29 | msgid "by filling this field" | 44 | msgid "download the extension" |
45 | msgstr "" | ||
46 | |||
47 | msgid "via F-Droid" | ||
48 | msgstr "" | ||
49 | |||
50 | msgid " or " | ||
51 | msgstr "" | ||
52 | |||
53 | msgid "via Google Play" | ||
54 | msgstr "" | ||
55 | |||
56 | msgid "download the application" | ||
57 | msgstr "" | ||
58 | |||
59 | #, fuzzy | ||
60 | msgid "By filling this field" | ||
30 | msgstr "z vnosom v to polje" | 61 | msgstr "z vnosom v to polje" |
31 | 62 | ||
32 | msgid "poche it!" | 63 | msgid "bag it!" |
33 | msgstr "shrani!" | 64 | msgstr "" |
34 | 65 | ||
35 | msgid "Updating poche" | 66 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
36 | msgstr "Posodabljam Poche" | 67 | msgstr "" |
37 | 68 | ||
38 | msgid "your version" | 69 | msgid "Upgrading wallabag" |
39 | msgstr "vaša različica" | 70 | msgstr "" |
40 | 71 | ||
41 | msgid "latest stable version" | 72 | #, fuzzy |
73 | msgid "Installed version" | ||
42 | msgstr "zadnja stabilna različica" | 74 | msgstr "zadnja stabilna različica" |
43 | 75 | ||
44 | msgid "a more recent stable version is available." | 76 | #, fuzzy |
77 | msgid "Latest stable version" | ||
78 | msgstr "zadnja stabilna različica" | ||
79 | |||
80 | #, fuzzy | ||
81 | msgid "A more recent stable version is available." | ||
45 | msgstr "na voljo je nova stabilna različica." | 82 | msgstr "na voljo je nova stabilna različica." |
46 | 83 | ||
47 | msgid "you are up to date." | 84 | #, fuzzy |
85 | msgid "You are up to date." | ||
48 | msgstr "imate najnovejšo različico." | 86 | msgstr "imate najnovejšo različico." |
49 | 87 | ||
50 | msgid "latest dev version" | 88 | #, fuzzy |
89 | msgid "Latest dev version" | ||
51 | msgstr "zadnja razvojna različica" | 90 | msgstr "zadnja razvojna različica" |
52 | 91 | ||
53 | msgid "a more recent development version is available." | 92 | #, fuzzy |
93 | msgid "A more recent development version is available." | ||
54 | msgstr "na voljo je nova razvojna različica." | 94 | msgstr "na voljo je nova razvojna različica." |
55 | 95 | ||
96 | msgid "Feeds" | ||
97 | msgstr "" | ||
98 | |||
99 | msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&action=generate'>here to generate it</a>." | ||
100 | msgstr "" | ||
101 | |||
102 | msgid "Unread feed" | ||
103 | msgstr "" | ||
104 | |||
105 | #, fuzzy | ||
106 | msgid "Favorites feed" | ||
107 | msgstr "priljubljeni" | ||
108 | |||
109 | #, fuzzy | ||
110 | msgid "Archive feed" | ||
111 | msgstr "arhiv" | ||
112 | |||
113 | msgid "Your token:" | ||
114 | msgstr "" | ||
115 | |||
116 | msgid "Your user id:" | ||
117 | msgstr "" | ||
118 | |||
119 | msgid "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." | ||
120 | msgstr "" | ||
121 | |||
122 | #, fuzzy | ||
123 | msgid "Change your theme" | ||
124 | msgstr "Zamenjava gesla" | ||
125 | |||
126 | msgid "Theme:" | ||
127 | msgstr "" | ||
128 | |||
129 | msgid "Update" | ||
130 | msgstr "Posodobi" | ||
131 | |||
132 | #, fuzzy | ||
133 | msgid "Change your language" | ||
134 | msgstr "Zamenjava gesla" | ||
135 | |||
136 | msgid "Language:" | ||
137 | msgstr "" | ||
138 | |||
56 | msgid "Change your password" | 139 | msgid "Change your password" |
57 | msgstr "Zamenjava gesla" | 140 | msgstr "Zamenjava gesla" |
58 | 141 | ||
@@ -65,67 +148,69 @@ msgstr "Geslo" | |||
65 | msgid "Repeat your new password:" | 148 | msgid "Repeat your new password:" |
66 | msgstr "Ponovite novo geslo:" | 149 | msgstr "Ponovite novo geslo:" |
67 | 150 | ||
68 | msgid "Update" | ||
69 | msgstr "Posodobi" | ||
70 | |||
71 | msgid "Import" | 151 | msgid "Import" |
72 | msgstr "Uvozi" | 152 | msgstr "Uvozi" |
73 | 153 | ||
74 | msgid "Please execute the import script locally, it can take a very long time." | 154 | #, fuzzy |
75 | msgstr "" | 155 | msgid "Please execute the import script locally as it can take a very long time." |
76 | "Prosimo poženite skripto za uvoz lokalno, saj lahko postopek traja precej " | 156 | msgstr "Prosimo poženite skripto za uvoz lokalno, saj lahko postopek traja precej časa." |
77 | "časa." | ||
78 | 157 | ||
79 | msgid "More infos in the official doc:" | 158 | #, fuzzy |
159 | msgid "More info in the official documentation:" | ||
80 | msgstr "Več informacij v uradni dokumentaciji:" | 160 | msgstr "Več informacij v uradni dokumentaciji:" |
81 | 161 | ||
82 | msgid "import from Pocket" | 162 | #, fuzzy |
163 | msgid "Import from Pocket" | ||
83 | msgstr "Uvoz iz aplikacije Pocket" | 164 | msgstr "Uvoz iz aplikacije Pocket" |
84 | 165 | ||
85 | msgid "import from Readability" | 166 | #, php-format |
167 | msgid "(you must have a %s file on your server)" | ||
168 | msgstr "" | ||
169 | |||
170 | #, fuzzy | ||
171 | msgid "Import from Readability" | ||
86 | msgstr "Uvoz iz aplikacije Readability" | 172 | msgstr "Uvoz iz aplikacije Readability" |
87 | 173 | ||
88 | msgid "import from Instapaper" | 174 | #, fuzzy |
175 | msgid "Import from Instapaper" | ||
89 | msgstr "Uvoz iz aplikacije Instapaper" | 176 | msgstr "Uvoz iz aplikacije Instapaper" |
90 | 177 | ||
91 | msgid "Export your poche datas" | 178 | #, fuzzy |
179 | msgid "Import from wallabag" | ||
180 | msgstr "Uvoz iz aplikacije Readability" | ||
181 | |||
182 | #, fuzzy | ||
183 | msgid "Export your wallabag data" | ||
92 | msgstr "Izvoz vsebine" | 184 | msgstr "Izvoz vsebine" |
93 | 185 | ||
94 | msgid "Click here" | 186 | msgid "Click here" |
95 | msgstr "Kliknite tukaj" | 187 | msgstr "Kliknite tukaj" |
96 | 188 | ||
97 | msgid "to export your poche datas." | 189 | #, fuzzy |
190 | msgid "to download your database." | ||
98 | msgstr "za izvoz vsebine aplikacije Poche." | 191 | msgstr "za izvoz vsebine aplikacije Poche." |
99 | 192 | ||
100 | msgid "back to home" | 193 | #, fuzzy |
101 | msgstr "Nazaj domov" | 194 | msgid "to export your wallabag data." |
102 | 195 | msgstr "za izvoz vsebine aplikacije Poche." | |
103 | msgid "installation" | ||
104 | msgstr "Namestitev" | ||
105 | 196 | ||
106 | msgid "install your poche" | 197 | msgid "Cache" |
107 | msgstr "Namestitev aplikacije Poche" | 198 | msgstr "" |
108 | 199 | ||
109 | msgid "" | 200 | msgid "to delete cache." |
110 | "poche is still not installed. Please fill the below form to install it. " | ||
111 | "Don't hesitate to <a href='http://inthepoche.com/doc'>read the documentation " | ||
112 | "on poche website</a>." | ||
113 | msgstr "" | 201 | msgstr "" |
114 | "Poche še vedno ni nameščen. Za namestitev izpolnite spodnji obrazec. Za več " | ||
115 | "informacij <a href='http://inthepoche.com/doc'>preberite dokumentacijo na " | ||
116 | "spletni strani</a>." | ||
117 | 202 | ||
118 | msgid "Login" | 203 | msgid "You can enter multiple tags, separated by commas." |
119 | msgstr "Prijava" | 204 | msgstr "" |
120 | 205 | ||
121 | msgid "Repeat your password" | 206 | msgid "return to article" |
122 | msgstr "Ponovite geslo" | 207 | msgstr "" |
123 | 208 | ||
124 | msgid "Install" | 209 | msgid "plop" |
125 | msgstr "Namesti" | 210 | msgstr "štrbunk" |
126 | 211 | ||
127 | msgid "back to top" | 212 | msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." |
128 | msgstr "nazaj na vrh" | 213 | msgstr "" |
129 | 214 | ||
130 | msgid "favoris" | 215 | msgid "favoris" |
131 | msgstr "priljubljeni" | 216 | msgstr "priljubljeni" |
@@ -154,10 +239,14 @@ msgstr "po naslovu" | |||
154 | msgid "by title desc" | 239 | msgid "by title desc" |
155 | msgstr "po naslovu - padajoče" | 240 | msgstr "po naslovu - padajoče" |
156 | 241 | ||
157 | msgid "No link available here!" | 242 | msgid "Tag" |
158 | msgstr "Povezava ni na voljo!" | 243 | msgstr "" |
159 | 244 | ||
160 | msgid "toggle mark as read" | 245 | msgid "No articles found." |
246 | msgstr "" | ||
247 | |||
248 | #, fuzzy | ||
249 | msgid "Toggle mark as read" | ||
161 | msgstr "označi kot prebrano" | 250 | msgstr "označi kot prebrano" |
162 | 251 | ||
163 | msgid "toggle favorite" | 252 | msgid "toggle favorite" |
@@ -169,13 +258,95 @@ msgstr "zavrzi" | |||
169 | msgid "original" | 258 | msgid "original" |
170 | msgstr "izvirnik" | 259 | msgstr "izvirnik" |
171 | 260 | ||
261 | msgid "estimated reading time:" | ||
262 | msgstr "" | ||
263 | |||
264 | msgid "mark all the entries as read" | ||
265 | msgstr "" | ||
266 | |||
172 | msgid "results" | 267 | msgid "results" |
173 | msgstr "rezultati" | 268 | msgstr "rezultati" |
174 | 269 | ||
175 | msgid "tweet" | 270 | msgid "installation" |
271 | msgstr "Namestitev" | ||
272 | |||
273 | #, fuzzy | ||
274 | msgid "install your wallabag" | ||
275 | msgstr "Namestitev aplikacije Poche" | ||
276 | |||
277 | #, fuzzy | ||
278 | msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." | ||
279 | msgstr "Poche še vedno ni nameščen. Za namestitev izpolnite spodnji obrazec. Za več informacij <a href='http://inthepoche.com/doc'>preberite dokumentacijo na spletni strani</a>." | ||
280 | |||
281 | msgid "Login" | ||
282 | msgstr "Prijava" | ||
283 | |||
284 | msgid "Repeat your password" | ||
285 | msgstr "Ponovite geslo" | ||
286 | |||
287 | msgid "Install" | ||
288 | msgstr "Namesti" | ||
289 | |||
290 | #, fuzzy | ||
291 | msgid "login to your wallabag" | ||
292 | msgstr "prijavite se v svoj Poche" | ||
293 | |||
294 | msgid "Login to wallabag" | ||
295 | msgstr "" | ||
296 | |||
297 | msgid "you are in demo mode, some features may be disabled." | ||
298 | msgstr "uporabljate vzorčno različico programa, zato so lahko nekatere funkcije izklopljene." | ||
299 | |||
300 | msgid "Username" | ||
301 | msgstr "" | ||
302 | |||
303 | msgid "Stay signed in" | ||
304 | msgstr "Ostani prijavljen" | ||
305 | |||
306 | msgid "(Do not check on public computers)" | ||
307 | msgstr "(Ne označi na javnih napravah)" | ||
308 | |||
309 | msgid "Sign in" | ||
310 | msgstr "Prijava" | ||
311 | |||
312 | msgid "favorites" | ||
313 | msgstr "priljubljeni" | ||
314 | |||
315 | msgid "estimated reading time :" | ||
316 | msgstr "" | ||
317 | |||
318 | msgid "Mark all the entries as read" | ||
319 | msgstr "" | ||
320 | |||
321 | msgid "Return home" | ||
322 | msgstr "" | ||
323 | |||
324 | #, fuzzy | ||
325 | msgid "Back to top" | ||
326 | msgstr "nazaj na vrh" | ||
327 | |||
328 | #, fuzzy | ||
329 | msgid "Mark as read" | ||
330 | msgstr "označi kot prebrano" | ||
331 | |||
332 | #, fuzzy | ||
333 | msgid "Favorite" | ||
334 | msgstr "priljubljeni" | ||
335 | |||
336 | #, fuzzy | ||
337 | msgid "Toggle favorite" | ||
338 | msgstr "označi kot priljubljeno" | ||
339 | |||
340 | #, fuzzy | ||
341 | msgid "Delete" | ||
342 | msgstr "zavrzi" | ||
343 | |||
344 | #, fuzzy | ||
345 | msgid "Tweet" | ||
176 | msgstr "tvitni" | 346 | msgstr "tvitni" |
177 | 347 | ||
178 | msgid "email" | 348 | #, fuzzy |
349 | msgid "Email" | ||
179 | msgstr "pošlji po e-pošti" | 350 | msgstr "pošlji po e-pošti" |
180 | 351 | ||
181 | msgid "shaarli" | 352 | msgid "shaarli" |
@@ -184,26 +355,24 @@ msgstr "shaarli" | |||
184 | msgid "flattr" | 355 | msgid "flattr" |
185 | msgstr "flattr" | 356 | msgstr "flattr" |
186 | 357 | ||
187 | msgid "this article appears wrong?" | 358 | #, fuzzy |
359 | msgid "Does this article appear wrong?" | ||
188 | msgstr "napaka?" | 360 | msgstr "napaka?" |
189 | 361 | ||
190 | msgid "create an issue" | 362 | msgid "tags:" |
191 | msgstr "prijavi napako" | 363 | msgstr "" |
192 | |||
193 | msgid "or" | ||
194 | msgstr "ali" | ||
195 | 364 | ||
196 | msgid "contact us by mail" | 365 | msgid "Edit tags" |
197 | msgstr "pošlji e-pošto razvijalcem" | 366 | msgstr "" |
198 | 367 | ||
199 | msgid "plop" | 368 | msgid "save link!" |
200 | msgstr "štrbunk" | 369 | msgstr "" |
201 | 370 | ||
202 | msgid "home" | 371 | msgid "home" |
203 | msgstr "domov" | 372 | msgstr "domov" |
204 | 373 | ||
205 | msgid "favorites" | 374 | msgid "tags" |
206 | msgstr "priljubljeni" | 375 | msgstr "" |
207 | 376 | ||
208 | msgid "logout" | 377 | msgid "logout" |
209 | msgstr "odjava" | 378 | msgstr "odjava" |
@@ -212,28 +381,188 @@ msgid "powered by" | |||
212 | msgstr "stran poganja" | 381 | msgstr "stran poganja" |
213 | 382 | ||
214 | msgid "debug mode is on so cache is off." | 383 | msgid "debug mode is on so cache is off." |
215 | msgstr "" | 384 | msgstr "vklopljen je način odpravljanja napak, zato je predpomnilnik izključen." |
216 | "vklopljen je način odpravljanja napak, zato je predpomnilnik izključen." | ||
217 | 385 | ||
218 | msgid "your poche version:" | 386 | #, fuzzy |
219 | msgstr "vaša verzija Poche:" | 387 | msgid "your wallabag version:" |
388 | msgstr "vaša različica" | ||
220 | 389 | ||
221 | msgid "storage:" | 390 | msgid "storage:" |
222 | msgstr "pomnilnik:" | 391 | msgstr "pomnilnik:" |
223 | 392 | ||
224 | msgid "login to your poche" | 393 | msgid "save a link" |
225 | msgstr "prijavite se v svoj Poche" | 394 | msgstr "" |
226 | 395 | ||
227 | msgid "you are in demo mode, some features may be disabled." | 396 | msgid "back to home" |
397 | msgstr "Nazaj domov" | ||
398 | |||
399 | msgid "toggle mark as read" | ||
400 | msgstr "označi kot prebrano" | ||
401 | |||
402 | msgid "tweet" | ||
403 | msgstr "tvitni" | ||
404 | |||
405 | msgid "email" | ||
406 | msgstr "pošlji po e-pošti" | ||
407 | |||
408 | msgid "this article appears wrong?" | ||
409 | msgstr "napaka?" | ||
410 | |||
411 | msgid "No link available here!" | ||
412 | msgstr "Povezava ni na voljo!" | ||
413 | |||
414 | msgid "Poching a link" | ||
415 | msgstr "Shrani povezavo" | ||
416 | |||
417 | msgid "by filling this field" | ||
418 | msgstr "z vnosom v to polje" | ||
419 | |||
420 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
228 | msgstr "" | 421 | msgstr "" |
229 | "uporabljate vzorčno različico programa, zato so lahko nekatere funkcije " | ||
230 | "izklopljene." | ||
231 | 422 | ||
232 | msgid "Stay signed in" | 423 | msgid "your version" |
233 | msgstr "Ostani prijavljen" | 424 | msgstr "vaša različica" |
234 | 425 | ||
235 | msgid "(Do not check on public computers)" | 426 | msgid "latest stable version" |
236 | msgstr "(Ne označi na javnih napravah)" | 427 | msgstr "zadnja stabilna različica" |
237 | 428 | ||
238 | msgid "Sign in" | 429 | msgid "a more recent stable version is available." |
239 | msgstr "Prijava" | 430 | msgstr "na voljo je nova stabilna različica." |
431 | |||
432 | msgid "you are up to date." | ||
433 | msgstr "imate najnovejšo različico." | ||
434 | |||
435 | msgid "latest dev version" | ||
436 | msgstr "zadnja razvojna različica" | ||
437 | |||
438 | msgid "a more recent development version is available." | ||
439 | msgstr "na voljo je nova razvojna različica." | ||
440 | |||
441 | msgid "Please execute the import script locally, it can take a very long time." | ||
442 | msgstr "Prosimo poženite skripto za uvoz lokalno, saj lahko postopek traja precej časa." | ||
443 | |||
444 | msgid "More infos in the official doc:" | ||
445 | msgstr "Več informacij v uradni dokumentaciji:" | ||
446 | |||
447 | msgid "import from Pocket" | ||
448 | msgstr "Uvoz iz aplikacije Pocket" | ||
449 | |||
450 | msgid "import from Readability" | ||
451 | msgstr "Uvoz iz aplikacije Readability" | ||
452 | |||
453 | msgid "import from Instapaper" | ||
454 | msgstr "Uvoz iz aplikacije Instapaper" | ||
455 | |||
456 | msgid "Tags" | ||
457 | msgstr "" | ||
458 | |||
459 | #, fuzzy | ||
460 | msgid "Untitled" | ||
461 | msgstr "po naslovu" | ||
462 | |||
463 | msgid "the link has been added successfully" | ||
464 | msgstr "" | ||
465 | |||
466 | msgid "error during insertion : the link wasn't added" | ||
467 | msgstr "" | ||
468 | |||
469 | msgid "the link has been deleted successfully" | ||
470 | msgstr "" | ||
471 | |||
472 | msgid "the link wasn't deleted" | ||
473 | msgstr "" | ||
474 | |||
475 | msgid "Article not found!" | ||
476 | msgstr "" | ||
477 | |||
478 | msgid "previous" | ||
479 | msgstr "" | ||
480 | |||
481 | msgid "next" | ||
482 | msgstr "" | ||
483 | |||
484 | msgid "in demo mode, you can't update your password" | ||
485 | msgstr "" | ||
486 | |||
487 | msgid "your password has been updated" | ||
488 | msgstr "" | ||
489 | |||
490 | msgid "the two fields have to be filled & the password must be the same in the two fields" | ||
491 | msgstr "" | ||
492 | |||
493 | msgid "still using the \"" | ||
494 | msgstr "" | ||
495 | |||
496 | msgid "that theme does not seem to be installed" | ||
497 | msgstr "" | ||
498 | |||
499 | msgid "you have changed your theme preferences" | ||
500 | msgstr "" | ||
501 | |||
502 | msgid "that language does not seem to be installed" | ||
503 | msgstr "" | ||
504 | |||
505 | msgid "you have changed your language preferences" | ||
506 | msgstr "" | ||
507 | |||
508 | msgid "login failed: you have to fill all fields" | ||
509 | msgstr "" | ||
510 | |||
511 | msgid "welcome to your wallabag" | ||
512 | msgstr "" | ||
513 | |||
514 | msgid "login failed: bad login or password" | ||
515 | msgstr "" | ||
516 | |||
517 | #, fuzzy | ||
518 | msgid "import from instapaper completed" | ||
519 | msgstr "Uvoz iz aplikacije Instapaper" | ||
520 | |||
521 | #, fuzzy | ||
522 | msgid "import from pocket completed" | ||
523 | msgstr "Uvoz iz aplikacije Pocket" | ||
524 | |||
525 | #, fuzzy | ||
526 | msgid "import from Readability completed. " | ||
527 | msgstr "Uvoz iz aplikacije Readability" | ||
528 | |||
529 | #, fuzzy | ||
530 | msgid "import from Poche completed. " | ||
531 | msgstr "Uvoz iz aplikacije Pocket" | ||
532 | |||
533 | msgid "Unknown import provider." | ||
534 | msgstr "" | ||
535 | |||
536 | msgid "Incomplete inc/poche/define.inc.php file, please define \"" | ||
537 | msgstr "" | ||
538 | |||
539 | msgid "Could not find required \"" | ||
540 | msgstr "" | ||
541 | |||
542 | msgid "Uh, there is a problem while generating feeds." | ||
543 | msgstr "" | ||
544 | |||
545 | #, fuzzy | ||
546 | msgid "Cache deleted." | ||
547 | msgstr "zavrzi" | ||
548 | |||
549 | msgid "Oops, it seems you don't have PHP 5." | ||
550 | msgstr "" | ||
551 | |||
552 | #~ msgid "poche it!" | ||
553 | #~ msgstr "shrani!" | ||
554 | |||
555 | #~ msgid "Updating poche" | ||
556 | #~ msgstr "Posodabljam Poche" | ||
557 | |||
558 | #~ msgid "create an issue" | ||
559 | #~ msgstr "prijavi napako" | ||
560 | |||
561 | #~ msgid "or" | ||
562 | #~ msgstr "ali" | ||
563 | |||
564 | #~ msgid "contact us by mail" | ||
565 | #~ msgstr "pošlji e-pošto razvijalcem" | ||
566 | |||
567 | #~ msgid "your poche version:" | ||
568 | #~ msgstr "vaša verzija Poche:" | ||
diff --git a/locale/tools/fillCache.php b/locale/tools/fillCache.php new file mode 100755 index 00000000..bdd9cc58 --- /dev/null +++ b/locale/tools/fillCache.php | |||
@@ -0,0 +1,59 @@ | |||
1 | <?php | ||
2 | |||
3 | // this script compile all twig templates and put it in cahce to get Poedit (or xgettext) to extract phrases fron chached templates. | ||
4 | |||
5 | // gettext command line tools: | ||
6 | // msgunfmt - get po from mo | ||
7 | // msgfmt - get mo from po | ||
8 | // xgettext - extract phrases from files | ||
9 | |||
10 | |||
11 | $siteRoot = dirname(__FILE__) . '/../..'; | ||
12 | |||
13 | require_once $siteRoot . '/vendor/twig/twig/lib/Twig/Autoloader.php'; | ||
14 | Twig_Autoloader::register(); | ||
15 | |||
16 | require_once $siteRoot . '/vendor/twig/extensions/lib/Twig/Extensions/Autoloader.php'; | ||
17 | Twig_Extensions_Autoloader::register(); | ||
18 | |||
19 | //$tplDir = $siteRoot.'/themes/default'; | ||
20 | $tplDirRoot = $siteRoot.'/themes/'; | ||
21 | $tmpDir = $siteRoot. '/cache/'; | ||
22 | |||
23 | foreach (new IteratorIterator(new DirectoryIterator($tplDirRoot)) as $tplDir) { | ||
24 | |||
25 | if ($tplDir->isDir() and $tplDir!='.' and $tplDir!='..') { | ||
26 | echo "\n$tplDir\n"; | ||
27 | |||
28 | $loader = new Twig_Loader_Filesystem($tplDirRoot.$tplDir); | ||
29 | |||
30 | // force auto-reload to always have the latest version of the template | ||
31 | $twig = new Twig_Environment($loader, array( | ||
32 | 'cache' => $tmpDir, | ||
33 | 'auto_reload' => true | ||
34 | )); | ||
35 | |||
36 | $twig->addExtension(new Twig_Extensions_Extension_I18n()); | ||
37 | |||
38 | $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain'); | ||
39 | $twig->addFilter($filter); | ||
40 | |||
41 | $filter = new Twig_SimpleFilter('getReadingTime', 'Tools::getReadingTime'); | ||
42 | $twig->addFilter($filter); | ||
43 | |||
44 | $filter = new Twig_SimpleFilter('getPrettyFilename', function($string) { return str_replace($siteRoot, '', $string); }); | ||
45 | $twig->addFilter($filter); | ||
46 | |||
47 | // // iterate over all your templates | ||
48 | foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($tplDirRoot.$tplDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) { | ||
49 | // force compilation | ||
50 | if ($file->isFile() and pathinfo($file, PATHINFO_EXTENSION)=='twig') { | ||
51 | echo "\t$file\n"; | ||
52 | $twig->loadTemplate(str_replace($tplDirRoot.$tplDir.'/', '', $file)); | ||
53 | } | ||
54 | } | ||
55 | |||
56 | } | ||
57 | |||
58 | } | ||
59 | |||
diff --git a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo index 80972b65..4884abf5 100755 --- a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo +++ b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo | |||
Binary files differ | |||
diff --git a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po index 6092cbab..08797705 100755 --- a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po +++ b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po | |||
@@ -2,8 +2,8 @@ msgid "" | |||
2 | msgstr "" | 2 | msgstr "" |
3 | "Project-Id-Version: wballabag\n" | 3 | "Project-Id-Version: wballabag\n" |
4 | "Report-Msgid-Bugs-To: \n" | 4 | "Report-Msgid-Bugs-To: \n" |
5 | "POT-Creation-Date: 2014-02-06 19:23+0300\n" | 5 | "POT-Creation-Date: 2014-02-25 15:06+0300\n" |
6 | "PO-Revision-Date: 2014-02-06 19:24+0300\n" | 6 | "PO-Revision-Date: 2014-02-25 15:08+0300\n" |
7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" | 7 | "Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" |
8 | "Language-Team: \n" | 8 | "Language-Team: \n" |
9 | "Language: \n" | 9 | "Language: \n" |
@@ -15,52 +15,25 @@ msgstr "" | |||
15 | "X-Poedit-Language: Ukrainian\n" | 15 | "X-Poedit-Language: Ukrainian\n" |
16 | "X-Poedit-Country: UKRAINE\n" | 16 | "X-Poedit-Country: UKRAINE\n" |
17 | "X-Poedit-SourceCharset: utf-8\n" | 17 | "X-Poedit-SourceCharset: utf-8\n" |
18 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag\n" | 18 | "X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n" |
19 | 19 | ||
20 | msgid "poche, a read it later open source system" | 20 | msgid "wallabag, a read it later open source system" |
21 | msgstr "poche, сервіс відкладеного читання з відкритим кодом" | 21 | msgstr "wallabag, сервіс відкладеного читання з відкритим кодом" |
22 | 22 | ||
23 | msgid "login failed: user doesn't exist" | 23 | msgid "login failed: user doesn't exist" |
24 | msgstr "увійти не вдалося: користувач не існує" | 24 | msgstr "увійти не вдалося: користувач не існує" |
25 | 25 | ||
26 | msgid "powered by" | 26 | msgid "return home" |
27 | msgstr "за підтримки" | 27 | msgstr "повернутися на головну" |
28 | |||
29 | msgid "debug mode is on so cache is off." | ||
30 | msgstr "режим відладки включено, отже кеш виключено." | ||
31 | |||
32 | msgid "your poche version:" | ||
33 | msgstr "версія вашої poche:" | ||
34 | |||
35 | msgid "storage:" | ||
36 | msgstr "сховище:" | ||
37 | |||
38 | msgid "home" | ||
39 | msgstr "головна" | ||
40 | |||
41 | msgid "favorites" | ||
42 | msgstr "вибране" | ||
43 | |||
44 | msgid "archive" | ||
45 | msgstr "архів" | ||
46 | |||
47 | msgid "tags" | ||
48 | msgstr "теги" | ||
49 | 28 | ||
50 | msgid "config" | 29 | msgid "config" |
51 | msgstr "налаштування" | 30 | msgstr "налаштування" |
52 | 31 | ||
53 | msgid "logout" | 32 | msgid "Saving articles" |
54 | msgstr "вихід" | ||
55 | |||
56 | msgid "return home" | ||
57 | msgstr "повернутися на головну" | ||
58 | |||
59 | msgid "Poching links" | ||
60 | msgstr "Зберігання посилань" | 33 | msgstr "Зберігання посилань" |
61 | 34 | ||
62 | msgid "There are several ways to poche a link:" | 35 | msgid "There are several ways to save an article:" |
63 | msgstr "Є кілька способів зберегти пос��л��нн��:" | 36 | msgstr "Є кілька способів зберегти ста��тю:" |
64 | 37 | ||
65 | msgid "read the documentation" | 38 | msgid "read the documentation" |
66 | msgstr "читати документацію" | 39 | msgstr "читати документацію" |
@@ -83,14 +56,14 @@ msgstr "завантажити додаток" | |||
83 | msgid "By filling this field" | 56 | msgid "By filling this field" |
84 | msgstr "Заповнивши це поле" | 57 | msgstr "Заповнивши це поле" |
85 | 58 | ||
86 | msgid "poche it!" | 59 | msgid "bag it!" |
87 | msgstr "зберегти!" | 60 | msgstr "зберегти!" |
88 | 61 | ||
89 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" | 62 | msgid "Bookmarklet: drag & drop this link to your bookmarks bar" |
90 | msgstr "З допомогою закладки: перетягніть і відпустіть посилання на панель закладок" | 63 | msgstr "З допомогою закладки: перетягніть і відпустіть посилання на панель закладок" |
91 | 64 | ||
92 | msgid "Updating poche" | 65 | msgid "Upgrading wallabag" |
93 | msgstr "Оновлення poche" | 66 | msgstr "Оновлення wallabag" |
94 | 67 | ||
95 | msgid "Installed version" | 68 | msgid "Installed version" |
96 | msgstr "Встановлено версію" | 69 | msgstr "Встановлено версію" |
@@ -104,14 +77,11 @@ msgstr "Є новіша стабільна версія." | |||
104 | msgid "You are up to date." | 77 | msgid "You are up to date." |
105 | msgstr "У вас остання версія." | 78 | msgstr "У вас остання версія." |
106 | 79 | ||
107 | msgid "latest dev version" | 80 | msgid "Latest dev version" |
108 | msgstr "остання версія в розробці" | 81 | msgstr "Остання версія в розробці" |
109 | |||
110 | msgid "a more recent development version is available." | ||
111 | msgstr "доступна новіша версія в розробці." | ||
112 | 82 | ||
113 | msgid "you are up to date." | 83 | msgid "A more recent development version is available." |
114 | msgstr "у ����с ��ст��нн�� версія." | 84 | msgstr "��осту��н�� ��ов��ша версія в розробці." |
115 | 85 | ||
116 | msgid "Feeds" | 86 | msgid "Feeds" |
117 | msgstr "Завантаження (feeds)" | 87 | msgstr "Завантаження (feeds)" |
@@ -170,8 +140,8 @@ msgstr "Імпортування" | |||
170 | msgid "Please execute the import script locally as it can take a very long time." | 140 | msgid "Please execute the import script locally as it can take a very long time." |
171 | msgstr "Будь ласка, виконайте сценарій імпорту локально, оскільки це може тривати досить довго." | 141 | msgstr "Будь ласка, виконайте сценарій імпорту локально, оскільки це може тривати досить довго." |
172 | 142 | ||
173 | msgid "More info in the official docs:" | 143 | msgid "More info in the official documentation:" |
174 | msgstr "Більш ����тальна інформаці�� в офіційній документації:" | 144 | msgstr "Більше інформаці�� в офіційній документації:" |
175 | 145 | ||
176 | msgid "Import from Pocket" | 146 | msgid "Import from Pocket" |
177 | msgstr "Імпорт з Pocket-а" | 147 | msgstr "Імпорт з Pocket-а" |
@@ -186,11 +156,11 @@ msgstr "Імпорт з Readability" | |||
186 | msgid "Import from Instapaper" | 156 | msgid "Import from Instapaper" |
187 | msgstr "Імпорт з Instapaper" | 157 | msgstr "Імпорт з Instapaper" |
188 | 158 | ||
189 | msgid "Import from poche" | 159 | msgid "Import from wallabag" |
190 | msgstr "Імпорт з poche" | 160 | msgstr "Імпорт з wallabag" |
191 | 161 | ||
192 | msgid "Export your poche data" | 162 | msgid "Export your wallabag data" |
193 | msgstr "Експортувати ваші дані з poche" | 163 | msgstr "Експортувати ваші дані з wallabag" |
194 | 164 | ||
195 | msgid "Click here" | 165 | msgid "Click here" |
196 | msgstr "Клікніть тут" | 166 | msgstr "Клікніть тут" |
@@ -198,32 +168,14 @@ msgstr "Клікніть тут" | |||
198 | msgid "to download your database." | 168 | msgid "to download your database." |
199 | msgstr "щоб завантажити вашу базу даних." | 169 | msgstr "щоб завантажити вашу базу даних." |
200 | 170 | ||
201 | msgid "to export your poche data." | 171 | msgid "to export your wallabag data." |
202 | msgstr "щоб експортувати ваші дані poche." | 172 | msgstr "щоб експортувати ваші дані wallabag." |
203 | 173 | ||
204 | msgid "Tag" | 174 | msgid "Cache" |
205 | msgstr "��ег" | 175 | msgstr "��еш" |
206 | 176 | ||
207 | msgid "No link available here!" | 177 | msgid "to delete cache." |
208 | msgstr "Немає доступних посилань!" | 178 | msgstr "щоб очистити кеш." |
209 | |||
210 | msgid "toggle mark as read" | ||
211 | msgstr "змінити мітку на прочитано" | ||
212 | |||
213 | msgid "toggle favorite" | ||
214 | msgstr "змінити мітку вибраного" | ||
215 | |||
216 | msgid "delete" | ||
217 | msgstr "видалити" | ||
218 | |||
219 | msgid "original" | ||
220 | msgstr "оригінал" | ||
221 | |||
222 | msgid "estimated reading time:" | ||
223 | msgstr "приблизний час читання:" | ||
224 | |||
225 | msgid "results" | ||
226 | msgstr "результат(ів)" | ||
227 | 179 | ||
228 | msgid "You can enter multiple tags, separated by commas." | 180 | msgid "You can enter multiple tags, separated by commas." |
229 | msgstr "Ви можете ввести декілька тегів, розділених комами." | 181 | msgstr "Ви можете ввести декілька тегів, розділених комами." |
@@ -240,6 +192,9 @@ msgstr "Ви можете <a href='wallabag_compatibility_test.php'>переві | |||
240 | msgid "favoris" | 192 | msgid "favoris" |
241 | msgstr "вибране" | 193 | msgstr "вибране" |
242 | 194 | ||
195 | msgid "archive" | ||
196 | msgstr "архів" | ||
197 | |||
243 | msgid "unread" | 198 | msgid "unread" |
244 | msgstr "непрочитане" | 199 | msgstr "непрочитане" |
245 | 200 | ||
@@ -261,12 +216,33 @@ msgstr "за назвою" | |||
261 | msgid "by title desc" | 216 | msgid "by title desc" |
262 | msgstr "за назвою по спаданню" | 217 | msgstr "за назвою по спаданню" |
263 | 218 | ||
219 | msgid "Tag" | ||
220 | msgstr "Тег" | ||
221 | |||
264 | msgid "No articles found." | 222 | msgid "No articles found." |
265 | msgstr "Статей не знайдено." | 223 | msgstr "Статей не знайдено." |
266 | 224 | ||
267 | msgid "Toggle mark as read" | 225 | msgid "Toggle mark as read" |
268 | msgstr "змінити мітку прочитаного" | 226 | msgstr "змінити мітку прочитаного" |
269 | 227 | ||
228 | msgid "toggle favorite" | ||
229 | msgstr "змінити мітку вибраного" | ||
230 | |||
231 | msgid "delete" | ||
232 | msgstr "видалити" | ||
233 | |||
234 | msgid "original" | ||
235 | msgstr "оригінал" | ||
236 | |||
237 | msgid "estimated reading time:" | ||
238 | msgstr "приблизний час читання:" | ||
239 | |||
240 | msgid "mark all the entries as read" | ||
241 | msgstr "відмітити всі статті як прочитані" | ||
242 | |||
243 | msgid "results" | ||
244 | msgstr "результат(ів)" | ||
245 | |||
270 | msgid "installation" | 246 | msgid "installation" |
271 | msgstr "інсталяція" | 247 | msgstr "інсталяція" |
272 | 248 | ||
@@ -303,6 +279,18 @@ msgstr "Запам'ятати мене" | |||
303 | msgid "(Do not check on public computers)" | 279 | msgid "(Do not check on public computers)" |
304 | msgstr "(Не відмічайте на загальнодоступних комп'ютерах)" | 280 | msgstr "(Не відмічайте на загальнодоступних комп'ютерах)" |
305 | 281 | ||
282 | msgid "Sign in" | ||
283 | msgstr "Увійти" | ||
284 | |||
285 | msgid "favorites" | ||
286 | msgstr "вибране" | ||
287 | |||
288 | msgid "estimated reading time :" | ||
289 | msgstr "приблизний час читання:" | ||
290 | |||
291 | msgid "Mark all the entries as read" | ||
292 | msgstr "Відмітити все як прочитане" | ||
293 | |||
306 | msgid "Return home" | 294 | msgid "Return home" |
307 | msgstr "Повернутися на головну" | 295 | msgstr "Повернутися на головну" |
308 | 296 | ||
@@ -342,11 +330,95 @@ msgstr "теги:" | |||
342 | msgid "Edit tags" | 330 | msgid "Edit tags" |
343 | msgstr "Редагувати теги" | 331 | msgstr "Редагувати теги" |
344 | 332 | ||
345 | msgid "previous" | 333 | msgid "save link!" |
346 | msgstr "��������ре������" | 334 | msgstr "����ере��т�� л��нк!" |
347 | 335 | ||
348 | msgid "next" | 336 | msgid "home" |
349 | msgstr "наступна" | 337 | msgstr "головна" |
338 | |||
339 | msgid "tags" | ||
340 | msgstr "теги" | ||
341 | |||
342 | msgid "logout" | ||
343 | msgstr "вихід" | ||
344 | |||
345 | msgid "powered by" | ||
346 | msgstr "за підтримки" | ||
347 | |||
348 | msgid "debug mode is on so cache is off." | ||
349 | msgstr "режим відладки включено, отже кеш виключено." | ||
350 | |||
351 | msgid "your wallabag version:" | ||
352 | msgstr "версія вашого wallabag:" | ||
353 | |||
354 | msgid "storage:" | ||
355 | msgstr "сховище:" | ||
356 | |||
357 | msgid "save a link" | ||
358 | msgstr "зберегти лінк" | ||
359 | |||
360 | msgid "back to home" | ||
361 | msgstr "назад на головну" | ||
362 | |||
363 | msgid "toggle mark as read" | ||
364 | msgstr "змінити мітку на прочитано" | ||
365 | |||
366 | msgid "tweet" | ||
367 | msgstr "твітнути" | ||
368 | |||
369 | msgid "email" | ||
370 | msgstr "email" | ||
371 | |||
372 | msgid "this article appears wrong?" | ||
373 | msgstr "ця стаття виглядає не так, як треба?" | ||
374 | |||
375 | msgid "No link available here!" | ||
376 | msgstr "Немає доступних посилань!" | ||
377 | |||
378 | msgid "Poching a link" | ||
379 | msgstr "Зберігання посилання" | ||
380 | |||
381 | msgid "by filling this field" | ||
382 | msgstr "заповнивши це поле" | ||
383 | |||
384 | msgid "bookmarklet: drag & drop this link to your bookmarks bar" | ||
385 | msgstr "з допомогою закладки: перетягніть і відпустіть посилання на панель закладок" | ||
386 | |||
387 | msgid "your version" | ||
388 | msgstr "ваша версія:" | ||
389 | |||
390 | msgid "latest stable version" | ||
391 | msgstr "остання стабільна версія" | ||
392 | |||
393 | msgid "a more recent stable version is available." | ||
394 | msgstr "є новіша стабільна версія." | ||
395 | |||
396 | msgid "you are up to date." | ||
397 | msgstr "у вас остання версія." | ||
398 | |||
399 | msgid "latest dev version" | ||
400 | msgstr "остання версія в розробці" | ||
401 | |||
402 | msgid "a more recent development version is available." | ||
403 | msgstr "доступна новіша версія в розробці." | ||
404 | |||
405 | msgid "Please execute the import script locally, it can take a very long time." | ||
406 | msgstr "Будь ласка, виконайте сценарій імпорту локально, оскільки це може тривати досить довго." | ||
407 | |||
408 | msgid "More infos in the official doc:" | ||
409 | msgstr "Більше інформації в офіційній документації:" | ||
410 | |||
411 | msgid "import from Pocket" | ||
412 | msgstr "імпорт з Pocket-а" | ||
413 | |||
414 | msgid "import from Readability" | ||
415 | msgstr "імпорт з Readability" | ||
416 | |||
417 | msgid "import from Instapaper" | ||
418 | msgstr "імпорт з Instapaper" | ||
419 | |||
420 | msgid "Tags" | ||
421 | msgstr "Теги" | ||
350 | 422 | ||
351 | msgid "Untitled" | 423 | msgid "Untitled" |
352 | msgstr "Без назви" | 424 | msgstr "Без назви" |
@@ -363,6 +435,15 @@ msgstr "посилання успішно видалено" | |||
363 | msgid "the link wasn't deleted" | 435 | msgid "the link wasn't deleted" |
364 | msgstr "посилання не було видалено" | 436 | msgstr "посилання не було видалено" |
365 | 437 | ||
438 | msgid "Article not found!" | ||
439 | msgstr "Статтю не знайдено!" | ||
440 | |||
441 | msgid "previous" | ||
442 | msgstr "попередня" | ||
443 | |||
444 | msgid "next" | ||
445 | msgstr "наступна" | ||
446 | |||
366 | msgid "in demo mode, you can't update your password" | 447 | msgid "in demo mode, you can't update your password" |
367 | msgstr "в демонстраційному режимі ви не можете змінювати свій пароль" | 448 | msgstr "в демонстраційному режимі ви не можете змінювати свій пароль" |
368 | 449 | ||
@@ -390,15 +471,12 @@ msgstr "ви змінили свої налаштування мови" | |||
390 | msgid "login failed: you have to fill all fields" | 471 | msgid "login failed: you have to fill all fields" |
391 | msgstr "увійти не вдалося: ви повинні заповнити всі поля" | 472 | msgstr "увійти не вдалося: ви повинні заповнити всі поля" |
392 | 473 | ||
393 | msgid "welcome to your poche" | 474 | msgid "welcome to your wallabag" |
394 | msgstr "ласкаво просимо до вашого poche" | 475 | msgstr "ласкаво просимо до вашого wallabag" |
395 | 476 | ||
396 | msgid "login failed: bad login or password" | 477 | msgid "login failed: bad login or password" |
397 | msgstr "увійти не вдалося: не вірний логін або пароль" | 478 | msgstr "увійти не вдалося: не вірний логін або пароль" |
398 | 479 | ||
399 | msgid "see you soon!" | ||
400 | msgstr "бувайте, ще побачимось!" | ||
401 | |||
402 | msgid "import from instapaper completed" | 480 | msgid "import from instapaper completed" |
403 | msgstr "імпорт з instapaper-а завершено" | 481 | msgstr "імпорт з instapaper-а завершено" |
404 | 482 | ||
@@ -423,6 +501,34 @@ msgstr "Не вдалося знайти потрібний \"" | |||
423 | msgid "Uh, there is a problem while generating feeds." | 501 | msgid "Uh, there is a problem while generating feeds." |
424 | msgstr "Ох, є проблема при створенні завантажень (feeds)." | 502 | msgstr "Ох, є проблема при створенні завантажень (feeds)." |
425 | 503 | ||
504 | msgid "Cache deleted." | ||
505 | msgstr "Кеш очищено." | ||
506 | |||
426 | msgid "Oops, it seems you don't have PHP 5." | 507 | msgid "Oops, it seems you don't have PHP 5." |
427 | msgstr "Упс, здається, у вас немає PHP 5." | 508 | msgstr "Упс, здається, у вас немає PHP 5." |
428 | 509 | ||
510 | #~ msgid "You can poche a link by several methods:" | ||
511 | #~ msgstr "Ви можете зберегти посилання кількома способами:" | ||
512 | |||
513 | #~ msgid "poche it!" | ||
514 | #~ msgstr "зберегти!" | ||
515 | |||
516 | #~ msgid "Updating poche" | ||
517 | #~ msgstr "Оновлення poche" | ||
518 | |||
519 | #, fuzzy | ||
520 | #~ msgid "Export your poche datas" | ||
521 | #~ msgstr "Експортувати ваші дані з poche" | ||
522 | |||
523 | #, fuzzy | ||
524 | #~ msgid "to export your poche datas." | ||
525 | #~ msgstr "щоб експортувати ваші дані poche." | ||
526 | |||
527 | #~ msgid "Import from poche" | ||
528 | #~ msgstr "Імпорт з poche" | ||
529 | |||
530 | #~ msgid "welcome to your poche" | ||
531 | #~ msgstr "ласкаво просимо до вашого poche" | ||
532 | |||
533 | #~ msgid "see you soon!" | ||
534 | #~ msgstr "бувайте, ще побачимось!" | ||
diff --git a/themes/baggy/_display-mode.twig b/themes/baggy/_display-mode.twig new file mode 100755 index 00000000..382dd5f1 --- /dev/null +++ b/themes/baggy/_display-mode.twig | |||
@@ -0,0 +1,5 @@ | |||
1 | <div id="display-mode"> | ||
2 | <a href="javascript: void(null);" id="listmode" class="listmode"> | ||
3 | <img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/blank.png" alt="{% trans "toggle view mode" %}" title="{% trans "toggle view mode" %}" width="16" height="16"> | ||
4 | </a> | ||
5 | </div> | ||
diff --git a/themes/baggy/_head.twig b/themes/baggy/_head.twig index 206d5aae..04898d85 100644..100755 --- a/themes/baggy/_head.twig +++ b/themes/baggy/_head.twig | |||
@@ -1,12 +1,15 @@ | |||
1 | <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}/themes/{{theme}}/img/favicon.ico" /> | 1 | <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}themes/{{theme}}/img/favicon.ico" /> |
2 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png"> | 2 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png"> |
3 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png"> | 3 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png"> |
4 | <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-precomposed.png"> | 4 | <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-precomposed.png"> |
5 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/ratatouille.css" media="all"> | 5 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/ratatouille.css" media="all"> |
6 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/font.css" media="all"> | 6 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/font.css" media="all"> |
7 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/main.css" media="all"> | 7 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/main.css" media="all"> |
8 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/messages.css" media="all"> | 8 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/messages.css" media="all"> |
9 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/print.css" media="print"> | 9 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/print.css" media="print"> |
10 | <script src="{{ poche_url }}/themes/{{theme}}/js/jquery-2.0.3.min.js"></script> | 10 | <script src="{{ poche_url }}themes/default/js/jquery-2.0.3.min.js"></script> |
11 | <script src="{{ poche_url }}/themes/{{theme}}/js/init.js"></script> | 11 | <script src="{{ poche_url }}themes/default/js/autoClose.js"></script> |
12 | <script src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/js/closeMessage.js"></script> | 12 | <script src="{{ poche_url }}themes/{{theme}}/js/jquery.cookie.js"></script> |
13 | <script src="{{ poche_url }}themes/{{theme}}/js/init.js"></script> | ||
14 | <script src="{{ poche_url }}themes/default/js/saveLink.js"></script> | ||
15 | <script src="{{ poche_url }}themes/{{theme}}/js/closeMessage.js"></script> | ||
diff --git a/themes/baggy/_menu.twig b/themes/baggy/_menu.twig index e9cd9d4a..f1b75cd5 100644 --- a/themes/baggy/_menu.twig +++ b/themes/baggy/_menu.twig | |||
@@ -4,9 +4,13 @@ | |||
4 | <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li> | 4 | <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li> |
5 | <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li> | 5 | <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li> |
6 | <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li> | 6 | <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li> |
7 | <li><a href="javascript: void(null);" id="pocheit">{% trans "save a link" %}</a></li> | 7 | <li style="position: relative;"><a href="javascript: void(null);" id="bagit">{% trans "save a link" %}</a> |
8 | {% include '_pocheit-form.twig' %} | ||
9 | </li> | ||
10 | <li style="position: relative;"><a href="javascript: void(null);" id="search">{% trans "search" %}</a> | ||
11 | {% include '_search-form.twig' %} | ||
12 | </li> | ||
8 | <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li> | 13 | <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li> |
9 | <li><a class="icon icon-power" href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li> | 14 | <li><a class="icon icon-power" href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li> |
10 | </ul> | 15 | </ul> |
11 | 16 | ||
12 | {% include '_pocheit-form.twig' %} | ||
diff --git a/themes/baggy/_pocheit-form.twig b/themes/baggy/_pocheit-form.twig new file mode 100755 index 00000000..505ec368 --- /dev/null +++ b/themes/baggy/_pocheit-form.twig | |||
@@ -0,0 +1,10 @@ | |||
1 | <div id="bagit-form" class="messages info"> | ||
2 | <form method="get" action="index.php" target="_blank" id="bagit-form-form"> | ||
3 | <h2><a href="javascript: void(null);" id="bagit-form-close">X</a> | ||
4 | {% trans "Save a link" %}</h2> | ||
5 | <input type="hidden" name="autoclose" value="1" /> | ||
6 | <input required placeholder="example.com/article" class="addurl" id="plainurl" name="plainurl" type="url" /> | ||
7 | <input type="submit" value="{% trans "save link!" %}" /> | ||
8 | <div id="add-link-result"></div> | ||
9 | </form> | ||
10 | </div> | ||
diff --git a/themes/baggy/_search-form.twig b/themes/baggy/_search-form.twig new file mode 100644 index 00000000..1fd4154e --- /dev/null +++ b/themes/baggy/_search-form.twig | |||
@@ -0,0 +1,21 @@ | |||
1 | <div id="search-form" class="messages info"> | ||
2 | <form method="get" action="index.php"> | ||
3 | <input type="hidden" name="view" value="search"></input> | ||
4 | <label><a href="javascript: void(null);" id="search-form-close">X</a>{% trans "Search" %}</label> : <input type="text" name="search" /> | ||
5 | <input id="submit-search" type="submit" value="{% trans "Search" %} !"></input> | ||
6 | </form> | ||
7 | </div> | ||
8 | <script type="text/javascript"> | ||
9 | $(document).ready(function() { | ||
10 | |||
11 | $("#search-form").hide(); | ||
12 | |||
13 | $("#search").click(function(){ | ||
14 | $("#search-form").toggle(); | ||
15 | $("#search").toggleClass("current"); | ||
16 | $("#search-arrow").toggleClass("arrow-down"); | ||
17 | }); | ||
18 | |||
19 | |||
20 | }); | ||
21 | </script> \ No newline at end of file | ||
diff --git a/themes/baggy/_top.twig b/themes/baggy/_top.twig index 4f476a37..a31c0925 100644..100755 --- a/themes/baggy/_top.twig +++ b/themes/baggy/_top.twig | |||
@@ -1,6 +1,6 @@ | |||
1 | <header class="w600p center mbm"> | 1 | <header class="w600p center mbm"> |
2 | <h1 class="logo"> | 2 | <h1 class="logo"> |
3 | {% if view == 'home' %}{% block logo %}<img width="100" height="100" src="{{ poche_url }}/themes/{{theme}}/img/logo-w.png" alt="logo poche" />{% endblock %} | 3 | {% if view == 'home' %}{% block logo %}<img width="100" height="100" src="{{ poche_url }}themes/{{theme}}/img/logo-w.png" alt="wallabag logo" />{% endblock %} |
4 | {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a> | 4 | {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a> |
5 | {% endif %} | 5 | {% endif %} |
6 | </h1> | 6 | </h1> |
diff --git a/themes/baggy/config.twig b/themes/baggy/config.twig index b37ac115..d441de7c 100644..100755 --- a/themes/baggy/config.twig +++ b/themes/baggy/config.twig | |||
@@ -8,10 +8,11 @@ | |||
8 | <h2>{% trans "Saving articles" %}</h2> | 8 | <h2>{% trans "Saving articles" %}</h2> |
9 | <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p> | 9 | <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p> |
10 | <ul> | 10 | <ul> |
11 | <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/poche/" title="download the firefox extension">{% trans "download the extension" %}</a></li> | 11 | <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/wallabag/" title="download the firefox extension">{% trans "download the extension" %}</a></li> |
12 | <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li> | 12 | <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li> |
13 | <li>Android: <a href="https://f-droid.org/repository/browse/?fdid=fr.gaulupeau.apps.Poche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li> | 13 | <li>Android: <a href="https://f-droid.org/app/fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li> |
14 | <li>Windows Phone: <a href="https://www.windowsphone.com/en-us/store/app/poche/334de2f0-51b5-4826-8549-a3d805a37e83" title="download the window phone application">{% trans "download the application" %}</a></li> | 14 | <li>iOS: <a href="https://itunes.apple.com/app/wallabag/id828331015?mt=8" title="download the iOS application">{% trans "download the application" %}</a></li> |
15 | <li>Windows Phone: <a href="http://www.windowsphone.com/en-us/store/app/wallabag/ff890514-348c-4d0b-9b43-153fff3f7450" title="download the window phone application">{% trans "download the application" %}</a></li> | ||
15 | <li> | 16 | <li> |
16 | <form method="get" action="index.php"> | 17 | <form method="get" action="index.php"> |
17 | <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label> | 18 | <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label> |
@@ -25,9 +26,10 @@ | |||
25 | <h2>{% trans "Upgrading wallabag" %}</h2> | 26 | <h2>{% trans "Upgrading wallabag" %}</h2> |
26 | <ul> | 27 | <ul> |
27 | <li>{% trans "Installed version" %} : <strong>{{ constant('POCHE') }}</strong></li> | 28 | <li>{% trans "Installed version" %} : <strong>{{ constant('POCHE') }}</strong></li> |
28 | <li>{% trans "Latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent stable version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %}</li> | 29 | <li>{% trans "Latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent stable version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %} ({% trans "Last check:" %} {{ check_time_prod }})</li> |
29 | {% if constant('DEBUG_POCHE') == 1 %}<li>{% trans "Latest dev version" %} : {{ dev }}. {% if compare_dev == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent development version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %}</li>{% endif %} | 30 | {% if constant('DEBUG_POCHE') == 1 %}<li>{% trans "Latest dev version" %} : {{ dev }}. {% if compare_dev == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent development version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %} ({% trans "Last check:" %} {{ check_time_dev }}){% endif %}</li> |
30 | </ul> | 31 | </ul> |
32 | <p>{% trans "You can clear cache to check the latest release." %}</p> | ||
31 | 33 | ||
32 | <h2>{% trans "Feeds" %}</h2> | 34 | <h2>{% trans "Feeds" %}</h2> |
33 | {% if token == '' %} | 35 | {% if token == '' %} |
@@ -42,7 +44,7 @@ | |||
42 | <p>{% trans "Your user id:" %} <strong>{{user_id}}</strong></p> | 44 | <p>{% trans "Your user id:" %} <strong>{{user_id}}</strong></p> |
43 | <p>{% trans "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." %}</p> | 45 | <p>{% trans "You can regenerate your token: <a href='?feed&action=generate'>generate!</a>." %}</p> |
44 | {% endif %} | 46 | {% endif %} |
45 | 47 | ||
46 | <h2>{% trans "Change your theme" %}</h2> | 48 | <h2>{% trans "Change your theme" %}</h2> |
47 | <form method="post" action="?updatetheme" name="changethemeform"> | 49 | <form method="post" action="?updatetheme" name="changethemeform"> |
48 | <fieldset class="w500p inline"> | 50 | <fieldset class="w500p inline"> |
@@ -103,15 +105,21 @@ | |||
103 | {% endif %} | 105 | {% endif %} |
104 | 106 | ||
105 | <h2>{% trans "Import" %}</h2> | 107 | <h2>{% trans "Import" %}</h2> |
106 | <p>{% trans "Please execute the import script locally as it can take a very long time." %}</p> | 108 | <p>{% trans "You can import your Pocket, Readability, Instapaper, Wallabag or any data in appropriate json or html format." %}</p> |
107 | <p>{% trans "More info in the official documentation:" %} <a href="http://doc.wallabag.org/doku.php?id=users:migrate">wallabag.org</a></p> | 109 | <p>{% trans "Please select export file on your computer and press \"Import\" button below.<br>Wallabag will parse your file, insert all URLs and start fetching of articles if required.<br>Fetching process is controlled by two constants in your config file: IMPORT_LIMIT (how many articles are fetched at once) and IMPORT_DELAY (delay between fetch of next batch of articles)." %}</p> |
108 | <ul> | 110 | <form method="post" action="?import" name="uploadfile" enctype="multipart/form-data"> |
109 | <li><a href="./?import&from=pocket">{% trans "Import from Pocket" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCKET_FILE')) }}</li> | 111 | <fieldset class="w500p"> |
110 | <li><a href="./?import&from=readability">{% trans "Import from Readability" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('READABILITY_FILE')) }}</li> | 112 | <div class="row"> |
111 | <li><a href="./?import&from=instapaper">{% trans "Import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li> | 113 | <label class="col w150p" for="file">{% trans "File:" %}</label> |
112 | <li><a href="./?import&from=poche">{% trans "Import from wallabag" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCHE_FILE')) }}</li> | 114 | <input class="col" type="file" id="file" name="file" tabindex="4"> |
113 | </ul> | 115 | </div> |
114 | 116 | <div class="row mts txtcenter"> | |
117 | <button class="bouton" type="submit" tabindex="4">{% trans "Import" %}</button> | ||
118 | </div> | ||
119 | </fieldset> | ||
120 | </form> | ||
121 | <p><a href="?import">{% trans "You can click here to fetch content for articles with no content." %}</a></p> | ||
122 | |||
115 | <h2>{% trans "Export your wallabag data" %}</h2> | 123 | <h2>{% trans "Export your wallabag data" %}</h2> |
116 | {% if constant('STORAGE') == 'sqlite' %} | 124 | {% if constant('STORAGE') == 'sqlite' %} |
117 | <p><a href="?download" target="_blank">{% trans "Click here" %}</a> {% trans "to download your database." %}</p>{% endif %} | 125 | <p><a href="?download" target="_blank">{% trans "Click here" %}</a> {% trans "to download your database." %}</p>{% endif %} |
diff --git a/themes/baggy/css/main.css b/themes/baggy/css/main.css index 3e128b08..0dd552de 100755 --- a/themes/baggy/css/main.css +++ b/themes/baggy/css/main.css | |||
@@ -173,21 +173,22 @@ h2:after { | |||
173 | #links { | 173 | #links { |
174 | position: fixed; | 174 | position: fixed; |
175 | top: 0; | 175 | top: 0; |
176 | width: 9em; | 176 | width: 10em; |
177 | left: 0; | 177 | left: 0; |
178 | text-align: right; | 178 | text-align: right; |
179 | background: #333; | 179 | background: #333; |
180 | padding-top: 9em; | 180 | padding-top: 9.5em; |
181 | height: 100%; | 181 | height: 100%; |
182 | box-shadow:inset -4px 0 20px rgba(0,0,0,0.6); | 182 | box-shadow:inset -4px 0 20px rgba(0,0,0,0.6); |
183 | z-index: 10; | 183 | z-index: 10; |
184 | } | 184 | } |
185 | 185 | ||
186 | #main { | 186 | #main { |
187 | margin-left: 12em; | 187 | margin-left: 13em; |
188 | position: relative; | 188 | position: relative; |
189 | z-index: 10; | 189 | z-index: 10; |
190 | padding-right: 5%; | 190 | padding-right: 5%; |
191 | padding-bottom: 1em; | ||
191 | } | 192 | } |
192 | 193 | ||
193 | #links a { | 194 | #links a { |
@@ -227,7 +228,7 @@ h2:after { | |||
227 | #links li:last-child { | 228 | #links li:last-child { |
228 | position: fixed; | 229 | position: fixed; |
229 | bottom: 1em; | 230 | bottom: 1em; |
230 | width: 10%; | 231 | width: 10em; |
231 | } | 232 | } |
232 | 233 | ||
233 | #links li:last-child a:before { | 234 | #links li:last-child a:before { |
@@ -237,6 +238,61 @@ h2:after { | |||
237 | } | 238 | } |
238 | 239 | ||
239 | 240 | ||
241 | #sort { | ||
242 | padding: 0; | ||
243 | list-style-type: none; | ||
244 | opacity: 0.5; | ||
245 | display: inline-block; | ||
246 | } | ||
247 | |||
248 | #sort li { | ||
249 | display: inline; | ||
250 | font-size: 0.9em; | ||
251 | } | ||
252 | |||
253 | #sort li + li { | ||
254 | margin-left: 10px; | ||
255 | } | ||
256 | |||
257 | #sort a { | ||
258 | padding: 2px 2px 0; | ||
259 | vertical-align: middle; | ||
260 | } | ||
261 | |||
262 | #sort img { | ||
263 | vertical-align: baseline; | ||
264 | } | ||
265 | #sort img:hover { | ||
266 | cursor: pointer; | ||
267 | } | ||
268 | |||
269 | #display-mode { | ||
270 | float: right; | ||
271 | vertical-align: middle; | ||
272 | margin-top: 10px; | ||
273 | margin-bottom: 10px; | ||
274 | opacity: 0.5; | ||
275 | } | ||
276 | #listmode { | ||
277 | width: 16px; | ||
278 | display: inline-block; | ||
279 | text-decoration: none; | ||
280 | } | ||
281 | #listmode a:hover { | ||
282 | opacity: 1; | ||
283 | } | ||
284 | .tablemode { | ||
285 | background-image: url("../img/baggy/table.png"); | ||
286 | background-repeat: no-repeat; | ||
287 | background-position: bottom; | ||
288 | } | ||
289 | .listmode { | ||
290 | background-image: url("../img/baggy/list.png"); | ||
291 | background-repeat: no-repeat; | ||
292 | background-position: bottom; | ||
293 | } | ||
294 | |||
295 | |||
240 | /* ========================================================================== | 296 | /* ========================================================================== |
241 | 2 = Layout | 297 | 2 = Layout |
242 | ========================================================================== */ | 298 | ========================================================================== */ |
@@ -248,7 +304,7 @@ h2:after { | |||
248 | 304 | ||
249 | footer { | 305 | footer { |
250 | text-align: right; | 306 | text-align: right; |
251 | position: fixed; | 307 | position: relative; |
252 | bottom: 0; | 308 | bottom: 0; |
253 | right: 5em; | 309 | right: 5em; |
254 | color: #999; | 310 | color: #999; |
@@ -266,6 +322,15 @@ footer a { | |||
266 | letter-spacing:-5px; | 322 | letter-spacing:-5px; |
267 | } | 323 | } |
268 | 324 | ||
325 | .listmode .entrie { | ||
326 | width: 100%!important; | ||
327 | margin-left: 0!important; | ||
328 | } | ||
329 | |||
330 | .listmode .entrie p { | ||
331 | display: none; | ||
332 | } | ||
333 | |||
269 | .list-entries + .results { | 334 | .list-entries + .results { |
270 | margin-bottom: 2em; | 335 | margin-bottom: 2em; |
271 | } | 336 | } |
@@ -287,10 +352,10 @@ footer a { | |||
287 | letter-spacing:normal; | 352 | letter-spacing:normal; |
288 | box-shadow: 0 3px 7px rgba(0,0,0,0.3); | 353 | box-shadow: 0 3px 7px rgba(0,0,0,0.3); |
289 | display: inline-block; | 354 | display: inline-block; |
290 | width: 32%; | 355 | width: 32%!important; |
291 | margin-bottom: 1.5em; | 356 | margin-bottom: 1.5em; |
292 | vertical-align: top; | 357 | vertical-align: top; |
293 | margin-left: 1.5%; | 358 | margin-left: 1.5%!important; |
294 | position: relative; | 359 | position: relative; |
295 | overflow: hidden; | 360 | overflow: hidden; |
296 | padding: 1.5em 1.5em 3em 1.5em; | 361 | padding: 1.5em 1.5em 3em 1.5em; |
@@ -359,6 +424,7 @@ footer a { | |||
359 | content: none; | 424 | content: none; |
360 | } | 425 | } |
361 | 426 | ||
427 | |||
362 | .entrie h2 a { | 428 | .entrie h2 a { |
363 | display: block; | 429 | display: block; |
364 | text-decoration: none; | 430 | text-decoration: none; |
@@ -370,7 +436,7 @@ footer a { | |||
370 | -o-transition: all 0.5s ease; | 436 | -o-transition: all 0.5s ease; |
371 | transition: all 0.5s ease; | 437 | transition: all 0.5s ease; |
372 | } | 438 | } |
373 | 439 | /* | |
374 | .entrie h2 a:after { | 440 | .entrie h2 a:after { |
375 | content: ""; | 441 | content: ""; |
376 | position: absolute; | 442 | position: absolute; |
@@ -379,6 +445,7 @@ footer a { | |||
379 | height: 100%; | 445 | height: 100%; |
380 | left: 0; | 446 | left: 0; |
381 | } | 447 | } |
448 | */ | ||
382 | 449 | ||
383 | .entrie p { | 450 | .entrie p { |
384 | color: #666; | 451 | color: #666; |
@@ -425,7 +492,7 @@ footer a { | |||
425 | } | 492 | } |
426 | 493 | ||
427 | .entrie:nth-child(3n+1) { | 494 | .entrie:nth-child(3n+1) { |
428 | margin-left: 0; | 495 | margin-left: 0!important; |
429 | } | 496 | } |
430 | 497 | ||
431 | .results { | 498 | .results { |
@@ -442,6 +509,7 @@ footer a { | |||
442 | 509 | ||
443 | .pagination { | 510 | .pagination { |
444 | text-align: right; | 511 | text-align: right; |
512 | margin-bottom:50px; | ||
445 | } | 513 | } |
446 | 514 | ||
447 | .nb-results { | 515 | .nb-results { |
@@ -469,6 +537,134 @@ footer a { | |||
469 | } | 537 | } |
470 | 538 | ||
471 | /* ========================================================================== | 539 | /* ========================================================================== |
540 | 2.1 = "save a link" popup div related styles | ||
541 | ========================================================================== */ | ||
542 | |||
543 | #bagit-form { | ||
544 | background: rgba(0,0,0,0.5); | ||
545 | position: absolute; | ||
546 | top: 0; | ||
547 | left: 10em; | ||
548 | z-index: 20; | ||
549 | height: 100%; | ||
550 | width: 100%; | ||
551 | margin: 0; | ||
552 | margin-top: -30%; | ||
553 | padding: 2em; | ||
554 | display: none; | ||
555 | border-left: 1px #EEE solid; | ||
556 | } | ||
557 | |||
558 | #bagit-form form { | ||
559 | background: #FFF; | ||
560 | position: absolute; | ||
561 | top: 0; | ||
562 | left: 0; | ||
563 | z-index: 20; | ||
564 | border: 10px solid #000; | ||
565 | width: 400px; | ||
566 | height: 200px; | ||
567 | /* margin: -150px 0 0 -300px; */ | ||
568 | padding: 2em; | ||
569 | } | ||
570 | |||
571 | a#bagit-form-close { | ||
572 | background: #000; | ||
573 | color: #FFF; | ||
574 | padding: 0.2em 0.5em; | ||
575 | text-decoration: none; | ||
576 | display: inline-block; | ||
577 | float: right; | ||
578 | font-size: 0.6em; | ||
579 | } | ||
580 | a#bagit-form-close:hover { | ||
581 | background: #999; | ||
582 | color: #000; | ||
583 | } | ||
584 | |||
585 | .active-current { | ||
586 | background-color: #999; | ||
587 | } | ||
588 | |||
589 | .active-current:after { | ||
590 | content: ""; | ||
591 | width: 0; | ||
592 | height: 0; | ||
593 | position: absolute; | ||
594 | border-style: solid; | ||
595 | border-width: 10px; | ||
596 | border-color: transparent #EEE transparent transparent; | ||
597 | right: 0; | ||
598 | top: 50%; | ||
599 | margin-top: -10px; | ||
600 | } | ||
601 | |||
602 | .opacity03 { | ||
603 | opacity: 0.3; | ||
604 | } | ||
605 | |||
606 | .add-to-wallabag-link-after { | ||
607 | background-color: #000; | ||
608 | color: #fff; | ||
609 | padding: 0 3px 2px 3px; | ||
610 | } | ||
611 | |||
612 | #add-link-result { | ||
613 | font-weight: bold; | ||
614 | margin-top: 10px; | ||
615 | } | ||
616 | |||
617 | /* ========================================================================== | ||
618 | 2.2 = "search for articles" popup div related styles | ||
619 | ========================================================================== */ | ||
620 | #search-form { | ||
621 | background: rgba(0,0,0,0.5); | ||
622 | position: absolute; | ||
623 | top: 0; | ||
624 | left: 10em; | ||
625 | z-index: 20; | ||
626 | height: 100%; | ||
627 | width: 100%; | ||
628 | margin: 0; | ||
629 | margin-top: -30%; | ||
630 | padding: 2em; | ||
631 | display: none; | ||
632 | border-left: 1px #EEE solid; | ||
633 | } | ||
634 | |||
635 | #search-form form { | ||
636 | background: #FFF; | ||
637 | position: absolute; | ||
638 | top: 0; | ||
639 | left: 0; | ||
640 | z-index: 20; | ||
641 | border: 10px solid #000; | ||
642 | width: 400px; | ||
643 | height: 200px; | ||
644 | /* margin: -150px 0 0 -300px; */ | ||
645 | padding: 2em; | ||
646 | } | ||
647 | |||
648 | a#search-form-close { | ||
649 | background: #000; | ||
650 | color: #FFF; | ||
651 | padding: 0.2em 0.5em; | ||
652 | text-decoration: none; | ||
653 | display: inline-block; | ||
654 | float: right; | ||
655 | font-size: 1.2em; | ||
656 | } | ||
657 | a#search-form-close:hover { | ||
658 | background: #999; | ||
659 | color: #000; | ||
660 | } | ||
661 | |||
662 | #submit-search{ | ||
663 | margin-left: 4em; | ||
664 | margin-top:1em; | ||
665 | } | ||
666 | |||
667 | /* ========================================================================== | ||
472 | 3 = Pictos | 668 | 3 = Pictos |
473 | ========================================================================== */ | 669 | ========================================================================== */ |
474 | 670 | ||
@@ -583,7 +779,7 @@ footer a { | |||
583 | } | 779 | } |
584 | 780 | ||
585 | .warning { | 781 | .warning { |
586 | font-size: 3em; | 782 | /* font-size: 3em; |
587 | color: #999; | 783 | color: #999; |
588 | font-style: italic; | 784 | font-style: italic; |
589 | position: absolute; | 785 | position: absolute; |
@@ -592,7 +788,10 @@ footer a { | |||
592 | width: 100%; | 788 | width: 100%; |
593 | text-align: center; | 789 | text-align: center; |
594 | padding-right: 5%; | 790 | padding-right: 5%; |
595 | margin-top: -2em; | 791 | margin-top: -2em;*/ |
792 | font-weight: bold; | ||
793 | display: block; | ||
794 | width: 100%; | ||
596 | } | 795 | } |
597 | 796 | ||
598 | /* ========================================================================== | 797 | /* ========================================================================== |
@@ -602,6 +801,7 @@ footer a { | |||
602 | #article { | 801 | #article { |
603 | width: 70%; | 802 | width: 70%; |
604 | margin-bottom: 3em; | 803 | margin-bottom: 3em; |
804 | text-align: justify; | ||
605 | } | 805 | } |
606 | 806 | ||
607 | #article .tags { | 807 | #article .tags { |
@@ -731,6 +931,9 @@ blockquote { | |||
731 | width: 100%; | 931 | width: 100%; |
732 | margin-left: 0; | 932 | margin-left: 0; |
733 | } | 933 | } |
934 | #display-mode { | ||
935 | display: none; | ||
936 | } | ||
734 | } | 937 | } |
735 | 938 | ||
736 | @media screen and (max-width: 500px) { | 939 | @media screen and (max-width: 500px) { |
@@ -820,4 +1023,12 @@ blockquote { | |||
820 | #article_toolbar a { | 1023 | #article_toolbar a { |
821 | padding: 0.3em 0.4em 0.2em; | 1024 | padding: 0.3em 0.4em 0.2em; |
822 | } | 1025 | } |
1026 | |||
1027 | #display-mode { | ||
1028 | display: none; | ||
1029 | } | ||
1030 | |||
1031 | #bagit-form { | ||
1032 | left: 0; | ||
1033 | } | ||
823 | } | 1034 | } |
diff --git a/themes/baggy/edit-tags.twig b/themes/baggy/edit-tags.twig index 9e9012ee..2113e964 100644..100755 --- a/themes/baggy/edit-tags.twig +++ b/themes/baggy/edit-tags.twig | |||
@@ -4,6 +4,11 @@ | |||
4 | {% include '_menu.twig' %} | 4 | {% include '_menu.twig' %} |
5 | {% endblock %} | 5 | {% endblock %} |
6 | {% block content %} | 6 | {% block content %} |
7 | |||
8 | <script src="{{ poche_url }}themes/default/js/jquery-ui-1.10.4.custom.min.js"></script> | ||
9 | <script src="{{ poche_url }}themes/default/js/autoCompleteTags.js"></script> | ||
10 | <link rel="stylesheet" href="{{ poche_url }}themes/default/css/jquery-ui-1.10.4.custom.min.css" media="all"> | ||
11 | |||
7 | <div id="article"> | 12 | <div id="article"> |
8 | <h2>{{ entry.title|raw }}</21> | 13 | <h2>{{ entry.title|raw }}</21> |
9 | </div> | 14 | </div> |
@@ -17,7 +22,8 @@ | |||
17 | <input type="hidden" name="entry_id" value="{{ entry_id }}" /> | 22 | <input type="hidden" name="entry_id" value="{{ entry_id }}" /> |
18 | <label for="value">Add tags: </label><input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" /> | 23 | <label for="value">Add tags: </label><input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" /> |
19 | <input type="submit" value="Tag" /> | 24 | <input type="submit" value="Tag" /> |
20 | <p>{% trans "You can enter multiple tags, separated by commas." %}</p> | 25 | <p>{% trans "Start typing for auto complete." %}<br> |
26 | {% trans "You can enter multiple tags, separated by commas." %}</p> | ||
21 | </form> | 27 | </form> |
22 | <a class="icon icon-reply return" href="./?view=view&id={{ entry_id }}">{% trans "return to article" %}</a> | 28 | <a class="icon icon-reply return" href="./?view=view&id={{ entry_id }}">{% trans "return to article" %}</a> |
23 | {% endblock %} | 29 | {% endblock %} |
diff --git a/themes/baggy/home.twig b/themes/baggy/home.twig index 4f9db063..5dd91307 100644..100755 --- a/themes/baggy/home.twig +++ b/themes/baggy/home.twig | |||
@@ -18,17 +18,27 @@ | |||
18 | {% if entries is empty %} | 18 | {% if entries is empty %} |
19 | <div class="messages warning"><p>{% trans "No articles found." %}</p></div> | 19 | <div class="messages warning"><p>{% trans "No articles found." %}</p></div> |
20 | {% else %} | 20 | {% else %} |
21 | <div> | ||
22 | {% include '_display-mode.twig' %} | ||
23 | {% include '_sorting.twig' %} | ||
24 | </div> | ||
21 | {% block pager %} | 25 | {% block pager %} |
22 | {% if nb_results > 1 %} | 26 | {% if nb_results > 1 %} |
23 | <div class="results"> | 27 | <div class="results"> |
24 | <div class="nb-results">{{ nb_results }} {% trans "results" %}</div> | 28 | <div class="nb-results">{{ nb_results }} {% trans "results" %}{% if search_term is defined %}{% trans " found for « " %} {{ search_term }} »{% endif %}</div> |
25 | {{ page_links | raw }} | 29 | {{ page_links | raw }} |
26 | </div> | 30 | </div> |
31 | {% elseif nb_results == 1 %} | ||
32 | {% if search_term is defined %} | ||
33 | <div class="results"> | ||
34 | <div class="nb-results">{% trans "Only one result found for " %} « {{ search_term }} »</div> | ||
35 | </div> | ||
36 | {% endif %} | ||
27 | {% endif %} | 37 | {% endif %} |
28 | {% endblock %} | 38 | {% endblock %} |
29 | <div class="list-entries"> | 39 | <div id="list-entries" class="list-entries"> |
30 | {% for entry in entries %} | 40 | {% for entry in entries %} |
31 | <div id="entry-{{ entry.id|e }}" class="entrie"> | 41 | <div id="entry-{{ entry.id|e }}" class="entrie"{% if listmode %} style="width:100%; margin-left:0;"{% endif %}> |
32 | <h2><a href="index.php?view=view&id={{ entry.id|e }}">{{ entry.title|raw }}</a></h2> | 42 | <h2><a href="index.php?view=view&id={{ entry.id|e }}">{{ entry.title|raw }}</a></h2> |
33 | {% if entry.content| getReadingTime > 0 %} | 43 | {% if entry.content| getReadingTime > 0 %} |
34 | <div class="estimatedTime"><a target="_blank" title="{% trans "estimated reading time:" %} {{ entry.content| getReadingTime }} min" class="tool reading-time"><span>{% trans "estimated reading time :" %} {{ entry.content| getReadingTime }} min</span></div> | 44 | <div class="estimatedTime"><a target="_blank" title="{% trans "estimated reading time:" %} {{ entry.content| getReadingTime }} min" class="tool reading-time"><span>{% trans "estimated reading time :" %} {{ entry.content| getReadingTime }} min</span></div> |
diff --git a/themes/baggy/img/baggy/blank.png b/themes/baggy/img/baggy/blank.png new file mode 100755 index 00000000..63e09844 --- /dev/null +++ b/themes/baggy/img/baggy/blank.png | |||
Binary files differ | |||
diff --git a/themes/baggy/img/baggy/down.png b/themes/baggy/img/baggy/down.png new file mode 100644 index 00000000..b9d536a7 --- /dev/null +++ b/themes/baggy/img/baggy/down.png | |||
Binary files differ | |||
diff --git a/themes/baggy/img/baggy/list.png b/themes/baggy/img/baggy/list.png new file mode 100755 index 00000000..bd5aff5a --- /dev/null +++ b/themes/baggy/img/baggy/list.png | |||
Binary files differ | |||
diff --git a/themes/baggy/img/baggy/table.png b/themes/baggy/img/baggy/table.png new file mode 100755 index 00000000..859c4cd8 --- /dev/null +++ b/themes/baggy/img/baggy/table.png | |||
Binary files differ | |||
diff --git a/themes/baggy/img/baggy/top.png b/themes/baggy/img/baggy/top.png new file mode 100644 index 00000000..954a8c0a --- /dev/null +++ b/themes/baggy/img/baggy/top.png | |||
Binary files differ | |||
diff --git a/themes/baggy/img/logo-other_themes.png b/themes/baggy/img/logo-other_themes.png new file mode 100755 index 00000000..32543a44 --- /dev/null +++ b/themes/baggy/img/logo-other_themes.png | |||
Binary files differ | |||
diff --git a/themes/baggy/js/autoClose.js b/themes/baggy/js/autoClose.js deleted file mode 100644 index e9145b7e..00000000 --- a/themes/baggy/js/autoClose.js +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | $(document).ready(function() { | ||
2 | current_url = window.location.href | ||
3 | if (current_url.match("&closewin=true")) { | ||
4 | window.close(); | ||
5 | } | ||
6 | }); | ||
diff --git a/themes/baggy/js/init.js b/themes/baggy/js/init.js index c1d3c0ec..00470fbf 100755 --- a/themes/baggy/js/init.js +++ b/themes/baggy/js/init.js | |||
@@ -1,12 +1,48 @@ | |||
1 | document.addEventListener('DOMContentLoaded', function() { | 1 | $.fn.ready(function() { |
2 | var menu = document.getElementById('menu'); | 2 | |
3 | 3 | var $listmode = $('#listmode'), | |
4 | menu.addEventListener('click', function(){ | 4 | $listentries = $("#list-entries"); |
5 | if(this.nextElementSibling.style.display === "block") { | 5 | |
6 | this.nextElementSibling.style.display = "none"; | 6 | /* ========================================================================== |
7 | }else { | 7 | Menu |
8 | this.nextElementSibling.style.display = "block"; | 8 | ========================================================================== */ |
9 | |||
10 | $("#menu").click(function(){ | ||
11 | $("#links").toggle(); | ||
12 | }); | ||
13 | |||
14 | /* ========================================================================== | ||
15 | List mode or Table Mode | ||
16 | ========================================================================== */ | ||
17 | |||
18 | $listmode.click(function(){ | ||
19 | if ( $.cookie("listmode") == 1 ) { | ||
20 | // Cookie | ||
21 | $.removeCookie("listmode"); | ||
22 | |||
23 | $listentries.removeClass("listmode"); | ||
24 | $listmode.removeClass("tablemode"); | ||
25 | $listmode.addClass("listmode"); | ||
9 | } | 26 | } |
10 | 27 | else { | |
28 | // Cookie | ||
29 | $.cookie("listmode", 1, {expires: 365}); | ||
30 | |||
31 | $listentries.addClass("listmode"); | ||
32 | $listmode.removeClass("listmode"); | ||
33 | $listmode.addClass("tablemode"); | ||
34 | } | ||
35 | |||
11 | }); | 36 | }); |
12 | }); \ No newline at end of file | 37 | |
38 | /* ========================================================================== | ||
39 | Cookie listmode | ||
40 | ========================================================================== */ | ||
41 | |||
42 | if ( $.cookie("listmode") == 1 ) { | ||
43 | $listentries.addClass("listmode"); | ||
44 | $listmode.removeClass("listmode"); | ||
45 | $listmode.addClass("tablemode"); | ||
46 | } | ||
47 | |||
48 | }); | ||
diff --git a/themes/baggy/js/jquery-2.0.3.min.js b/themes/baggy/js/jquery-2.0.3.min.js deleted file mode 100644 index a4dd0a2f..00000000 --- a/themes/baggy/js/jquery-2.0.3.min.js +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | (function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window); \ No newline at end of file | ||
diff --git a/themes/baggy/js/jquery.cookie.js b/themes/baggy/js/jquery.cookie.js new file mode 100755 index 00000000..92719000 --- /dev/null +++ b/themes/baggy/js/jquery.cookie.js | |||
@@ -0,0 +1,117 @@ | |||
1 | /*! | ||
2 | * jQuery Cookie Plugin v1.4.0 | ||
3 | * https://github.com/carhartl/jquery-cookie | ||
4 | * | ||
5 | * Copyright 2013 Klaus Hartl | ||
6 | * Released under the MIT license | ||
7 | */ | ||
8 | (function (factory) { | ||
9 | if (typeof define === 'function' && define.amd) { | ||
10 | // AMD. Register as anonymous module. | ||
11 | define(['jquery'], factory); | ||
12 | } else { | ||
13 | // Browser globals. | ||
14 | factory(jQuery); | ||
15 | } | ||
16 | }(function ($) { | ||
17 | |||
18 | var pluses = /\+/g; | ||
19 | |||
20 | function encode(s) { | ||
21 | return config.raw ? s : encodeURIComponent(s); | ||
22 | } | ||
23 | |||
24 | function decode(s) { | ||
25 | return config.raw ? s : decodeURIComponent(s); | ||
26 | } | ||
27 | |||
28 | function stringifyCookieValue(value) { | ||
29 | return encode(config.json ? JSON.stringify(value) : String(value)); | ||
30 | } | ||
31 | |||
32 | function parseCookieValue(s) { | ||
33 | if (s.indexOf('"') === 0) { | ||
34 | // This is a quoted cookie as according to RFC2068, unescape... | ||
35 | s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); | ||
36 | } | ||
37 | |||
38 | try { | ||
39 | // Replace server-side written pluses with spaces. | ||
40 | // If we can't decode the cookie, ignore it, it's unusable. | ||
41 | s = decodeURIComponent(s.replace(pluses, ' ')); | ||
42 | } catch(e) { | ||
43 | return; | ||
44 | } | ||
45 | |||
46 | try { | ||
47 | // If we can't parse the cookie, ignore it, it's unusable. | ||
48 | return config.json ? JSON.parse(s) : s; | ||
49 | } catch(e) {} | ||
50 | } | ||
51 | |||
52 | function read(s, converter) { | ||
53 | var value = config.raw ? s : parseCookieValue(s); | ||
54 | return $.isFunction(converter) ? converter(value) : value; | ||
55 | } | ||
56 | |||
57 | var config = $.cookie = function (key, value, options) { | ||
58 | |||
59 | // Write | ||
60 | if (value !== undefined && !$.isFunction(value)) { | ||
61 | options = $.extend({}, config.defaults, options); | ||
62 | |||
63 | if (typeof options.expires === 'number') { | ||
64 | var days = options.expires, t = options.expires = new Date(); | ||
65 | t.setDate(t.getDate() + days); | ||
66 | } | ||
67 | |||
68 | return (document.cookie = [ | ||
69 | encode(key), '=', stringifyCookieValue(value), | ||
70 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE | ||
71 | options.path ? '; path=' + options.path : '', | ||
72 | options.domain ? '; domain=' + options.domain : '', | ||
73 | options.secure ? '; secure' : '' | ||
74 | ].join('')); | ||
75 | } | ||
76 | |||
77 | // Read | ||
78 | |||
79 | var result = key ? undefined : {}; | ||
80 | |||
81 | // To prevent the for loop in the first place assign an empty array | ||
82 | // in case there are no cookies at all. Also prevents odd result when | ||
83 | // calling $.cookie(). | ||
84 | var cookies = document.cookie ? document.cookie.split('; ') : []; | ||
85 | |||
86 | for (var i = 0, l = cookies.length; i < l; i++) { | ||
87 | var parts = cookies[i].split('='); | ||
88 | var name = decode(parts.shift()); | ||
89 | var cookie = parts.join('='); | ||
90 | |||
91 | if (key && key === name) { | ||
92 | // If second argument (value) is a function it's a converter... | ||
93 | result = read(cookie, value); | ||
94 | break; | ||
95 | } | ||
96 | |||
97 | // Prevent storing a cookie that we couldn't decode. | ||
98 | if (!key && (cookie = read(cookie)) !== undefined) { | ||
99 | result[name] = cookie; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | return result; | ||
104 | }; | ||
105 | |||
106 | config.defaults = {}; | ||
107 | |||
108 | $.removeCookie = function (key, options) { | ||
109 | if ($.cookie(key) !== undefined) { | ||
110 | // Must not alter options, thus extending a fresh object... | ||
111 | $.cookie(key, '', $.extend({}, options, { expires: -1 })); | ||
112 | return true; | ||
113 | } | ||
114 | return false; | ||
115 | }; | ||
116 | |||
117 | })); | ||
diff --git a/themes/baggy/layout.twig b/themes/baggy/layout.twig index dfebc3ea..8de12749 100644..100755 --- a/themes/baggy/layout.twig +++ b/themes/baggy/layout.twig | |||
@@ -21,6 +21,9 @@ | |||
21 | {% block precontent %}{% endblock %} | 21 | {% block precontent %}{% endblock %} |
22 | {% block messages %} | 22 | {% block messages %} |
23 | {% include '_messages.twig' %} | 23 | {% include '_messages.twig' %} |
24 | {% if includeImport %} | ||
25 | {% include '_import.twig' %} | ||
26 | {% endif %} | ||
24 | {% endblock %} | 27 | {% endblock %} |
25 | <div id="content" class="w600p center"> | 28 | <div id="content" class="w600p center"> |
26 | {% block content %}{% endblock %} | 29 | {% block content %}{% endblock %} |
diff --git a/themes/baggy/tags.twig b/themes/baggy/tags.twig index 9df44bb7..9bb93a45 100644..100755 --- a/themes/baggy/tags.twig +++ b/themes/baggy/tags.twig | |||
@@ -6,7 +6,7 @@ | |||
6 | {% block content %} | 6 | {% block content %} |
7 | <h2>{% trans "Tags" %}</h2> | 7 | <h2>{% trans "Tags" %}</h2> |
8 | <ul class="list-tags"> | 8 | <ul class="list-tags"> |
9 | {% for tag in tags %}<li>{% if token != '' %}<a class="icon icon-rss" href="?feed&type=tag&user_id={{ user_id }}&tag_id={{ tag.id }}&token={{ token }}" target="_blank"><span>rss</span></a>{% endif %} <a href="./?view=tag&id={{ tag.id }}">{{ tag.value }}</a> | 9 | {% for tag in tags %}<li>{% if token != '' %}<a class="icon icon-rss" href="?feed&type=tag&user_id={{ user_id }}&tag_id={{ tag.id }}&token={{ token }}" target="_blank"><span>rss</span></a>{% endif %} <a href="./?view=tag&id={{ tag.id }}">{{ tag.value }}</a> ({{ tag.entriescount }}) |
10 | </li> | 10 | </li> |
11 | {% endfor %} | 11 | {% endfor %} |
12 | </ul> | 12 | </ul> |
diff --git a/themes/baggy/view.twig b/themes/baggy/view.twig index 4751c4cb..ffb512a3 100644..100755 --- a/themes/baggy/view.twig +++ b/themes/baggy/view.twig | |||
@@ -14,7 +14,7 @@ | |||
14 | {% if constant('SHARE_TWITTER') == 1 %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="{% trans "Tweet" %}"><span>{% trans "Tweet" %}</span></a></li>{% endif %} | 14 | {% if constant('SHARE_TWITTER') == 1 %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="{% trans "Tweet" %}"><span>{% trans "Tweet" %}</span></a></li>{% endif %} |
15 | {% if constant('SHARE_MAIL') == 1 %}<li><a href="mailto:?subject={{ entry.title|url_encode }}&body={{ entry.url|url_encode }}%20via%20@wallabagapp" class="tool email icon icon-mail" title="{% trans "Email" %}"><span>{% trans "Email" %}</span></a></li>{% endif %} | 15 | {% if constant('SHARE_MAIL') == 1 %}<li><a href="mailto:?subject={{ entry.title|url_encode }}&body={{ entry.url|url_encode }}%20via%20@wallabagapp" class="tool email icon icon-mail" title="{% trans "Email" %}"><span>{% trans "Email" %}</span></a></li>{% endif %} |
16 | {% if constant('SHARE_SHAARLI') == 1 %}<li><a href="{{ constant('SHAARLI_URL') }}/index.php?post={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}" target="_blank" class="tool shaarli" title="{% trans "shaarli" %}"><span>{% trans "shaarli" %}</span></a></li>{% endif %} | 16 | {% if constant('SHARE_SHAARLI') == 1 %}<li><a href="{{ constant('SHAARLI_URL') }}/index.php?post={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}" target="_blank" class="tool shaarli" title="{% trans "shaarli" %}"><span>{% trans "shaarli" %}</span></a></li>{% endif %} |
17 | {% if constant('FLATTR') == 1 %}{% if flattr.status == constant('FLATTRABLE') %}<li><a href="http://flattr.com/submit/auto?url={{ entry.url }}" class="tool flattr icon icon-flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span></a></li>{% elseif flattr.status == constant('FLATTRED') %}<li><a href="{{ flattr.flattrItemURL }}" class="tool flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span> ({{ flattr.numflattrs }})</a></li>{% endif %}{% endif %} | 17 | {% if constant('FLATTR') == 1 %}{% if flattr.status == constant('FLATTRABLE') %}<li><a href="http://flattr.com/submit/auto?url={{ entry.url }}" class="tool flattr icon icon-flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span></a></li>{% elseif flattr.status == constant('FLATTRED') %}<li><a href="{{ flattr.flattrItemURL }}" class="tool flattr icon icon-flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span> ({{ flattr.numflattrs }})</a></li>{% endif %}{% endif %} |
18 | <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&body={{ entry.url|url_encode }}" title="{% trans "Does this article appear wrong?" %}" class="tool bad-display icon icon-delete"><span>{% trans "Does this article appear wrong?" %}</span></a></li> | 18 | <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&body={{ entry.url|url_encode }}" title="{% trans "Does this article appear wrong?" %}" class="tool bad-display icon icon-delete"><span>{% trans "Does this article appear wrong?" %}</span></a></li> |
19 | </ul> | 19 | </ul> |
20 | </div> | 20 | </div> |
@@ -29,4 +29,23 @@ | |||
29 | {{ content | raw }} | 29 | {{ content | raw }} |
30 | </article> | 30 | </article> |
31 | </div> | 31 | </div> |
32 | <script src="{{ poche_url }}themes/{{theme}}/js/restoreScroll.js"></script> | ||
33 | <script type="text/javascript"> | ||
34 | $(document).ready(function() { | ||
35 | |||
36 | $(window).scroll(function(e){ | ||
37 | var scrollTop = $(window).scrollTop(); | ||
38 | var docHeight = $(document).height(); | ||
39 | var scrollPercent = (scrollTop) / (docHeight); | ||
40 | var scrollPercentRounded = Math.round(scrollPercent*100)/100; | ||
41 | savePercent({{ entry.id|e }}, scrollPercentRounded); | ||
42 | }); | ||
43 | |||
44 | retrievePercent({{ entry.id|e }}); | ||
45 | |||
46 | $(window).resize(function(){ | ||
47 | retrievePercent({{ entry.id|e }}); | ||
48 | }); | ||
49 | }); | ||
50 | </script> | ||
32 | {% endblock %} | 51 | {% endblock %} |
diff --git a/themes/courgette/_head.twig b/themes/courgette/_head.twig index 57b40f41..059936d9 100755 --- a/themes/courgette/_head.twig +++ b/themes/courgette/_head.twig | |||
@@ -1,11 +1,11 @@ | |||
1 | <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}/themes/{{theme}}/img/favicon.ico" /> | 1 | <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}themes/{{theme}}/img/favicon.ico" /> |
2 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png"> | 2 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png"> |
3 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png"> | 3 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png"> |
4 | <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-precomposed.png"> | 4 | <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-precomposed.png"> |
5 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/font.css" media="all"> | 5 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/font.css" media="all"> |
6 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/style.css" media="all"> | 6 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/style.css" media="all"> |
7 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/messages.css" media="all"> | 7 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/messages.css" media="all"> |
8 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/print.css" media="print"> | 8 | <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/print.css" media="print"> |
9 | <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'> | 9 | <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'> |
10 | <script src="//codeorigin.jquery.com/jquery-2.0.3.min.js"></script> | 10 | <script src="//codeorigin.jquery.com/jquery-2.0.3.min.js"></script> |
11 | <script src="{{ poche_url }}/themes/{{theme}}/js/init.js"></script> | 11 | <script src="{{ poche_url }}themes/{{theme}}/js/init.js"></script> |
diff --git a/themes/courgette/_top.twig b/themes/courgette/_top.twig index 792687c0..2d41db17 100755 --- a/themes/courgette/_top.twig +++ b/themes/courgette/_top.twig | |||
@@ -1,6 +1,6 @@ | |||
1 | <header> | 1 | <header> |
2 | <h1> | 2 | <h1> |
3 | {% if view == 'home' %}{% block logo %}<img src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/img/logo.svg" alt="logo poche" />{% endblock %} | 3 | {% if view == 'home' %}{% block logo %}<img src="{{ poche_url }}themes/{{theme}}/img/logo.svg" alt="wallabag logo" />{% endblock %} |
4 | {% elseif view == 'fav' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Favoris</span></a> | 4 | {% elseif view == 'fav' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Favoris</span></a> |
5 | {% elseif view == 'archive' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Archive</span></a> | 5 | {% elseif view == 'archive' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Archive</span></a> |
6 | {% else %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }}</a> | 6 | {% else %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }}</a> |
diff --git a/themes/courgette/_view.twig b/themes/courgette/_view.twig index e80829ef..9f9ea4f6 100755 --- a/themes/courgette/_view.twig +++ b/themes/courgette/_view.twig | |||
@@ -23,7 +23,7 @@ | |||
23 | {{ content | raw }} | 23 | {{ content | raw }} |
24 | </article> | 24 | </article> |
25 | </div> | 25 | </div> |
26 | <script src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/js/restoreScroll.js"></script> | 26 | <script src="{{ poche_url }}themes/{{theme}}/js/restoreScroll.js"></script> |
27 | <script type="text/javascript"> | 27 | <script type="text/javascript"> |
28 | $(document).ready(function() { | 28 | $(document).ready(function() { |
29 | 29 | ||
diff --git a/themes/courgette/config.twig b/themes/courgette/config.twig index 26da7289..5c0aa4b1 100755 --- a/themes/courgette/config.twig +++ b/themes/courgette/config.twig | |||
@@ -7,7 +7,7 @@ | |||
7 | {% block content %} | 7 | {% block content %} |
8 | <div id="config"> | 8 | <div id="config"> |
9 | <h2>{% trans "Poching a link" %}</h2> | 9 | <h2>{% trans "Poching a link" %}</h2> |
10 | <p>{% trans "You can poche a link by several methods:" %} (<a class="special" href="http://doc.wallabag.org" title="{% trans "read the documentation" %}">?</a>)</p> | 10 | <p>{% trans "There are several ways to save an article:" %} (<a class="special" href="http://doc.wallabag.org" title="{% trans "read the documentation" %}">?</a>)</p> |
11 | <ul> | 11 | <ul> |
12 | <li>firefox: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.xpi" title="download the firefox extension">{% trans "download the extension" %}</a></li> | 12 | <li>firefox: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.xpi" title="download the firefox extension">{% trans "download the extension" %}</a></li> |
13 | <li>chrome: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.crx" title="download the chrome extension">{% trans "download the extension" %}</a></li> | 13 | <li>chrome: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.crx" title="download the chrome extension">{% trans "download the extension" %}</a></li> |
@@ -16,13 +16,13 @@ | |||
16 | <form method="get" action="index.php"> | 16 | <form method="get" action="index.php"> |
17 | <label class="addurl" for="plainurl">{% trans "by filling this field" %}:</label> | 17 | <label class="addurl" for="plainurl">{% trans "by filling this field" %}:</label> |
18 | <input required placeholder="Ex:mywebsite.com/article" class="addurl" id="plainurl" name="plainurl" type="url" /> | 18 | <input required placeholder="Ex:mywebsite.com/article" class="addurl" id="plainurl" name="plainurl" type="url" /> |
19 | <input type="submit" value="{% trans "poche it!" %}" /> | 19 | <input type="submit" value="{% trans "bag it!" %}" /> |
20 | </form> | 20 | </form> |
21 | </li> | 21 | </li> |
22 | <li>{% trans "bookmarklet: drag & drop this link to your bookmarks bar" %} <a id="bookmarklet" ondragend="this.click();" title="i am a bookmarklet, use me !" href="javascript:if(top['bookmarklet-url@wallabag.org']){top['bookmarklet-url@wallabag.org'];}else{(function(){var%20url%20=%20location.href%20||%20url;window.open('{{ poche_url }}?action=add&url='%20+%20btoa(url),'_self');})();void(0);}">{% trans "poche it!" %}</a></li> | 22 | <li>{% trans "bookmarklet: drag & drop this link to your bookmarks bar" %} <a id="bookmarklet" ondragend="this.click();" title="i am a bookmarklet, use me !" href="javascript:if(top['bookmarklet-url@wallabag.org']){top['bookmarklet-url@wallabag.org'];}else{(function(){var%20url%20=%20location.href%20||%20url;window.open('{{ poche_url }}?action=add&url='%20+%20btoa(url),'_self');})();void(0);}">{% trans "bag it!" %}</a></li> |
23 | </ul> | 23 | </ul> |
24 | 24 | ||
25 | <h2>{% trans "Updating poche" %}</h2> | 25 | <h2>{% trans "Upgrading wallabag" %}</h2> |
26 | <ul> | 26 | <ul> |
27 | <li>{% trans "your version" %} : <strong>{{ constant('POCHE') }}</strong></li> | 27 | <li>{% trans "your version" %} : <strong>{{ constant('POCHE') }}</strong></li> |
28 | <li>{% trans "latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "a more recent stable version is available." %}</a></strong>{% else %}{% trans "you are up to date." %}{% endif %}</li> | 28 | <li>{% trans "latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "a more recent stable version is available." %}</a></strong>{% else %}{% trans "you are up to date." %}{% endif %}</li> |
@@ -76,7 +76,7 @@ | |||
76 | <li><a href="./?import&from=instapaper">{% trans "import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li> | 76 | <li><a href="./?import&from=instapaper">{% trans "import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li> |
77 | </ul> | 77 | </ul> |
78 | 78 | ||
79 | <h2>{% trans "Export your poche datas" %}</h2> | 79 | <h2>{% trans "Export your wallabag data" %}</h2> |
80 | <p><a href="./?export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your poche datas." %}</p> | 80 | <p><a href="./?export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your wallabag data." %}</p> |
81 | </div> | 81 | </div> |
82 | {% endblock %} \ No newline at end of file | 82 | {% endblock %} \ No newline at end of file |
diff --git a/themes/courgette/home.twig b/themes/courgette/home.twig index 416cfa43..6ba72d35 100755 --- a/themes/courgette/home.twig +++ b/themes/courgette/home.twig | |||
@@ -14,8 +14,8 @@ | |||
14 | {% block precontent %} | 14 | {% block precontent %} |
15 | {% if entries|length > 1 %} | 15 | {% if entries|length > 1 %} |
16 | <ul id="sort"> | 16 | <ul id="sort"> |
17 | <li><a href="./?sort=ia&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li> | 17 | <li><a href="./?sort=ia&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li> |
18 | <li><a href="./?sort=ta&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li> | 18 | <li><a href="./?sort=ta&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li> |
19 | </ul> | 19 | </ul> |
20 | {% endif %} | 20 | {% endif %} |
21 | {% endblock %} | 21 | {% endblock %} |
@@ -26,9 +26,15 @@ | |||
26 | {% block pager %} | 26 | {% block pager %} |
27 | {% if nb_results > 1 %} | 27 | {% if nb_results > 1 %} |
28 | <div class="results"> | 28 | <div class="results"> |
29 | <div class="nb-results">{{ nb_results }} {% trans "results" %}</div> | 29 | <div class="nb-results">{{ nb_results }} {% trans "results" %}{% if search_term is defined %}{% trans " found for « " %} {{ search_term }} »{% endif %}</div> |
30 | {{ page_links | raw }} | 30 | {{ page_links | raw }} |
31 | </div> | 31 | </div> |
32 | {% elseif nb_results == 1 %} | ||
33 | {% if search_term is defined %} | ||
34 | <div class="results"> | ||
35 | <div class="nb-results">{% trans "Only one result found for " %} « {{ search_term }} »</div> | ||
36 | </div> | ||
37 | {% endif %} | ||
32 | {% endif %} | 38 | {% endif %} |
33 | {% endblock %} | 39 | {% endblock %} |
34 | {% for entry in entries %} | 40 | {% for entry in entries %} |
diff --git a/themes/courgette/tags.twig b/themes/courgette/tags.twig index 9dfdab52..b11dce28 100644..100755 --- a/themes/courgette/tags.twig +++ b/themes/courgette/tags.twig | |||
@@ -4,5 +4,5 @@ | |||
4 | {% include '_menu.twig' %} | 4 | {% include '_menu.twig' %} |
5 | {% endblock %} | 5 | {% endblock %} |
6 | {% block content %} | 6 | {% block content %} |
7 | {% for tag in tags %}<a class="tag" href="./?view=tag&id={{ tag.id }}">{{ tag.value }}</a> {% if token != '' %}<a href="?feed&type=tag&user_id={{ user_id }}&tag_id={{ tag.id }}&token={{ token }}" target="_blank"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %} {% endfor %} | 7 | {% for tag in tags %}<a class="tag" href="./?view=tag&id={{ tag.id }}">{{ tag.value }}</a> {% if token != '' %}<a href="?feed&type=tag&user_id={{ user_id }}&tag_id={{ tag.id }}&token={{ token }}" target="_blank"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %} {% endfor %} |
8 | {% endblock %} \ No newline at end of file | 8 | {% endblock %} \ No newline at end of file |
diff --git a/themes/default/_bookmarklet.twig b/themes/default/_bookmarklet.twig index 2e3071ad..61996353 100644 --- a/themes/default/_bookmarklet.twig +++ b/themes/default/_bookmarklet.twig | |||
@@ -1,3 +1,3 @@ | |||
1 | <script type="text/javascript"> | 1 | <script type="text/javascript"> |
2 | top["bookmarklet-url@wallabag.org"]=""+"<!DOCTYPE html>"+"<html>"+"<head>"+"<title>poche it !</title>"+'<link rel="icon" href="{{poche_url}}tpl/img/favicon.ico" />'+"</head>"+"<body>"+"<script>"+"window.onload=function(){"+"window.setTimeout(function(){"+"history.back();"+"},250);"+"};"+"</scr"+"ipt>"+"</body>"+"</html>" | 2 | top["bookmarklet-url@wallabag.org"]=""+"<!DOCTYPE html>"+"<html>"+"<head>"+"<title>bag it!</title>"+'<link rel="icon" href="{{poche_url}}tpl/img/favicon.ico" />'+"</head>"+"<body>"+"<script>"+"window.onload=function(){"+"window.setTimeout(function(){"+"history.back();"+"},250);"+"};"+"</scr"+"ipt>"+"</body>"+"</html>" |
3 | </script> \ No newline at end of file | 3 | </script> \ No newline at end of file |
diff --git a/themes/default/_head.twig b/themes/default/_head.twig index f310e420..ffbfc22e 100644..100755 --- a/themes/default/_head.twig +++ b/themes/default/_head.twig | |||
@@ -1,12 +1,13 @@ | |||
1 | <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}/themes/default/img/favicon.ico" /> | 1 | <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}themes/default/img/favicon.ico" /> |
2 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}/themes/default/img/apple-touch-icon-144x144-precomposed.png"> | 2 | <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}themes/default/img/apple-touch-icon-144x144-precomposed.png"> |
3 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}/themes/default/img/apple-touch-icon-72x72-precomposed.png"> | 3 | <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}themes/default/img/apple-touch-icon-72x72-precomposed.png"> |
4 | <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}/themes/default/img/apple-touch-icon-precomposed.png"> | 4 | <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}themes/default/img/apple-touch-icon-precomposed.png"> |
5 | <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/knacss.css" media="all"> | 5 | <link rel="stylesheet" href="{{ poche_url }}themes/default/css/knacss.css" media="all"> |
6 | <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/style.css" media="all"> | 6 | <link rel="stylesheet" href="{{ poche_url }}themes/default/css/style.css" media="all"> |
7 | <link rel="stylesheet" href="{{ poche_url }}/themes/{{ theme }}/css/style-{{ theme }}.css" media="all" title="{{ theme }} theme"> | 7 | <link rel="stylesheet" href="{{ poche_url }}themes/{{ theme }}/css/style-{{ theme }}.css" media="all" title="{{ theme }} theme"> |
8 | <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/messages.css" media="all"> | 8 | <link rel="stylesheet" href="{{ poche_url }}themes/default/css/messages.css" media="all"> |
9 | <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/print.css" media="print"> | 9 | <link rel="stylesheet" href="{{ poche_url }}themes/default/css/print.css" media="print"> |
10 | <script src="{{ poche_url }}/themes/default/js/jquery-2.0.3.min.js"></script> | 10 | <script src="{{ poche_url }}themes/default/js/jquery-2.0.3.min.js"></script> |
11 | <script src="{{ poche_url }}/themes/default/js/autoClose.js"></script> | 11 | <script src="{{ poche_url }}themes/default/js/autoClose.js"></script> |
12 | <script src="{{ poche_url }}/themes/default/js/closeMessage.js"></script> \ No newline at end of file | 12 | <script src="{{ poche_url }}themes/default/js/closeMessage.js"></script> |
13 | <script src="{{ poche_url }}themes/default/js/saveLink.js"></script> | ||
diff --git a/themes/default/_import.twig b/themes/default/_import.twig new file mode 100755 index 00000000..c59b7a15 --- /dev/null +++ b/themes/default/_import.twig | |||
@@ -0,0 +1,15 @@ | |||
1 | <script type="text/javascript"> | ||
2 | <!-- | ||
3 | $(document).ready(function() { | ||
4 | $("body").css("cursor", "wait"); | ||
5 | |||
6 | setTimeout(function(){ | ||
7 | window.location = './?import'; | ||
8 | }, {{ import.delay }} ); | ||
9 | }); | ||
10 | //--> | ||
11 | </script> | ||
12 | <div class="messages warning"> | ||
13 | <p>{% trans "Download required for " %} {{ import.recordsDownloadRequired }} {% trans "records" %}.</p> | ||
14 | <p>{% trans "Downloading next " %} {{ import.recordsUnderDownload }} {% trans "articles, please wait" %}...</p> | ||
15 | </div> | ||
diff --git a/themes/default/_menu.twig b/themes/default/_menu.twig index 55583b3d..0daa0b03 100644 --- a/themes/default/_menu.twig +++ b/themes/default/_menu.twig | |||
@@ -3,9 +3,11 @@ | |||
3 | <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li> | 3 | <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li> |
4 | <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li> | 4 | <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li> |
5 | <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li> | 5 | <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li> |
6 | <li><a href="javascript: void(null);" id="pocheit">{% trans "save a link" %}</a><span id="pocheit-arrow"></span></li> | 6 | <li><a href="javascript: void(null);" id="bagit">{% trans "save a link" %}</a><span id="bagit-arrow"></span></li> |
7 | <li><a href="javascript: void(null);" id="search">{% trans "search" %}</a><span id="search-arrow"></span></li> | ||
7 | <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li> | 8 | <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li> |
8 | <li><a href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li> | 9 | <li><a href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li> |
9 | </ul> | 10 | </ul> |
10 | {% include '_pocheit-form.twig' %} | 11 | {% include '_pocheit-form.twig' %} |
12 | {% include '_search-form.twig' %} | ||
11 | 13 | ||
diff --git a/themes/default/_pocheit-form.twig b/themes/default/_pocheit-form.twig index 13096159..8c982db0 100755 --- a/themes/default/_pocheit-form.twig +++ b/themes/default/_pocheit-form.twig | |||
@@ -1,22 +1,8 @@ | |||
1 | <div id="pocheit-form" class="messages info"> | 1 | <div id="bagit-form" class="messages info"> |
2 | <center> | 2 | <a href="javascript: void(null);" id="bagit-form-close"> </a> |
3 | <form method="get" action="index.php"> | 3 | <form method="get" action="index.php" id="bagit-form-form"> |
4 | <input required placeholder="example.com/article" class="addurl" id="plainurl" name="plainurl" type="url" /> | 4 | <input required placeholder="example.com/article" class="addurl" id="plainurl" name="plainurl" type="url" /> |
5 | <input type="submit" value="{% trans "save link!" %}" /> | 5 | <input type="submit" value="{% trans "save link!" %}" /> |
6 | <div id="add-link-result"></div> | ||
6 | </form> | 7 | </form> |
7 | </center> | ||
8 | </div> | 8 | </div> |
9 | <script type="text/javascript"> | ||
10 | $(document).ready(function() { | ||
11 | |||
12 | $("#pocheit-form").hide(); | ||
13 | |||
14 | $("#pocheit").click(function(){ | ||
15 | $("#pocheit-form").toggle(); | ||
16 | $("#pocheit").toggleClass("current"); | ||
17 | $("#pocheit-arrow").toggleClass("arrow-down"); | ||
18 | }); | ||
19 | |||
20 | |||
21 | }); | ||
22 | </script> | ||
diff --git a/themes/default/_search-form.twig b/themes/default/_search-form.twig new file mode 100644 index 00000000..74f420d0 --- /dev/null +++ b/themes/default/_search-form.twig | |||
@@ -0,0 +1,23 @@ | |||
1 | <div id="search-form" class="messages info"> | ||
2 | <form method="get" action="index.php"> | ||
3 | <p> | ||
4 | <input type="hidden" name="view" value="search"></input> | ||
5 | <label>{% trans "Search" %}</label> : <input type="text" placeholder="{% trans "Enter your search here" %}" name="search" /> | ||
6 | <input type="submit" value="{% trans "Search" %} !"></input> | ||
7 | </p> | ||
8 | </form> | ||
9 | </div> | ||
10 | <script type="text/javascript"> | ||
11 | $(document).ready(function() { | ||
12 | |||
13 | $("#search-form").hide(); | ||
14 | |||
15 | $("#search").click(function(){ | ||
16 | $("#search-form").toggle(); | ||
17 | $("#search").toggleClass("current"); | ||
18 | $("#search-arrow").toggleClass("arrow-down"); | ||
19 | }); | ||
20 | |||
21 | |||
22 | }); | ||
23 | </script> \ No newline at end of file | ||
diff --git a/themes/default/_sorting.twig b/themes/default/_sorting.twig new file mode 100755 index 00000000..ce3d38bc --- /dev/null +++ b/themes/default/_sorting.twig | |||
@@ -0,0 +1,6 @@ | |||
1 | {% if entries|length > 1 %} | ||
2 | <ul id="sort"> | ||
3 | <li><a href="./?sort=ia&view={{ view }}{% if search_term is defined %}&search={{ search_term }}{% endif %}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&view={{ view }}{% if search_term is defined %}&search={{ search_term }}{% endif %}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li> | ||
4 | <li><a href="./?sort=ta&view={{ view }}{% if search_term is defined %}&search={{ search_term }}{% endif %}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&view={{ view }}{% if search_term is defined %}&search={{ search_term }}{% endif %}&id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li> | ||
5 | </ul> | ||
6 | {% endif %} | ||
diff --git a/themes/default/_top.twig b/themes/default/_top.twig index 083be152..45806f01 100644..100755 --- a/themes/default/_top.twig +++ b/themes/default/_top.twig | |||
@@ -1,6 +1,6 @@ | |||
1 | <header class="w600p center mbm"> | 1 | <header class="w600p center mbm"> |
2 | <h1> | 2 | <h1> |
3 | {% if view == 'home' %}{% block logo %}<img src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/img/logo.svg" alt="logo poche" />{% endblock %} | 3 | {% if view == 'home' %}{% block logo %}<img width="100" height="100" src="{{ poche_url }}themes/baggy/img/logo-other_themes.png" alt="wallabag logo" />{% endblock %} |
4 | {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a> | 4 | {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a> |
5 | {% endif %} | 5 | {% endif %} |
6 | </h1> | 6 | </h1> |
diff --git a/themes/default/config.twig b/themes/default/config.twig index cd4d074d..bb39dea2 100644..100755 --- a/themes/default/config.twig +++ b/themes/default/config.twig | |||
@@ -8,10 +8,11 @@ | |||
8 | <h2>{% trans "Saving articles" %}</h2> | 8 | <h2>{% trans "Saving articles" %}</h2> |
9 | <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p> | 9 | <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p> |
10 | <ul> | 10 | <ul> |
11 | <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/poche/" title="download the firefox extension">{% trans "download the extension" %}</a></li> | 11 | <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/wallabag/" title="download the firefox extension">{% trans "download the extension" %}</a></li> |
12 | <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li> | 12 | <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li> |
13 | <li>Android: <a href="https://f-droid.org/repository/browse/?fdid=fr.gaulupeau.apps.Poche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li> | 13 | <li>Android: <a href="https://f-droid.org/app/fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li> |
14 | <li>Windows Phone: <a href="https://www.windowsphone.com/en-us/store/app/poche/334de2f0-51b5-4826-8549-a3d805a37e83" title="download the window phone application">{% trans "download the application" %}</a></li> | 14 | <li>iOS: <a href="https://itunes.apple.com/app/wallabag/id828331015?mt=8" title="download the iOS application">{% trans "download the application" %}</a></li> |
15 | <li>Windows Phone: <a href="http://www.windowsphone.com/en-us/store/app/wallabag/ff890514-348c-4d0b-9b43-153fff3f7450" title="download the window phone application">{% trans "download the application" %}</a></li> | ||
15 | <li> | 16 | <li> |
16 | <form method="get" action="index.php"> | 17 | <form method="get" action="index.php"> |
17 | <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label> | 18 | <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label> |
@@ -103,14 +104,20 @@ | |||
103 | {% endif %} | 104 | {% endif %} |
104 | 105 | ||
105 | <h2>{% trans "Import" %}</h2> | 106 | <h2>{% trans "Import" %}</h2> |
106 | <p>{% trans "Please execute the import script locally as it can take a very long time." %}</p> | 107 | <p>{% trans "You can import your Pocket, Readability, Instapaper, Wallabag or any data in appropriate json or html format." %}</p> |
107 | <p>{% trans "More info in the official documentation:" %} <a href="http://doc.wallabag.org/doku.php?id=users:migrate">wallabag.org</a></p> | 108 | <p>{% trans "Please select export file on your computer and press \"Import\" button below.<br>Wallabag will parse your file, insert all URLs and start fetching of articles if required.<br>Fetching process is controlled by two constants in your config file: IMPORT_LIMIT (how many articles are fetched at once) and IMPORT_DELAY (delay between fetch of next batch of articles)." %}</p> |
108 | <ul> | 109 | <form method="post" action="?import" name="uploadfile" enctype="multipart/form-data"> |
109 | <li><a href="./?import&from=pocket">{% trans "Import from Pocket" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCKET_FILE')) }}</li> | 110 | <fieldset class="w500p"> |
110 | <li><a href="./?import&from=readability">{% trans "Import from Readability" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('READABILITY_FILE')) }}</li> | 111 | <div class="row"> |
111 | <li><a href="./?import&from=instapaper">{% trans "Import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li> | 112 | <label class="col w150p" for="file">{% trans "File:" %}</label> |
112 | <li><a href="./?import&from=poche">{% trans "Import from wallabag" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCHE_FILE')) }}</li> | 113 | <input class="col" type="file" id="file" name="file" tabindex="4"> |
113 | </ul> | 114 | </div> |
115 | <div class="row mts txtcenter"> | ||
116 | <button class="bouton" type="submit" tabindex="4">{% trans "Import" %}</button> | ||
117 | </div> | ||
118 | </fieldset> | ||
119 | </form> | ||
120 | <p><a href="?import">{% trans "You can click here to fetch content for articles with no content." %}</a></p> | ||
114 | 121 | ||
115 | <h2>{% trans "Export your wallabag data" %}</h2> | 122 | <h2>{% trans "Export your wallabag data" %}</h2> |
116 | {% if constant('STORAGE') == 'sqlite' %} | 123 | {% if constant('STORAGE') == 'sqlite' %} |
diff --git a/themes/default/css/images/animated-overlay.gif b/themes/default/css/images/animated-overlay.gif new file mode 100644 index 00000000..d441f75e --- /dev/null +++ b/themes/default/css/images/animated-overlay.gif | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_flat_0_aaaaaa_40x100.png b/themes/default/css/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 00000000..9f10cb65 --- /dev/null +++ b/themes/default/css/images/ui-bg_flat_0_aaaaaa_40x100.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_flat_75_ffffff_40x100.png b/themes/default/css/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 00000000..b89b914b --- /dev/null +++ b/themes/default/css/images/ui-bg_flat_75_ffffff_40x100.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/themes/default/css/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 00000000..780d3ffd --- /dev/null +++ b/themes/default/css/images/ui-bg_glass_55_fbf9ee_1x400.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_glass_65_ffffff_1x400.png b/themes/default/css/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 00000000..da53255b --- /dev/null +++ b/themes/default/css/images/ui-bg_glass_65_ffffff_1x400.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_glass_75_dadada_1x400.png b/themes/default/css/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 00000000..f6306608 --- /dev/null +++ b/themes/default/css/images/ui-bg_glass_75_dadada_1x400.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_glass_75_e6e6e6_1x400.png b/themes/default/css/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 00000000..7d347065 --- /dev/null +++ b/themes/default/css/images/ui-bg_glass_75_e6e6e6_1x400.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_glass_95_fef1ec_1x400.png b/themes/default/css/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 00000000..533c4900 --- /dev/null +++ b/themes/default/css/images/ui-bg_glass_95_fef1ec_1x400.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/themes/default/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 00000000..bf3a9481 --- /dev/null +++ b/themes/default/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-icons_222222_256x240.png b/themes/default/css/images/ui-icons_222222_256x240.png new file mode 100644 index 00000000..c1cb1170 --- /dev/null +++ b/themes/default/css/images/ui-icons_222222_256x240.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-icons_2e83ff_256x240.png b/themes/default/css/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 00000000..84b601bf --- /dev/null +++ b/themes/default/css/images/ui-icons_2e83ff_256x240.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-icons_454545_256x240.png b/themes/default/css/images/ui-icons_454545_256x240.png new file mode 100644 index 00000000..b6db1acd --- /dev/null +++ b/themes/default/css/images/ui-icons_454545_256x240.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-icons_888888_256x240.png b/themes/default/css/images/ui-icons_888888_256x240.png new file mode 100644 index 00000000..feea0e20 --- /dev/null +++ b/themes/default/css/images/ui-icons_888888_256x240.png | |||
Binary files differ | |||
diff --git a/themes/default/css/images/ui-icons_cd0a0a_256x240.png b/themes/default/css/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 00000000..ed5b6b09 --- /dev/null +++ b/themes/default/css/images/ui-icons_cd0a0a_256x240.png | |||
Binary files differ | |||
diff --git a/themes/default/css/jquery-ui-1.10.4.custom.css b/themes/default/css/jquery-ui-1.10.4.custom.css new file mode 100644 index 00000000..5690172f --- /dev/null +++ b/themes/default/css/jquery-ui-1.10.4.custom.css | |||
@@ -0,0 +1,560 @@ | |||
1 | /*! jQuery UI - v1.10.4 - 2014-03-09 | ||
2 | * http://jqueryui.com | ||
3 | * Includes: jquery.ui.core.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css | ||
4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px | ||
5 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | ||
6 | |||
7 | /* Layout helpers | ||
8 | ----------------------------------*/ | ||
9 | .ui-helper-hidden { | ||
10 | display: none; | ||
11 | } | ||
12 | .ui-helper-hidden-accessible { | ||
13 | border: 0; | ||
14 | clip: rect(0 0 0 0); | ||
15 | height: 1px; | ||
16 | margin: -1px; | ||
17 | overflow: hidden; | ||
18 | padding: 0; | ||
19 | position: absolute; | ||
20 | width: 1px; | ||
21 | } | ||
22 | .ui-helper-reset { | ||
23 | margin: 0; | ||
24 | padding: 0; | ||
25 | border: 0; | ||
26 | outline: 0; | ||
27 | line-height: 1.3; | ||
28 | text-decoration: none; | ||
29 | font-size: 100%; | ||
30 | list-style: none; | ||
31 | } | ||
32 | .ui-helper-clearfix:before, | ||
33 | .ui-helper-clearfix:after { | ||
34 | content: ""; | ||
35 | display: table; | ||
36 | border-collapse: collapse; | ||
37 | } | ||
38 | .ui-helper-clearfix:after { | ||
39 | clear: both; | ||
40 | } | ||
41 | .ui-helper-clearfix { | ||
42 | min-height: 0; /* support: IE7 */ | ||
43 | } | ||
44 | .ui-helper-zfix { | ||
45 | width: 100%; | ||
46 | height: 100%; | ||
47 | top: 0; | ||
48 | left: 0; | ||
49 | position: absolute; | ||
50 | opacity: 0; | ||
51 | filter:Alpha(Opacity=0); | ||
52 | } | ||
53 | |||
54 | .ui-front { | ||
55 | z-index: 100; | ||
56 | } | ||
57 | |||
58 | |||
59 | /* Interaction Cues | ||
60 | ----------------------------------*/ | ||
61 | .ui-state-disabled { | ||
62 | cursor: default !important; | ||
63 | } | ||
64 | |||
65 | |||
66 | /* Icons | ||
67 | ----------------------------------*/ | ||
68 | |||
69 | /* states and images */ | ||
70 | .ui-icon { | ||
71 | display: block; | ||
72 | text-indent: -99999px; | ||
73 | overflow: hidden; | ||
74 | background-repeat: no-repeat; | ||
75 | } | ||
76 | |||
77 | |||
78 | /* Misc visuals | ||
79 | ----------------------------------*/ | ||
80 | |||
81 | /* Overlays */ | ||
82 | .ui-widget-overlay { | ||
83 | position: fixed; | ||
84 | top: 0; | ||
85 | left: 0; | ||
86 | width: 100%; | ||
87 | height: 100%; | ||
88 | } | ||
89 | .ui-autocomplete { | ||
90 | position: absolute; | ||
91 | top: 0; | ||
92 | left: 0; | ||
93 | cursor: default; | ||
94 | } | ||
95 | .ui-menu { | ||
96 | list-style: none; | ||
97 | padding: 2px; | ||
98 | margin: 0; | ||
99 | display: block; | ||
100 | outline: none; | ||
101 | } | ||
102 | .ui-menu .ui-menu { | ||
103 | margin-top: -3px; | ||
104 | position: absolute; | ||
105 | } | ||
106 | .ui-menu .ui-menu-item { | ||
107 | margin: 0; | ||
108 | padding: 0; | ||
109 | width: 100%; | ||
110 | /* support: IE10, see #8844 */ | ||
111 | list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); | ||
112 | } | ||
113 | .ui-menu .ui-menu-divider { | ||
114 | margin: 5px -2px 5px -2px; | ||
115 | height: 0; | ||
116 | font-size: 0; | ||
117 | line-height: 0; | ||
118 | border-width: 1px 0 0 0; | ||
119 | } | ||
120 | .ui-menu .ui-menu-item a { | ||
121 | text-decoration: none; | ||
122 | display: block; | ||
123 | padding: 2px .4em; | ||
124 | line-height: 1.5; | ||
125 | min-height: 0; /* support: IE7 */ | ||
126 | font-weight: normal; | ||
127 | } | ||
128 | .ui-menu .ui-menu-item a.ui-state-focus, | ||
129 | .ui-menu .ui-menu-item a.ui-state-active { | ||
130 | font-weight: normal; | ||
131 | margin: -1px; | ||
132 | } | ||
133 | |||
134 | .ui-menu .ui-state-disabled { | ||
135 | font-weight: normal; | ||
136 | margin: .4em 0 .2em; | ||
137 | line-height: 1.5; | ||
138 | } | ||
139 | .ui-menu .ui-state-disabled a { | ||
140 | cursor: default; | ||
141 | } | ||
142 | |||
143 | /* icon support */ | ||
144 | .ui-menu-icons { | ||
145 | position: relative; | ||
146 | } | ||
147 | .ui-menu-icons .ui-menu-item a { | ||
148 | position: relative; | ||
149 | padding-left: 2em; | ||
150 | } | ||
151 | |||
152 | /* left-aligned */ | ||
153 | .ui-menu .ui-icon { | ||
154 | position: absolute; | ||
155 | top: .2em; | ||
156 | left: .2em; | ||
157 | } | ||
158 | |||
159 | /* right-aligned */ | ||
160 | .ui-menu .ui-menu-icon { | ||
161 | position: static; | ||
162 | float: right; | ||
163 | } | ||
164 | |||
165 | /* Component containers | ||
166 | ----------------------------------*/ | ||
167 | .ui-widget { | ||
168 | font-family: Verdana,Arial,sans-serif; | ||
169 | font-size: 1.1em; | ||
170 | } | ||
171 | .ui-widget .ui-widget { | ||
172 | font-size: 1em; | ||
173 | } | ||
174 | .ui-widget input, | ||
175 | .ui-widget select, | ||
176 | .ui-widget textarea, | ||
177 | .ui-widget button { | ||
178 | font-family: Verdana,Arial,sans-serif; | ||
179 | font-size: 1em; | ||
180 | } | ||
181 | .ui-widget-content { | ||
182 | border: 1px solid #aaaaaa; | ||
183 | background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; | ||
184 | color: #222222; | ||
185 | } | ||
186 | .ui-widget-content a { | ||
187 | color: #222222; | ||
188 | } | ||
189 | .ui-widget-header { | ||
190 | border: 1px solid #aaaaaa; | ||
191 | background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; | ||
192 | color: #222222; | ||
193 | font-weight: bold; | ||
194 | } | ||
195 | .ui-widget-header a { | ||
196 | color: #222222; | ||
197 | } | ||
198 | |||
199 | /* Interaction states | ||
200 | ----------------------------------*/ | ||
201 | .ui-state-default, | ||
202 | .ui-widget-content .ui-state-default, | ||
203 | .ui-widget-header .ui-state-default { | ||
204 | border: 1px solid #d3d3d3; | ||
205 | background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; | ||
206 | font-weight: normal; | ||
207 | color: #555555; | ||
208 | } | ||
209 | .ui-state-default a, | ||
210 | .ui-state-default a:link, | ||
211 | .ui-state-default a:visited { | ||
212 | color: #555555; | ||
213 | text-decoration: none; | ||
214 | } | ||
215 | .ui-state-hover, | ||
216 | .ui-widget-content .ui-state-hover, | ||
217 | .ui-widget-header .ui-state-hover, | ||
218 | .ui-state-focus, | ||
219 | .ui-widget-content .ui-state-focus, | ||
220 | .ui-widget-header .ui-state-focus { | ||
221 | border: 1px solid #999999; | ||
222 | background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; | ||
223 | font-weight: normal; | ||
224 | color: #212121; | ||
225 | } | ||
226 | .ui-state-hover a, | ||
227 | .ui-state-hover a:hover, | ||
228 | .ui-state-hover a:link, | ||
229 | .ui-state-hover a:visited, | ||
230 | .ui-state-focus a, | ||
231 | .ui-state-focus a:hover, | ||
232 | .ui-state-focus a:link, | ||
233 | .ui-state-focus a:visited { | ||
234 | color: #212121; | ||
235 | text-decoration: none; | ||
236 | } | ||
237 | .ui-state-active, | ||
238 | .ui-widget-content .ui-state-active, | ||
239 | .ui-widget-header .ui-state-active { | ||
240 | border: 1px solid #aaaaaa; | ||
241 | background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; | ||
242 | font-weight: normal; | ||
243 | color: #212121; | ||
244 | } | ||
245 | .ui-state-active a, | ||
246 | .ui-state-active a:link, | ||
247 | .ui-state-active a:visited { | ||
248 | color: #212121; | ||
249 | text-decoration: none; | ||
250 | } | ||
251 | |||
252 | /* Interaction Cues | ||
253 | ----------------------------------*/ | ||
254 | .ui-state-highlight, | ||
255 | .ui-widget-content .ui-state-highlight, | ||
256 | .ui-widget-header .ui-state-highlight { | ||
257 | border: 1px solid #fcefa1; | ||
258 | background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; | ||
259 | color: #363636; | ||
260 | } | ||
261 | .ui-state-highlight a, | ||
262 | .ui-widget-content .ui-state-highlight a, | ||
263 | .ui-widget-header .ui-state-highlight a { | ||
264 | color: #363636; | ||
265 | } | ||
266 | .ui-state-error, | ||
267 | .ui-widget-content .ui-state-error, | ||
268 | .ui-widget-header .ui-state-error { | ||
269 | border: 1px solid #cd0a0a; | ||
270 | background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; | ||
271 | color: #cd0a0a; | ||
272 | } | ||
273 | .ui-state-error a, | ||
274 | .ui-widget-content .ui-state-error a, | ||
275 | .ui-widget-header .ui-state-error a { | ||
276 | color: #cd0a0a; | ||
277 | } | ||
278 | .ui-state-error-text, | ||
279 | .ui-widget-content .ui-state-error-text, | ||
280 | .ui-widget-header .ui-state-error-text { | ||
281 | color: #cd0a0a; | ||
282 | } | ||
283 | .ui-priority-primary, | ||
284 | .ui-widget-content .ui-priority-primary, | ||
285 | .ui-widget-header .ui-priority-primary { | ||
286 | font-weight: bold; | ||
287 | } | ||
288 | .ui-priority-secondary, | ||
289 | .ui-widget-content .ui-priority-secondary, | ||
290 | .ui-widget-header .ui-priority-secondary { | ||
291 | opacity: .7; | ||
292 | filter:Alpha(Opacity=70); | ||
293 | font-weight: normal; | ||
294 | } | ||
295 | .ui-state-disabled, | ||
296 | .ui-widget-content .ui-state-disabled, | ||
297 | .ui-widget-header .ui-state-disabled { | ||
298 | opacity: .35; | ||
299 | filter:Alpha(Opacity=35); | ||
300 | background-image: none; | ||
301 | } | ||
302 | .ui-state-disabled .ui-icon { | ||
303 | filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ | ||
304 | } | ||
305 | |||
306 | /* Icons | ||
307 | ----------------------------------*/ | ||
308 | |||
309 | /* states and images */ | ||
310 | .ui-icon { | ||
311 | width: 16px; | ||
312 | height: 16px; | ||
313 | } | ||
314 | .ui-icon, | ||
315 | .ui-widget-content .ui-icon { | ||
316 | background-image: url(images/ui-icons_222222_256x240.png); | ||
317 | } | ||
318 | .ui-widget-header .ui-icon { | ||
319 | background-image: url(images/ui-icons_222222_256x240.png); | ||
320 | } | ||
321 | .ui-state-default .ui-icon { | ||
322 | background-image: url(images/ui-icons_888888_256x240.png); | ||
323 | } | ||
324 | .ui-state-hover .ui-icon, | ||
325 | .ui-state-focus .ui-icon { | ||
326 | background-image: url(images/ui-icons_454545_256x240.png); | ||
327 | } | ||
328 | .ui-state-active .ui-icon { | ||
329 | background-image: url(images/ui-icons_454545_256x240.png); | ||
330 | } | ||
331 | .ui-state-highlight .ui-icon { | ||
332 | background-image: url(images/ui-icons_2e83ff_256x240.png); | ||
333 | } | ||
334 | .ui-state-error .ui-icon, | ||
335 | .ui-state-error-text .ui-icon { | ||
336 | background-image: url(images/ui-icons_cd0a0a_256x240.png); | ||
337 | } | ||
338 | |||
339 | /* positioning */ | ||
340 | .ui-icon-blank { background-position: 16px 16px; } | ||
341 | .ui-icon-carat-1-n { background-position: 0 0; } | ||
342 | .ui-icon-carat-1-ne { background-position: -16px 0; } | ||
343 | .ui-icon-carat-1-e { background-position: -32px 0; } | ||
344 | .ui-icon-carat-1-se { background-position: -48px 0; } | ||
345 | .ui-icon-carat-1-s { background-position: -64px 0; } | ||
346 | .ui-icon-carat-1-sw { background-position: -80px 0; } | ||
347 | .ui-icon-carat-1-w { background-position: -96px 0; } | ||
348 | .ui-icon-carat-1-nw { background-position: -112px 0; } | ||
349 | .ui-icon-carat-2-n-s { background-position: -128px 0; } | ||
350 | .ui-icon-carat-2-e-w { background-position: -144px 0; } | ||
351 | .ui-icon-triangle-1-n { background-position: 0 -16px; } | ||
352 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } | ||
353 | .ui-icon-triangle-1-e { background-position: -32px -16px; } | ||
354 | .ui-icon-triangle-1-se { background-position: -48px -16px; } | ||
355 | .ui-icon-triangle-1-s { background-position: -64px -16px; } | ||
356 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } | ||
357 | .ui-icon-triangle-1-w { background-position: -96px -16px; } | ||
358 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } | ||
359 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } | ||
360 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } | ||
361 | .ui-icon-arrow-1-n { background-position: 0 -32px; } | ||
362 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } | ||
363 | .ui-icon-arrow-1-e { background-position: -32px -32px; } | ||
364 | .ui-icon-arrow-1-se { background-position: -48px -32px; } | ||
365 | .ui-icon-arrow-1-s { background-position: -64px -32px; } | ||
366 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } | ||
367 | .ui-icon-arrow-1-w { background-position: -96px -32px; } | ||
368 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } | ||
369 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } | ||
370 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } | ||
371 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } | ||
372 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } | ||
373 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } | ||
374 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } | ||
375 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } | ||
376 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } | ||
377 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } | ||
378 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } | ||
379 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } | ||
380 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } | ||
381 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } | ||
382 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } | ||
383 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } | ||
384 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } | ||
385 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } | ||
386 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } | ||
387 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } | ||
388 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } | ||
389 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } | ||
390 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } | ||
391 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } | ||
392 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } | ||
393 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } | ||
394 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } | ||
395 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } | ||
396 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } | ||
397 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } | ||
398 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } | ||
399 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } | ||
400 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } | ||
401 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } | ||
402 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } | ||
403 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } | ||
404 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } | ||
405 | .ui-icon-arrow-4 { background-position: 0 -80px; } | ||
406 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } | ||
407 | .ui-icon-extlink { background-position: -32px -80px; } | ||
408 | .ui-icon-newwin { background-position: -48px -80px; } | ||
409 | .ui-icon-refresh { background-position: -64px -80px; } | ||
410 | .ui-icon-shuffle { background-position: -80px -80px; } | ||
411 | .ui-icon-transfer-e-w { background-position: -96px -80px; } | ||
412 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } | ||
413 | .ui-icon-folder-collapsed { background-position: 0 -96px; } | ||
414 | .ui-icon-folder-open { background-position: -16px -96px; } | ||
415 | .ui-icon-document { background-position: -32px -96px; } | ||
416 | .ui-icon-document-b { background-position: -48px -96px; } | ||
417 | .ui-icon-note { background-position: -64px -96px; } | ||
418 | .ui-icon-mail-closed { background-position: -80px -96px; } | ||
419 | .ui-icon-mail-open { background-position: -96px -96px; } | ||
420 | .ui-icon-suitcase { background-position: -112px -96px; } | ||
421 | .ui-icon-comment { background-position: -128px -96px; } | ||
422 | .ui-icon-person { background-position: -144px -96px; } | ||
423 | .ui-icon-print { background-position: -160px -96px; } | ||
424 | .ui-icon-trash { background-position: -176px -96px; } | ||
425 | .ui-icon-locked { background-position: -192px -96px; } | ||
426 | .ui-icon-unlocked { background-position: -208px -96px; } | ||
427 | .ui-icon-bookmark { background-position: -224px -96px; } | ||
428 | .ui-icon-tag { background-position: -240px -96px; } | ||
429 | .ui-icon-home { background-position: 0 -112px; } | ||
430 | .ui-icon-flag { background-position: -16px -112px; } | ||
431 | .ui-icon-calendar { background-position: -32px -112px; } | ||
432 | .ui-icon-cart { background-position: -48px -112px; } | ||
433 | .ui-icon-pencil { background-position: -64px -112px; } | ||
434 | .ui-icon-clock { background-position: -80px -112px; } | ||
435 | .ui-icon-disk { background-position: -96px -112px; } | ||
436 | .ui-icon-calculator { background-position: -112px -112px; } | ||
437 | .ui-icon-zoomin { background-position: -128px -112px; } | ||
438 | .ui-icon-zoomout { background-position: -144px -112px; } | ||
439 | .ui-icon-search { background-position: -160px -112px; } | ||
440 | .ui-icon-wrench { background-position: -176px -112px; } | ||
441 | .ui-icon-gear { background-position: -192px -112px; } | ||
442 | .ui-icon-heart { background-position: -208px -112px; } | ||
443 | .ui-icon-star { background-position: -224px -112px; } | ||
444 | .ui-icon-link { background-position: -240px -112px; } | ||
445 | .ui-icon-cancel { background-position: 0 -128px; } | ||
446 | .ui-icon-plus { background-position: -16px -128px; } | ||
447 | .ui-icon-plusthick { background-position: -32px -128px; } | ||
448 | .ui-icon-minus { background-position: -48px -128px; } | ||
449 | .ui-icon-minusthick { background-position: -64px -128px; } | ||
450 | .ui-icon-close { background-position: -80px -128px; } | ||
451 | .ui-icon-closethick { background-position: -96px -128px; } | ||
452 | .ui-icon-key { background-position: -112px -128px; } | ||
453 | .ui-icon-lightbulb { background-position: -128px -128px; } | ||
454 | .ui-icon-scissors { background-position: -144px -128px; } | ||
455 | .ui-icon-clipboard { background-position: -160px -128px; } | ||
456 | .ui-icon-copy { background-position: -176px -128px; } | ||
457 | .ui-icon-contact { background-position: -192px -128px; } | ||
458 | .ui-icon-image { background-position: -208px -128px; } | ||
459 | .ui-icon-video { background-position: -224px -128px; } | ||
460 | .ui-icon-script { background-position: -240px -128px; } | ||
461 | .ui-icon-alert { background-position: 0 -144px; } | ||
462 | .ui-icon-info { background-position: -16px -144px; } | ||
463 | .ui-icon-notice { background-position: -32px -144px; } | ||
464 | .ui-icon-help { background-position: -48px -144px; } | ||
465 | .ui-icon-check { background-position: -64px -144px; } | ||
466 | .ui-icon-bullet { background-position: -80px -144px; } | ||
467 | .ui-icon-radio-on { background-position: -96px -144px; } | ||
468 | .ui-icon-radio-off { background-position: -112px -144px; } | ||
469 | .ui-icon-pin-w { background-position: -128px -144px; } | ||
470 | .ui-icon-pin-s { background-position: -144px -144px; } | ||
471 | .ui-icon-play { background-position: 0 -160px; } | ||
472 | .ui-icon-pause { background-position: -16px -160px; } | ||
473 | .ui-icon-seek-next { background-position: -32px -160px; } | ||
474 | .ui-icon-seek-prev { background-position: -48px -160px; } | ||
475 | .ui-icon-seek-end { background-position: -64px -160px; } | ||
476 | .ui-icon-seek-start { background-position: -80px -160px; } | ||
477 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ | ||
478 | .ui-icon-seek-first { background-position: -80px -160px; } | ||
479 | .ui-icon-stop { background-position: -96px -160px; } | ||
480 | .ui-icon-eject { background-position: -112px -160px; } | ||
481 | .ui-icon-volume-off { background-position: -128px -160px; } | ||
482 | .ui-icon-volume-on { background-position: -144px -160px; } | ||
483 | .ui-icon-power { background-position: 0 -176px; } | ||
484 | .ui-icon-signal-diag { background-position: -16px -176px; } | ||
485 | .ui-icon-signal { background-position: -32px -176px; } | ||
486 | .ui-icon-battery-0 { background-position: -48px -176px; } | ||
487 | .ui-icon-battery-1 { background-position: -64px -176px; } | ||
488 | .ui-icon-battery-2 { background-position: -80px -176px; } | ||
489 | .ui-icon-battery-3 { background-position: -96px -176px; } | ||
490 | .ui-icon-circle-plus { background-position: 0 -192px; } | ||
491 | .ui-icon-circle-minus { background-position: -16px -192px; } | ||
492 | .ui-icon-circle-close { background-position: -32px -192px; } | ||
493 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } | ||
494 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } | ||
495 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } | ||
496 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } | ||
497 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } | ||
498 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } | ||
499 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } | ||
500 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } | ||
501 | .ui-icon-circle-zoomin { background-position: -176px -192px; } | ||
502 | .ui-icon-circle-zoomout { background-position: -192px -192px; } | ||
503 | .ui-icon-circle-check { background-position: -208px -192px; } | ||
504 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } | ||
505 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } | ||
506 | .ui-icon-circlesmall-close { background-position: -32px -208px; } | ||
507 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } | ||
508 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } | ||
509 | .ui-icon-squaresmall-close { background-position: -80px -208px; } | ||
510 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } | ||
511 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } | ||
512 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } | ||
513 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } | ||
514 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } | ||
515 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } | ||
516 | |||
517 | |||
518 | /* Misc visuals | ||
519 | ----------------------------------*/ | ||
520 | |||
521 | /* Corner radius */ | ||
522 | .ui-corner-all, | ||
523 | .ui-corner-top, | ||
524 | .ui-corner-left, | ||
525 | .ui-corner-tl { | ||
526 | border-top-left-radius: 4px; | ||
527 | } | ||
528 | .ui-corner-all, | ||
529 | .ui-corner-top, | ||
530 | .ui-corner-right, | ||
531 | .ui-corner-tr { | ||
532 | border-top-right-radius: 4px; | ||
533 | } | ||
534 | .ui-corner-all, | ||
535 | .ui-corner-bottom, | ||
536 | .ui-corner-left, | ||
537 | .ui-corner-bl { | ||
538 | border-bottom-left-radius: 4px; | ||
539 | } | ||
540 | .ui-corner-all, | ||
541 | .ui-corner-bottom, | ||
542 | .ui-corner-right, | ||
543 | .ui-corner-br { | ||
544 | border-bottom-right-radius: 4px; | ||
545 | } | ||
546 | |||
547 | /* Overlays */ | ||
548 | .ui-widget-overlay { | ||
549 | background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; | ||
550 | opacity: .3; | ||
551 | filter: Alpha(Opacity=30); | ||
552 | } | ||
553 | .ui-widget-shadow { | ||
554 | margin: -8px 0 0 -8px; | ||
555 | padding: 8px; | ||
556 | background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; | ||
557 | opacity: .3; | ||
558 | filter: Alpha(Opacity=30); | ||
559 | border-radius: 8px; | ||
560 | } | ||
diff --git a/themes/default/css/jquery-ui-1.10.4.custom.min.css b/themes/default/css/jquery-ui-1.10.4.custom.min.css new file mode 100644 index 00000000..4dba92a8 --- /dev/null +++ b/themes/default/css/jquery-ui-1.10.4.custom.min.css | |||
@@ -0,0 +1,7 @@ | |||
1 | /*! jQuery UI - v1.10.4 - 2014-03-09 | ||
2 | * http://jqueryui.com | ||
3 | * Includes: jquery.ui.core.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css | ||
4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px | ||
5 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | ||
6 | |||
7 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file | ||
diff --git a/themes/default/css/style.css b/themes/default/css/style.css index 28675907..e536ac6b 100644..100755 --- a/themes/default/css/style.css +++ b/themes/default/css/style.css | |||
@@ -347,3 +347,58 @@ a.reading-time span { | |||
347 | margin-left: -30px; | 347 | margin-left: -30px; |
348 | } | 348 | } |
349 | 349 | ||
350 | .two-column { | ||
351 | display: block; | ||
352 | width: 50%; | ||
353 | paddig-right: 20px; | ||
354 | float: left; | ||
355 | vertical-align: top; | ||
356 | } | ||
357 | |||
358 | |||
359 | /* ========================================================================== | ||
360 | "save a link" popup div related styles | ||
361 | ========================================================================== */ | ||
362 | |||
363 | #bagit-form { | ||
364 | display: none; | ||
365 | padding-left: 30px; | ||
366 | width: 450px; | ||
367 | |||
368 | } | ||
369 | |||
370 | a#bagit-form-close { | ||
371 | color: #FFF; | ||
372 | display: inline-block; | ||
373 | float: right; | ||
374 | background: url("../img/messages/close.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0); | ||
375 | height: 16px; | ||
376 | margin: -14px -8px 0 0; | ||
377 | width: 16px; | ||
378 | text-decoration: none; | ||
379 | } | ||
380 | |||
381 | |||
382 | .add-to-wallabag-link-after { | ||
383 | background-color: #000; | ||
384 | color: #fff; | ||
385 | padding: 0 4px 1px 3px; | ||
386 | font-weight: bold; | ||
387 | font-size: 0.7em; | ||
388 | border-radius: 4px; | ||
389 | } | ||
390 | .add-to-wallabag-link-after:hover, .add-to-wallabag-link-after:active { | ||
391 | color: #fff; | ||
392 | } | ||
393 | .add-to-wallabag-link-after:visited { | ||
394 | color: #999; | ||
395 | } | ||
396 | |||
397 | #add-link-result { | ||
398 | display: inline; | ||
399 | padding-left: 10px; | ||
400 | } | ||
401 | |||
402 | .opacity03 { | ||
403 | /*opacity: 0.3;*/ | ||
404 | } | ||
diff --git a/themes/default/edit-tags.twig b/themes/default/edit-tags.twig index 83f04aa0..bd498d26 100644..100755 --- a/themes/default/edit-tags.twig +++ b/themes/default/edit-tags.twig | |||
@@ -5,6 +5,10 @@ | |||
5 | {% endblock %} | 5 | {% endblock %} |
6 | {% block content %} | 6 | {% block content %} |
7 | 7 | ||
8 | <script src="{{ poche_url }}themes/default/js/jquery-ui-1.10.4.custom.min.js"></script> | ||
9 | <script src="{{ poche_url }}themes/default/js/autoCompleteTags.js"></script> | ||
10 | <link rel="stylesheet" href="{{ poche_url }}themes/default/css/jquery-ui-1.10.4.custom.min.css" media="all"> | ||
11 | |||
8 | <div id="article"> | 12 | <div id="article"> |
9 | <header class="mbm"> | 13 | <header class="mbm"> |
10 | <h1>{{ entry.title|raw }}</h1> | 14 | <h1>{{ entry.title|raw }}</h1> |
@@ -17,13 +21,15 @@ no tags | |||
17 | <ul> | 21 | <ul> |
18 | {% for tag in tags %}<li>{{ tag.value }} <a href="./?action=remove_tag&tag_id={{ tag.id }}&id={{ entry_id }}">✘</a></li>{% endfor %} | 22 | {% for tag in tags %}<li>{{ tag.value }} <a href="./?action=remove_tag&tag_id={{ tag.id }}&id={{ entry_id }}">✘</a></li>{% endfor %} |
19 | </ul> | 23 | </ul> |
20 | <form method="post" action="./?action=add_tag"> | 24 | <form method="post" action="./?action=add_tag" id="editTags"> |
21 | <input type="hidden" name="entry_id" value="{{ entry_id }}" /> | 25 | <input type="hidden" name="entry_id" value="{{ entry_id }}" /> |
22 | <label for="value">Add tags: </label> | 26 | <label for="value">Add tags: </label> |
23 | <input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" /> | 27 | <input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" /> |
24 | <input type="submit" value="Tag" /> | 28 | <input type="submit" value="Tag" /> |
25 | <p>{% trans "You can enter multiple tags, separated by commas." %}</p> | 29 | <p>{% trans "Start typing for auto complete." %}<br> |
30 | {% trans "You can enter multiple tags, separated by commas." %}</p> | ||
26 | 31 | ||
27 | </form> | 32 | </form> |
33 | <br> | ||
28 | <a href="./?view=view&id={{ entry_id }}">« {% trans "return to article" %}</a> | 34 | <a href="./?view=view&id={{ entry_id }}">« {% trans "return to article" %}</a> |
29 | {% endblock %} | 35 | {% endblock %} |
diff --git a/themes/default/home.twig b/themes/default/home.twig index 165fecc6..d6cb98e8 100644..100755 --- a/themes/default/home.twig +++ b/themes/default/home.twig | |||
@@ -12,14 +12,15 @@ | |||
12 | {% include '_menu.twig' %} | 12 | {% include '_menu.twig' %} |
13 | {% endblock %} | 13 | {% endblock %} |
14 | {% block precontent %} | 14 | {% block precontent %} |
15 | {% if entries|length > 1 %} | 15 | |
16 | <ul id="sort"> | 16 | {% include '_sorting.twig' %} |
17 | <li><a href="./?sort=ia&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li> | ||
18 | <li><a href="./?sort=ta&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&view={{ view }}&id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li> | ||
19 | </ul> | ||
20 | {% endif %} | ||
21 | {% endblock %} | 17 | {% endblock %} |
22 | {% block content %} | 18 | {% block content %} |
19 | |||
20 | {% if includeImport %} | ||
21 | {% include '_import.twig' %} | ||
22 | {% endif %} | ||
23 | |||
23 | {% if tag %} | 24 | {% if tag %} |
24 | <h3>{% trans "Tag" %}: <b>{{ tag.value }}</b></h3> | 25 | <h3>{% trans "Tag" %}: <b>{{ tag.value }}</b></h3> |
25 | {% endif %} | 26 | {% endif %} |
@@ -30,9 +31,15 @@ | |||
30 | {% block pager %} | 31 | {% block pager %} |
31 | {% if nb_results > 1 %} | 32 | {% if nb_results > 1 %} |
32 | <div class="results"> | 33 | <div class="results"> |
33 | <div class="nb-results">{{ nb_results }} {% trans "results" %}</div> | 34 | <div class="nb-results">{{ nb_results }} {% trans "results" %}{% if search_term is defined %}{% trans " found for « " %} {{ search_term }} »{% endif %}</div> |
34 | {{ page_links | raw }} | 35 | {{ page_links | raw }} |
35 | </div> | 36 | </div> |
37 | {% elseif nb_results == 1 %} | ||
38 | {% if search_term is defined %} | ||
39 | <div class="results"> | ||
40 | <div class="nb-results">{% trans "Only one result found for " %} « {{ search_term }} »</div> | ||
41 | </div> | ||
42 | {% endif %} | ||
36 | {% endif %} | 43 | {% endif %} |
37 | {% endblock %} | 44 | {% endblock %} |
38 | {% for entry in entries %} | 45 | {% for entry in entries %} |
diff --git a/themes/default/js/autoCompleteTags.js b/themes/default/js/autoCompleteTags.js new file mode 100755 index 00000000..90bc982c --- /dev/null +++ b/themes/default/js/autoCompleteTags.js | |||
@@ -0,0 +1,47 @@ | |||
1 | jQuery(function($) { | ||
2 | |||
3 | function split( val ) { | ||
4 | return val.split( /,\s*/ ); | ||
5 | } | ||
6 | function extractLast( term ) { | ||
7 | return split( term ).pop(); | ||
8 | } | ||
9 | |||
10 | |||
11 | $("#value").bind("keydown", function(event) { | ||
12 | if (event.keyCode === $.ui.keyCode.TAB && $(this).data("ui-autocomplete").menu.active) { | ||
13 | event.preventDefault(); | ||
14 | } | ||
15 | }).autocomplete({ | ||
16 | source : function(request, response) { | ||
17 | $.getJSON("./?view=tags", { | ||
18 | term : extractLast(request.term), | ||
19 | //id: $(':hidden#entry_id').val() | ||
20 | }, response); | ||
21 | }, | ||
22 | search : function() { | ||
23 | // custom minLength | ||
24 | var term = extractLast(this.value); | ||
25 | if (term.length < 1) { | ||
26 | return false; | ||
27 | } | ||
28 | }, | ||
29 | focus : function() { | ||
30 | // prevent value inserted on focus | ||
31 | return false; | ||
32 | }, | ||
33 | select : function(event, ui) { | ||
34 | var terms = split(this.value); | ||
35 | // remove the current input | ||
36 | terms.pop(); | ||
37 | // add the selected item | ||
38 | terms.push(ui.item.value); | ||
39 | // add placeholder to get the comma-and-space at the end | ||
40 | terms.push(""); | ||
41 | this.value = terms.join(", "); | ||
42 | return false; | ||
43 | } | ||
44 | }); | ||
45 | |||
46 | |||
47 | }); | ||
diff --git a/themes/default/js/jquery-ui-1.10.4.custom.js b/themes/default/js/jquery-ui-1.10.4.custom.js new file mode 100644 index 00000000..6f599fca --- /dev/null +++ b/themes/default/js/jquery-ui-1.10.4.custom.js | |||
@@ -0,0 +1,2519 @@ | |||
1 | /*! jQuery UI - v1.10.4 - 2014-03-08 | ||
2 | * http://jqueryui.com | ||
3 | * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.menu.js | ||
4 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | ||
5 | |||
6 | (function( $, undefined ) { | ||
7 | |||
8 | var uuid = 0, | ||
9 | runiqueId = /^ui-id-\d+$/; | ||
10 | |||
11 | // $.ui might exist from components with no dependencies, e.g., $.ui.position | ||
12 | $.ui = $.ui || {}; | ||
13 | |||
14 | $.extend( $.ui, { | ||
15 | version: "1.10.4", | ||
16 | |||
17 | keyCode: { | ||
18 | BACKSPACE: 8, | ||
19 | COMMA: 188, | ||
20 | DELETE: 46, | ||
21 | DOWN: 40, | ||
22 | END: 35, | ||
23 | ENTER: 13, | ||
24 | ESCAPE: 27, | ||
25 | HOME: 36, | ||
26 | LEFT: 37, | ||
27 | NUMPAD_ADD: 107, | ||
28 | NUMPAD_DECIMAL: 110, | ||
29 | NUMPAD_DIVIDE: 111, | ||
30 | NUMPAD_ENTER: 108, | ||
31 | NUMPAD_MULTIPLY: 106, | ||
32 | NUMPAD_SUBTRACT: 109, | ||
33 | PAGE_DOWN: 34, | ||
34 | PAGE_UP: 33, | ||
35 | PERIOD: 190, | ||
36 | RIGHT: 39, | ||
37 | SPACE: 32, | ||
38 | TAB: 9, | ||
39 | UP: 38 | ||
40 | } | ||
41 | }); | ||
42 | |||
43 | // plugins | ||
44 | $.fn.extend({ | ||
45 | focus: (function( orig ) { | ||
46 | return function( delay, fn ) { | ||
47 | return typeof delay === "number" ? | ||
48 | this.each(function() { | ||
49 | var elem = this; | ||
50 | setTimeout(function() { | ||
51 | $( elem ).focus(); | ||
52 | if ( fn ) { | ||
53 | fn.call( elem ); | ||
54 | } | ||
55 | }, delay ); | ||
56 | }) : | ||
57 | orig.apply( this, arguments ); | ||
58 | }; | ||
59 | })( $.fn.focus ), | ||
60 | |||
61 | scrollParent: function() { | ||
62 | var scrollParent; | ||
63 | if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) { | ||
64 | scrollParent = this.parents().filter(function() { | ||
65 | return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x")); | ||
66 | }).eq(0); | ||
67 | } else { | ||
68 | scrollParent = this.parents().filter(function() { | ||
69 | return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x")); | ||
70 | }).eq(0); | ||
71 | } | ||
72 | |||
73 | return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent; | ||
74 | }, | ||
75 | |||
76 | zIndex: function( zIndex ) { | ||
77 | if ( zIndex !== undefined ) { | ||
78 | return this.css( "zIndex", zIndex ); | ||
79 | } | ||
80 | |||
81 | if ( this.length ) { | ||
82 | var elem = $( this[ 0 ] ), position, value; | ||
83 | while ( elem.length && elem[ 0 ] !== document ) { | ||
84 | // Ignore z-index if position is set to a value where z-index is ignored by the browser | ||
85 | // This makes behavior of this function consistent across browsers | ||
86 | // WebKit always returns auto if the element is positioned | ||
87 | position = elem.css( "position" ); | ||
88 | if ( position === "absolute" || position === "relative" || position === "fixed" ) { | ||
89 | // IE returns 0 when zIndex is not specified | ||
90 | // other browsers return a string | ||
91 | // we ignore the case of nested elements with an explicit value of 0 | ||
92 | // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> | ||
93 | value = parseInt( elem.css( "zIndex" ), 10 ); | ||
94 | if ( !isNaN( value ) && value !== 0 ) { | ||
95 | return value; | ||
96 | } | ||
97 | } | ||
98 | elem = elem.parent(); | ||
99 | } | ||
100 | } | ||
101 | |||
102 | return 0; | ||
103 | }, | ||
104 | |||
105 | uniqueId: function() { | ||
106 | return this.each(function() { | ||
107 | if ( !this.id ) { | ||
108 | this.id = "ui-id-" + (++uuid); | ||
109 | } | ||
110 | }); | ||
111 | }, | ||
112 | |||
113 | removeUniqueId: function() { | ||
114 | return this.each(function() { | ||
115 | if ( runiqueId.test( this.id ) ) { | ||
116 | $( this ).removeAttr( "id" ); | ||
117 | } | ||
118 | }); | ||
119 | } | ||
120 | }); | ||
121 | |||
122 | // selectors | ||
123 | function focusable( element, isTabIndexNotNaN ) { | ||
124 | var map, mapName, img, | ||
125 | nodeName = element.nodeName.toLowerCase(); | ||
126 | if ( "area" === nodeName ) { | ||
127 | map = element.parentNode; | ||
128 | mapName = map.name; | ||
129 | if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { | ||
130 | return false; | ||
131 | } | ||
132 | img = $( "img[usemap=#" + mapName + "]" )[0]; | ||
133 | return !!img && visible( img ); | ||
134 | } | ||
135 | return ( /input|select|textarea|button|object/.test( nodeName ) ? | ||
136 | !element.disabled : | ||
137 | "a" === nodeName ? | ||
138 | element.href || isTabIndexNotNaN : | ||
139 | isTabIndexNotNaN) && | ||
140 | // the element and all of its ancestors must be visible | ||
141 | visible( element ); | ||
142 | } | ||
143 | |||
144 | function visible( element ) { | ||
145 | return $.expr.filters.visible( element ) && | ||
146 | !$( element ).parents().addBack().filter(function() { | ||
147 | return $.css( this, "visibility" ) === "hidden"; | ||
148 | }).length; | ||
149 | } | ||
150 | |||
151 | $.extend( $.expr[ ":" ], { | ||
152 | data: $.expr.createPseudo ? | ||
153 | $.expr.createPseudo(function( dataName ) { | ||
154 | return function( elem ) { | ||
155 | return !!$.data( elem, dataName ); | ||
156 | }; | ||
157 | }) : | ||
158 | // support: jQuery <1.8 | ||
159 | function( elem, i, match ) { | ||
160 | return !!$.data( elem, match[ 3 ] ); | ||
161 | }, | ||
162 | |||
163 | focusable: function( element ) { | ||
164 | return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); | ||
165 | }, | ||
166 | |||
167 | tabbable: function( element ) { | ||
168 | var tabIndex = $.attr( element, "tabindex" ), | ||
169 | isTabIndexNaN = isNaN( tabIndex ); | ||
170 | return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); | ||
171 | } | ||
172 | }); | ||
173 | |||
174 | // support: jQuery <1.8 | ||
175 | if ( !$( "<a>" ).outerWidth( 1 ).jquery ) { | ||
176 | $.each( [ "Width", "Height" ], function( i, name ) { | ||
177 | var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], | ||
178 | type = name.toLowerCase(), | ||
179 | orig = { | ||
180 | innerWidth: $.fn.innerWidth, | ||
181 | innerHeight: $.fn.innerHeight, | ||
182 | outerWidth: $.fn.outerWidth, | ||
183 | outerHeight: $.fn.outerHeight | ||
184 | }; | ||
185 | |||
186 | function reduce( elem, size, border, margin ) { | ||
187 | $.each( side, function() { | ||
188 | size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; | ||
189 | if ( border ) { | ||
190 | size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; | ||
191 | } | ||
192 | if ( margin ) { | ||
193 | size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; | ||
194 | } | ||
195 | }); | ||
196 | return size; | ||
197 | } | ||
198 | |||
199 | $.fn[ "inner" + name ] = function( size ) { | ||
200 | if ( size === undefined ) { | ||
201 | return orig[ "inner" + name ].call( this ); | ||
202 | } | ||
203 | |||
204 | return this.each(function() { | ||
205 | $( this ).css( type, reduce( this, size ) + "px" ); | ||
206 | }); | ||
207 | }; | ||
208 | |||
209 | $.fn[ "outer" + name] = function( size, margin ) { | ||
210 | if ( typeof size !== "number" ) { | ||
211 | return orig[ "outer" + name ].call( this, size ); | ||
212 | } | ||
213 | |||
214 | return this.each(function() { | ||
215 | $( this).css( type, reduce( this, size, true, margin ) + "px" ); | ||
216 | }); | ||
217 | }; | ||
218 | }); | ||
219 | } | ||
220 | |||
221 | // support: jQuery <1.8 | ||
222 | if ( !$.fn.addBack ) { | ||
223 | $.fn.addBack = function( selector ) { | ||
224 | return this.add( selector == null ? | ||
225 | this.prevObject : this.prevObject.filter( selector ) | ||
226 | ); | ||
227 | }; | ||
228 | } | ||
229 | |||
230 | // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) | ||
231 | if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { | ||
232 | $.fn.removeData = (function( removeData ) { | ||
233 | return function( key ) { | ||
234 | if ( arguments.length ) { | ||
235 | return removeData.call( this, $.camelCase( key ) ); | ||
236 | } else { | ||
237 | return removeData.call( this ); | ||
238 | } | ||
239 | }; | ||
240 | })( $.fn.removeData ); | ||
241 | } | ||
242 | |||
243 | |||
244 | |||
245 | |||
246 | |||
247 | // deprecated | ||
248 | $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); | ||
249 | |||
250 | $.support.selectstart = "onselectstart" in document.createElement( "div" ); | ||
251 | $.fn.extend({ | ||
252 | disableSelection: function() { | ||
253 | return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + | ||
254 | ".ui-disableSelection", function( event ) { | ||
255 | event.preventDefault(); | ||
256 | }); | ||
257 | }, | ||
258 | |||
259 | enableSelection: function() { | ||
260 | return this.unbind( ".ui-disableSelection" ); | ||
261 | } | ||
262 | }); | ||
263 | |||
264 | $.extend( $.ui, { | ||
265 | // $.ui.plugin is deprecated. Use $.widget() extensions instead. | ||
266 | plugin: { | ||
267 | add: function( module, option, set ) { | ||
268 | var i, | ||
269 | proto = $.ui[ module ].prototype; | ||
270 | for ( i in set ) { | ||
271 | proto.plugins[ i ] = proto.plugins[ i ] || []; | ||
272 | proto.plugins[ i ].push( [ option, set[ i ] ] ); | ||
273 | } | ||
274 | }, | ||
275 | call: function( instance, name, args ) { | ||
276 | var i, | ||
277 | set = instance.plugins[ name ]; | ||
278 | if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) { | ||
279 | return; | ||
280 | } | ||
281 | |||
282 | for ( i = 0; i < set.length; i++ ) { | ||
283 | if ( instance.options[ set[ i ][ 0 ] ] ) { | ||
284 | set[ i ][ 1 ].apply( instance.element, args ); | ||
285 | } | ||
286 | } | ||
287 | } | ||
288 | }, | ||
289 | |||
290 | // only used by resizable | ||
291 | hasScroll: function( el, a ) { | ||
292 | |||
293 | //If overflow is hidden, the element might have extra content, but the user wants to hide it | ||
294 | if ( $( el ).css( "overflow" ) === "hidden") { | ||
295 | return false; | ||
296 | } | ||
297 | |||
298 | var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", | ||
299 | has = false; | ||
300 | |||
301 | if ( el[ scroll ] > 0 ) { | ||
302 | return true; | ||
303 | } | ||
304 | |||
305 | // TODO: determine which cases actually cause this to happen | ||
306 | // if the element doesn't have the scroll set, see if it's possible to | ||
307 | // set the scroll | ||
308 | el[ scroll ] = 1; | ||
309 | has = ( el[ scroll ] > 0 ); | ||
310 | el[ scroll ] = 0; | ||
311 | return has; | ||
312 | } | ||
313 | }); | ||
314 | |||
315 | })( jQuery ); | ||
316 | (function( $, undefined ) { | ||
317 | |||
318 | var uuid = 0, | ||
319 | slice = Array.prototype.slice, | ||
320 | _cleanData = $.cleanData; | ||
321 | $.cleanData = function( elems ) { | ||
322 | for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { | ||
323 | try { | ||
324 | $( elem ).triggerHandler( "remove" ); | ||
325 | // http://bugs.jquery.com/ticket/8235 | ||
326 | } catch( e ) {} | ||
327 | } | ||
328 | _cleanData( elems ); | ||
329 | }; | ||
330 | |||
331 | $.widget = function( name, base, prototype ) { | ||
332 | var fullName, existingConstructor, constructor, basePrototype, | ||
333 | // proxiedPrototype allows the provided prototype to remain unmodified | ||
334 | // so that it can be used as a mixin for multiple widgets (#8876) | ||
335 | proxiedPrototype = {}, | ||
336 | namespace = name.split( "." )[ 0 ]; | ||
337 | |||
338 | name = name.split( "." )[ 1 ]; | ||
339 | fullName = namespace + "-" + name; | ||
340 | |||
341 | if ( !prototype ) { | ||
342 | prototype = base; | ||
343 | base = $.Widget; | ||
344 | } | ||
345 | |||
346 | // create selector for plugin | ||
347 | $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { | ||
348 | return !!$.data( elem, fullName ); | ||
349 | }; | ||
350 | |||
351 | $[ namespace ] = $[ namespace ] || {}; | ||
352 | existingConstructor = $[ namespace ][ name ]; | ||
353 | constructor = $[ namespace ][ name ] = function( options, element ) { | ||
354 | // allow instantiation without "new" keyword | ||
355 | if ( !this._createWidget ) { | ||
356 | return new constructor( options, element ); | ||
357 | } | ||
358 | |||
359 | // allow instantiation without initializing for simple inheritance | ||
360 | // must use "new" keyword (the code above always passes args) | ||
361 | if ( arguments.length ) { | ||
362 | this._createWidget( options, element ); | ||
363 | } | ||
364 | }; | ||
365 | // extend with the existing constructor to carry over any static properties | ||
366 | $.extend( constructor, existingConstructor, { | ||
367 | version: prototype.version, | ||
368 | // copy the object used to create the prototype in case we need to | ||
369 | // redefine the widget later | ||
370 | _proto: $.extend( {}, prototype ), | ||
371 | // track widgets that inherit from this widget in case this widget is | ||
372 | // redefined after a widget inherits from it | ||
373 | _childConstructors: [] | ||
374 | }); | ||
375 | |||
376 | basePrototype = new base(); | ||
377 | // we need to make the options hash a property directly on the new instance | ||
378 | // otherwise we'll modify the options hash on the prototype that we're | ||
379 | // inheriting from | ||
380 | basePrototype.options = $.widget.extend( {}, basePrototype.options ); | ||
381 | $.each( prototype, function( prop, value ) { | ||
382 | if ( !$.isFunction( value ) ) { | ||
383 | proxiedPrototype[ prop ] = value; | ||
384 | return; | ||
385 | } | ||
386 | proxiedPrototype[ prop ] = (function() { | ||
387 | var _super = function() { | ||
388 | return base.prototype[ prop ].apply( this, arguments ); | ||
389 | }, | ||
390 | _superApply = function( args ) { | ||
391 | return base.prototype[ prop ].apply( this, args ); | ||
392 | }; | ||
393 | return function() { | ||
394 | var __super = this._super, | ||
395 | __superApply = this._superApply, | ||
396 | returnValue; | ||
397 | |||
398 | this._super = _super; | ||
399 | this._superApply = _superApply; | ||
400 | |||
401 | returnValue = value.apply( this, arguments ); | ||
402 | |||
403 | this._super = __super; | ||
404 | this._superApply = __superApply; | ||
405 | |||
406 | return returnValue; | ||
407 | }; | ||
408 | })(); | ||
409 | }); | ||
410 | constructor.prototype = $.widget.extend( basePrototype, { | ||
411 | // TODO: remove support for widgetEventPrefix | ||
412 | // always use the name + a colon as the prefix, e.g., draggable:start | ||
413 | // don't prefix for widgets that aren't DOM-based | ||
414 | widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name | ||
415 | }, proxiedPrototype, { | ||
416 | constructor: constructor, | ||
417 | namespace: namespace, | ||
418 | widgetName: name, | ||
419 | widgetFullName: fullName | ||
420 | }); | ||
421 | |||
422 | // If this widget is being redefined then we need to find all widgets that | ||
423 | // are inheriting from it and redefine all of them so that they inherit from | ||
424 | // the new version of this widget. We're essentially trying to replace one | ||
425 | // level in the prototype chain. | ||
426 | if ( existingConstructor ) { | ||
427 | $.each( existingConstructor._childConstructors, function( i, child ) { | ||
428 | var childPrototype = child.prototype; | ||
429 | |||
430 | // redefine the child widget using the same prototype that was | ||
431 | // originally used, but inherit from the new version of the base | ||
432 | $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); | ||
433 | }); | ||
434 | // remove the list of existing child constructors from the old constructor | ||
435 | // so the old child constructors can be garbage collected | ||
436 | delete existingConstructor._childConstructors; | ||
437 | } else { | ||
438 | base._childConstructors.push( constructor ); | ||
439 | } | ||
440 | |||
441 | $.widget.bridge( name, constructor ); | ||
442 | }; | ||
443 | |||
444 | $.widget.extend = function( target ) { | ||
445 | var input = slice.call( arguments, 1 ), | ||
446 | inputIndex = 0, | ||
447 | inputLength = input.length, | ||
448 | key, | ||
449 | value; | ||
450 | for ( ; inputIndex < inputLength; inputIndex++ ) { | ||
451 | for ( key in input[ inputIndex ] ) { | ||
452 | value = input[ inputIndex ][ key ]; | ||
453 | if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { | ||
454 | // Clone objects | ||
455 | if ( $.isPlainObject( value ) ) { | ||
456 | target[ key ] = $.isPlainObject( target[ key ] ) ? | ||
457 | $.widget.extend( {}, target[ key ], value ) : | ||
458 | // Don't extend strings, arrays, etc. with objects | ||
459 | $.widget.extend( {}, value ); | ||
460 | // Copy everything else by reference | ||
461 | } else { | ||
462 | target[ key ] = value; | ||
463 | } | ||
464 | } | ||
465 | } | ||
466 | } | ||
467 | return target; | ||
468 | }; | ||
469 | |||
470 | $.widget.bridge = function( name, object ) { | ||
471 | var fullName = object.prototype.widgetFullName || name; | ||
472 | $.fn[ name ] = function( options ) { | ||
473 | var isMethodCall = typeof options === "string", | ||
474 | args = slice.call( arguments, 1 ), | ||
475 | returnValue = this; | ||
476 | |||
477 | // allow multiple hashes to be passed on init | ||
478 | options = !isMethodCall && args.length ? | ||
479 | $.widget.extend.apply( null, [ options ].concat(args) ) : | ||
480 | options; | ||
481 | |||
482 | if ( isMethodCall ) { | ||
483 | this.each(function() { | ||
484 | var methodValue, | ||
485 | instance = $.data( this, fullName ); | ||
486 | if ( !instance ) { | ||
487 | return $.error( "cannot call methods on " + name + " prior to initialization; " + | ||
488 | "attempted to call method '" + options + "'" ); | ||
489 | } | ||
490 | if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { | ||
491 | return $.error( "no such method '" + options + "' for " + name + " widget instance" ); | ||
492 | } | ||
493 | methodValue = instance[ options ].apply( instance, args ); | ||
494 | if ( methodValue !== instance && methodValue !== undefined ) { | ||
495 | returnValue = methodValue && methodValue.jquery ? | ||
496 | returnValue.pushStack( methodValue.get() ) : | ||
497 | methodValue; | ||
498 | return false; | ||
499 | } | ||
500 | }); | ||
501 | } else { | ||
502 | this.each(function() { | ||
503 | var instance = $.data( this, fullName ); | ||
504 | if ( instance ) { | ||
505 | instance.option( options || {} )._init(); | ||
506 | } else { | ||
507 | $.data( this, fullName, new object( options, this ) ); | ||
508 | } | ||
509 | }); | ||
510 | } | ||
511 | |||
512 | return returnValue; | ||
513 | }; | ||
514 | }; | ||
515 | |||
516 | $.Widget = function( /* options, element */ ) {}; | ||
517 | $.Widget._childConstructors = []; | ||
518 | |||
519 | $.Widget.prototype = { | ||
520 | widgetName: "widget", | ||
521 | widgetEventPrefix: "", | ||
522 | defaultElement: "<div>", | ||
523 | options: { | ||
524 | disabled: false, | ||
525 | |||
526 | // callbacks | ||
527 | create: null | ||
528 | }, | ||
529 | _createWidget: function( options, element ) { | ||
530 | element = $( element || this.defaultElement || this )[ 0 ]; | ||
531 | this.element = $( element ); | ||
532 | this.uuid = uuid++; | ||
533 | this.eventNamespace = "." + this.widgetName + this.uuid; | ||
534 | this.options = $.widget.extend( {}, | ||
535 | this.options, | ||
536 | this._getCreateOptions(), | ||
537 | options ); | ||
538 | |||
539 | this.bindings = $(); | ||
540 | this.hoverable = $(); | ||
541 | this.focusable = $(); | ||
542 | |||
543 | if ( element !== this ) { | ||
544 | $.data( element, this.widgetFullName, this ); | ||
545 | this._on( true, this.element, { | ||
546 | remove: function( event ) { | ||
547 | if ( event.target === element ) { | ||
548 | this.destroy(); | ||
549 | } | ||
550 | } | ||
551 | }); | ||
552 | this.document = $( element.style ? | ||
553 | // element within the document | ||
554 | element.ownerDocument : | ||
555 | // element is window or document | ||
556 | element.document || element ); | ||
557 | this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); | ||
558 | } | ||
559 | |||
560 | this._create(); | ||
561 | this._trigger( "create", null, this._getCreateEventData() ); | ||
562 | this._init(); | ||
563 | }, | ||
564 | _getCreateOptions: $.noop, | ||
565 | _getCreateEventData: $.noop, | ||
566 | _create: $.noop, | ||
567 | _init: $.noop, | ||
568 | |||
569 | destroy: function() { | ||
570 | this._destroy(); | ||
571 | // we can probably remove the unbind calls in 2.0 | ||
572 | // all event bindings should go through this._on() | ||
573 | this.element | ||
574 | .unbind( this.eventNamespace ) | ||
575 | // 1.9 BC for #7810 | ||
576 | // TODO remove dual storage | ||
577 | .removeData( this.widgetName ) | ||
578 | .removeData( this.widgetFullName ) | ||
579 | // support: jquery <1.6.3 | ||
580 | // http://bugs.jquery.com/ticket/9413 | ||
581 | .removeData( $.camelCase( this.widgetFullName ) ); | ||
582 | this.widget() | ||
583 | .unbind( this.eventNamespace ) | ||
584 | .removeAttr( "aria-disabled" ) | ||
585 | .removeClass( | ||
586 | this.widgetFullName + "-disabled " + | ||
587 | "ui-state-disabled" ); | ||
588 | |||
589 | // clean up events and states | ||
590 | this.bindings.unbind( this.eventNamespace ); | ||
591 | this.hoverable.removeClass( "ui-state-hover" ); | ||
592 | this.focusable.removeClass( "ui-state-focus" ); | ||
593 | }, | ||
594 | _destroy: $.noop, | ||
595 | |||
596 | widget: function() { | ||
597 | return this.element; | ||
598 | }, | ||
599 | |||
600 | option: function( key, value ) { | ||
601 | var options = key, | ||
602 | parts, | ||
603 | curOption, | ||
604 | i; | ||
605 | |||
606 | if ( arguments.length === 0 ) { | ||
607 | // don't return a reference to the internal hash | ||
608 | return $.widget.extend( {}, this.options ); | ||
609 | } | ||
610 | |||
611 | if ( typeof key === "string" ) { | ||
612 | // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } | ||
613 | options = {}; | ||
614 | parts = key.split( "." ); | ||
615 | key = parts.shift(); | ||
616 | if ( parts.length ) { | ||
617 | curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); | ||
618 | for ( i = 0; i < parts.length - 1; i++ ) { | ||
619 | curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; | ||
620 | curOption = curOption[ parts[ i ] ]; | ||
621 | } | ||
622 | key = parts.pop(); | ||
623 | if ( arguments.length === 1 ) { | ||
624 | return curOption[ key ] === undefined ? null : curOption[ key ]; | ||
625 | } | ||
626 | curOption[ key ] = value; | ||
627 | } else { | ||
628 | if ( arguments.length === 1 ) { | ||
629 | return this.options[ key ] === undefined ? null : this.options[ key ]; | ||
630 | } | ||
631 | options[ key ] = value; | ||
632 | } | ||
633 | } | ||
634 | |||
635 | this._setOptions( options ); | ||
636 | |||
637 | return this; | ||
638 | }, | ||
639 | _setOptions: function( options ) { | ||
640 | var key; | ||
641 | |||
642 | for ( key in options ) { | ||
643 | this._setOption( key, options[ key ] ); | ||
644 | } | ||
645 | |||
646 | return this; | ||
647 | }, | ||
648 | _setOption: function( key, value ) { | ||
649 | this.options[ key ] = value; | ||
650 | |||
651 | if ( key === "disabled" ) { | ||
652 | this.widget() | ||
653 | .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value ) | ||
654 | .attr( "aria-disabled", value ); | ||
655 | this.hoverable.removeClass( "ui-state-hover" ); | ||
656 | this.focusable.removeClass( "ui-state-focus" ); | ||
657 | } | ||
658 | |||
659 | return this; | ||
660 | }, | ||
661 | |||
662 | enable: function() { | ||
663 | return this._setOption( "disabled", false ); | ||
664 | }, | ||
665 | disable: function() { | ||
666 | return this._setOption( "disabled", true ); | ||
667 | }, | ||
668 | |||
669 | _on: function( suppressDisabledCheck, element, handlers ) { | ||
670 | var delegateElement, | ||
671 | instance = this; | ||
672 | |||
673 | // no suppressDisabledCheck flag, shuffle arguments | ||
674 | if ( typeof suppressDisabledCheck !== "boolean" ) { | ||
675 | handlers = element; | ||
676 | element = suppressDisabledCheck; | ||
677 | suppressDisabledCheck = false; | ||
678 | } | ||
679 | |||
680 | // no element argument, shuffle and use this.element | ||
681 | if ( !handlers ) { | ||
682 | handlers = element; | ||
683 | element = this.element; | ||
684 | delegateElement = this.widget(); | ||
685 | } else { | ||
686 | // accept selectors, DOM elements | ||
687 | element = delegateElement = $( element ); | ||
688 | this.bindings = this.bindings.add( element ); | ||
689 | } | ||
690 | |||
691 | $.each( handlers, function( event, handler ) { | ||
692 | function handlerProxy() { | ||
693 | // allow widgets to customize the disabled handling | ||
694 | // - disabled as an array instead of boolean | ||
695 | // - disabled class as method for disabling individual parts | ||
696 | if ( !suppressDisabledCheck && | ||
697 | ( instance.options.disabled === true || | ||
698 | $( this ).hasClass( "ui-state-disabled" ) ) ) { | ||
699 | return; | ||
700 | } | ||
701 | return ( typeof handler === "string" ? instance[ handler ] : handler ) | ||
702 | .apply( instance, arguments ); | ||
703 | } | ||
704 | |||
705 | // copy the guid so direct unbinding works | ||
706 | if ( typeof handler !== "string" ) { | ||
707 | handlerProxy.guid = handler.guid = | ||
708 | handler.guid || handlerProxy.guid || $.guid++; | ||
709 | } | ||
710 | |||
711 | var match = event.match( /^(\w+)\s*(.*)$/ ), | ||
712 | eventName = match[1] + instance.eventNamespace, | ||
713 | selector = match[2]; | ||
714 | if ( selector ) { | ||
715 | delegateElement.delegate( selector, eventName, handlerProxy ); | ||
716 | } else { | ||
717 | element.bind( eventName, handlerProxy ); | ||
718 | } | ||
719 | }); | ||
720 | }, | ||
721 | |||
722 | _off: function( element, eventName ) { | ||
723 | eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; | ||
724 | element.unbind( eventName ).undelegate( eventName ); | ||
725 | }, | ||
726 | |||
727 | _delay: function( handler, delay ) { | ||
728 | function handlerProxy() { | ||
729 | return ( typeof handler === "string" ? instance[ handler ] : handler ) | ||
730 | .apply( instance, arguments ); | ||
731 | } | ||
732 | var instance = this; | ||
733 | return setTimeout( handlerProxy, delay || 0 ); | ||
734 | }, | ||
735 | |||
736 | _hoverable: function( element ) { | ||
737 | this.hoverable = this.hoverable.add( element ); | ||
738 | this._on( element, { | ||
739 | mouseenter: function( event ) { | ||
740 | $( event.currentTarget ).addClass( "ui-state-hover" ); | ||
741 | }, | ||
742 | mouseleave: function( event ) { | ||
743 | $( event.currentTarget ).removeClass( "ui-state-hover" ); | ||
744 | } | ||
745 | }); | ||
746 | }, | ||
747 | |||
748 | _focusable: function( element ) { | ||
749 | this.focusable = this.focusable.add( element ); | ||
750 | this._on( element, { | ||
751 | focusin: function( event ) { | ||
752 | $( event.currentTarget ).addClass( "ui-state-focus" ); | ||
753 | }, | ||
754 | focusout: function( event ) { | ||
755 | $( event.currentTarget ).removeClass( "ui-state-focus" ); | ||
756 | } | ||
757 | }); | ||
758 | }, | ||
759 | |||
760 | _trigger: function( type, event, data ) { | ||
761 | var prop, orig, | ||
762 | callback = this.options[ type ]; | ||
763 | |||
764 | data = data || {}; | ||
765 | event = $.Event( event ); | ||
766 | event.type = ( type === this.widgetEventPrefix ? | ||
767 | type : | ||
768 | this.widgetEventPrefix + type ).toLowerCase(); | ||
769 | // the original event may come from any element | ||
770 | // so we need to reset the target on the new event | ||
771 | event.target = this.element[ 0 ]; | ||
772 | |||
773 | // copy original event properties over to the new event | ||
774 | orig = event.originalEvent; | ||
775 | if ( orig ) { | ||
776 | for ( prop in orig ) { | ||
777 | if ( !( prop in event ) ) { | ||
778 | event[ prop ] = orig[ prop ]; | ||
779 | } | ||
780 | } | ||
781 | } | ||
782 | |||
783 | this.element.trigger( event, data ); | ||
784 | return !( $.isFunction( callback ) && | ||
785 | callback.apply( this.element[0], [ event ].concat( data ) ) === false || | ||
786 | event.isDefaultPrevented() ); | ||
787 | } | ||
788 | }; | ||
789 | |||
790 | $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { | ||
791 | $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { | ||
792 | if ( typeof options === "string" ) { | ||
793 | options = { effect: options }; | ||
794 | } | ||
795 | var hasOptions, | ||
796 | effectName = !options ? | ||
797 | method : | ||
798 | options === true || typeof options === "number" ? | ||
799 | defaultEffect : | ||
800 | options.effect || defaultEffect; | ||
801 | options = options || {}; | ||
802 | if ( typeof options === "number" ) { | ||
803 | options = { duration: options }; | ||
804 | } | ||
805 | hasOptions = !$.isEmptyObject( options ); | ||
806 | options.complete = callback; | ||
807 | if ( options.delay ) { | ||
808 | element.delay( options.delay ); | ||
809 | } | ||
810 | if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { | ||
811 | element[ method ]( options ); | ||
812 | } else if ( effectName !== method && element[ effectName ] ) { | ||
813 | element[ effectName ]( options.duration, options.easing, callback ); | ||
814 | } else { | ||
815 | element.queue(function( next ) { | ||
816 | $( this )[ method ](); | ||
817 | if ( callback ) { | ||
818 | callback.call( element[ 0 ] ); | ||
819 | } | ||
820 | next(); | ||
821 | }); | ||
822 | } | ||
823 | }; | ||
824 | }); | ||
825 | |||
826 | })( jQuery ); | ||
827 | (function( $, undefined ) { | ||
828 | |||
829 | $.ui = $.ui || {}; | ||
830 | |||
831 | var cachedScrollbarWidth, | ||
832 | max = Math.max, | ||
833 | abs = Math.abs, | ||
834 | round = Math.round, | ||
835 | rhorizontal = /left|center|right/, | ||
836 | rvertical = /top|center|bottom/, | ||
837 | roffset = /[\+\-]\d+(\.[\d]+)?%?/, | ||
838 | rposition = /^\w+/, | ||
839 | rpercent = /%$/, | ||
840 | _position = $.fn.position; | ||
841 | |||
842 | function getOffsets( offsets, width, height ) { | ||
843 | return [ | ||
844 | parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), | ||
845 | parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) | ||
846 | ]; | ||
847 | } | ||
848 | |||
849 | function parseCss( element, property ) { | ||
850 | return parseInt( $.css( element, property ), 10 ) || 0; | ||
851 | } | ||
852 | |||
853 | function getDimensions( elem ) { | ||
854 | var raw = elem[0]; | ||
855 | if ( raw.nodeType === 9 ) { | ||
856 | return { | ||
857 | width: elem.width(), | ||
858 | height: elem.height(), | ||
859 | offset: { top: 0, left: 0 } | ||
860 | }; | ||
861 | } | ||
862 | if ( $.isWindow( raw ) ) { | ||
863 | return { | ||
864 | width: elem.width(), | ||
865 | height: elem.height(), | ||
866 | offset: { top: elem.scrollTop(), left: elem.scrollLeft() } | ||
867 | }; | ||
868 | } | ||
869 | if ( raw.preventDefault ) { | ||
870 | return { | ||
871 | width: 0, | ||
872 | height: 0, | ||
873 | offset: { top: raw.pageY, left: raw.pageX } | ||
874 | }; | ||
875 | } | ||
876 | return { | ||
877 | width: elem.outerWidth(), | ||
878 | height: elem.outerHeight(), | ||
879 | offset: elem.offset() | ||
880 | }; | ||
881 | } | ||
882 | |||
883 | $.position = { | ||
884 | scrollbarWidth: function() { | ||
885 | if ( cachedScrollbarWidth !== undefined ) { | ||
886 | return cachedScrollbarWidth; | ||
887 | } | ||
888 | var w1, w2, | ||
889 | div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ), | ||
890 | innerDiv = div.children()[0]; | ||
891 | |||
892 | $( "body" ).append( div ); | ||
893 | w1 = innerDiv.offsetWidth; | ||
894 | div.css( "overflow", "scroll" ); | ||
895 | |||
896 | w2 = innerDiv.offsetWidth; | ||
897 | |||
898 | if ( w1 === w2 ) { | ||
899 | w2 = div[0].clientWidth; | ||
900 | } | ||
901 | |||
902 | div.remove(); | ||
903 | |||
904 | return (cachedScrollbarWidth = w1 - w2); | ||
905 | }, | ||
906 | getScrollInfo: function( within ) { | ||
907 | var overflowX = within.isWindow || within.isDocument ? "" : | ||
908 | within.element.css( "overflow-x" ), | ||
909 | overflowY = within.isWindow || within.isDocument ? "" : | ||
910 | within.element.css( "overflow-y" ), | ||
911 | hasOverflowX = overflowX === "scroll" || | ||
912 | ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), | ||
913 | hasOverflowY = overflowY === "scroll" || | ||
914 | ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); | ||
915 | return { | ||
916 | width: hasOverflowY ? $.position.scrollbarWidth() : 0, | ||
917 | height: hasOverflowX ? $.position.scrollbarWidth() : 0 | ||
918 | }; | ||
919 | }, | ||
920 | getWithinInfo: function( element ) { | ||
921 | var withinElement = $( element || window ), | ||
922 | isWindow = $.isWindow( withinElement[0] ), | ||
923 | isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; | ||
924 | return { | ||
925 | element: withinElement, | ||
926 | isWindow: isWindow, | ||
927 | isDocument: isDocument, | ||
928 | offset: withinElement.offset() || { left: 0, top: 0 }, | ||
929 | scrollLeft: withinElement.scrollLeft(), | ||
930 | scrollTop: withinElement.scrollTop(), | ||
931 | width: isWindow ? withinElement.width() : withinElement.outerWidth(), | ||
932 | height: isWindow ? withinElement.height() : withinElement.outerHeight() | ||
933 | }; | ||
934 | } | ||
935 | }; | ||
936 | |||
937 | $.fn.position = function( options ) { | ||
938 | if ( !options || !options.of ) { | ||
939 | return _position.apply( this, arguments ); | ||
940 | } | ||
941 | |||
942 | // make a copy, we don't want to modify arguments | ||
943 | options = $.extend( {}, options ); | ||
944 | |||
945 | var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, | ||
946 | target = $( options.of ), | ||
947 | within = $.position.getWithinInfo( options.within ), | ||
948 | scrollInfo = $.position.getScrollInfo( within ), | ||
949 | collision = ( options.collision || "flip" ).split( " " ), | ||
950 | offsets = {}; | ||
951 | |||
952 | dimensions = getDimensions( target ); | ||
953 | if ( target[0].preventDefault ) { | ||
954 | // force left top to allow flipping | ||
955 | options.at = "left top"; | ||
956 | } | ||
957 | targetWidth = dimensions.width; | ||
958 | targetHeight = dimensions.height; | ||
959 | targetOffset = dimensions.offset; | ||
960 | // clone to reuse original targetOffset later | ||
961 | basePosition = $.extend( {}, targetOffset ); | ||
962 | |||
963 | // force my and at to have valid horizontal and vertical positions | ||
964 | // if a value is missing or invalid, it will be converted to center | ||
965 | $.each( [ "my", "at" ], function() { | ||
966 | var pos = ( options[ this ] || "" ).split( " " ), | ||
967 | horizontalOffset, | ||
968 | verticalOffset; | ||
969 | |||
970 | if ( pos.length === 1) { | ||
971 | pos = rhorizontal.test( pos[ 0 ] ) ? | ||
972 | pos.concat( [ "center" ] ) : | ||
973 | rvertical.test( pos[ 0 ] ) ? | ||
974 | [ "center" ].concat( pos ) : | ||
975 | [ "center", "center" ]; | ||
976 | } | ||
977 | pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; | ||
978 | pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; | ||
979 | |||
980 | // calculate offsets | ||
981 | horizontalOffset = roffset.exec( pos[ 0 ] ); | ||
982 | verticalOffset = roffset.exec( pos[ 1 ] ); | ||
983 | offsets[ this ] = [ | ||
984 | horizontalOffset ? horizontalOffset[ 0 ] : 0, | ||
985 | verticalOffset ? verticalOffset[ 0 ] : 0 | ||
986 | ]; | ||
987 | |||
988 | // reduce to just the positions without the offsets | ||
989 | options[ this ] = [ | ||
990 | rposition.exec( pos[ 0 ] )[ 0 ], | ||
991 | rposition.exec( pos[ 1 ] )[ 0 ] | ||
992 | ]; | ||
993 | }); | ||
994 | |||
995 | // normalize collision option | ||
996 | if ( collision.length === 1 ) { | ||
997 | collision[ 1 ] = collision[ 0 ]; | ||
998 | } | ||
999 | |||
1000 | if ( options.at[ 0 ] === "right" ) { | ||
1001 | basePosition.left += targetWidth; | ||
1002 | } else if ( options.at[ 0 ] === "center" ) { | ||
1003 | basePosition.left += targetWidth / 2; | ||
1004 | } | ||
1005 | |||
1006 | if ( options.at[ 1 ] === "bottom" ) { | ||
1007 | basePosition.top += targetHeight; | ||
1008 | } else if ( options.at[ 1 ] === "center" ) { | ||
1009 | basePosition.top += targetHeight / 2; | ||
1010 | } | ||
1011 | |||
1012 | atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); | ||
1013 | basePosition.left += atOffset[ 0 ]; | ||
1014 | basePosition.top += atOffset[ 1 ]; | ||
1015 | |||
1016 | return this.each(function() { | ||
1017 | var collisionPosition, using, | ||
1018 | elem = $( this ), | ||
1019 | elemWidth = elem.outerWidth(), | ||
1020 | elemHeight = elem.outerHeight(), | ||
1021 | marginLeft = parseCss( this, "marginLeft" ), | ||
1022 | marginTop = parseCss( this, "marginTop" ), | ||
1023 | collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, | ||
1024 | collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, | ||
1025 | position = $.extend( {}, basePosition ), | ||
1026 | myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); | ||
1027 | |||
1028 | if ( options.my[ 0 ] === "right" ) { | ||
1029 | position.left -= elemWidth; | ||
1030 | } else if ( options.my[ 0 ] === "center" ) { | ||
1031 | position.left -= elemWidth / 2; | ||
1032 | } | ||
1033 | |||
1034 | if ( options.my[ 1 ] === "bottom" ) { | ||
1035 | position.top -= elemHeight; | ||
1036 | } else if ( options.my[ 1 ] === "center" ) { | ||
1037 | position.top -= elemHeight / 2; | ||
1038 | } | ||
1039 | |||
1040 | position.left += myOffset[ 0 ]; | ||
1041 | position.top += myOffset[ 1 ]; | ||
1042 | |||
1043 | // if the browser doesn't support fractions, then round for consistent results | ||
1044 | if ( !$.support.offsetFractions ) { | ||
1045 | position.left = round( position.left ); | ||
1046 | position.top = round( position.top ); | ||
1047 | } | ||
1048 | |||
1049 | collisionPosition = { | ||
1050 | marginLeft: marginLeft, | ||
1051 | marginTop: marginTop | ||
1052 | }; | ||
1053 | |||
1054 | $.each( [ "left", "top" ], function( i, dir ) { | ||
1055 | if ( $.ui.position[ collision[ i ] ] ) { | ||
1056 | $.ui.position[ collision[ i ] ][ dir ]( position, { | ||
1057 | targetWidth: targetWidth, | ||
1058 | targetHeight: targetHeight, | ||
1059 | elemWidth: elemWidth, | ||
1060 | elemHeight: elemHeight, | ||
1061 | collisionPosition: collisionPosition, | ||
1062 | collisionWidth: collisionWidth, | ||
1063 | collisionHeight: collisionHeight, | ||
1064 | offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], | ||
1065 | my: options.my, | ||
1066 | at: options.at, | ||
1067 | within: within, | ||
1068 | elem : elem | ||
1069 | }); | ||
1070 | } | ||
1071 | }); | ||
1072 | |||
1073 | if ( options.using ) { | ||
1074 | // adds feedback as second argument to using callback, if present | ||
1075 | using = function( props ) { | ||
1076 | var left = targetOffset.left - position.left, | ||
1077 | right = left + targetWidth - elemWidth, | ||
1078 | top = targetOffset.top - position.top, | ||
1079 | bottom = top + targetHeight - elemHeight, | ||
1080 | feedback = { | ||
1081 | target: { | ||
1082 | element: target, | ||
1083 | left: targetOffset.left, | ||
1084 | top: targetOffset.top, | ||
1085 | width: targetWidth, | ||
1086 | height: targetHeight | ||
1087 | }, | ||
1088 | element: { | ||
1089 | element: elem, | ||
1090 | left: position.left, | ||
1091 | top: position.top, | ||
1092 | width: elemWidth, | ||
1093 | height: elemHeight | ||
1094 | }, | ||
1095 | horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", | ||
1096 | vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" | ||
1097 | }; | ||
1098 | if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { | ||
1099 | feedback.horizontal = "center"; | ||
1100 | } | ||
1101 | if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { | ||
1102 | feedback.vertical = "middle"; | ||
1103 | } | ||
1104 | if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { | ||
1105 | feedback.important = "horizontal"; | ||
1106 | } else { | ||
1107 | feedback.important = "vertical"; | ||
1108 | } | ||
1109 | options.using.call( this, props, feedback ); | ||
1110 | }; | ||
1111 | } | ||
1112 | |||
1113 | elem.offset( $.extend( position, { using: using } ) ); | ||
1114 | }); | ||
1115 | }; | ||
1116 | |||
1117 | $.ui.position = { | ||
1118 | fit: { | ||
1119 | left: function( position, data ) { | ||
1120 | var within = data.within, | ||
1121 | withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, | ||
1122 | outerWidth = within.width, | ||
1123 | collisionPosLeft = position.left - data.collisionPosition.marginLeft, | ||
1124 | overLeft = withinOffset - collisionPosLeft, | ||
1125 | overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, | ||
1126 | newOverRight; | ||
1127 | |||
1128 | // element is wider than within | ||
1129 | if ( data.collisionWidth > outerWidth ) { | ||
1130 | // element is initially over the left side of within | ||
1131 | if ( overLeft > 0 && overRight <= 0 ) { | ||
1132 | newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; | ||
1133 | position.left += overLeft - newOverRight; | ||
1134 | // element is initially over right side of within | ||
1135 | } else if ( overRight > 0 && overLeft <= 0 ) { | ||
1136 | position.left = withinOffset; | ||
1137 | // element is initially over both left and right sides of within | ||
1138 | } else { | ||
1139 | if ( overLeft > overRight ) { | ||
1140 | position.left = withinOffset + outerWidth - data.collisionWidth; | ||
1141 | } else { | ||
1142 | position.left = withinOffset; | ||
1143 | } | ||
1144 | } | ||
1145 | // too far left -> align with left edge | ||
1146 | } else if ( overLeft > 0 ) { | ||
1147 | position.left += overLeft; | ||
1148 | // too far right -> align with right edge | ||
1149 | } else if ( overRight > 0 ) { | ||
1150 | position.left -= overRight; | ||
1151 | // adjust based on position and margin | ||
1152 | } else { | ||
1153 | position.left = max( position.left - collisionPosLeft, position.left ); | ||
1154 | } | ||
1155 | }, | ||
1156 | top: function( position, data ) { | ||
1157 | var within = data.within, | ||
1158 | withinOffset = within.isWindow ? within.scrollTop : within.offset.top, | ||
1159 | outerHeight = data.within.height, | ||
1160 | collisionPosTop = position.top - data.collisionPosition.marginTop, | ||
1161 | overTop = withinOffset - collisionPosTop, | ||
1162 | overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, | ||
1163 | newOverBottom; | ||
1164 | |||
1165 | // element is taller than within | ||
1166 | if ( data.collisionHeight > outerHeight ) { | ||
1167 | // element is initially over the top of within | ||
1168 | if ( overTop > 0 && overBottom <= 0 ) { | ||
1169 | newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; | ||
1170 | position.top += overTop - newOverBottom; | ||
1171 | // element is initially over bottom of within | ||
1172 | } else if ( overBottom > 0 && overTop <= 0 ) { | ||
1173 | position.top = withinOffset; | ||
1174 | // element is initially over both top and bottom of within | ||
1175 | } else { | ||
1176 | if ( overTop > overBottom ) { | ||
1177 | position.top = withinOffset + outerHeight - data.collisionHeight; | ||
1178 | } else { | ||
1179 | position.top = withinOffset; | ||
1180 | } | ||
1181 | } | ||
1182 | // too far up -> align with top | ||
1183 | } else if ( overTop > 0 ) { | ||
1184 | position.top += overTop; | ||
1185 | // too far down -> align with bottom edge | ||
1186 | } else if ( overBottom > 0 ) { | ||
1187 | position.top -= overBottom; | ||
1188 | // adjust based on position and margin | ||
1189 | } else { | ||
1190 | position.top = max( position.top - collisionPosTop, position.top ); | ||
1191 | } | ||
1192 | } | ||
1193 | }, | ||
1194 | flip: { | ||
1195 | left: function( position, data ) { | ||
1196 | var within = data.within, | ||
1197 | withinOffset = within.offset.left + within.scrollLeft, | ||
1198 | outerWidth = within.width, | ||
1199 | offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, | ||
1200 | collisionPosLeft = position.left - data.collisionPosition.marginLeft, | ||
1201 | overLeft = collisionPosLeft - offsetLeft, | ||
1202 | overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, | ||
1203 | myOffset = data.my[ 0 ] === "left" ? | ||
1204 | -data.elemWidth : | ||
1205 | data.my[ 0 ] === "right" ? | ||
1206 | data.elemWidth : | ||
1207 | 0, | ||
1208 | atOffset = data.at[ 0 ] === "left" ? | ||
1209 | data.targetWidth : | ||
1210 | data.at[ 0 ] === "right" ? | ||
1211 | -data.targetWidth : | ||
1212 | 0, | ||
1213 | offset = -2 * data.offset[ 0 ], | ||
1214 | newOverRight, | ||
1215 | newOverLeft; | ||
1216 | |||
1217 | if ( overLeft < 0 ) { | ||
1218 | newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; | ||
1219 | if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { | ||
1220 | position.left += myOffset + atOffset + offset; | ||
1221 | } | ||
1222 | } | ||
1223 | else if ( overRight > 0 ) { | ||
1224 | newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; | ||
1225 | if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { | ||
1226 | position.left += myOffset + atOffset + offset; | ||
1227 | } | ||
1228 | } | ||
1229 | }, | ||
1230 | top: function( position, data ) { | ||
1231 | var within = data.within, | ||
1232 | withinOffset = within.offset.top + within.scrollTop, | ||
1233 | outerHeight = within.height, | ||
1234 | offsetTop = within.isWindow ? within.scrollTop : within.offset.top, | ||
1235 | collisionPosTop = position.top - data.collisionPosition.marginTop, | ||
1236 | overTop = collisionPosTop - offsetTop, | ||
1237 | overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, | ||
1238 | top = data.my[ 1 ] === "top", | ||
1239 | myOffset = top ? | ||
1240 | -data.elemHeight : | ||
1241 | data.my[ 1 ] === "bottom" ? | ||
1242 | data.elemHeight : | ||
1243 | 0, | ||
1244 | atOffset = data.at[ 1 ] === "top" ? | ||
1245 | data.targetHeight : | ||
1246 | data.at[ 1 ] === "bottom" ? | ||
1247 | -data.targetHeight : | ||
1248 | 0, | ||
1249 | offset = -2 * data.offset[ 1 ], | ||
1250 | newOverTop, | ||
1251 | newOverBottom; | ||
1252 | if ( overTop < 0 ) { | ||
1253 | newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; | ||
1254 | if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { | ||
1255 | position.top += myOffset + atOffset + offset; | ||
1256 | } | ||
1257 | } | ||
1258 | else if ( overBottom > 0 ) { | ||
1259 | newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; | ||
1260 | if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { | ||
1261 | position.top += myOffset + atOffset + offset; | ||
1262 | } | ||
1263 | } | ||
1264 | } | ||
1265 | }, | ||
1266 | flipfit: { | ||
1267 | left: function() { | ||
1268 | $.ui.position.flip.left.apply( this, arguments ); | ||
1269 | $.ui.position.fit.left.apply( this, arguments ); | ||
1270 | }, | ||
1271 | top: function() { | ||
1272 | $.ui.position.flip.top.apply( this, arguments ); | ||
1273 | $.ui.position.fit.top.apply( this, arguments ); | ||
1274 | } | ||
1275 | } | ||
1276 | }; | ||
1277 | |||
1278 | // fraction support test | ||
1279 | (function () { | ||
1280 | var testElement, testElementParent, testElementStyle, offsetLeft, i, | ||
1281 | body = document.getElementsByTagName( "body" )[ 0 ], | ||
1282 | div = document.createElement( "div" ); | ||
1283 | |||
1284 | //Create a "fake body" for testing based on method used in jQuery.support | ||
1285 | testElement = document.createElement( body ? "div" : "body" ); | ||
1286 | testElementStyle = { | ||
1287 | visibility: "hidden", | ||
1288 | width: 0, | ||
1289 | height: 0, | ||
1290 | border: 0, | ||
1291 | margin: 0, | ||
1292 | background: "none" | ||
1293 | }; | ||
1294 | if ( body ) { | ||
1295 | $.extend( testElementStyle, { | ||
1296 | position: "absolute", | ||
1297 | left: "-1000px", | ||
1298 | top: "-1000px" | ||
1299 | }); | ||
1300 | } | ||
1301 | for ( i in testElementStyle ) { | ||
1302 | testElement.style[ i ] = testElementStyle[ i ]; | ||
1303 | } | ||
1304 | testElement.appendChild( div ); | ||
1305 | testElementParent = body || document.documentElement; | ||
1306 | testElementParent.insertBefore( testElement, testElementParent.firstChild ); | ||
1307 | |||
1308 | div.style.cssText = "position: absolute; left: 10.7432222px;"; | ||
1309 | |||
1310 | offsetLeft = $( div ).offset().left; | ||
1311 | $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11; | ||
1312 | |||
1313 | testElement.innerHTML = ""; | ||
1314 | testElementParent.removeChild( testElement ); | ||
1315 | })(); | ||
1316 | |||
1317 | }( jQuery ) ); | ||
1318 | (function( $, undefined ) { | ||
1319 | |||
1320 | $.widget( "ui.autocomplete", { | ||
1321 | version: "1.10.4", | ||
1322 | defaultElement: "<input>", | ||
1323 | options: { | ||
1324 | appendTo: null, | ||
1325 | autoFocus: false, | ||
1326 | delay: 300, | ||
1327 | minLength: 1, | ||
1328 | position: { | ||
1329 | my: "left top", | ||
1330 | at: "left bottom", | ||
1331 | collision: "none" | ||
1332 | }, | ||
1333 | source: null, | ||
1334 | |||
1335 | // callbacks | ||
1336 | change: null, | ||
1337 | close: null, | ||
1338 | focus: null, | ||
1339 | open: null, | ||
1340 | response: null, | ||
1341 | search: null, | ||
1342 | select: null | ||
1343 | }, | ||
1344 | |||
1345 | requestIndex: 0, | ||
1346 | pending: 0, | ||
1347 | |||
1348 | _create: function() { | ||
1349 | // Some browsers only repeat keydown events, not keypress events, | ||
1350 | // so we use the suppressKeyPress flag to determine if we've already | ||
1351 | // handled the keydown event. #7269 | ||
1352 | // Unfortunately the code for & in keypress is the same as the up arrow, | ||
1353 | // so we use the suppressKeyPressRepeat flag to avoid handling keypress | ||
1354 | // events when we know the keydown event was used to modify the | ||
1355 | // search term. #7799 | ||
1356 | var suppressKeyPress, suppressKeyPressRepeat, suppressInput, | ||
1357 | nodeName = this.element[0].nodeName.toLowerCase(), | ||
1358 | isTextarea = nodeName === "textarea", | ||
1359 | isInput = nodeName === "input"; | ||
1360 | |||
1361 | this.isMultiLine = | ||
1362 | // Textareas are always multi-line | ||
1363 | isTextarea ? true : | ||
1364 | // Inputs are always single-line, even if inside a contentEditable element | ||
1365 | // IE also treats inputs as contentEditable | ||
1366 | isInput ? false : | ||
1367 | // All other element types are determined by whether or not they're contentEditable | ||
1368 | this.element.prop( "isContentEditable" ); | ||
1369 | |||
1370 | this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ]; | ||
1371 | this.isNewMenu = true; | ||
1372 | |||
1373 | this.element | ||
1374 | .addClass( "ui-autocomplete-input" ) | ||
1375 | .attr( "autocomplete", "off" ); | ||
1376 | |||
1377 | this._on( this.element, { | ||
1378 | keydown: function( event ) { | ||
1379 | if ( this.element.prop( "readOnly" ) ) { | ||
1380 | suppressKeyPress = true; | ||
1381 | suppressInput = true; | ||
1382 | suppressKeyPressRepeat = true; | ||
1383 | return; | ||
1384 | } | ||
1385 | |||
1386 | suppressKeyPress = false; | ||
1387 | suppressInput = false; | ||
1388 | suppressKeyPressRepeat = false; | ||
1389 | var keyCode = $.ui.keyCode; | ||
1390 | switch( event.keyCode ) { | ||
1391 | case keyCode.PAGE_UP: | ||
1392 | suppressKeyPress = true; | ||
1393 | this._move( "previousPage", event ); | ||
1394 | break; | ||
1395 | case keyCode.PAGE_DOWN: | ||
1396 | suppressKeyPress = true; | ||
1397 | this._move( "nextPage", event ); | ||
1398 | break; | ||
1399 | case keyCode.UP: | ||
1400 | suppressKeyPress = true; | ||
1401 | this._keyEvent( "previous", event ); | ||
1402 | break; | ||
1403 | case keyCode.DOWN: | ||
1404 | suppressKeyPress = true; | ||
1405 | this._keyEvent( "next", event ); | ||
1406 | break; | ||
1407 | case keyCode.ENTER: | ||
1408 | case keyCode.NUMPAD_ENTER: | ||
1409 | // when menu is open and has focus | ||
1410 | if ( this.menu.active ) { | ||
1411 | // #6055 - Opera still allows the keypress to occur | ||
1412 | // which causes forms to submit | ||
1413 | suppressKeyPress = true; | ||
1414 | event.preventDefault(); | ||
1415 | this.menu.select( event ); | ||
1416 | } | ||
1417 | break; | ||
1418 | case keyCode.TAB: | ||
1419 | if ( this.menu.active ) { | ||
1420 | this.menu.select( event ); | ||
1421 | } | ||
1422 | break; | ||
1423 | case keyCode.ESCAPE: | ||
1424 | if ( this.menu.element.is( ":visible" ) ) { | ||
1425 | this._value( this.term ); | ||
1426 | this.close( event ); | ||
1427 | // Different browsers have different default behavior for escape | ||
1428 | // Single press can mean undo or clear | ||
1429 | // Double press in IE means clear the whole form | ||
1430 | event.preventDefault(); | ||
1431 | } | ||
1432 | break; | ||
1433 | default: | ||
1434 | suppressKeyPressRepeat = true; | ||
1435 | // search timeout should be triggered before the input value is changed | ||
1436 | this._searchTimeout( event ); | ||
1437 | break; | ||
1438 | } | ||
1439 | }, | ||
1440 | keypress: function( event ) { | ||
1441 | if ( suppressKeyPress ) { | ||
1442 | suppressKeyPress = false; | ||
1443 | if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { | ||
1444 | event.preventDefault(); | ||
1445 | } | ||
1446 | return; | ||
1447 | } | ||
1448 | if ( suppressKeyPressRepeat ) { | ||
1449 | return; | ||
1450 | } | ||
1451 | |||
1452 | // replicate some key handlers to allow them to repeat in Firefox and Opera | ||
1453 | var keyCode = $.ui.keyCode; | ||
1454 | switch( event.keyCode ) { | ||
1455 | case keyCode.PAGE_UP: | ||
1456 | this._move( "previousPage", event ); | ||
1457 | break; | ||
1458 | case keyCode.PAGE_DOWN: | ||
1459 | this._move( "nextPage", event ); | ||
1460 | break; | ||
1461 | case keyCode.UP: | ||
1462 | this._keyEvent( "previous", event ); | ||
1463 | break; | ||
1464 | case keyCode.DOWN: | ||
1465 | this._keyEvent( "next", event ); | ||
1466 | break; | ||
1467 | } | ||
1468 | }, | ||
1469 | input: function( event ) { | ||
1470 | if ( suppressInput ) { | ||
1471 | suppressInput = false; | ||
1472 | event.preventDefault(); | ||
1473 | return; | ||
1474 | } | ||
1475 | this._searchTimeout( event ); | ||
1476 | }, | ||
1477 | focus: function() { | ||
1478 | this.selectedItem = null; | ||
1479 | this.previous = this._value(); | ||
1480 | }, | ||
1481 | blur: function( event ) { | ||
1482 | if ( this.cancelBlur ) { | ||
1483 | delete this.cancelBlur; | ||
1484 | return; | ||
1485 | } | ||
1486 | |||
1487 | clearTimeout( this.searching ); | ||
1488 | this.close( event ); | ||
1489 | this._change( event ); | ||
1490 | } | ||
1491 | }); | ||
1492 | |||
1493 | this._initSource(); | ||
1494 | this.menu = $( "<ul>" ) | ||
1495 | .addClass( "ui-autocomplete ui-front" ) | ||
1496 | .appendTo( this._appendTo() ) | ||
1497 | .menu({ | ||
1498 | // disable ARIA support, the live region takes care of that | ||
1499 | role: null | ||
1500 | }) | ||
1501 | .hide() | ||
1502 | .data( "ui-menu" ); | ||
1503 | |||
1504 | this._on( this.menu.element, { | ||
1505 | mousedown: function( event ) { | ||
1506 | // prevent moving focus out of the text field | ||
1507 | event.preventDefault(); | ||
1508 | |||
1509 | // IE doesn't prevent moving focus even with event.preventDefault() | ||
1510 | // so we set a flag to know when we should ignore the blur event | ||
1511 | this.cancelBlur = true; | ||
1512 | this._delay(function() { | ||
1513 | delete this.cancelBlur; | ||
1514 | }); | ||
1515 | |||
1516 | // clicking on the scrollbar causes focus to shift to the body | ||
1517 | // but we can't detect a mouseup or a click immediately afterward | ||
1518 | // so we have to track the next mousedown and close the menu if | ||
1519 | // the user clicks somewhere outside of the autocomplete | ||
1520 | var menuElement = this.menu.element[ 0 ]; | ||
1521 | if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { | ||
1522 | this._delay(function() { | ||
1523 | var that = this; | ||
1524 | this.document.one( "mousedown", function( event ) { | ||
1525 | if ( event.target !== that.element[ 0 ] && | ||
1526 | event.target !== menuElement && | ||
1527 | !$.contains( menuElement, event.target ) ) { | ||
1528 | that.close(); | ||
1529 | } | ||
1530 | }); | ||
1531 | }); | ||
1532 | } | ||
1533 | }, | ||
1534 | menufocus: function( event, ui ) { | ||
1535 | // support: Firefox | ||
1536 | // Prevent accidental activation of menu items in Firefox (#7024 #9118) | ||
1537 | if ( this.isNewMenu ) { | ||
1538 | this.isNewMenu = false; | ||
1539 | if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) { | ||
1540 | this.menu.blur(); | ||
1541 | |||
1542 | this.document.one( "mousemove", function() { | ||
1543 | $( event.target ).trigger( event.originalEvent ); | ||
1544 | }); | ||
1545 | |||
1546 | return; | ||
1547 | } | ||
1548 | } | ||
1549 | |||
1550 | var item = ui.item.data( "ui-autocomplete-item" ); | ||
1551 | if ( false !== this._trigger( "focus", event, { item: item } ) ) { | ||
1552 | // use value to match what will end up in the input, if it was a key event | ||
1553 | if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) { | ||
1554 | this._value( item.value ); | ||
1555 | } | ||
1556 | } else { | ||
1557 | // Normally the input is populated with the item's value as the | ||
1558 | // menu is navigated, causing screen readers to notice a change and | ||
1559 | // announce the item. Since the focus event was canceled, this doesn't | ||
1560 | // happen, so we update the live region so that screen readers can | ||
1561 | // still notice the change and announce it. | ||
1562 | this.liveRegion.text( item.value ); | ||
1563 | } | ||
1564 | }, | ||
1565 | menuselect: function( event, ui ) { | ||
1566 | var item = ui.item.data( "ui-autocomplete-item" ), | ||
1567 | previous = this.previous; | ||
1568 | |||
1569 | // only trigger when focus was lost (click on menu) | ||
1570 | if ( this.element[0] !== this.document[0].activeElement ) { | ||
1571 | this.element.focus(); | ||
1572 | this.previous = previous; | ||
1573 | // #6109 - IE triggers two focus events and the second | ||
1574 | // is asynchronous, so we need to reset the previous | ||
1575 | // term synchronously and asynchronously :-( | ||
1576 | this._delay(function() { | ||
1577 | this.previous = previous; | ||
1578 | this.selectedItem = item; | ||
1579 | }); | ||
1580 | } | ||
1581 | |||
1582 | if ( false !== this._trigger( "select", event, { item: item } ) ) { | ||
1583 | this._value( item.value ); | ||
1584 | } | ||
1585 | // reset the term after the select event | ||
1586 | // this allows custom select handling to work properly | ||
1587 | this.term = this._value(); | ||
1588 | |||
1589 | this.close( event ); | ||
1590 | this.selectedItem = item; | ||
1591 | } | ||
1592 | }); | ||
1593 | |||
1594 | this.liveRegion = $( "<span>", { | ||
1595 | role: "status", | ||
1596 | "aria-live": "polite" | ||
1597 | }) | ||
1598 | .addClass( "ui-helper-hidden-accessible" ) | ||
1599 | .insertBefore( this.element ); | ||
1600 | |||
1601 | // turning off autocomplete prevents the browser from remembering the | ||
1602 | // value when navigating through history, so we re-enable autocomplete | ||
1603 | // if the page is unloaded before the widget is destroyed. #7790 | ||
1604 | this._on( this.window, { | ||
1605 | beforeunload: function() { | ||
1606 | this.element.removeAttr( "autocomplete" ); | ||
1607 | } | ||
1608 | }); | ||
1609 | }, | ||
1610 | |||
1611 | _destroy: function() { | ||
1612 | clearTimeout( this.searching ); | ||
1613 | this.element | ||
1614 | .removeClass( "ui-autocomplete-input" ) | ||
1615 | .removeAttr( "autocomplete" ); | ||
1616 | this.menu.element.remove(); | ||
1617 | this.liveRegion.remove(); | ||
1618 | }, | ||
1619 | |||
1620 | _setOption: function( key, value ) { | ||
1621 | this._super( key, value ); | ||
1622 | if ( key === "source" ) { | ||
1623 | this._initSource(); | ||
1624 | } | ||
1625 | if ( key === "appendTo" ) { | ||
1626 | this.menu.element.appendTo( this._appendTo() ); | ||
1627 | } | ||
1628 | if ( key === "disabled" && value && this.xhr ) { | ||
1629 | this.xhr.abort(); | ||
1630 | } | ||
1631 | }, | ||
1632 | |||
1633 | _appendTo: function() { | ||
1634 | var element = this.options.appendTo; | ||
1635 | |||
1636 | if ( element ) { | ||
1637 | element = element.jquery || element.nodeType ? | ||
1638 | $( element ) : | ||
1639 | this.document.find( element ).eq( 0 ); | ||
1640 | } | ||
1641 | |||
1642 | if ( !element ) { | ||
1643 | element = this.element.closest( ".ui-front" ); | ||
1644 | } | ||
1645 | |||
1646 | if ( !element.length ) { | ||
1647 | element = this.document[0].body; | ||
1648 | } | ||
1649 | |||
1650 | return element; | ||
1651 | }, | ||
1652 | |||
1653 | _initSource: function() { | ||
1654 | var array, url, | ||
1655 | that = this; | ||
1656 | if ( $.isArray(this.options.source) ) { | ||
1657 | array = this.options.source; | ||
1658 | this.source = function( request, response ) { | ||
1659 | response( $.ui.autocomplete.filter( array, request.term ) ); | ||
1660 | }; | ||
1661 | } else if ( typeof this.options.source === "string" ) { | ||
1662 | url = this.options.source; | ||
1663 | this.source = function( request, response ) { | ||
1664 | if ( that.xhr ) { | ||
1665 | that.xhr.abort(); | ||
1666 | } | ||
1667 | that.xhr = $.ajax({ | ||
1668 | url: url, | ||
1669 | data: request, | ||
1670 | dataType: "json", | ||
1671 | success: function( data ) { | ||
1672 | response( data ); | ||
1673 | }, | ||
1674 | error: function() { | ||
1675 | response( [] ); | ||
1676 | } | ||
1677 | }); | ||
1678 | }; | ||
1679 | } else { | ||
1680 | this.source = this.options.source; | ||
1681 | } | ||
1682 | }, | ||
1683 | |||
1684 | _searchTimeout: function( event ) { | ||
1685 | clearTimeout( this.searching ); | ||
1686 | this.searching = this._delay(function() { | ||
1687 | // only search if the value has changed | ||
1688 | if ( this.term !== this._value() ) { | ||
1689 | this.selectedItem = null; | ||
1690 | this.search( null, event ); | ||
1691 | } | ||
1692 | }, this.options.delay ); | ||
1693 | }, | ||
1694 | |||
1695 | search: function( value, event ) { | ||
1696 | value = value != null ? value : this._value(); | ||
1697 | |||
1698 | // always save the actual value, not the one passed as an argument | ||
1699 | this.term = this._value(); | ||
1700 | |||
1701 | if ( value.length < this.options.minLength ) { | ||
1702 | return this.close( event ); | ||
1703 | } | ||
1704 | |||
1705 | if ( this._trigger( "search", event ) === false ) { | ||
1706 | return; | ||
1707 | } | ||
1708 | |||
1709 | return this._search( value ); | ||
1710 | }, | ||
1711 | |||
1712 | _search: function( value ) { | ||
1713 | this.pending++; | ||
1714 | this.element.addClass( "ui-autocomplete-loading" ); | ||
1715 | this.cancelSearch = false; | ||
1716 | |||
1717 | this.source( { term: value }, this._response() ); | ||
1718 | }, | ||
1719 | |||
1720 | _response: function() { | ||
1721 | var index = ++this.requestIndex; | ||
1722 | |||
1723 | return $.proxy(function( content ) { | ||
1724 | if ( index === this.requestIndex ) { | ||
1725 | this.__response( content ); | ||
1726 | } | ||
1727 | |||
1728 | this.pending--; | ||
1729 | if ( !this.pending ) { | ||
1730 | this.element.removeClass( "ui-autocomplete-loading" ); | ||
1731 | } | ||
1732 | }, this ); | ||
1733 | }, | ||
1734 | |||
1735 | __response: function( content ) { | ||
1736 | if ( content ) { | ||
1737 | content = this._normalize( content ); | ||
1738 | } | ||
1739 | this._trigger( "response", null, { content: content } ); | ||
1740 | if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { | ||
1741 | this._suggest( content ); | ||
1742 | this._trigger( "open" ); | ||
1743 | } else { | ||
1744 | // use ._close() instead of .close() so we don't cancel future searches | ||
1745 | this._close(); | ||
1746 | } | ||
1747 | }, | ||
1748 | |||
1749 | close: function( event ) { | ||
1750 | this.cancelSearch = true; | ||
1751 | this._close( event ); | ||
1752 | }, | ||
1753 | |||
1754 | _close: function( event ) { | ||
1755 | if ( this.menu.element.is( ":visible" ) ) { | ||
1756 | this.menu.element.hide(); | ||
1757 | this.menu.blur(); | ||
1758 | this.isNewMenu = true; | ||
1759 | this._trigger( "close", event ); | ||
1760 | } | ||
1761 | }, | ||
1762 | |||
1763 | _change: function( event ) { | ||
1764 | if ( this.previous !== this._value() ) { | ||
1765 | this._trigger( "change", event, { item: this.selectedItem } ); | ||
1766 | } | ||
1767 | }, | ||
1768 | |||
1769 | _normalize: function( items ) { | ||
1770 | // assume all items have the right format when the first item is complete | ||
1771 | if ( items.length && items[0].label && items[0].value ) { | ||
1772 | return items; | ||
1773 | } | ||
1774 | return $.map( items, function( item ) { | ||
1775 | if ( typeof item === "string" ) { | ||
1776 | return { | ||
1777 | label: item, | ||
1778 | value: item | ||
1779 | }; | ||
1780 | } | ||
1781 | return $.extend({ | ||
1782 | label: item.label || item.value, | ||
1783 | value: item.value || item.label | ||
1784 | }, item ); | ||
1785 | }); | ||
1786 | }, | ||
1787 | |||
1788 | _suggest: function( items ) { | ||
1789 | var ul = this.menu.element.empty(); | ||
1790 | this._renderMenu( ul, items ); | ||
1791 | this.isNewMenu = true; | ||
1792 | this.menu.refresh(); | ||
1793 | |||
1794 | // size and position menu | ||
1795 | ul.show(); | ||
1796 | this._resizeMenu(); | ||
1797 | ul.position( $.extend({ | ||
1798 | of: this.element | ||
1799 | }, this.options.position )); | ||
1800 | |||
1801 | if ( this.options.autoFocus ) { | ||
1802 | this.menu.next(); | ||
1803 | } | ||
1804 | }, | ||
1805 | |||
1806 | _resizeMenu: function() { | ||
1807 | var ul = this.menu.element; | ||
1808 | ul.outerWidth( Math.max( | ||
1809 | // Firefox wraps long text (possibly a rounding bug) | ||
1810 | // so we add 1px to avoid the wrapping (#7513) | ||
1811 | ul.width( "" ).outerWidth() + 1, | ||
1812 | this.element.outerWidth() | ||
1813 | ) ); | ||
1814 | }, | ||
1815 | |||
1816 | _renderMenu: function( ul, items ) { | ||
1817 | var that = this; | ||
1818 | $.each( items, function( index, item ) { | ||
1819 | that._renderItemData( ul, item ); | ||
1820 | }); | ||
1821 | }, | ||
1822 | |||
1823 | _renderItemData: function( ul, item ) { | ||
1824 | return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); | ||
1825 | }, | ||
1826 | |||
1827 | _renderItem: function( ul, item ) { | ||
1828 | return $( "<li>" ) | ||
1829 | .append( $( "<a>" ).text( item.label ) ) | ||
1830 | .appendTo( ul ); | ||
1831 | }, | ||
1832 | |||
1833 | _move: function( direction, event ) { | ||
1834 | if ( !this.menu.element.is( ":visible" ) ) { | ||
1835 | this.search( null, event ); | ||
1836 | return; | ||
1837 | } | ||
1838 | if ( this.menu.isFirstItem() && /^previous/.test( direction ) || | ||
1839 | this.menu.isLastItem() && /^next/.test( direction ) ) { | ||
1840 | this._value( this.term ); | ||
1841 | this.menu.blur(); | ||
1842 | return; | ||
1843 | } | ||
1844 | this.menu[ direction ]( event ); | ||
1845 | }, | ||
1846 | |||
1847 | widget: function() { | ||
1848 | return this.menu.element; | ||
1849 | }, | ||
1850 | |||
1851 | _value: function() { | ||
1852 | return this.valueMethod.apply( this.element, arguments ); | ||
1853 | }, | ||
1854 | |||
1855 | _keyEvent: function( keyEvent, event ) { | ||
1856 | if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { | ||
1857 | this._move( keyEvent, event ); | ||
1858 | |||
1859 | // prevents moving cursor to beginning/end of the text field in some browsers | ||
1860 | event.preventDefault(); | ||
1861 | } | ||
1862 | } | ||
1863 | }); | ||
1864 | |||
1865 | $.extend( $.ui.autocomplete, { | ||
1866 | escapeRegex: function( value ) { | ||
1867 | return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); | ||
1868 | }, | ||
1869 | filter: function(array, term) { | ||
1870 | var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); | ||
1871 | return $.grep( array, function(value) { | ||
1872 | return matcher.test( value.label || value.value || value ); | ||
1873 | }); | ||
1874 | } | ||
1875 | }); | ||
1876 | |||
1877 | |||
1878 | // live region extension, adding a `messages` option | ||
1879 | // NOTE: This is an experimental API. We are still investigating | ||
1880 | // a full solution for string manipulation and internationalization. | ||
1881 | $.widget( "ui.autocomplete", $.ui.autocomplete, { | ||
1882 | options: { | ||
1883 | messages: { | ||
1884 | noResults: "No search results.", | ||
1885 | results: function( amount ) { | ||
1886 | return amount + ( amount > 1 ? " results are" : " result is" ) + | ||
1887 | " available, use up and down arrow keys to navigate."; | ||
1888 | } | ||
1889 | } | ||
1890 | }, | ||
1891 | |||
1892 | __response: function( content ) { | ||
1893 | var message; | ||
1894 | this._superApply( arguments ); | ||
1895 | if ( this.options.disabled || this.cancelSearch ) { | ||
1896 | return; | ||
1897 | } | ||
1898 | if ( content && content.length ) { | ||
1899 | message = this.options.messages.results( content.length ); | ||
1900 | } else { | ||
1901 | message = this.options.messages.noResults; | ||
1902 | } | ||
1903 | this.liveRegion.text( message ); | ||
1904 | } | ||
1905 | }); | ||
1906 | |||
1907 | }( jQuery )); | ||
1908 | (function( $, undefined ) { | ||
1909 | |||
1910 | $.widget( "ui.menu", { | ||
1911 | version: "1.10.4", | ||
1912 | defaultElement: "<ul>", | ||
1913 | delay: 300, | ||
1914 | options: { | ||
1915 | icons: { | ||
1916 | submenu: "ui-icon-carat-1-e" | ||
1917 | }, | ||
1918 | menus: "ul", | ||
1919 | position: { | ||
1920 | my: "left top", | ||
1921 | at: "right top" | ||
1922 | }, | ||
1923 | role: "menu", | ||
1924 | |||
1925 | // callbacks | ||
1926 | blur: null, | ||
1927 | focus: null, | ||
1928 | select: null | ||
1929 | }, | ||
1930 | |||
1931 | _create: function() { | ||
1932 | this.activeMenu = this.element; | ||
1933 | // flag used to prevent firing of the click handler | ||
1934 | // as the event bubbles up through nested menus | ||
1935 | this.mouseHandled = false; | ||
1936 | this.element | ||
1937 | .uniqueId() | ||
1938 | .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) | ||
1939 | .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ) | ||
1940 | .attr({ | ||
1941 | role: this.options.role, | ||
1942 | tabIndex: 0 | ||
1943 | }) | ||
1944 | // need to catch all clicks on disabled menu | ||
1945 | // not possible through _on | ||
1946 | .bind( "click" + this.eventNamespace, $.proxy(function( event ) { | ||
1947 | if ( this.options.disabled ) { | ||
1948 | event.preventDefault(); | ||
1949 | } | ||
1950 | }, this )); | ||
1951 | |||
1952 | if ( this.options.disabled ) { | ||
1953 | this.element | ||
1954 | .addClass( "ui-state-disabled" ) | ||
1955 | .attr( "aria-disabled", "true" ); | ||
1956 | } | ||
1957 | |||
1958 | this._on({ | ||
1959 | // Prevent focus from sticking to links inside menu after clicking | ||
1960 | // them (focus should always stay on UL during navigation). | ||
1961 | "mousedown .ui-menu-item > a": function( event ) { | ||
1962 | event.preventDefault(); | ||
1963 | }, | ||
1964 | "click .ui-state-disabled > a": function( event ) { | ||
1965 | event.preventDefault(); | ||
1966 | }, | ||
1967 | "click .ui-menu-item:has(a)": function( event ) { | ||
1968 | var target = $( event.target ).closest( ".ui-menu-item" ); | ||
1969 | if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) { | ||
1970 | this.select( event ); | ||
1971 | |||
1972 | // Only set the mouseHandled flag if the event will bubble, see #9469. | ||
1973 | if ( !event.isPropagationStopped() ) { | ||
1974 | this.mouseHandled = true; | ||
1975 | } | ||
1976 | |||
1977 | // Open submenu on click | ||
1978 | if ( target.has( ".ui-menu" ).length ) { | ||
1979 | this.expand( event ); | ||
1980 | } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) { | ||
1981 | |||
1982 | // Redirect focus to the menu | ||
1983 | this.element.trigger( "focus", [ true ] ); | ||
1984 | |||
1985 | // If the active item is on the top level, let it stay active. | ||
1986 | // Otherwise, blur the active item since it is no longer visible. | ||
1987 | if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) { | ||
1988 | clearTimeout( this.timer ); | ||
1989 | } | ||
1990 | } | ||
1991 | } | ||
1992 | }, | ||
1993 | "mouseenter .ui-menu-item": function( event ) { | ||
1994 | var target = $( event.currentTarget ); | ||
1995 | // Remove ui-state-active class from siblings of the newly focused menu item | ||
1996 | // to avoid a jump caused by adjacent elements both having a class with a border | ||
1997 | target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" ); | ||
1998 | this.focus( event, target ); | ||
1999 | }, | ||
2000 | mouseleave: "collapseAll", | ||
2001 | "mouseleave .ui-menu": "collapseAll", | ||
2002 | focus: function( event, keepActiveItem ) { | ||
2003 | // If there's already an active item, keep it active | ||
2004 | // If not, activate the first item | ||
2005 | var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 ); | ||
2006 | |||
2007 | if ( !keepActiveItem ) { | ||
2008 | this.focus( event, item ); | ||
2009 | } | ||
2010 | }, | ||
2011 | blur: function( event ) { | ||
2012 | this._delay(function() { | ||
2013 | if ( !$.contains( this.element[0], this.document[0].activeElement ) ) { | ||
2014 | this.collapseAll( event ); | ||
2015 | } | ||
2016 | }); | ||
2017 | }, | ||
2018 | keydown: "_keydown" | ||
2019 | }); | ||
2020 | |||
2021 | this.refresh(); | ||
2022 | |||
2023 | // Clicks outside of a menu collapse any open menus | ||
2024 | this._on( this.document, { | ||
2025 | click: function( event ) { | ||
2026 | if ( !$( event.target ).closest( ".ui-menu" ).length ) { | ||
2027 | this.collapseAll( event ); | ||
2028 | } | ||
2029 | |||
2030 | // Reset the mouseHandled flag | ||
2031 | this.mouseHandled = false; | ||
2032 | } | ||
2033 | }); | ||
2034 | }, | ||
2035 | |||
2036 | _destroy: function() { | ||
2037 | // Destroy (sub)menus | ||
2038 | this.element | ||
2039 | .removeAttr( "aria-activedescendant" ) | ||
2040 | .find( ".ui-menu" ).addBack() | ||
2041 | .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" ) | ||
2042 | .removeAttr( "role" ) | ||
2043 | .removeAttr( "tabIndex" ) | ||
2044 | .removeAttr( "aria-labelledby" ) | ||
2045 | .removeAttr( "aria-expanded" ) | ||
2046 | .removeAttr( "aria-hidden" ) | ||
2047 | .removeAttr( "aria-disabled" ) | ||
2048 | .removeUniqueId() | ||
2049 | .show(); | ||
2050 | |||
2051 | // Destroy menu items | ||
2052 | this.element.find( ".ui-menu-item" ) | ||
2053 | .removeClass( "ui-menu-item" ) | ||
2054 | .removeAttr( "role" ) | ||
2055 | .removeAttr( "aria-disabled" ) | ||
2056 | .children( "a" ) | ||
2057 | .removeUniqueId() | ||
2058 | .removeClass( "ui-corner-all ui-state-hover" ) | ||
2059 | .removeAttr( "tabIndex" ) | ||
2060 | .removeAttr( "role" ) | ||
2061 | .removeAttr( "aria-haspopup" ) | ||
2062 | .children().each( function() { | ||
2063 | var elem = $( this ); | ||
2064 | if ( elem.data( "ui-menu-submenu-carat" ) ) { | ||
2065 | elem.remove(); | ||
2066 | } | ||
2067 | }); | ||
2068 | |||
2069 | // Destroy menu dividers | ||
2070 | this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" ); | ||
2071 | }, | ||
2072 | |||
2073 | _keydown: function( event ) { | ||
2074 | var match, prev, character, skip, regex, | ||
2075 | preventDefault = true; | ||
2076 | |||
2077 | function escape( value ) { | ||
2078 | return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); | ||
2079 | } | ||
2080 | |||
2081 | switch ( event.keyCode ) { | ||
2082 | case $.ui.keyCode.PAGE_UP: | ||
2083 | this.previousPage( event ); | ||
2084 | break; | ||
2085 | case $.ui.keyCode.PAGE_DOWN: | ||
2086 | this.nextPage( event ); | ||
2087 | break; | ||
2088 | case $.ui.keyCode.HOME: | ||
2089 | this._move( "first", "first", event ); | ||
2090 | break; | ||
2091 | case $.ui.keyCode.END: | ||
2092 | this._move( "last", "last", event ); | ||
2093 | break; | ||
2094 | case $.ui.keyCode.UP: | ||
2095 | this.previous( event ); | ||
2096 | break; | ||
2097 | case $.ui.keyCode.DOWN: | ||
2098 | this.next( event ); | ||
2099 | break; | ||
2100 | case $.ui.keyCode.LEFT: | ||
2101 | this.collapse( event ); | ||
2102 | break; | ||
2103 | case $.ui.keyCode.RIGHT: | ||
2104 | if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { | ||
2105 | this.expand( event ); | ||
2106 | } | ||
2107 | break; | ||
2108 | case $.ui.keyCode.ENTER: | ||
2109 | case $.ui.keyCode.SPACE: | ||
2110 | this._activate( event ); | ||
2111 | break; | ||
2112 | case $.ui.keyCode.ESCAPE: | ||
2113 | this.collapse( event ); | ||
2114 | break; | ||
2115 | default: | ||
2116 | preventDefault = false; | ||
2117 | prev = this.previousFilter || ""; | ||
2118 | character = String.fromCharCode( event.keyCode ); | ||
2119 | skip = false; | ||
2120 | |||
2121 | clearTimeout( this.filterTimer ); | ||
2122 | |||
2123 | if ( character === prev ) { | ||
2124 | skip = true; | ||
2125 | } else { | ||
2126 | character = prev + character; | ||
2127 | } | ||
2128 | |||
2129 | regex = new RegExp( "^" + escape( character ), "i" ); | ||
2130 | match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { | ||
2131 | return regex.test( $( this ).children( "a" ).text() ); | ||
2132 | }); | ||
2133 | match = skip && match.index( this.active.next() ) !== -1 ? | ||
2134 | this.active.nextAll( ".ui-menu-item" ) : | ||
2135 | match; | ||
2136 | |||
2137 | // If no matches on the current filter, reset to the last character pressed | ||
2138 | // to move down the menu to the first item that starts with that character | ||
2139 | if ( !match.length ) { | ||
2140 | character = String.fromCharCode( event.keyCode ); | ||
2141 | regex = new RegExp( "^" + escape( character ), "i" ); | ||
2142 | match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { | ||
2143 | return regex.test( $( this ).children( "a" ).text() ); | ||
2144 | }); | ||
2145 | } | ||
2146 | |||
2147 | if ( match.length ) { | ||
2148 | this.focus( event, match ); | ||
2149 | if ( match.length > 1 ) { | ||
2150 | this.previousFilter = character; | ||
2151 | this.filterTimer = this._delay(function() { | ||
2152 | delete this.previousFilter; | ||
2153 | }, 1000 ); | ||
2154 | } else { | ||
2155 | delete this.previousFilter; | ||
2156 | } | ||
2157 | } else { | ||
2158 | delete this.previousFilter; | ||
2159 | } | ||
2160 | } | ||
2161 | |||
2162 | if ( preventDefault ) { | ||
2163 | event.preventDefault(); | ||
2164 | } | ||
2165 | }, | ||
2166 | |||
2167 | _activate: function( event ) { | ||
2168 | if ( !this.active.is( ".ui-state-disabled" ) ) { | ||
2169 | if ( this.active.children( "a[aria-haspopup='true']" ).length ) { | ||
2170 | this.expand( event ); | ||
2171 | } else { | ||
2172 | this.select( event ); | ||
2173 | } | ||
2174 | } | ||
2175 | }, | ||
2176 | |||
2177 | refresh: function() { | ||
2178 | var menus, | ||
2179 | icon = this.options.icons.submenu, | ||
2180 | submenus = this.element.find( this.options.menus ); | ||
2181 | |||
2182 | this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ); | ||
2183 | |||
2184 | // Initialize nested menus | ||
2185 | submenus.filter( ":not(.ui-menu)" ) | ||
2186 | .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) | ||
2187 | .hide() | ||
2188 | .attr({ | ||
2189 | role: this.options.role, | ||
2190 | "aria-hidden": "true", | ||
2191 | "aria-expanded": "false" | ||
2192 | }) | ||
2193 | .each(function() { | ||
2194 | var menu = $( this ), | ||
2195 | item = menu.prev( "a" ), | ||
2196 | submenuCarat = $( "<span>" ) | ||
2197 | .addClass( "ui-menu-icon ui-icon " + icon ) | ||
2198 | .data( "ui-menu-submenu-carat", true ); | ||
2199 | |||
2200 | item | ||
2201 | .attr( "aria-haspopup", "true" ) | ||
2202 | .prepend( submenuCarat ); | ||
2203 | menu.attr( "aria-labelledby", item.attr( "id" ) ); | ||
2204 | }); | ||
2205 | |||
2206 | menus = submenus.add( this.element ); | ||
2207 | |||
2208 | // Don't refresh list items that are already adapted | ||
2209 | menus.children( ":not(.ui-menu-item):has(a)" ) | ||
2210 | .addClass( "ui-menu-item" ) | ||
2211 | .attr( "role", "presentation" ) | ||
2212 | .children( "a" ) | ||
2213 | .uniqueId() | ||
2214 | .addClass( "ui-corner-all" ) | ||
2215 | .attr({ | ||
2216 | tabIndex: -1, | ||
2217 | role: this._itemRole() | ||
2218 | }); | ||
2219 | |||
2220 | // Initialize unlinked menu-items containing spaces and/or dashes only as dividers | ||
2221 | menus.children( ":not(.ui-menu-item)" ).each(function() { | ||
2222 | var item = $( this ); | ||
2223 | // hyphen, em dash, en dash | ||
2224 | if ( !/[^\-\u2014\u2013\s]/.test( item.text() ) ) { | ||
2225 | item.addClass( "ui-widget-content ui-menu-divider" ); | ||
2226 | } | ||
2227 | }); | ||
2228 | |||
2229 | // Add aria-disabled attribute to any disabled menu item | ||
2230 | menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); | ||
2231 | |||
2232 | // If the active item has been removed, blur the menu | ||
2233 | if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { | ||
2234 | this.blur(); | ||
2235 | } | ||
2236 | }, | ||
2237 | |||
2238 | _itemRole: function() { | ||
2239 | return { | ||
2240 | menu: "menuitem", | ||
2241 | listbox: "option" | ||
2242 | }[ this.options.role ]; | ||
2243 | }, | ||
2244 | |||
2245 | _setOption: function( key, value ) { | ||
2246 | if ( key === "icons" ) { | ||
2247 | this.element.find( ".ui-menu-icon" ) | ||
2248 | .removeClass( this.options.icons.submenu ) | ||
2249 | .addClass( value.submenu ); | ||
2250 | } | ||
2251 | this._super( key, value ); | ||
2252 | }, | ||
2253 | |||
2254 | focus: function( event, item ) { | ||
2255 | var nested, focused; | ||
2256 | this.blur( event, event && event.type === "focus" ); | ||
2257 | |||
2258 | this._scrollIntoView( item ); | ||
2259 | |||
2260 | this.active = item.first(); | ||
2261 | focused = this.active.children( "a" ).addClass( "ui-state-focus" ); | ||
2262 | // Only update aria-activedescendant if there's a role | ||
2263 | // otherwise we assume focus is managed elsewhere | ||
2264 | if ( this.options.role ) { | ||
2265 | this.element.attr( "aria-activedescendant", focused.attr( "id" ) ); | ||
2266 | } | ||
2267 | |||
2268 | // Highlight active parent menu item, if any | ||
2269 | this.active | ||
2270 | .parent() | ||
2271 | .closest( ".ui-menu-item" ) | ||
2272 | .children( "a:first" ) | ||
2273 | .addClass( "ui-state-active" ); | ||
2274 | |||
2275 | if ( event && event.type === "keydown" ) { | ||
2276 | this._close(); | ||
2277 | } else { | ||
2278 | this.timer = this._delay(function() { | ||
2279 | this._close(); | ||
2280 | }, this.delay ); | ||
2281 | } | ||
2282 | |||
2283 | nested = item.children( ".ui-menu" ); | ||
2284 | if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) { | ||
2285 | this._startOpening(nested); | ||
2286 | } | ||
2287 | this.activeMenu = item.parent(); | ||
2288 | |||
2289 | this._trigger( "focus", event, { item: item } ); | ||
2290 | }, | ||
2291 | |||
2292 | _scrollIntoView: function( item ) { | ||
2293 | var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; | ||
2294 | if ( this._hasScroll() ) { | ||
2295 | borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0; | ||
2296 | paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0; | ||
2297 | offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; | ||
2298 | scroll = this.activeMenu.scrollTop(); | ||
2299 | elementHeight = this.activeMenu.height(); | ||
2300 | itemHeight = item.height(); | ||
2301 | |||
2302 | if ( offset < 0 ) { | ||
2303 | this.activeMenu.scrollTop( scroll + offset ); | ||
2304 | } else if ( offset + itemHeight > elementHeight ) { | ||
2305 | this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); | ||
2306 | } | ||
2307 | } | ||
2308 | }, | ||
2309 | |||
2310 | blur: function( event, fromFocus ) { | ||
2311 | if ( !fromFocus ) { | ||
2312 | clearTimeout( this.timer ); | ||
2313 | } | ||
2314 | |||
2315 | if ( !this.active ) { | ||
2316 | return; | ||
2317 | } | ||
2318 | |||
2319 | this.active.children( "a" ).removeClass( "ui-state-focus" ); | ||
2320 | this.active = null; | ||
2321 | |||
2322 | this._trigger( "blur", event, { item: this.active } ); | ||
2323 | }, | ||
2324 | |||
2325 | _startOpening: function( submenu ) { | ||
2326 | clearTimeout( this.timer ); | ||
2327 | |||
2328 | // Don't open if already open fixes a Firefox bug that caused a .5 pixel | ||
2329 | // shift in the submenu position when mousing over the carat icon | ||
2330 | if ( submenu.attr( "aria-hidden" ) !== "true" ) { | ||
2331 | return; | ||
2332 | } | ||
2333 | |||
2334 | this.timer = this._delay(function() { | ||
2335 | this._close(); | ||
2336 | this._open( submenu ); | ||
2337 | }, this.delay ); | ||
2338 | }, | ||
2339 | |||
2340 | _open: function( submenu ) { | ||
2341 | var position = $.extend({ | ||
2342 | of: this.active | ||
2343 | }, this.options.position ); | ||
2344 | |||
2345 | clearTimeout( this.timer ); | ||
2346 | this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) ) | ||
2347 | .hide() | ||
2348 | .attr( "aria-hidden", "true" ); | ||
2349 | |||
2350 | submenu | ||
2351 | .show() | ||
2352 | .removeAttr( "aria-hidden" ) | ||
2353 | .attr( "aria-expanded", "true" ) | ||
2354 | .position( position ); | ||
2355 | }, | ||
2356 | |||
2357 | collapseAll: function( event, all ) { | ||
2358 | clearTimeout( this.timer ); | ||
2359 | this.timer = this._delay(function() { | ||
2360 | // If we were passed an event, look for the submenu that contains the event | ||
2361 | var currentMenu = all ? this.element : | ||
2362 | $( event && event.target ).closest( this.element.find( ".ui-menu" ) ); | ||
2363 | |||
2364 | // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway | ||
2365 | if ( !currentMenu.length ) { | ||
2366 | currentMenu = this.element; | ||
2367 | } | ||
2368 | |||
2369 | this._close( currentMenu ); | ||
2370 | |||
2371 | this.blur( event ); | ||
2372 | this.activeMenu = currentMenu; | ||
2373 | }, this.delay ); | ||
2374 | }, | ||
2375 | |||
2376 | // With no arguments, closes the currently active menu - if nothing is active | ||
2377 | // it closes all menus. If passed an argument, it will search for menus BELOW | ||
2378 | _close: function( startMenu ) { | ||
2379 | if ( !startMenu ) { | ||
2380 | startMenu = this.active ? this.active.parent() : this.element; | ||
2381 | } | ||
2382 | |||
2383 | startMenu | ||
2384 | .find( ".ui-menu" ) | ||
2385 | .hide() | ||
2386 | .attr( "aria-hidden", "true" ) | ||
2387 | .attr( "aria-expanded", "false" ) | ||
2388 | .end() | ||
2389 | .find( "a.ui-state-active" ) | ||
2390 | .removeClass( "ui-state-active" ); | ||
2391 | }, | ||
2392 | |||
2393 | collapse: function( event ) { | ||
2394 | var newItem = this.active && | ||
2395 | this.active.parent().closest( ".ui-menu-item", this.element ); | ||
2396 | if ( newItem && newItem.length ) { | ||
2397 | this._close(); | ||
2398 | this.focus( event, newItem ); | ||
2399 | } | ||
2400 | }, | ||
2401 | |||
2402 | expand: function( event ) { | ||
2403 | var newItem = this.active && | ||
2404 | this.active | ||
2405 | .children( ".ui-menu " ) | ||
2406 | .children( ".ui-menu-item" ) | ||
2407 | .first(); | ||
2408 | |||
2409 | if ( newItem && newItem.length ) { | ||
2410 | this._open( newItem.parent() ); | ||
2411 | |||
2412 | // Delay so Firefox will not hide activedescendant change in expanding submenu from AT | ||
2413 | this._delay(function() { | ||
2414 | this.focus( event, newItem ); | ||
2415 | }); | ||
2416 | } | ||
2417 | }, | ||
2418 | |||
2419 | next: function( event ) { | ||
2420 | this._move( "next", "first", event ); | ||
2421 | }, | ||
2422 | |||
2423 | previous: function( event ) { | ||
2424 | this._move( "prev", "last", event ); | ||
2425 | }, | ||
2426 | |||
2427 | isFirstItem: function() { | ||
2428 | return this.active && !this.active.prevAll( ".ui-menu-item" ).length; | ||
2429 | }, | ||
2430 | |||
2431 | isLastItem: function() { | ||
2432 | return this.active && !this.active.nextAll( ".ui-menu-item" ).length; | ||
2433 | }, | ||
2434 | |||
2435 | _move: function( direction, filter, event ) { | ||
2436 | var next; | ||
2437 | if ( this.active ) { | ||
2438 | if ( direction === "first" || direction === "last" ) { | ||
2439 | next = this.active | ||
2440 | [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ) | ||
2441 | .eq( -1 ); | ||
2442 | } else { | ||
2443 | next = this.active | ||
2444 | [ direction + "All" ]( ".ui-menu-item" ) | ||
2445 | .eq( 0 ); | ||
2446 | } | ||
2447 | } | ||
2448 | if ( !next || !next.length || !this.active ) { | ||
2449 | next = this.activeMenu.children( ".ui-menu-item" )[ filter ](); | ||
2450 | } | ||
2451 | |||
2452 | this.focus( event, next ); | ||
2453 | }, | ||
2454 | |||
2455 | nextPage: function( event ) { | ||
2456 | var item, base, height; | ||
2457 | |||
2458 | if ( !this.active ) { | ||
2459 | this.next( event ); | ||
2460 | return; | ||
2461 | } | ||
2462 | if ( this.isLastItem() ) { | ||
2463 | return; | ||
2464 | } | ||
2465 | if ( this._hasScroll() ) { | ||
2466 | base = this.active.offset().top; | ||
2467 | height = this.element.height(); | ||
2468 | this.active.nextAll( ".ui-menu-item" ).each(function() { | ||
2469 | item = $( this ); | ||
2470 | return item.offset().top - base - height < 0; | ||
2471 | }); | ||
2472 | |||
2473 | this.focus( event, item ); | ||
2474 | } else { | ||
2475 | this.focus( event, this.activeMenu.children( ".ui-menu-item" ) | ||
2476 | [ !this.active ? "first" : "last" ]() ); | ||
2477 | } | ||
2478 | }, | ||
2479 | |||
2480 | previousPage: function( event ) { | ||
2481 | var item, base, height; | ||
2482 | if ( !this.active ) { | ||
2483 | this.next( event ); | ||
2484 | return; | ||
2485 | } | ||
2486 | if ( this.isFirstItem() ) { | ||
2487 | return; | ||
2488 | } | ||
2489 | if ( this._hasScroll() ) { | ||
2490 | base = this.active.offset().top; | ||
2491 | height = this.element.height(); | ||
2492 | this.active.prevAll( ".ui-menu-item" ).each(function() { | ||
2493 | item = $( this ); | ||
2494 | return item.offset().top - base + height > 0; | ||
2495 | }); | ||
2496 | |||
2497 | this.focus( event, item ); | ||
2498 | } else { | ||
2499 | this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() ); | ||
2500 | } | ||
2501 | }, | ||
2502 | |||
2503 | _hasScroll: function() { | ||
2504 | return this.element.outerHeight() < this.element.prop( "scrollHeight" ); | ||
2505 | }, | ||
2506 | |||
2507 | select: function( event ) { | ||
2508 | // TODO: It should never be possible to not have an active item at this | ||
2509 | // point, but the tests don't trigger mouseenter before click. | ||
2510 | this.active = this.active || $( event.target ).closest( ".ui-menu-item" ); | ||
2511 | var ui = { item: this.active }; | ||
2512 | if ( !this.active.has( ".ui-menu" ).length ) { | ||
2513 | this.collapseAll( event, true ); | ||
2514 | } | ||
2515 | this._trigger( "select", event, ui ); | ||
2516 | } | ||
2517 | }); | ||
2518 | |||
2519 | }( jQuery )); | ||
diff --git a/themes/default/js/jquery-ui-1.10.4.custom.min.js b/themes/default/js/jquery-ui-1.10.4.custom.min.js new file mode 100644 index 00000000..31635026 --- /dev/null +++ b/themes/default/js/jquery-ui-1.10.4.custom.min.js | |||
@@ -0,0 +1,6 @@ | |||
1 | /*! jQuery UI - v1.10.4 - 2014-03-08 | ||
2 | * http://jqueryui.com | ||
3 | * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.menu.js | ||
4 | * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | ||
5 | |||
6 | (function(e,t){function i(t,i){var s,a,o,r=t.nodeName.toLowerCase();return"area"===r?(s=t.parentNode,a=s.name,t.href&&a&&"map"===s.nodeName.toLowerCase()?(o=e("img[usemap=#"+a+"]")[0],!!o&&n(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||i:i)&&n(t)}function n(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var s=0,a=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,n){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),n&&n.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var n,s,a=e(this[0]);a.length&&a[0]!==document;){if(n=a.css("position"),("absolute"===n||"relative"===n||"fixed"===n)&&(s=parseInt(a.css("zIndex"),10),!isNaN(s)&&0!==s))return s;a=a.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++s)})},removeUniqueId:function(){return this.each(function(){a.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,n){return!!e.data(t,n[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),s=isNaN(n);return(s||n>=0)&&i(t,!s)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(i,n){function s(t,i,n,s){return e.each(a,function(){i-=parseFloat(e.css(t,"padding"+this))||0,n&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var a="Width"===n?["Left","Right"]:["Top","Bottom"],o=n.toLowerCase(),r={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+n]=function(i){return i===t?r["inner"+n].call(this):this.each(function(){e(this).css(o,s(this,i)+"px")})},e.fn["outer"+n]=function(t,i){return"number"!=typeof t?r["outer"+n].call(this,t):this.each(function(){e(this).css(o,s(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,n){var s,a=e.ui[t].prototype;for(s in n)a.plugins[s]=a.plugins[s]||[],a.plugins[s].push([i,n[s]])},call:function(e,t,i){var n,s=e.plugins[t];if(s&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(n=0;s.length>n;n++)e.options[s[n][0]]&&s[n][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var n=i&&"left"===i?"scrollLeft":"scrollTop",s=!1;return t[n]>0?!0:(t[n]=1,s=t[n]>0,t[n]=0,s)}})})(jQuery);(function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix||i:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),1===arguments.length)return o[i]===e?null:o[i];o[i]=s}else{if(1===arguments.length)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})})(jQuery);(function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var a,o=Math.max,r=Math.abs,l=Math.round,h=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(a!==e)return a;var i,s,n=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=n.children()[0];return t("body").append(n),i=o.offsetWidth,n.css("overflow","scroll"),s=o.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),a=i-s},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,a="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:a?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},t.fn.position=function(e){if(!e||!e.of)return f.apply(this,arguments);e=t.extend({},e);var a,p,g,m,v,_,b=t(e.of),y=t.position.getWithinInfo(e.within),k=t.position.getScrollInfo(y),w=(e.collision||"flip").split(" "),D={};return _=n(b),b[0].preventDefault&&(e.at="left top"),p=_.width,g=_.height,m=_.offset,v=t.extend({},m),t.each(["my","at"],function(){var t,i,s=(e[this]||"").split(" ");1===s.length&&(s=h.test(s[0])?s.concat(["center"]):c.test(s[0])?["center"].concat(s):["center","center"]),s[0]=h.test(s[0])?s[0]:"center",s[1]=c.test(s[1])?s[1]:"center",t=u.exec(s[0]),i=u.exec(s[1]),D[this]=[t?t[0]:0,i?i[0]:0],e[this]=[d.exec(s[0])[0],d.exec(s[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===e.at[0]?v.left+=p:"center"===e.at[0]&&(v.left+=p/2),"bottom"===e.at[1]?v.top+=g:"center"===e.at[1]&&(v.top+=g/2),a=i(D.at,p,g),v.left+=a[0],v.top+=a[1],this.each(function(){var n,h,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=s(this,"marginLeft"),_=s(this,"marginTop"),x=u+f+s(this,"marginRight")+k.width,C=d+_+s(this,"marginBottom")+k.height,M=t.extend({},v),T=i(D.my,c.outerWidth(),c.outerHeight());"right"===e.my[0]?M.left-=u:"center"===e.my[0]&&(M.left-=u/2),"bottom"===e.my[1]?M.top-=d:"center"===e.my[1]&&(M.top-=d/2),M.left+=T[0],M.top+=T[1],t.support.offsetFractions||(M.left=l(M.left),M.top=l(M.top)),n={marginLeft:f,marginTop:_},t.each(["left","top"],function(i,s){t.ui.position[w[i]]&&t.ui.position[w[i]][s](M,{targetWidth:p,targetHeight:g,elemWidth:u,elemHeight:d,collisionPosition:n,collisionWidth:x,collisionHeight:C,offset:[a[0]+T[0],a[1]+T[1]],my:e.my,at:e.at,within:y,elem:c})}),e.using&&(h=function(t){var i=m.left-M.left,s=i+p-u,n=m.top-M.top,a=n+g-d,l={target:{element:b,left:m.left,top:m.top,width:p,height:g},element:{element:c,left:M.left,top:M.top,width:u,height:d},horizontal:0>s?"left":i>0?"right":"center",vertical:0>a?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(l.horizontal="center"),d>g&&g>r(n+a)&&(l.vertical="middle"),l.important=o(r(i),r(s))>o(r(n),r(a))?"horizontal":"vertical",e.using.call(this,t,l)}),c.offset(t.extend(M,{using:h}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,a=n.offset.left+n.scrollLeft,o=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-o-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-o-a,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,a=n.offset.top+n.scrollTop,o=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-o-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-o-a,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,a,o=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(o?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(a in s)e.style[a]=s[a];e.appendChild(r),i=o||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()})(jQuery);(function(e){e.widget("ui.autocomplete",{version:"1.10.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,undefined;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:case a.NUMPAD_ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),undefined):(this._searchTimeout(e),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(e),this._change(e),undefined)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().data("ui-menu"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),undefined;var s=i.item.data("ui-autocomplete-item");!1!==this._trigger("focus",t,{item:s})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value):this.liveRegion.text(s.value)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertBefore(this.element),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):undefined},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({label:t.label||t.value,value:t.value||t.label},t)})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").append(e("<a>").text(i.label)).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this._value(this.term),this.menu.blur(),undefined):(this.menu[e](t),undefined):(this.search(null,t),undefined)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var t;this._superApply(arguments),this.options.disabled||this.cancelSearch||(t=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.text(t))}})})(jQuery);(function(t){t.widget("ui.menu",{version:"1.10.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,t.proxy(function(t){this.options.disabled&&t.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(t){t.preventDefault()},"click .ui-state-disabled > a":function(t){t.preventDefault()},"click .ui-menu-item:has(a)":function(e){var i=t(e.target).closest(".ui-menu-item");!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&t(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){var i=t(e.currentTarget);i.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(e,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.children(".ui-menu-item").eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){t.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){t(e.target).closest(".ui-menu").length||this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var e=t(this);e.data("ui-menu-submenu-carat")&&e.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(e){function i(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,a,o,r,l=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:l=!1,n=this.previousFilter||"",a=String.fromCharCode(e.keyCode),o=!1,clearTimeout(this.filterTimer),a===n?o=!0:a=n+a,r=RegExp("^"+i(a),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())}),s=o&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(a=String.fromCharCode(e.keyCode),r=RegExp("^"+i(a),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())})),s.length?(this.focus(e,s),s.length>1?(this.previousFilter=a,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}l&&e.preventDefault()},_activate:function(t){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i=this.options.icons.submenu,s=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),s.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),s=e.prev("a"),n=t("<span>").addClass("ui-menu-icon ui-icon "+i).data("ui-menu-submenu-carat",!0);s.attr("aria-haspopup","true").prepend(n),e.attr("aria-labelledby",s.attr("id"))}),e=s.add(this.element),e.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),e.children(":not(.ui-menu-item)").each(function(){var e=t(this);/[^\-\u2014\u2013\s]/.test(e.text())||e.addClass("ui-widget-content ui-menu-divider")}),e.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){"icons"===t&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(e.submenu),this._super(t,e)},focus:function(t,e){var i,s;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=e.height(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",t,{item:this.active}))},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.children(".ui-menu-item")[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())),undefined):(this.next(e),undefined)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item").first())),undefined):(this.next(e),undefined)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)}})})(jQuery); \ No newline at end of file | ||
diff --git a/themes/default/js/saveLink.js b/themes/default/js/saveLink.js new file mode 100755 index 00000000..ccc00d1e --- /dev/null +++ b/themes/default/js/saveLink.js | |||
@@ -0,0 +1,101 @@ | |||
1 | $.fn.ready(function() { | ||
2 | |||
3 | var $bagit = $('#bagit'), | ||
4 | $bagitForm = $('#bagit-form'), | ||
5 | $bagitFormForm = $('#bagit-form-form'); | ||
6 | |||
7 | /* ========================================================================== | ||
8 | bag it link and close button | ||
9 | ========================================================================== */ | ||
10 | |||
11 | function toggleSaveLinkForm(url, event) { | ||
12 | $("#add-link-result").empty(); | ||
13 | |||
14 | $bagit.toggleClass("active-current"); | ||
15 | |||
16 | //only if bagiti link is not presented on page | ||
17 | if ( $bagit.length === 0 ) { | ||
18 | if ( event !== 'undefined' && event ) { | ||
19 | $bagitForm.css( {position:"absolute", top:event.pageY, left:event.pageX-200}); | ||
20 | } | ||
21 | else { | ||
22 | $bagitForm.css( {position:"relative", top:"auto", left:"auto"}); | ||
23 | } | ||
24 | } | ||
25 | |||
26 | $bagitForm.toggle(); | ||
27 | $('#content').toggleClass("opacity03"); | ||
28 | if (url !== 'undefined' && url) { | ||
29 | $('#plainurl').val(url); | ||
30 | } | ||
31 | $('#plainurl').focus(); | ||
32 | } | ||
33 | |||
34 | |||
35 | $bagit.click(function(){ | ||
36 | $bagit.toggleClass("current"); | ||
37 | $("#bagit-arrow").toggleClass("arrow-down"); | ||
38 | toggleSaveLinkForm(); | ||
39 | }); | ||
40 | |||
41 | $("#bagit-form-close").click(function(){ | ||
42 | $bagit.removeClass("current"); | ||
43 | $("#bagit-arrow").removeClass("arrow-down"); | ||
44 | toggleSaveLinkForm(); | ||
45 | }); | ||
46 | |||
47 | |||
48 | //send "bag it link" form request via ajax | ||
49 | $bagitFormForm.submit( function(event) { | ||
50 | $("body").css("cursor", "wait"); | ||
51 | $("#add-link-result").empty(); | ||
52 | |||
53 | $.ajax({ | ||
54 | type: $bagitFormForm.attr('method'), | ||
55 | url: $bagitFormForm.attr('action'), | ||
56 | data: $bagitFormForm.serialize(), | ||
57 | success: function(data) { | ||
58 | $('#add-link-result').html("Done!"); | ||
59 | $('#plainurl').val(''); | ||
60 | $('#plainurl').blur(''); | ||
61 | $("body").css("cursor", "auto"); | ||
62 | //setTimeout( function() { toggleSaveLinkForm(); }, 1000); //close form after 1000 delay | ||
63 | }, | ||
64 | error: function(data) { | ||
65 | $('#add-link-result').html("Failed!"); | ||
66 | $("body").css("cursor", "auto"); | ||
67 | } | ||
68 | }); | ||
69 | |||
70 | event.preventDefault(); | ||
71 | }); | ||
72 | |||
73 | /* ========================================================================== | ||
74 | Keyboard gestion | ||
75 | ========================================================================== */ | ||
76 | |||
77 | $(window).keydown(function(e){ | ||
78 | if ( ( e.target.tagName.toLowerCase() !== 'input' && e.keyCode == 83 ) || e.keyCode == 27 ) { | ||
79 | $bagit.removeClass("current"); | ||
80 | $("#bagit-arrow").removeClass("arrow-down"); | ||
81 | toggleSaveLinkForm(); | ||
82 | return false; | ||
83 | } | ||
84 | }); | ||
85 | |||
86 | /* ========================================================================== | ||
87 | Process all links inside an article | ||
88 | ========================================================================== */ | ||
89 | |||
90 | $("article a[href^='http']").after(function() { | ||
91 | return " <a href=\"" + $(this).attr('href') + "\" class=\"add-to-wallabag-link-after\" alt=\"add to wallabag\" title=\"add to wallabag\">w</a> "; | ||
92 | }); | ||
93 | |||
94 | $(".add-to-wallabag-link-after").click(function(event){ | ||
95 | toggleSaveLinkForm($(this).attr('href'), event); | ||
96 | event.preventDefault(); | ||
97 | }); | ||
98 | |||
99 | }); | ||
100 | |||
101 | |||
diff --git a/themes/default/tags.twig b/themes/default/tags.twig index cff6b1d7..e5be748e 100644..100755 --- a/themes/default/tags.twig +++ b/themes/default/tags.twig | |||
@@ -4,5 +4,15 @@ | |||
4 | {% include '_menu.twig' %} | 4 | {% include '_menu.twig' %} |
5 | {% endblock %} | 5 | {% endblock %} |
6 | {% block content %} | 6 | {% block content %} |
7 | {% for tag in tags %}<a href="./?view=tag&id={{ tag.id }}">{{ tag.value }}</a> {% if token != '' %}<a href="?feed&type=tag&user_id={{ user_id }}&tag_id={{ tag.id }}&token={{ token }}" target="_blank"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %} {% endfor %} | 7 | <div class="two-column"> |
8 | {% for tag in tags %} | ||
9 | <a href="./?view=tag&id={{ tag.id }}">{{ tag.value }}</a> ({{ tag.entriescount }}) {% if token != '' %}<a href="?feed&type=tag&user_id={{ user_id }}&tag_id={{ tag.id }}&token={{ token }}" target="_blank"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %} | ||
10 | <br> | ||
11 | |||
12 | {% if loop.index == '%d'|format(loop.length/2 + 0.5) %} | ||
13 | </div><div class="two-column"> | ||
14 | {% endif %} | ||
15 | |||
16 | {% endfor %} | ||
17 | </div> | ||
8 | {% endblock %} \ No newline at end of file | 18 | {% endblock %} \ No newline at end of file |
diff --git a/themes/default/view.twig b/themes/default/view.twig index 916abe0d..cc491c77 100644..100755 --- a/themes/default/view.twig +++ b/themes/default/view.twig | |||
@@ -1,6 +1,7 @@ | |||
1 | {% extends "layout.twig" %} | 1 | {% extends "layout.twig" %} |
2 | {% block title %}{{ entry.title|raw }} ({{ entry.url | e | getDomain }}){% endblock %} | 2 | {% block title %}{{ entry.title|raw }} ({{ entry.url | e | getDomain }}){% endblock %} |
3 | {% block content %} | 3 | {% block content %} |
4 | {% include '_pocheit-form.twig' %} | ||
4 | <div id="article_toolbar"> | 5 | <div id="article_toolbar"> |
5 | <ul> | 6 | <ul> |
6 | <li><a href="./" title="{% trans "Return home" %}" class="tool back"><span>{% trans "Return home" %}</span></a></li> | 7 | <li><a href="./" title="{% trans "Return home" %}" class="tool back"><span>{% trans "Return home" %}</span></a></li> |
@@ -30,7 +31,7 @@ | |||
30 | </article> | 31 | </article> |
31 | {{ block('tags') }} | 32 | {{ block('tags') }} |
32 | </div> | 33 | </div> |
33 | <script src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/js/restoreScroll.js"></script> | 34 | <script src="{{ poche_url }}themes/{{theme}}/js/restoreScroll.js"></script> |
34 | <script type="text/javascript"> | 35 | <script type="text/javascript"> |
35 | $(document).ready(function() { | 36 | $(document).ready(function() { |
36 | 37 | ||
@@ -55,3 +56,4 @@ | |||
55 | }); | 56 | }); |
56 | </script> | 57 | </script> |
57 | {% endblock %} | 58 | {% endblock %} |
59 | |||
diff --git a/wallabag_compatibility_test.php b/wallabag_compatibility_test.php index 26dce018..7a52767c 100644 --- a/wallabag_compatibility_test.php +++ b/wallabag_compatibility_test.php | |||
@@ -1,5 +1,5 @@ | |||
1 | <?php | 1 | <?php |
2 | $app_name = 'wallabag 1'; | 2 | $app_name = 'wallabag'; |
3 | 3 | ||
4 | $php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.3.3', '>=')); | 4 | $php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.3.3', '>=')); |
5 | $pcre_ok = extension_loaded('pcre'); | 5 | $pcre_ok = extension_loaded('pcre'); |
@@ -11,6 +11,7 @@ $curl_ok = function_exists('curl_exec'); | |||
11 | $parallel_ok = ((extension_loaded('http') && class_exists('HttpRequestPool')) || ($curl_ok && function_exists('curl_multi_init'))); | 11 | $parallel_ok = ((extension_loaded('http') && class_exists('HttpRequestPool')) || ($curl_ok && function_exists('curl_multi_init'))); |
12 | $allow_url_fopen_ok = (bool)ini_get('allow_url_fopen'); | 12 | $allow_url_fopen_ok = (bool)ini_get('allow_url_fopen'); |
13 | $filter_ok = extension_loaded('filter'); | 13 | $filter_ok = extension_loaded('filter'); |
14 | $gettext_ok = function_exists("gettext"); | ||
14 | 15 | ||
15 | if (extension_loaded('xmlreader')) { | 16 | if (extension_loaded('xmlreader')) { |
16 | $xml_ok = true; | 17 | $xml_ok = true; |
@@ -130,8 +131,6 @@ table#chart tr.enabled td { | |||
130 | 131 | ||
131 | table#chart tr.disabled td, | 132 | table#chart tr.disabled td, |
132 | table#chart tr.disabled td a { | 133 | table#chart tr.disabled td a { |
133 | color:#999; | ||
134 | font-style:italic; | ||
135 | } | 134 | } |
136 | 135 | ||
137 | table#chart tr.disabled td a { | 136 | table#chart tr.disabled td a { |
@@ -154,12 +153,31 @@ div.chunk { | |||
154 | background-color:transparent; | 153 | background-color:transparent; |
155 | font-style:italic; | 154 | font-style:italic; |
156 | } | 155 | } |
156 | |||
157 | .good{ | ||
158 | background-color:#52CC5B; | ||
159 | } | ||
160 | .bad{ | ||
161 | background-color:#F74343; | ||
162 | font-style:italic; | ||
163 | font-weight: bold; | ||
164 | } | ||
165 | .pass{ | ||
166 | background-color:#FF9500; | ||
167 | } | ||
168 | |||
157 | </style> | 169 | </style> |
158 | 170 | ||
159 | </head> | 171 | </head> |
160 | 172 | ||
161 | <body> | 173 | <body> |
162 | 174 | <?php | |
175 | $frominstall = false; | ||
176 | if (isset($_GET['from'])){ | ||
177 | if ($_GET['from'] == 'install'){ | ||
178 | $frominstall = true; | ||
179 | }} | ||
180 | ?> | ||
163 | <div id="site"> | 181 | <div id="site"> |
164 | <div id="content"> | 182 | <div id="content"> |
165 | 183 | ||
@@ -177,58 +195,63 @@ div.chunk { | |||
177 | <tr class="<?php echo ($php_ok) ? 'enabled' : 'disabled'; ?>"> | 195 | <tr class="<?php echo ($php_ok) ? 'enabled' : 'disabled'; ?>"> |
178 | <td>PHP</td> | 196 | <td>PHP</td> |
179 | <td>5.3.3 or higher</td> | 197 | <td>5.3.3 or higher</td> |
180 | <td><?php echo phpversion(); ?></td> | 198 | <td class="<?php echo ($php_ok) ? 'good' : 'disabled'; ?>"><?php echo phpversion(); ?></td> |
181 | </tr> | 199 | </tr> |
182 | <tr class="<?php echo ($xml_ok) ? 'enabled, and sane' : 'disabled, or broken'; ?>"> | 200 | <tr class="<?php echo ($xml_ok) ? 'enabled' : 'disabled'; ?>"> |
183 | <td><a href="http://php.net/xml">XML</a></td> | 201 | <td><a href="http://php.net/xml">XML</a></td> |
184 | <td>Enabled</td> | 202 | <td>Enabled</td> |
185 | <td><?php echo ($xml_ok) ? 'Enabled, and sane' : 'Disabled, or broken'; ?></td> | 203 | <?php echo ($xml_ok) ? '<td class="good">Enabled, and sane</span>' : '<td class="bad">Disabled, or broken'; ?></td> |
186 | </tr> | 204 | </tr> |
187 | <tr class="<?php echo ($pcre_ok) ? 'enabled' : 'disabled'; ?>"> | 205 | <tr class="<?php echo ($pcre_ok) ? 'enabled' : 'disabled'; ?>"> |
188 | <td><a href="http://php.net/pcre">PCRE</a></td> | 206 | <td><a href="http://php.net/pcre">PCRE</a></td> |
189 | <td>Enabled</td> | 207 | <td>Enabled</td> |
190 | <td><?php echo ($pcre_ok) ? 'Enabled' : 'Disabled'; ?></td> | 208 | <?php echo ($pcre_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td> |
191 | </tr> | 209 | </tr> |
192 | <!-- <tr class="<?php echo ($zlib_ok) ? 'enabled' : 'disabled'; ?>"> | 210 | <!-- <tr class="<?php echo ($zlib_ok) ? 'enabled' : 'disabled'; ?>"> |
193 | <td><a href="http://php.net/zlib">Zlib</a></td> | 211 | <td><a href="http://php.net/zlib">Zlib</a></td> |
194 | <td>Enabled</td> | 212 | <td>Enabled</td> |
195 | <td><?php echo ($zlib_ok) ? 'Enabled' : 'Disabled'; ?></td> | 213 | <?php echo ($zlib_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td> |
196 | </tr> --> | 214 | </tr> --> |
197 | <!-- <tr class="<?php echo ($mbstring_ok) ? 'enabled' : 'disabled'; ?>"> | 215 | <!-- <tr class="<?php echo ($mbstring_ok) ? 'enabled' : 'disabled'; ?>"> |
198 | <td><a href="http://php.net/mbstring">mbstring</a></td> | 216 | <td><a href="http://php.net/mbstring">mbstring</a></td> |
199 | <td>Enabled</td> | 217 | <td>Enabled</td> |
200 | <td><?php echo ($mbstring_ok) ? 'Enabled' : 'Disabled'; ?></td> | 218 | <?php echo ($mbstring_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td> |
201 | </tr> --> | 219 | </tr> --> |
202 | <!-- <tr class="<?php echo ($iconv_ok) ? 'enabled' : 'disabled'; ?>"> | 220 | <!-- <tr class="<?php echo ($iconv_ok) ? 'enabled' : 'disabled'; ?>"> |
203 | <td><a href="http://php.net/iconv">iconv</a></td> | 221 | <td><a href="http://php.net/iconv">iconv</a></td> |
204 | <td>Enabled</td> | 222 | <td>Enabled</td> |
205 | <td><?php echo ($iconv_ok) ? 'Enabled' : 'Disabled'; ?></td> | 223 | <?php echo ($iconv_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td> |
206 | </tr> --> | 224 | </tr> --> |
207 | <tr class="<?php echo ($filter_ok) ? 'enabled' : 'disabled'; ?>"> | 225 | <tr class="<?php echo ($filter_ok) ? 'enabled' : 'disabled'; ?>"> |
208 | <td><a href="http://uk.php.net/manual/en/book.filter.php">Data filtering</a></td> | 226 | <td><a href="http://uk.php.net/manual/en/book.filter.php">Data filtering</a></td> |
209 | <td>Enabled</td> | 227 | <td>Enabled</td> |
210 | <td><?php echo ($filter_ok) ? 'Enabled' : 'Disabled'; ?></td> | 228 | <?php echo ($filter_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td> |
211 | </tr> | 229 | </tr> |
212 | <tr class="<?php echo ($tidy_ok) ? 'enabled' : 'disabled'; ?>"> | 230 | <tr class="<?php echo ($tidy_ok) ? 'enabled' : 'disabled'; ?>"> |
213 | <td><a href="http://php.net/tidy">Tidy</a></td> | 231 | <td><a href="http://php.net/tidy">Tidy</a></td> |
214 | <td>Enabled</td> | 232 | <td>Enabled</td> |
215 | <td><?php echo ($tidy_ok) ? 'Enabled' : 'Disabled'; ?></td> | 233 | <?php echo ($tidy_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td> |
216 | </tr> | 234 | </tr> |
217 | <tr class="<?php echo ($curl_ok) ? 'enabled' : 'disabled'; ?>"> | 235 | <tr class="<?php echo ($curl_ok) ? 'enabled' : 'disabled'; ?>"> |
218 | <td><a href="http://php.net/curl">cURL</a></td> | 236 | <td><a href="http://php.net/curl">cURL</a></td> |
219 | <td>Enabled</td> | 237 | <td>Enabled</td> |
220 | <td><?php echo (extension_loaded('curl')) ? 'Enabled' : 'Disabled'; ?></td> | 238 | <?php echo (extension_loaded('curl')) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td> |
221 | </tr> | 239 | </tr> |
222 | <tr class="<?php echo ($parallel_ok) ? 'enabled' : 'disabled'; ?>"> | 240 | <tr class="<?php echo ($parallel_ok) ? 'enabled' : 'disabled'; ?>"> |
223 | <td>Parallel URL fetching</td> | 241 | <td>Parallel URL fetching</td> |
224 | <td>Enabled</td> | 242 | <td>Enabled</td> |
225 | <td><?php echo ($parallel_ok) ? 'Enabled' : 'Disabled'; ?></td> | 243 | <?php echo ($parallel_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td> |
226 | </tr> | 244 | </tr> |
227 | <tr class="<?php echo ($allow_url_fopen_ok) ? 'enabled' : 'disabled'; ?>"> | 245 | <tr class="<?php echo ($allow_url_fopen_ok) ? 'enabled' : 'disabled'; ?>"> |
228 | <td><a href="http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen">allow_url_fopen</a></td> | 246 | <td><a href="http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen">allow_url_fopen</a></td> |
229 | <td>Enabled</td> | 247 | <td>Enabled</td> |
230 | <td><?php echo ($allow_url_fopen_ok) ? 'Enabled' : 'Disabled'; ?></td> | 248 | <?php echo ($allow_url_fopen_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td> |
231 | </tr> | 249 | </tr> |
250 | <tr class="<?php echo ($gettext_ok) ? 'enabled' : 'disabled'; ?>"> | ||
251 | <td><a href="http://php.net/manual/en/book.gettext.php">gettext</a></td> | ||
252 | <td>Enabled</td> | ||
253 | <?php echo ($gettext_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td> | ||
254 | </tr> | ||
232 | </tbody> | 255 | </tbody> |
233 | </table> | 256 | </table> |
234 | </div> | 257 | </div> |
@@ -237,7 +260,7 @@ div.chunk { | |||
237 | <h3>What does this mean?</h3> | 260 | <h3>What does this mean?</h3> |
238 | <ol> | 261 | <ol> |
239 | <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $zlib_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok): ?> | 262 | <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $zlib_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok): ?> |
240 | <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok): ?> | 263 | <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok && $gettext_ok): ?> |
241 | <li><em>You have everything you need to run <?php echo $app_name; ?> properly! Congratulations!</em></li> | 264 | <li><em>You have everything you need to run <?php echo $app_name; ?> properly! Congratulations!</em></li> |
242 | <?php else: ?> | 265 | <?php else: ?> |
243 | <?php if ($php_ok): ?> | 266 | <?php if ($php_ok): ?> |
@@ -250,59 +273,66 @@ div.chunk { | |||
250 | <?php if ($allow_url_fopen_ok): ?> | 273 | <?php if ($allow_url_fopen_ok): ?> |
251 | <li><strong>allow_url_fopen:</strong> You have allow_url_fopen enabled. <em>No problems here.</em></li> | 274 | <li><strong>allow_url_fopen:</strong> You have allow_url_fopen enabled. <em>No problems here.</em></li> |
252 | 275 | ||
253 | <?php if ($filter_ok): ?> | 276 | <?php if ($gettext_ok): ?> |
254 | <li><strong>Data filtering:</strong> You have the PHP filter extension enabled. <em>No problems here.</em></li> | 277 | <li><strong>Gettext:</strong> You have <code>gettext</code> enabled. <em>No problems here.</em></li> |
278 | |||
279 | <?php if ($filter_ok): ?> | ||
280 | <li><strong>Data filtering:</strong> You have the PHP filter extension enabled. <em>No problems here.</em></li> | ||
255 | 281 | ||
256 | <?php if ($zlib_ok): ?> | 282 | <?php if ($zlib_ok): ?> |
257 | <li><strong>Zlib:</strong> You have <code>Zlib</code> enabled. This allows SimplePie to support GZIP-encoded feeds. <em>No problems here.</em></li> | 283 | <li><strong>Zlib:</strong> You have <code>Zlib</code> enabled. This allows SimplePie to support GZIP-encoded feeds. <em>No problems here.</em></li> |
258 | <?php else: ?> | 284 | <?php else: ?> |
259 | <li><strong>Zlib:</strong> The <code>Zlib</code> extension is not available. SimplePie will ignore any GZIP-encoding, and instead handle feeds as uncompressed text.</li> | 285 | <li><strong>Zlib:</strong> The <code>Zlib</code> extension is not available. SimplePie will ignore any GZIP-encoding, and instead handle feeds as uncompressed text.</li> |
260 | <?php endif; ?> | 286 | <?php endif; ?> |
287 | |||
288 | <?php if ($mbstring_ok && $iconv_ok): ?> | ||
289 | <li><strong>mbstring and iconv:</strong> You have both <code>mbstring</code> and <code>iconv</code> installed! This will allow <?php echo $app_name; ?> to handle the greatest number of languages. <em>No problems here.</em></li> | ||
290 | <?php elseif ($mbstring_ok): ?> | ||
291 | <li><strong>mbstring:</strong> <code>mbstring</code> is installed, but <code>iconv</code> is not.</li> | ||
292 | <?php elseif ($iconv_ok): ?> | ||
293 | <li><strong>iconv:</strong> <code>iconv</code> is installed, but <code>mbstring</code> is not.</li> | ||
294 | <?php else: ?> | ||
295 | <li><strong>mbstring and iconv:</strong> <em>You do not have either of the extensions installed.</em> This will significantly impair your ability to read non-English feeds, as well as even some English ones.</li> | ||
296 | <?php endif; ?> | ||
297 | |||
298 | <?php if ($tidy_ok): ?> | ||
299 | <li><strong>Tidy:</strong> You have <code>Tidy</code> support installed. <em>No problems here.</em></li> | ||
300 | <?php else: ?> | ||
301 | <li><strong>Tidy:</strong> The <code>Tidy</code> extension is not available. <?php echo $app_name; ?> should still work with most feeds, but you may experience problems with some.</li> | ||
302 | <?php endif; ?> | ||
303 | |||
304 | <?php if ($curl_ok): ?> | ||
305 | <li><strong>cURL:</strong> You have <code>cURL</code> support installed. <em>No problems here.</em></li> | ||
306 | <?php else: ?> | ||
307 | <li><strong>cURL:</strong> The <code>cURL</code> extension is not available. SimplePie will use <code>fsockopen()</code> instead.</li> | ||
308 | <?php endif; ?> | ||
261 | 309 | ||
262 | <?php if ($mbstring_ok && $iconv_ok): ?> | 310 | <?php if ($parallel_ok): ?> |
263 | <li><strong>mbstring and iconv:</strong> You have both <code>mbstring</code> and <code>iconv</code> installed! This will allow <?php echo $app_name; ?> to handle the greatest number of languages. <em>No problems here.</em></li> | 311 | <li><strong>Parallel URL fetching:</strong> You have <code>HttpRequestPool</code> or <code>curl_multi</code> support installed. <em>No problems here.</em></li> |
264 | <?php elseif ($mbstring_ok): ?> | 312 | <?php else: ?> |
265 | <li><strong>mbstring:</strong> <code>mbstring</code> is installed, but <code>iconv</code> is not.</li> | 313 | <li><strong>Parallel URL fetching:</strong> <code>HttpRequestPool</code> or <code>curl_multi</code> support is not available. <?php echo $app_name; ?> will use <code>file_get_contents()</code> instead to fetch URLs sequentially rather than in parallel.</li> |
266 | <?php elseif ($iconv_ok): ?> | 314 | <?php endif; ?> |
267 | <li><strong>iconv:</strong> <code>iconv</code> is installed, but <code>mbstring</code> is not.</li> | ||
268 | <?php else: ?> | ||
269 | <li><strong>mbstring and iconv:</strong> <em>You do not have either of the extensions installed.</em> This will significantly impair your ability to read non-English feeds, as well as even some English ones.</li> | ||
270 | <?php endif; ?> | ||
271 | 315 | ||
272 | <?php if ($tidy_ok): ?> | ||
273 | <li><strong>Tidy:</strong> You have <code>Tidy</code> support installed. <em>No problems here.</em></li> | ||
274 | <?php else: ?> | 316 | <?php else: ?> |
275 | <li><strong>Tidy:</strong> The <code>Tidy</code> extension is not available. <?php echo $app_name; ?> should still work with most feeds, but you may experience problems with some.</li> | 317 | <li><strong>Data filtering:</strong> Your PHP configuration has the filter extension disabled. <strong><?php echo $app_name; ?> will not work here.</strong></li> |
276 | <?php endif; ?> | 318 | <?php endif; ?> |
277 | 319 | ||
278 | <?php if ($curl_ok): ?> | ||
279 | <li><strong>cURL:</strong> You have <code>cURL</code> support installed. <em>No problems here.</em></li> | ||
280 | <?php else: ?> | ||
281 | <li><strong>cURL:</strong> The <code>cURL</code> extension is not available. SimplePie will use <code>fsockopen()</code> instead.</li> | ||
282 | <?php endif; ?> | ||
283 | |||
284 | <?php if ($parallel_ok): ?> | ||
285 | <li><strong>Parallel URL fetching:</strong> You have <code>HttpRequestPool</code> or <code>curl_multi</code> support installed. <em>No problems here.</em></li> | ||
286 | <?php else: ?> | ||
287 | <li><strong>Parallel URL fetching:</strong> <code>HttpRequestPool</code> or <code>curl_multi</code> support is not available. <?php echo $app_name; ?> will use <code>file_get_contents()</code> instead to fetch URLs sequentially rather than in parallel.</li> | ||
288 | <?php endif; ?> | ||
289 | |||
290 | <?php else: ?> | 320 | <?php else: ?> |
291 | <li><strong>Data filtering:</strong> Your PHP configuration has the filter extension disabled. <em><?php echo $app_name; ?> will not work here.</em></li> | 321 | <li><strong>GetText:</strong> The <code>gettext</code> extension is not available. The system we use to display wallabag in various languages is not available. <strong><?php echo $app_name; ?> will not work here.</strong></li> |
292 | <?php endif; ?> | 322 | <?php endif; ?> |
293 | 323 | ||
294 | <?php else: ?> | 324 | <?php else: ?> |
295 | <li><strong>allow_url_fopen:</strong> Your PHP configuration has allow_url_fopen disabled. <em><?php echo $app_name; ?> will not work here.</em></li> | 325 | <li><strong>allow_url_fopen:</strong> Your PHP configuration has allow_url_fopen disabled. <strong><?php echo $app_name; ?> will not work here.</strong></li> |
296 | <?php endif; ?> | 326 | <?php endif; ?> |
297 | 327 | ||
298 | <?php else: ?> | 328 | <?php else: ?> |
299 | <li><strong>PCRE:</strong> Your PHP installation doesn't support Perl-Compatible Regular Expressions. <em><?php echo $app_name; ?> will not work here.</em></li> | 329 | <li><strong>PCRE:</strong> Your PHP installation doesn't support Perl-Compatible Regular Expressions. <strong><?php echo $app_name; ?> will not work here.</strong></li> |
300 | <?php endif; ?> | 330 | <?php endif; ?> |
301 | <?php else: ?> | 331 | <?php else: ?> |
302 | <li><strong>XML:</strong> Your PHP installation doesn't support XML parsing. <em><?php echo $app_name; ?> will not work here.</em></li> | 332 | <li><strong>XML:</strong> Your PHP installation doesn't support XML parsing. <strong><?php echo $app_name; ?> will not work here.</strong></li> |
303 | <?php endif; ?> | 333 | <?php endif; ?> |
304 | <?php else: ?> | 334 | <?php else: ?> |
305 | <li><strong>PHP:</strong> You are running an unsupported version of PHP. <em><?php echo $app_name; ?> will not work here.</em></li> | 335 | <li><strong>PHP:</strong> You are running an unsupported version of PHP. <strong><?php echo $app_name; ?> will not work here.</strong></li> |
306 | <?php endif; ?> | 336 | <?php endif; ?> |
307 | <?php endif; ?> | 337 | <?php endif; ?> |
308 | </ol> | 338 | </ol> |
@@ -310,16 +340,26 @@ div.chunk { | |||
310 | 340 | ||
311 | <div class="chunk"> | 341 | <div class="chunk"> |
312 | <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $allow_url_fopen_ok) { ?> | 342 | <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $allow_url_fopen_ok) { ?> |
313 | <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $allow_url_fopen_ok) { ?> | 343 | <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $allow_url_fopen_ok && $gettext_ok) { ?> |
314 | <h3>Bottom Line: Yes, you can!</h3> | 344 | <h3>Bottom Line: Yes, you can!</h3> |
315 | <p><em>Your webhost has its act together!</em></p> | 345 | <p><em>Your webhost has its act together!</em></p> |
346 | <?php if (!$frominstall) { ?> | ||
316 | <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p> | 347 | <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p> |
348 | <p>If you already have done that, you should access <a href="index.php">the index.php file</a> of your installation to configure and/or start using wallabag</p> | ||
349 | <?php } else { ?> | ||
350 | <p>You can now <a href="index.php">return to the installation section</a>.</p> | ||
351 | <?php } ?> | ||
317 | <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost — it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p> | 352 | <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost — it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p> |
318 | <?php //} else if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $allow_url_fopen_ok && $filter_ok) { ?> | 353 | <?php //} else if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $allow_url_fopen_ok && $filter_ok) { ?> |
319 | <?php } else if ($php_ok && $xml_ok && $pcre_ok && $allow_url_fopen_ok && $filter_ok) { ?> | 354 | <?php } else if ($php_ok && $xml_ok && $pcre_ok && $allow_url_fopen_ok && $filter_ok && $gettext_ok) { ?> |
320 | <h3>Bottom Line: Yes, you can!</h3> | 355 | <h3>Bottom Line: Yes, you can!</h3> |
321 | <p><em>For most feeds, it'll run with no problems.</em> There are certain languages that you might have a hard time with though.</p> | 356 | <p><em>For most feeds, it'll run with no problems.</em> There are certain languages that you might have a hard time with though.</p> |
357 | <?php if (!$frominstall) { ?> | ||
322 | <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p> | 358 | <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p> |
359 | <p>If you already have done that, you should access <a href="index.php">the index.php file</a> of your installation to configure and/or start using wallabag</p> | ||
360 | <?php } else { ?> | ||
361 | <p>You can now <a href="index.php">return to the installation section</a>.</p> | ||
362 | <?php } ?> | ||
323 | <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost — it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p> | 363 | <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost — it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p> |
324 | <?php } else { ?> | 364 | <?php } else { ?> |
325 | <h3>Bottom Line: We're sorry…</h3> | 365 | <h3>Bottom Line: We're sorry…</h3> |