Changes for Version 3.0.1, a=chris

Chris Pollett [2015-08-27 19:Aug:th]
Changes for Version 3.0.1, a=chris
Filename
Routes.php
configs/PublicHelpPages.php
controllers/MainController.php
locale/ar/resources/Tokenizer.php
locale/bn/resources/Tokenizer.php
locale/de/resources/Tokenizer.php
locale/en_US/configure.ini
locale/en_US/resources/Tokenizer.php
locale/en_US/resources/lexicon.txt.gz
locale/en_US/resources/locale.js
locale/en_US/resources/suggest_trie.txt.gz
locale/en_US/statistics.txt
locale/es/resources/Tokenizer.php
locale/fa/resources/Tokenizer.php
locale/fr_FR/configure.ini
locale/fr_FR/resources/Tokenizer.php
locale/fr_FR/resources/locale.js
locale/fr_FR/resources/suggest_trie.txt.gz
locale/fr_FR/statistics.txt
locale/he/resources/Tokenizer.php
locale/hi/resources/Tokenizer.php
locale/hi/resources/suggest_trie.txt.gz
locale/in_ID/configure.ini
locale/in_ID/resources/Tokenizer.php
locale/in_ID/resources/locale.js
locale/in_ID/resources/suggest_trie.txt.gz
locale/in_ID/statistics.txt
locale/it/resources/Tokenizer.php
locale/ja/resources/Tokenizer.php
locale/kn/resources/Tokenizer.php
locale/ko/resources/Tokenizer.php
locale/nl/configure.ini
locale/nl/resources/Tokenizer.php
locale/nl/resources/locale.js
locale/nl/statistics.txt
locale/pl/resources/Tokenizer.php
locale/pt/resources/Tokenizer.php
locale/ru/resources/Tokenizer.php
locale/te/resources/Tokenizer.php
locale/th/resources/Tokenizer.php
locale/tr/resources/Tokenizer.php
locale/vi_VN/configure.ini
locale/vi_VN/resources/Tokenizer.php
locale/vi_VN/resources/locale.js
locale/vi_VN/resources/suggest_trie.txt.gz
locale/vi_VN/statistics.txt
locale/zh_CN/configure.ini
locale/zh_CN/resources/Tokenizer.php
locale/zh_CN/resources/locale.js
locale/zh_CN/resources/segment_word_grams.ftr
locale/zh_CN/statistics.txt
resources/4Pa/4PaP2dQJZTE/AppearanceActivity.png
resources/4Pa/4PaP2dQJZTE/CreateAdStep1.png
resources/4Pa/4PaP2dQJZTE/CreateAdStep2.png
resources/4Pa/4PaP2dQJZTE/DefaultYioopLandingPage.png
resources/4Pa/4PaP2dQJZTE/KeywordAdSearchResult.png
resources/4Pa/4PaP2dQJZTE/ManageAdvertisementElement.png
resources/4Pa/4PaP2dQJZTE/ManageAdvertisements.png
resources/4Pa/4PaP2dQJZTE/Version210.pdf
resources/Seekquarry.png
resources/xyq/xyqWsOS2HOY/AppearanceActivity.png.jpg
resources/xyq/xyqWsOS2HOY/CreateAdStep1.png.jpg
resources/xyq/xyqWsOS2HOY/CreateAdStep2.png.jpg
resources/xyq/xyqWsOS2HOY/DefaultYioopLandingPage.png.jpg
resources/xyq/xyqWsOS2HOY/KeywordAdSearchResult.png.jpg
resources/xyq/xyqWsOS2HOY/ManageAdvertisementElement.png.jpg
resources/xyq/xyqWsOS2HOY/ManageAdvertisements.png.jpg
views/DownloadView.php
views/StoreView.php
diff --git a/Routes.php b/Routes.php
new file mode 100644
index 0000000..b73a815
--- /dev/null
+++ b/Routes.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop;
+
+use seekquarry\yioop\configs as C;
+
+class Routes
+{
+    public static function getRoutes()
+    {
+        $routes = [
+            "download" => "routeDownload"
+        ];
+        return $routes;
+    }
+}
+
+function routeDownload($route_args)
+{
+    $handled = true;
+    if (!empty($route_args[1]) && $route_args[1] == floatval($route_args[1])) {
+        $_REQUEST['c'] = "main";
+        $_REQUEST['a'] = "download";
+        $_REQUEST['version'] = $route_args[1];
+        $_REQUEST['route']['c'] = true;
+        $_REQUEST['route']['a'] = true;
+        $_REQUEST['route']['version'] = true;
+    } else {
+        $handled = false;
+    }
+    return $handled;
+}
diff --git a/configs/PublicHelpPages.php b/configs/PublicHelpPages.php
new file mode 100755
index 0000000..e922fdf
--- /dev/null
+++ b/configs/PublicHelpPages.php
@@ -0,0 +1,7999 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * Default Public Wiki Pages
+ *
+ * This file should be generated using ExportPublicHelpDb.php
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\configs;
+
+/**
+ * Public wiki pages
+ * @var array
+ */
+$public_pages = [];
+$public_pages["en-US"]["404"] = <<< 'EOD'
+title=Page Not Found
+description=The page you requested cannot be found on our server
+END_HEAD_VARS
+==The page you requested cannot be found.==
+EOD;
+$public_pages["en-US"]["409"] = <<< 'EOD'
+title=Conflict
+
+description=Your request would result in an edit conflict.
+END_HEAD_VARS
+==Your request would result in an edit conflict, so will not be processed.==
+EOD;
+$public_pages["en-US"]["About"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=About
+
+author=Chris Pollett
+
+robots=
+
+description=
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS==About SeekQuarry/Yioop==
+
+SeekQuarry, LLC is the company responsible for the [[http://www.yioop.com/|Yioop PHP Search Engine]] project. SeekQuarry is owned by, and Yioop was mainly written by, myself, [[http://www.cs.sjsu.edu/faculty/pollett|Chris Pollett]]. Development of Yioop began in Nov. 2009 and was first publicly released August, 2010. SeekQuarry maintains the documentation and official public code repository for Yioop. It is also responsible for the SeekQuarry and Yioop servers. SeekQuarry LLC receives revenue from [[http://www.seekquarry.com/?c=main&amp;p=downloads#consulting|consulting services]] related to Yioop and by [[http://www.seekquarry.com/?c=main&amp;p=downloads#contribute|contributions]] from people interested in the continued development of the Yioop Search Engine Software and in the documentary resources the Seekquarry website provides. The Yioop and SeekQuarry Names
+When looking for names for my search engine, I was originally thinking about using the name SeekQuarry whose domain name hadn&#039;t been registered. After deciding that I would use Yioop for the name of my search engine site, I decided I would use SeekQuarry as a site to publish the software that is used in the Yioop engine. That is, yioop.com is a live site that demonstrates the open source search engine software distributed on the seekquarry.com site.
+
+&lt;br&gt;
+
+The name Yioop has the following history: I was looking for names that hadn&#039;t already been registered. My wife is Vietnamese, so I thought I might have better luck with Vietnamese words since all the English ones seemed to have been taken. I started with the word giup, which is the way to spell &#039;help&#039; in Vietnamese if you remove the accents. It was already taken. Then I tried yoop, which is my lame way of pronouncing how giup sounds like in English. It was already taken. So then I combined the two to get Yioop.
+
+==Dictionary Data==
+
+The [[https://en.wikipedia.org/wiki/Bloom_Filter|Bloom filter]] for Chinese word segmentation was developed using the word list [[http://www.mdbg.net/chindict/chindict.php?page=cedict|http://www.mdbg.net/chindict/chindict.php?page=cedict]] which has a Creative Commons Share Alike 3.0 Unported License. [[https://en.wikipedia.org/wiki/Trie|Trie]]&#039;s for word suggestion for all languages other than Vietnamese were built using the [[https://en.wiktionary.org/wiki/Wiktionary:Frequency_lists|Wiktionary Frequency Lists]]. These are also available under a [[https://creativecommons.org/licenses/by-sa/3.0/|Creative Commons Share Alike 3.0 Unported License]] as described on [[https://en.wikipedia.org/wiki/Wikipedia:Database_download|Wikipedia&#039;s Download page]]. The derived data files (if they were created for that language) for a language IANA tag, locale-tag, can be found in the locale/locale-tag/resources folder of the Yioop project. These are also licensed using the same license. For Vietnamese, I used the following [[http://www.informatik.uni-leipzig.de/~duc/software/misc/wordlist.html|Vietnamese Word List]] obtained with permision from [[http://www.informatik.uni-leipzig.de/~duc/|Ho Ngoc Duc]].
+
+&lt;br&gt;
+
+The English part-of-speech tagging algorithm in Yioop was originally coded by Shailesh Padave using with permission the article on Brill tagging by Ian Barber. This kind of tagging in turn makes use of the [[https://en.wikipedia.org/wiki/Brown_Corpus|Brown Corpus]]. Part-of-Speech tagging is used in Yioop only if thesaurus lookup is being used in final result reordering. In this case, to generate the thesaurus, [[http://wordnet.princeton.edu/wordnet/|WordNet]] is used.
+
+==Additional Credits==
+
+Several people helped with localization: Mary Pollett, Jonathan Ben-David, Ismail.B, Andrea Brunetti, Thanh Bui, Sujata Dongre, Animesh Dutta, Aida Khosroshahi, Youn Kim, Radha Kotipalli, Akshat Kukreti, Vijeth Patil, Chao-Hsin Shih, Ahmed Kamel Taha, and Sugi Widjaja. Several of my former students have contributed code which appear in the Yioop repository. They are: Mangesh Dahale, Ravi Dhillon, Priya Gangaraju, Akshat Kukreti, Pooja Mishra, Sreenidhi Pundi Muralidharan, Nakul Natu, Shailesh Padave, Vijaya Pamidi, Snigdha Parvatneni, Akash Patel, Vijeth Patil, Mallika Perepa, Tarun Pepira, Eswara Rajesh Pinapala, Tamayee Potluri, Shawn Tice, Pushkar Umaranikar, Sandhya Vissapragada. In addition, several of my students have created projects based on Yioop. Information about these project can be found on their [[http://www.cs.sjsu.edu/faculty/pollett/masters/|student pages]].
+
+EOD;
+$public_pages["en-US"]["Coding"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Open Source Search Engine Software - Seekquarry :: Coding
+
+author=Chris Pollett
+
+robots=
+
+description=Describes coding guidelines for the Yioop Search Engine
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS{{id=&#039;contents&#039;
+=Coding Guidelines for the Yioop=
+}}
+==Introduction==
+
+In order to understand a software project it helps to understand its organization and conventions. To encourage people to dive in and help improve Yioop and to ensure contributions which are easily understood within the context of Yioop&#039;s current standards, this article describes the coding conventions, issue tracking, and commit process for Yioop. It first describes the coding styles to be used for various languages within Yioop. It then describes some guidelines for what kind of code should go into which kind of files in Yioop. Finally, it concludes with a discussion of how issues should be submitted to the issue tracker, how to make patches for Yioop, and how commit messages should be written.
+
+[[Coding#contents|Return to table of contents]].
+
+==General==
+
+#One of the design goals of Yioop was to minimize dependencies on other projects and libraries. When coming up with a solution to a problem preference should be given to solutions which do not introduce new dependencies on external projects or libraries. Also, one should be on the lookout for eliminating existing dependencies, configuration requirements, etc.
+#The coding language for Yioop is English. This means all comments within the source code should be in English.
+#All data that will be written to the web interface should be localizable. That means easily translatable to any text representation of a human language. The section on [[Coding#localization|localization]] discusses facilities in Yioop for doing this.
+#Information written as log messages to log files and profiling information about queries (made available by the query info checkbox in Configure), which are not intended for end-users, do not need to be localized.
+#Project file names should be lowercase words. Non-PHP, multi-word file names should separate words with an underscore. For example, default_crawl.ini
+#To facilitate autoloading, all PHP files names should be camel-cased starting with a upper-case letter. For example, AdminView.php
+#Each project file should begin with the [[http://www.gnu.org/licenses/|GPL3 license]] as a comment in the appropriate format for the file in question. For example, for a PHP file, this might look like:
+ /**
+  *  SeekQuarry/Yioop --
+  *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+  *
+  *  Copyright (C) 2009 - 2014  Chris Pollett chris@pollett.org
+  *
+  *  LICENSE:
+  *
+  *  This program is free software: you can redistribute it and/or modify
+  *  it under the terms of the GNU General Public License as published by
+  *  the Free Software Foundation, either version 3 of the License, or
+  *  (at your option) any later version.
+  *
+  *  This program is distributed in the hope that it will be useful,
+  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  *  GNU General Public License for more details.
+  *
+  *  You should have received a copy of the GNU General Public License
+  *  along with this program.  If not, see .
+  *
+  *  END LICENSE
+  *
+  * @author Chris Pollett chris@pollett.org
+  * @package seek_quarry
+  * @subpackage executables
+  * @license http://www.gnu.org/licenses/ GPL3
+  * @link http://www.seekquarry.com/
+  * @copyright 2009 - 2014
+  * @filesource
+  */
+Here the subpackage might vary.
+#All non-binary files in Yioop should be [[http://en.wikipedia.org/wiki/Utf-8|UTF-8 encoded]]. Files should not have a [[http://en.wikipedia.org/wiki/Byte_order_mark|byte order mark]].
+#All non-binary files in Yioop should follow the convention of using four spaces for tabs (rather than tab characters). Further, all lines should be less than or equal to 80 columns in length. Lines should not end with trailing white-space characters. It is recommended to use an editor which can display white-space characters and which can display a bar marking the 80th column. For example, one can use [[http://projects.gnome.org/gedit/|gEdit]] or [[http://www.vim.org/|vim]].
+#One should use one space before and after assignment, boolean, binary, and comparison operators. A single space should be used after, but not before, commas and semi-colons. A space should not be used before increment, decrement, and sign operators:
+ if ($i == 0 &amp;&amp; $j &gt; 5 * $x) { /* some statements*/}
+ $i = 7;
+ $i += 3;
+ $a = array(1, 2, 3, 4);
+ for ($i = 0; $i &lt; $num; $i++) {
+ }
+# Control keywords such as if, for, foreach, while, switch, etc. should be followed by one blank space before the open parenthesis that follows them:
+  if ($my_var &gt; 0) {
+  }
+  while ($still_working) {
+  }
+  switch ($selector)
+  {
+  }
+#Some leeway may be given on this if it helps make a line under 80 characters -- provided being under 80 characters helps program clarity.
+#Do not use unstable code layouts such as:
+ $something1   = 25;
+ //...
+ $something10  = 25;
+ //...
+ $something100 = 27;
+Although the equal signs are aligned, the spacing is unstable under changes of variable names. Do not have multiple statements on one line such as:
+ $a=1; $b=6; $c=7;
+#Braces on class declarations, interface declarations, function declarations, and CSS declaration groups should be vertically aligned. For example,
+ class MyClass
+ {
+     //code for class
+ }
+
+ interface MyInterface
+ {
+     //code for interface
+ }
+
+ function myFun()
+ {
+     //some code
+ }
+
+ .my-selector
+ {
+     //some css
+ }
+
+#Braces for conditionals, loops, etc. should roughly follow the one true brace convention (1TBS):
+ if (cond) { /*single statement should still use braces*/}
+
+ if (cond) {
+     //some statements
+ } else if {
+     // another condition
+ } else {
+     // yet another condition
+ }
+
+ switch ($my_var) {
+     case 1:
+         break;
+     case 2:
+         //no break - should comment like this if don&#039;t have a break
+     case 3:
+         break;
+     default:
+ }
+
+ while (something) {
+     //do something
+ }
+
+ for ($i = 0; $i &lt; $num; $i++) {
+ }
+
+#The body of conditionals, loops, etc. code blocks should be indented 4 spaces. Code should not appear on the same line as an opening brace or on the same line as a closing brace:
+ class MyClass
+ {   function MyFun //not allowed
+     {
+     }
+ }
+
+ if (something) {
+     $i++;
+     $j++; } // not allowed
+
+ if (something) {
+     $i++;
+     $j++;
+ } // good
+An exception is allowed for single-line code blocks:
+ if (something) { $i++; } // is allowed
+ if (something) {
+     $i++;
+ } //is preferred
+#When a non-compound statement is split across several lines, all lines after the first should be indented four spaces:
+ //a long function call
+ setlocale(LC_ALL, $locale_tag, $locale_tag.&#039;.UTF-8&#039;,
+     $locale_tag.&#039;.UTF8&#039;,  $locale_tag.&quot;.TCVN&quot;, $locale_tag.&quot;.VISCII&quot;,
+     $locale_tag_parts[0], $locale_tag_parts[0].&#039;.UTF-8&#039;,
+     $locale_tag_parts[0].&#039;.UTF8&#039;, $locale_tag_parts[0].&quot;.TCVN&quot;);
+
+ // a case where the conditional of an if is long
+ if (!file_exists(&quot;$tag_prefix/statistics.txt&quot;) ||
+     filemtime(&quot;$tag_prefix/statistics.txt&quot;) &lt;
+     filemtime(&quot;$tag_prefix/configure.ini&quot;)) {
+     //code
+ }
+
+[[Coding#contents|Return to table of contents]].
+
+==PHP==
+
+Most of the code for Yioop is written in [[http://www.php.net|PHP]].  Here are some conventions that Yioop programmers should follow with regards to this language:
+
+#Yioop code should adhere to the [[http://www.php-fig.org|PHP Framework Interop Group]]&#039;s [[http://www.php-fig.org/psr/psr-2/|PSR-2 Coding Style Guidelines]].
+#Yioop code should all be in the seekquarry\yioop namespace or a subspace of this namespace. Global variables and other variables which affect namespace&#039;s outside seekquarry\yioop should not be used.
+#Code should be in classes other than web app entry points and the files: configs/Config.php, src/executables/CodeTool.php, src/library/LocaleFunctions.php, src/library/UpgradeFunctions.php, and src/library/Utility.php. Code should rely on the autoloading mechanism to load all other files.
+#The end of a PHP file should omit a final closing ?&gt; and should have one blank line beyond the last text character line.
+#Classes should be organized as:
+ class MyClass
+ {
+     // Variable Declarations
+     var some_var;
+
+     // Constant Declarations
+     const SOME_CONTANTS;
+
+     // Constructor
+     function __construct()
+     {
+         // code
+     }
+
+     // abstract member functions, if any
+     /*
+     abstract function someAbstractMethod($arg1, $arg2)
+     {
+         // code
+     }
+     */
+
+     //non static member functions
+     function someFunction($arg)
+     {
+         // code
+     }
+
+     // static member functions
+     function someStaticFunction($arg)
+     {
+         // code
+     }
+ }
+#Except for loop variables where $i, $j, $k may be used, preference should be given to variable names which are full words. $queue rather than $q, for example. Some common abbreviations are permissible $dir (for directory), $db (for database), $str (for string), but should be avoided.
+#Variable names should be descriptive. If this entails multi-word variable names, then the words should be separated by underscores. For example, $crawl_order.
+#Defines, class constants, global variables (used in more than one file) should be written in all-caps. All other variables should be lowercase only. Some example defines in Yioop are: BASE_DIR, NAME_SERVER, USER_AGENT_SHORT. Some example global variables are: $INDEXED_FILE_TYPES, $IMAGE_TYPES, $PAGE_PROCESSORS. Some example class constants in Yioop are: CrawlConstants::GOT_ROBOT_TXT, CrawlConstants::INVERTED_INDEX, IndexDictionary::DICT_BLOCK_SIZE.
+#Function and member function names should be camel-cased beginning with a lowercase letter. For example, insert, crawlHash, getEntry, extractWordStringPageSummary.
+#Class and interface names should be camel-cased beginning with an uppercase letter. For example, CrawlConstants, IndexShard, WebArchiveBundle. Class names involved in the web-app portion of Yioop: controllers, elements, helpers, layouts, models, and views should begin with an uppercase letter, subsequent words except this last should be lowercase. For example, SearchfiltersModel, MachinestatusView. This facilitates Yioop&#039;s auto-loading mechanism.
+#Yioop code should not use language feature which would break backward compatibility with PHP 5.4.
+#Each require/include, define, global variable, function, class, interface, field, constant, member function should have a [[http://www.phpdoc.org/|phpDoc]] docblock. These comments look like /** some comment */.
+#The GPL license should be included in a phpDoc (page-level) docblock which includes @author, @package, @subpackage, @license, @link http://www.seekquarry.com/, @copyright, and @filesource tags. See the example in the [[Coding#General|General guidelines section]].
+#Field variables (PHP properties) docblock&#039;s should use @var to say the type of the field. For example,
+ /**
+  * Number of days between resets of the page url filter
+  * If nonpositive, then never reset filter
+  * @var int
+  */
+ var $page_recrawl_frequency;
+#Multi-line phpDoc&#039;s should have a a vertical line of *&#039;s. For example,
+ /**
+  * First line of a phpDoc is a short summary, should not rehash function name
+  *
+  * Then a blank comment line, followed by
+  * a longer description. This in turn is followed by an @tags
+  *
+  * @param type $var_name description of variable
+  * @return type description of returned valued
+  */
+#Each parameter of a function/member function should be documented with an @param tag. The return value of a function/member function should be documented with an @return tag. For example,
+ /**
+  * Subtracts the two values $value1 and $value2
+  *
+  * This function is intended to be used as a callback function for sorting
+  *
+  * @param float $value1 a value to take the difference between
+  * @param float $value2 the other value
+  * @return float the difference
+  */
+ function difference($value1, $value2)
+ {
+     return $value1 - $value2;
+ }
+Notice the type of the argument/return value is give after the @tag. This could be NULL, int, float, string, array, object, resource, or mixed -- mixed, is used for return values which might return more than one type.
+#Multi-line comments within the body of a function or method should not use // such as:
+ // first line
+ // second line
+C-style comments /* */ should be used instead.
+#Multi-line comments within the body of a function or method should not have a vertical stripe of stars. This prevents fragile layout problems with comments. For example, a good multi-line comment within a function might look like:
+ /*
+     This loop&#039;s end condition
+     will be satisfied by something clever.
+  */
+
+[[Coding#contents|Return to table of contents]].
+
+==Javascript==
+
+#Variable names should not begin with $&#039;s to avoid confusion with PHP. Except for this, they should follow the same conventions as PHP variable names described earlier. Here are some example Javascript variable names: i,j,k, request, message_tag.
+#Function names should be camel-cased beginning with a lowercase letter. For example, elt, redrawGroup, drawCrawlSelect.
+#Function docblock comments have the same format as PHP ones, but rather than use /** */ use /* */. For example,
+ /*
+  *  Make an AJAX request for a url and put the results as inner HTML of a tag
+  *
+  *  @param Object tag  a DOM element to put the results of the AJAX request
+  *  @param String url  web page to fetch using AJAX
+  */
+ function getPage(tag, url)
+ {
+ //code
+ }
+#Within functions, comments follow the same conventions as PHP.
+#One should avoid echoing Javascript within PHP code and instead move such code as much as possible to an external .js file.
+#Javascript should be included/inlined at the end of web pages not at the beginning. This allows browsers to begin rendering pages rather than blocking for pages to load.
+#Javascript output via PHP in a controller should be output in the $data[&#039;SCRIPT&#039;] field sent in the $data variable to a view.
+#Localization needed by Javascript should be passed from PHP controllers using the $data[&#039;SCRIPT&#039;] field sent in the $data variable to a view. For example, in PHP one might have:
+ $data[&quot;MESSAGE&quot;] = tl(&#039;admin_controller_configure_no_set_config&#039;);
+ $data[&#039;SCRIPT&#039;] .=
+     &quot;doMessage(&#039;&lt;h1 class=\&quot;red\&quot; &gt;&quot;.
+     $data[&quot;MESSAGE&quot;] . &quot;&lt;/h1&gt;&#039;);&quot; .
+     &quot;setTimeout(&#039;window.location.href= &quot;.
+     &quot;window.location.href&#039;, 3000);&quot;;
+The PHP function tl is used here to provide the translation, which will be used in the Javascript function call.
+#Javascript output by a PHP View should be output as much as possible outside of PHP tags &lt;?php ... ?&gt; rather than with echo or similar statements.
+#External Javascript files (.js files) should not contain any PHP code.
+#External Javascript files should be included using the $data[&#039;INCLUDE_SCRIPTS&#039;] array. For example,
+ $data[&#039;INCLUDE_SCRIPTS&#039;] = array(&quot;script1&quot;, &quot;script2&quot;);
+would include script1.js and script2.js from the Yioop script folder.
+
+[[Coding#contents|Return to table of contents]].
+
+==CSS==
+
+#CSS should [[http://validator.w3.org/|W3C validate]] as either CSS 2 or CSS 3. CSS 3 styles should fail gracefully on non-supported browsers. Use of browser specific extensions such as -ms, -moz, -o, and -webkit selectors should only be for CSS 3 effects not yet supported by the given browser.
+#A [[http://www.w3.org/TR/CSS21/syndata.html#rule-sets|CSS Rule Set]] in Yioop should follow one of the following formats:
+ /* single selector case */
+ selector
+ {
+     property1: value1; /* notice there should be a single space after the : */
+     property2: value2; /* all property-value pairs should be terminate with a
+                           semi-colon */
+     ...
+ }
+
+ /* multiple selector case */
+ selector1,
+ selector2,
+ ...
+ {
+     property1: value1;
+     property2: value2;
+     ...
+ }
+#Selectors should be written on one line. For example:
+ .html-rtl .user-nav ul li
+Notice a single space is used between parts of this.
+#If an element should look different in a right-to-left language than a left-to-right language, then the .html-ltr and .html-rtl class selectors should be used. For example,
+ .html-ltr .user-nav
+ {
+     margin:0 0.5in 0 0;
+     min-width: 10in;
+     padding:0;
+     text-align: right;
+ }
+
+ .html-rtl .user-nav
+ {
+     margin:0 0 0 0.5in;
+     min-width: 10in;
+     padding:0;
+     text-align: left;
+ }
+For vertically written languages, one can use the selectors: .html-rl-tb, .html-lr-tb, .html-tb-rl, .html-tb-lr. Finally, if an element needs to be formatted differently for mobile devices, the .mobile selector should be used:
+ .mobile .user-nav
+ {
+     font-size: 11pt;
+     min-width: 0;
+     left:0px;
+     padding: 0px;
+     position: absolute;
+     right: 0px;
+     top: -10px;
+     width:320px;
+ }
+#To increase clarity, left-to-right, right-to-left, and mobile variants of the otherwise same selector should appear near each other in the given stylesheet file.
+#Class and ID selectors should be lowercase. Multi-word selector names should have the words separated by a hyphen:
+ .mobile
+ #message
+ #more-menu
+ .user-nav
+#Multiple selectors should be listed in alphabetical order. Properties in a rule-set should be listed alphabetically. For example,
+ .html-ltr .role-table,
+ .html-ltr .role-table td,
+ .html-ltr .role-table th
+ {
+     border: 1px solid black;
+     margin-left: 0.2in;
+     padding: 1px;
+ }
+An exception to this is a browser-specific property should be grouped next to its CSS3 equivalent.
+
+[[Coding#contents|Return to table of contents]].
+
+==HTML==
+#Any web page output by Yioop should validate as [[http://www.w3.org/TR/html5/|HTML5]]. This can be checked at the site [[http://validator.w3.org/|http://validator.w3.org/]].
+#Any web page output by Yioop should pass the Web accessibility checks of the [[http://wave.webaim.org/|WAVE Tool]].
+#Web pages should render reasonably similarly in any version of Chrome, Firefox, Internet Explorer, Opera, or Safari released since 2009. To test this, it generally suffices to test a 2009 version of each of these browsers together with a current version.
+#All tags in a document should be closed, but short forms of tags are allowed. i.e., a tag like &lt;br`&gt;` must have a corresponding close tag &lt;/br&gt;; however, it is permissible to use the short open-close form &lt;br` /&gt;`.
+#All tag attribute should have their values in single or double quotes:
+ &lt;tag attribute1=&#039;value1&#039; attribute2=&#039;value1&#039; &gt;
+ not
+ &lt;tag attribute1=value1 attribute2=value1 &gt;
+#For those still using Internet Explorer 6... For any given tag, name attribute values should be different than their id attribute values. For multi-word name attribute values, separate words with underscore, for id attributes, separate them with hyphens. For example,
+ &lt;input id=&quot;some-form-field&quot; name=&quot;some_form_field&quot; type=&quot;text&quot;  /&gt;
+#HTML code is output in views, elements, helpers, and layouts in Yioop. This code might be seen in one of two contexts: Either by directly looking at the source code of Yioop (so one can see the PHP code, etc.) or in a browser or other client when one uses the client&#039;s &quot;View Source&quot; feature. Code should look reasonably visually appealing in either context, but with preference given to how it looks as source code. Client-side HTML is often a useful tool for debugging however, so should not be entirely neglected.
+#Generating code dynamically all on one line should be avoided. Client-side HTML should avoid lines longer than 80 characters as well.
+#Although not as strictly followed as for braces, an attempt should be made to align block-level elements. For such an element, one should often place the starting and ending tag on a line by itself and nest the contents by four spaces, if possible. This is not required if the indentation level would be too deep to easily read the line. Inline elements can be more free-form:
+ &lt;ol&gt;
+     &lt;li&gt;Although not as strictly followed as for braces, an attempt
+     should be made to align block-level elements. For such an element, one
+     should often place the starting and ending tag on a line by itself and nest
+     the contents by &lt;b&gt;four spaces&lt;/b&gt;, if possible. This is not
+     required if the indentation level would be too deep to easily read the line.
+     Inline elements can be more free-form:
+     &lt;/li&gt;
+ &lt;/ol&gt;
+Notice we indent for the ol tag. Since starting text on a separate line for an li tag might affect appearance, adding a space to the output, we don&#039;t do it. We do, however, put the close tag on a line by itself. In the above the b tag is inlined.
+#Here are some examples of splitting long lines in HTML:
+ &lt;-- Long open tags --&gt;
+
+ &lt;-- case where content start and end spacing affects output --&gt;
+ &lt;tag attr1=&quot;value1&quot; attr2=&quot;value2&quot;
+     attr3=&quot;value3&quot;&gt;contents&lt;/tag&gt;
+
+ &lt;-- or, if it doesn&#039;t affect output: --&gt;
+ &lt;tag attr1=&quot;value1&quot; attr2=&quot;value2&quot;
+     attr3=&quot;value3&quot;&gt;
+     contents
+ &lt;/tag&gt;
+
+ &lt;-- Long urls should be split near &#039;/&#039;, &#039;?&#039;, &#039;&amp;&#039;. Most browsers
+     ignore a carriage return (without spaces) at such places in a url
+ --&gt;
+ &lt;a href=&quot;http://www.cs.sjsu.edu/faculty/
+ pollett/masters/Semesters/Fall10/vijaya/index.shtml&quot;&gt;Vijaya Pamidi&#039;s
+ master&#039;s pages&lt;/a&gt;
+#Urls appearing in HTML should make use of the HTML entity for ampersand: &amp; rather than just a &amp; . Browsers will treat these the same and this can often help with validation issues.
+
+[[Coding#contents|Return to table of contents]].
+
+==SQL==
+
+SQL in Yioop typically appears embedded in PHP code. This section briefly describes some minor issues with the formatting of SQL, and, in general, how Yioop code should interact with databases.
+
+#Except in subclasses of DatasourceManager, Yioop PHP code should not directly call native PHP database functions. That is, functions with names beginning with db2_, mysql_, mysqli_, pg_, orcl_, sqlite_, etc., or similar PHP classes. A DatasourceManager object exists as the $db field variable of any subclass of Model.
+#SQL should not appear in Yioop in any functions or classes other than subclasses of Model.
+#SQL code should be in uppercase. An example PHP string of SQL code might look like:
+ $sql = &quot;SELECT LOCALE_NAME, WRITING_MODE &quot;.
+     &quot; FROM LOCALE WHERE LOCALE_TAG = ?&quot;;
+#New tables names and field names created for Yioop should also be uppercase only.
+#Multi-word names should be separated by an underscore: LOCALE_NAME, WRITING_MODE, etc.
+#New tables added to the Yioop should maintain its [[http://en.wikipedia.org/wiki/Boyce%E2%80%93Codd_normal_form|BCNF normalization]]. [[http://en.wikipedia.org/wiki/Denormalization|Denormalization]] should be avoided.
+#Yioop&#039;s DatasourceManager class does have a facility for prepared statements. Using prepared statements should be preferred over escaping query parameters. Below is exampled of prepared statements in Yioop called from a model:
+ $sql = &quot;INSERT INTO CRAWL_MIXES VALUES (?, ?, ?, ?)&quot;;
+ $this-&gt;db-&gt;execute($sql, array($timestamp, $mix[&#039;NAME&#039;],
+     $mix[&#039;OWNER_ID&#039;], $mix[&#039;PARENT&#039;]));
+Notice how the values that are to be filled in for the ? are listed in order in the array. execute caches the last statement it has seen, so internally if you call $db-&gt;execute twice with the same statement it doesn&#039;t do the lower level prepare call to the database the second time. You can also use named parameters, as in the following example:
+ $sql = &quot;UPDATE VISITOR SET DELAY=:delay, END_TIME=:end_time,
+     FORGET_AGE=:forget_age, ACCESS_COUNT=:account_count
+     WHERE ADDRESS=:ip_address AND PAGE_NAME=:page_name&quot;;
+ $this-&gt;db-&gt;execute($sql, array(
+     &quot;:delay&quot;=&gt;$delay, &quot;:end_time&quot; =&gt; $end_time,
+     &quot;:forget_age&quot; =&gt; $forget_age,
+     &quot;:account_count&quot; =&gt; $access_count,
+     &quot;:ip_address&quot; =&gt; $ip_address, &quot;:page_name&quot; =&gt; $page_name));
+#In the rare case where a non-prepared statement is used, strings should
+be properly escaped usingDatasourceManager::escape_string. For example,
+ $sql = &quot;INSERT INTO LOCALE&quot;.
+     &quot;(LOCALE_NAME, LOCALE_TAG, WRITING_MODE) VALUES&quot;.
+     &quot;(&#039;&quot;.$this-&gt;db-&gt;escapeString($locale_name).
+     &quot;&#039;, &#039;&quot;.$this-&gt;db-&gt;escapeString($locale_tag) .
+     &quot;&#039;, &#039;&quot;.$this-&gt;db-&gt;escapeString($writing_mode).&quot;&#039;)&quot;;
+
+[[Coding#contents|Return to table of contents]].
+
+==Localization==
+
+Details on how Yioop can be translated into different languages can be found in the [[Documentation#Localizing%20Yioop%20to%20a%20New%20Languageg|Yioop Localization Documentation]]. As a coder what things should be localized are given in the [[Coding#General|general considerations]] section of this document. In this section, we describe a little about what constitutes a good translation, and then talk a little about, as a coder, how you should add new strings to be localized. We also make some remarks on how localization patches should be created before posting them to the issue tracker. This section describes how Yioop should be localized. The seekquarry.com site is also localizable. If you are interested in translating the Yioop documentation or pages on seekquarry.com, drop me a line at: chris@pollett.org .
+
+#It can take quite a long time to translate all the strings in Yioop. Translations of only some of the missing strings for some locale are welcome! Preference should be given to strings that an end-user is likely to see. In order of priority one should translate string ids beginning with search_view_, pagination_helper_, search_controller_, signin_element_, settings_view_, settings_controller_, web_layout_, signin_view_, static_view_, statistics_view_.
+#For static pages, there are two versions -- those included with the Yioop download, and those on the the order of translation should be: privacy.thtml, bot.thtml, 404.thtml, and 409.thtml. For translations of the privacy statement for yioop.com, you should add a sentence saying the meaning of English statement takes precedence over any translations.
+#Localization should be done by a native (or close to) speaker of the language Yioop is being translated to. Automated translations using things like [[http://translate.google.com/|Google Translate]] should be avoided. If used, such translations should be verified by a native speaker before being used.
+#There are three main kinds of text which might need to be localized in Yioop: static strings, dynamic strings, and static pages.
+#Text that has the potential to be output by the Yioop web interface should only appear in views, elements, helpers, layouts, or controllers. Controllers should only pass the string to be translated to a view, which in turn outputs it; rather than directly output it.
+#If you need Javascript to output a translatable string, use a PHP controller to output a Javascript variable into $data[&#039;SCRIPT&#039;], then have your Javascript make use of this variable to provide translation on the client. External .js files should not contain PHP code. An example of using this mechanism is given by the files mix.js and admin_controller.php&#039;s editMix member function.
+#String ids should be all lowercase, with an underscore used to separate words. They should follow the convention: file_name_approximate_english_translation. For example, signin_view_password is a string id which appears in the views/SigninView.php file, and in English is translated as Password.
+#Dynamic strings ids are string ids stored in the database and which may be added by administrators after downloading Yioop. String ids for these strings should all be in the format: db_use_case_translation. For example, db_activity_manage_locales or db_subsearch_images .
+#All suggested localizations posted to the issue tracker should be [[http://en.wikipedia.org/wiki/UTF-8|UTF-8 encoded]].
+#If the only string ids you have translated are static ones, you can just make a new issue in the [[http://www.seekquarry.com/mantis/|issue tracker]] and post the relevant configure.ini file. These files should be located in the Yioop Work Directory/locale/locale_in_question . Ideally, you should add strings through Manage Locales, which will modify this file for you.
+#For dynamic string translations just cut-and-paste the relevant line from Edit Locales into a new note for your issue.
+#Wiki pages for the Public and Help groups are also useful to have translated. Again, how to set up localizations of wiki pages is described in [[Documentation#Localizing%20Yioop%20to%20a%20New%20Languageg|Yioop Localization Documentation]]. Once you have translated these pages on your local system, you can run the script configs/ExportPublicHelpDb.php to export this information to a file in APP_DIR/configs/PublicHelpPages.php which you can send.
+
+[[Coding#contents|Return to table of contents]].
+
+==Code-base Organization==
+
+This section describes what code should be put where when writing new code for Yioop. It can serve as a rough guide as to where to find stuff. Also, coding organization is used to ensure the security of the overall Yioop software. Some of the material in this section overlaps with what is described in the [[Documentation#Summary%20of%20Files%20and%20Folders|Summary of Files and Folders]] and the [[Documentation#Building%20a%20Site%20using%20Yioop%20as%20Framework|Building a Site using Yioop as a Framework]] sections of the main Yioop documentation. All folder paths listed in this section are with respect to the Yioop INSTALL_DIR/src folder, or, in the case of tests, just the INSTALL_DIR folder.
+
+#There are two main categories of apps in Yioop: the command line tools and programs, and the Yioop web app.
+#Core libraries common to both kinds of apps should be put in the library folder. One exception to this are subclasses of DatasourceManager. DatasourceManager has database and filesystem functions which might be useful to both kinds of apps. It is contained in models/datasources. The easiest way to create an instance of this class is with a line like:
+        $model = new Model(); // $model-&gt;db will be a DatasourceManager
+#Some command-line programs such as executables/Fetcher.php and executables/QueueServer.php communicate with the web app either through curl requests or by file-based message passing. As a crude way to the check integrity of these messages as well as to reduce the size of serializations of the messages sent, the CrawlConstants interface defines a large number of shared class constants. This interface is then implemented by all classes that have need of this kind of message passing. CrawlConstants is defined in the file library/CrawlConstants.php .
+#Command-line tools useful for general Yioop configuration together with the Yioop configuration files Config.php and LocalConfig.php should be put in the configs folder. Some examples are: ConfigureTool.php and Createdb.php .
+#All non-configuration command-line tools should be in the executables folder.
+#Example scripts such as the file search.php which demonstrates the Yioop search API should be in the examples folder.
+#External Javascripts should be in the scripts folder, CSS should be the css folder, images should be in the resources folder, and sqlite3 databases in the data folder.
+#Code (PHP and Javascript) related to a particular locale should be in the folder locale/locale-tag/resources. Examples of this are the files: locale/en_US/resources/locale.js and locale/en_US/resources/Tokenizer.php .
+#Unit tests and coding experiments (the latter might test different aspects about speed and memory usage of PHP or Javascript constructs) should be in the tests folder. Auxiliary files to these tests and experiments should be put in tests/test_files.
+#Unit tests should be written for any new lib folder files. Unit tests should be a subclass of UnitTest which can be found in library/UnitTest.php. The file name for a unit test should end in Test.php to facilitates it detection by tests/index.php which is used to run the tests. As much as possible unit tests should be written for executables folder programs and the web app as well.
+#Command-line tools should have a check that they are not being run from the web such as:
+ // if the command-line program does not have a unit test
+ if(php_sapi_name() != &#039;cli&#039;) {echo &quot;BAD REQUEST&quot;; exit();}
+
+ // if the command-line program has a unit test
+ if (!defined(&quot;seekquarry\\yioop\\configs\\UNIT_TEST_MODE&quot;)) {
+     if (php_sapi_name() != &#039;cli&#039;) {echo &quot;BAD REQUEST&quot;; exit();}
+ }
+#Files other than command line programs, ./index.php, and ./tests/index.php should not define the UNIT_TEST_MODE constants. All code in non-command line programs should be in class, interface, or function definitions. I.e., they should have no globally executing statements.
+#The entry points into the web app should output the HTTP header:
+ header(&quot;X-FRAME-OPTIONS: DENY&quot;);
+to try to prevent [[http://en.wikipedia.org/wiki/Clickjacking|clickjacking]].
+#The only file to specify the autoloader for Yioop is configs/Config.php. It also defines important namespace level constants. It is require&#039;d by both library/Utility.php and library/LocaleFunctions.php. Requiring any one of these files thus specifies the autoloader and important namespace constants. The base classes Controller, Model, View, etc., each require at least one of these files, so subclasses shouldn&#039;t.
+#The Yioop web app has the following kinds of files: controllers, models, views, (these three are main three); and components, element, helpers, and layouts (lesser). These should be put respectively into the folders: controllers, models, views, controllers/components, views/elements, views/helpers, views/layouts. Filenames should for these files should end with its type: i.e., a view should end with View.php, for example, MyView.php .
+#A view roughly corresponds to one web page, a layout is used to render common page headers and footers for several views, an element is used for a relatively static portion of a web page which might appear in more than one view, and a helper is used to dynamically render a web page element such as a select tag according to passed PHP variables.
+#Views, elements, and layouts should contain minimal PHP and be mostly HTML. In these classes for, while, etc. loops should be avoided. PHP in these classes should be restricted to simple conditionals and echos of $data variable fields.
+#Control logic involving conditionals, loops, etc. should be put in controllers or components. Components are collections of related methods which might be used by several controllers. The controller&#039;s static field $component_activities is used to define which components live on a controller and what activities from that component are allowed. A component has a $parent field that allows access to the controller it currently lives on.
+#In the web app, only models should access the file system or a database.
+#Variables whose values come from a web client should be cleaned before used by a view or a model. Subclasses of Controller have a clean() member function for this purpose. Further DatasourceManager&#039;s have an escapeString method which should be used on string before inserting them into a database in a Model.
+#Models, views, elements, helpers, and layouts should not use the $_GET, $_POST, $_REQUEST super-globals. Controllers should not use $_GET and $_POST, at most they should use $_REQUEST. This helps facilitates changing whether HTTP GET or POST is used -- also, using the same variable name for both a GET and POST variable is evil -- this restriction may (or may not) help in catching such errors.
+#For controllers which use the $_SESSION super-global, the integrity of the session against [[http://en.wikipedia.org/wiki/Csrf|cross-site request forgery]] should be checked. This should be done in the processRequest method using code like:
+ if(isset($_SESSION[&#039;USER_ID&#039;])) {
+     $user = $_SESSION[&#039;USER_ID&#039;];
+ } else {
+     $user = $_SERVER[&#039;REMOTE_ADDR&#039;];
+ }
+
+ $data[CSRF_TOKEN] = $this-&gt;generateCSRFToken($user);
+ $token_okay = $this-&gt;checkCSRFToken(CSRF_TOKEN, $user);
+ if($token_okay) {
+     //now can do stuff
+ }
+#When creating a new release of Yioop, one should check if any required database or locale changes were made since the last version. If database changes have been made, then configs/Createdb.php should be updated. Also library/UpgradeFunctions.php should have a new upgradeDatabaseVersion function added. If locale changes need to be pushed from BASE_DIR/locale files to WORK_DIRECTORY/locale files when people upgrade, then one should change the version number on the view_locale_version string id. i.e., view_locale_version0 as a string id might become view_locale_version1. This string id is in views/View.php. It is not actually output anywhere to the UI -- it is used only for this purpose. A number of variables control whether client-side, HTML5 localStorage related to the previous release will still work with the new release. If it won&#039;t work, then this version number should be updated. An example of such a variable is SUGGEST_VERSION_NO in suggest.js.
+
+[[Coding#contents|Return to table of contents]].
+
+==Issue Tracking/Making Patches/Commit Messages==
+
+In this section we discuss the Yioop issue tracker and discuss using the git version control system to make and apply patches for Yioop.
+#If you would like to contribute code to Yioop, but don&#039;t yet have an account on the issue tracker, you can [[http://www.seekquarry.com/mantis/signup_page.php|sign up for an account]].
+#After one has an account and is logged in, one can click the [[http://www.seekquarry.com/mantis/bug_report_page.php|Report Issue]] link to report an issue. Be sure to fill in as many report fields and give as much detail as possible. In particular, you should select a Product Version.
+#The Upload File fieldset lets you upload files to an issue and the Add Note fieldset allows you to add new notes. This is where you could upload a patch. By default, a new account is a Reporter level account. This won&#039;t let you set people to moniter (get email about) the issue besides yourself. However, the administrator will be aware the issue was created.
+#A developer level account will allow you to change the status of issues, update/delete issues, set who is monitoring an issue, and assign issues to individuals. This can be done through the fieldset just beneath Attached Files.
+#Information about [[http://en.wikipedia.org/wiki/Git_%28software%29|Git]], Git clients, etc. can be obtained from: [[http://git-scm.com/|http://git-scm.com/]]. Here we talk about a typically workflow for coding Yioop using Git.
+#After installing git, make sure to configure your user name and email address:
+ % git config --global user.name &quot;Chris Pollett&quot;
+ % git config --global user.email &quot;chris@pollett.org&quot;
+You should of course change the values above to your name and email. To see your current configuration settings you can type:
+ % git config -l
+If you want to remove any settings you can type:
+ % git config --unset some.setting.you.dont.want
+Setting the user name and email will ensure that you receive credit/blame for any changes that end up in the main git repository. To see who is responsible for what lines in a file one can use the git blame command. For example:
+ % git blame yioopbar.xml
+ |chris-polletts-macbook-pro:yioop:526&gt;git blame yioopbar.xml
+ git blame yioopbar.xml
+ ad3c397c (Chris Pollett 2010-12-28 00:27:38 -0800  1) &lt;?xml version=&quot;1.0&quot; e
+ ad3c397c (Chris Pollett 2010-12-28 00:27:38 -0800  2) &lt;OpenSearchDescriptio
+ ad3c397c (Chris Pollett 2010-12-28 00:27:38 -0800  3) &lt;ShortName&gt;Yioop&lt;
+ ad3c397c (Chris Pollett 2010-12-28 00:27:38 -0800  4) &lt;Description&gt;Quickly
+ ad3c397c (Chris Pollett 2010-12-28 00:27:38 -0800  5) &lt;InputEncoding&gt;UTF-8
+ ad3c397c (Chris Pollett 2010-12-28 00:27:38 -0800  6) &lt;Image width=&quot;16&quot; hei
+ 774eb50d (Chris Pollett 2012-12-31 10:47:57 -0800  7) &lt;Url type=&quot;text/html&quot;
+ 774eb50d (Chris Pollett 2012-12-31 10:47:57 -0800  8)     template=&quot;http://
+ ad3c397c (Chris Pollett 2010-12-28 00:27:38 -0800  9) &lt;/Url&gt;
+ 774eb50d (Chris Pollett 2012-12-31 10:47:57 -0800 10) &lt;/OpenSearchDescripti
+#To make a new copy of the most recent version of Yioop one can run the git clone command:
+ % git clone https://seekquarry.com/git/yioop.git yioop
+This would create a copy of the Yioop repository into a folder yioop in the current directory. Thereafter, to bring this copy up to date with the most recent version of yioop one can issue the command:
+ % git pull
+#Once one has a git clone of Yioop -- or done a git pull of the most recent changes to Yioop -- one can start coding! After coding a while you should run git status to see what files you have changed. For example,
+ % git status
+ # On branch master
+ # Your branch is behind &#039;origin/master&#039; by 1 commit, and can be fast-forwarded.
+ #
+ # Untracked files:
+ #   (use &quot;git add &lt;file&gt;...&quot; to include in what will be committed)
+ #
+ #    tmp.php
+ nothing added to commit but untracked files present (use &quot;git add&quot; to track)
+This says there has been one commit to the main repository since your clone / last git pull. It also says we could bring things up to date by just doing a git pull. In this case, however, it says that there was an untracked file in the repository. If this file was a file we made with the intention of adding it to Yioop, we should type git add to add it. For example,
+ % git add tmp.php
+
+
+ Now we could try to do a git pull. Suppose we get the message...
+
+ Updating e3e4f20..a9a8ed9
+ error: Your local changes to the following files would be overwritten by merge:
+     tmp.php
+ Please, commit your changes or stash them before you can merge.
+ Aborting
+What this means is that someone else has also added tmp.php and there are conflicts between these two versions. To merge these two versions, we first commit our version:
+ % git commit -a -m &quot;Fixes Issue 987, Yioop needs a tmp.php file, a=chris&quot;
+ [master 3afe055] Fixes Issue 987, Yioop needs a tmp.php file, a=chris
+  1 file changed, 4 insertions(+)
+  create mode 100644 tmp.php
+The option -a tells git to put in the commit all changes done to staged files (those that we have git add&#039;d) since the last commit. The option -m is used to give an inline message. The general format of a of such a message in Yioop is: which issue number in the issue tracker is being fixed, a brief English summary of that issue, and under whose authority the commit is being done. This last will be in the format a=chris where a means approved and the person who approved is of sufficient seniority to commit unreviewed things or in the format r=someone, where someone is the person asked in the issue to review your commits before they are pushed. Often for administrator commits, there won&#039;t be an associated issue tracking issue, in which case the format reduces to: some useful English description of the change, a=username of administrator. Now that we have done the above commit, we can try again to do a git pull:
+ % git pull
+ Auto-merging tmp.php
+ CONFLICT (add/add): Merge conflict in tmp.php
+ Automatic merge failed; fix conflicts and then commit the result.
+ %cat tmp.php
+ cat tmp.php
+ &lt;?php
+ &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
+  echo &quot;hello&quot;;
+  echo &quot;good bye&quot;;
+ =======
+ &gt;&gt;&gt;&gt;&gt;&gt;&gt; a9a8ed990108598d06334e29c0eb37d98f0845aa
+ ?&gt;
+The listing of the tmp.php file above has blocks of the form: &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD, =======, &gt;&gt;&gt;&gt;&gt;&gt;&gt; a9a8ed990108598d06334e29c0eb37d98f0845aa. In this case, there is only one such block, in general, there could be many. The stuff before the ======= in the block is in the local repository, the stuff after the ======= is in the remote repository. So in the local copy, there are the two lines:
+ echo &quot;hello&quot;;
+ echo &quot;good bye&quot;;
+not in the remote repository. On the other hand, there is nothing in the remote repository not in the local copy. So we could fix this conflict by editing this block to look like:
+ &lt;?php
+  echo &quot;hello&quot;;
+  echo &quot;good bye&quot;;
+ ?&gt;
+In general, we should fix each conflict block if there is more than one. Conflicts can also be in more than one file, so we could have to fix each file with conflicts. Once this is done, to tell git we have resolved the conflict, we can type:
+ % git add tmp.php
+ % git commit
+ [master e5ebf9f] Merge branch &#039;master&#039; of https://seekquarry.com/git/yioop
+Here we didn&#039;t use -m, so we were dropped into the vi text editor, where we left the default commit message. Now we can go back to editing our local copy of Yioop. If we do a git pull at this point, we will get the message: &quot;Already up-to-date.&quot;
+#The &quot;opposite command&quot; to git pull is git push. Most casual developers for Yioop don&#039;t have push privileges on the main Yioop repository. If one did, a possible development workflow would be: Pull the master copy of Yioop to a local branch, make your changes and post a patch to the Bug/Issue in question on the issue tracker asking someone to review it (probably, the administrator, which is me, Chris Pollett). The reviewer gives a thumbs up or down. If it is a thumbs up, you push your changes back to the master branch. Otherwise, you revise you patch and try again. To configure git so git push works you can either make a ~/.netrc file with
+ machine seekquarry.com
+ login &lt;username&gt;
+ password &lt;password&gt;
+in it, chmod it to 600, and type:
+ % git config remote.upload.url https://seekquarry.com/git/yioop.git
+or you can just type the command:
+ % git config remote.upload.url \
+     https://&lt;username&gt;@seekquarry.com/git/yioop.git
+After this, you should be able to use the command:
+ % git push upload master
+This pushes your local changes back to the repository. In the second method, you will be prompted for your password. Another common setting that you might to change is http.sslVerify. If you are getting error messages such as
+ error: server certificate verification failed. CAfile:
+ /etc/ssl/certs/ca-certificates.crt CRLfile: none
+ while accessing https://seekquarry.com/git/yioop.git/info/refs
+
+
+ you might want to use the command:
+ % git config --global --add http.sslVerify false
+#In the workflow above, the changes we make to our local repository should be reviewed before we do a push back to the Yioop repository. To do this review, we need to make a patch, upload the patch to the issue tracker, and add someone to this issue monitor list who could review it, asking them to do a review. These last two steps require the user to have at least a developer account on the issue tracker. Anyone who registers for the issue tracker gets initially a reporter account. If you would like to code for Yioop and have already made a patch, you can send an email to chris@pollett.org to request your account to be upgraded to a developer account. New developers do not get push access on the Yioop repository. For such a developer, the workflow is create a patch, post it to an issue on the issue tracker, get it approved by an administrator reviewer, then the reviewer pushes the result to the main Yioop repository.
+#After coding, but before making a patch you should run executables/CodeTool.php to remove any stray tab characters, or spaces at the end of lines. This program can be run either on a single file or on a folder. For example, one could type:
+ % php executables/CodeTool.php clean tmp.php
+This assumes you were in the Yioop base directory and that was also the location of tmp.php. You should also run the command:
+ % php executables/CodeTool.php longlines tmp.php
+to check for lines over 80 characters.
+#To make a patch, we start with an up-to-date copy of Yioop obtained by either doing a fresh clone or by doing a git pull. Suppose we create a couple new files, add them to our local repository, do a commit, delete one of these files, make a few more changes, and commit the result. This might look on a Mac or Linux system like:
+ % ed test1.php
+ test1.php: No such file or directory
+ a
+ &lt;?php
+ ?&gt;
+ .
+ wq
+ 9
+ % ed test2.php
+ test2.php: No such file or directory
+ a
+ &lt;?php
+ ?&gt;
+ .
+ wq
+ 9
+ % git add test1.php
+ % git add test2.php
+ % git commit -a -m &quot;Adding test1.php and  test2.php to the repository&quot;
+ [master 100f787] Adding test1.php and test2.php to the repository
+  2 files changed, 4 insertions(+)
+  create mode 100644 test1.php
+  create mode 100644 test2.php
+ % ed test1.php
+ 9
+ 1
+ &lt;?php
+ a
+     phpinfo();
+ .
+ wq
+ 24
+ % git rm test2.php
+ rm &#039;test2.php&#039;
+ % ls
+ ./        README*        data/        locale/        search_filters/
+ ../        bin/        error.php*    models/        test1.php
+ .DS_Store*    blog.php*    examples/    my.patch    tests/
+ .git/        bot.php*    extensions/    privacy.php*    views/
+ .gitignore    configs/    favicon.ico    resources/    yioopbar.xml
+ INSTALL*    controllers/    index.php*    robots.txt
+ LICENSE*    css/        lib/        scripts/
+ % git commit -a -m &quot;Adding phpinfo to test1.php, removing test2.php&quot;
+ [master 7e64648] Adding phpinfo to test1.php, removing test2.php
+  2 files changed, 1 insertion(+), 2 deletions(-)
+  delete mode 100644 test2.php
+Presumably, you will use a less ancient editor than ed. ed though does have the virtue of not clearing the screen, making it easy to cut and paste what we did. We now want to make a patch consisting of all the commits since we did the git pull. First, we get the name of the commit before we started modifying stuff by doing git log -3 to list out the information about the last three commits. If you had done more commits or less commits since the git pull then -3 would be different. We see the name is e3e4f20674cf19cf5840f431066de0bccd1b226c. The first eight or so characters of this uniquely identify this commit, so we copy them. To make a patch with git, one uses the format-patch command. By default this will make a separate patch file for each commit after the starting commit we choose. To instead make one patch file we use the --stdout option and redirect the stream to my.patch. We can use the cat command to list out the contents of the file my.patch. This sequence of commands looks like the following...
+ % git log -3
+ commit 7e646486faa35f69d7322a8e4fca12fb6b457b8f
+ Author: Chris Pollett &lt;chris@pollett.org&gt;
+ Date:   Tue Jan 1 17:32:00 2013 -0800
+
+     Adding phpinfo to test1.php, removing test2.php
+
+ commit 100f7870221d453720c90dcce3cef76c0d475cc8
+ Author: Chris Pollett &lt;chris@pollett.org&gt;
+ Date:   Tue Jan 1 16:35:02 2013 -0800
+
+     Adding test1.php and test2.php to the repository
+
+ commit e3e4f20674cf19cf5840f431066de0bccd1b226c
+ Author: Chris Pollett &lt;chris@pollett.org&gt;
+ Date:   Tue Jan 1 15:48:34 2013 -0800
+
+     modify string id in settings_view, remove _REQUEST variable from
+ machinelog_element, a=chris
+ % git format-patch e3e4f2067 --stdout &gt; my.patch
+ % cat my.patch
+ From 100f7870221d453720c90dcce3cef76c0d475cc8 Mon Sep 17 00:00:00 2001
+ From: Chris Pollett &lt;chris@pollett.org&gt;
+ Date: Tue, 1 Jan 2013 16:35:02 -0800
+ Subject: [PATCH 1/2] Adding test1.php and test2.php to the repository
+
+ ---
+  test1.php |    2 ++
+  test2.php |    2 ++
+  2 files changed, 4 insertions(+)
+  create mode 100644 test1.php
+  create mode 100644 test2.php
+
+ diff --git a/test1.php b/test1.php
+ new file mode 100644
+ index 0000000..acb6c35
+ --- /dev/null
+ +++ b/test1.php
+ @@ -0,0 +1,2 @@
+ +&lt;?php
+ +?&gt;
+ diff --git a/test2.php b/test2.php
+ new file mode 100644
+ index 0000000..acb6c35
+ --- /dev/null
+ +++ b/test2.php
+ @@ -0,0 +1,2 @@
+ +&lt;?php
+ +?&gt;
+ --
+ 1.7.10.2 (Apple Git-33)
+
+
+ From 7e646486faa35f69d7322a8e4fca12fb6b457b8f Mon Sep 17 00:00:00 2001
+ From: Chris Pollett &lt;chris@pollett.org&gt;
+ Date: Tue, 1 Jan 2013 17:32:00 -0800
+ Subject: [PATCH 2/2] Adding phpinfo to test1.php, removing test2.php
+
+ ---
+  test1.php |    1 +
+  test2.php |    2 --
+  2 files changed, 1 insertion(+), 2 deletions(-)
+  delete mode 100644 test2.php
+
+ diff --git a/test1.php b/test1.php
+ index acb6c35..e2b4c37 100644
+ --- a/test1.php
+ +++ b/test1.php
+ @@ -1,2 +1,3 @@
+  &lt;?php
+ +    phpinfo();
+  ?&gt;
+ diff --git a/test2.php b/test2.php
+ deleted file mode 100644
+ index acb6c35..0000000
+ --- a/test2.php
+ +++ /dev/null
+ @@ -1,2 +0,0 @@
+ -&lt;?php
+ -?&gt;
+ --
+ 1.7.10.2 (Apple Git-33)
+#One should always list out the patch as we did above before posting it to the issue tracker. It can happen that we accidentally find that we have more things in the patch than we should. Also, it is useful to do one last check that the Yioop coding guidelines seem to be followed within the patch.
+#The last step before uploading the patch to the issue tracker is to just check that the patch in fact works. To do this make a fresh clone of Yioop. Copy my.patch into your clone folder. To see what files the patch affects, we can type:
+ % git apply --stat my.patch
+  test1.php |    2 ++
+  test2.php |    2 ++
+  test1.php |    1 +
+  test2.php |    2 --
+  4 files changed, 5 insertions(+), 2 deletions(-)
+Since there are two concatenated patches in my.patch, it first lists the two files affected by the first patch, then the two files affected by the second patch. To do a check to see if the patch will cause any problems before applying it, one can type:
+ % git apply --check my.patch
+Finally, to apply the patch we can type:
+ % git am --signoff &lt;  my.patch
+ Applying: Adding test1.php and test2.php to the repository
+ Applying: Adding phpinfo to test1.php, removing test2.php
+     &lt;/pre&gt;
+     The am says apply from a mail, the --signoff option says to write a
+     commit message with your email saying you approved this commit. From
+     the above we see each patch within my.patch was applied in turn. To
+     see what this signoff looks like, we can do:
+     &lt;pre&gt;
+ commit aca40730c41fafe9a21d4f0d765d3695f20cc5aa
+ Author: Chris Pollett &lt;chris@pollett.org&gt;
+ Date:   Tue Jan 1 17:32:00 2013 -0800
+
+     Adding phpinfo to test1.php, removing test2.php
+
+     Signed-off-by: Chris Pollett &lt;chris@pollett.org&gt;
+
+ commit d0d13d9cf3059450ee6b1b4a51db0d0fae18256c
+ Author: Chris Pollett &lt;chris@pollett.org&gt;
+ Date:   Tue Jan 1 16:35:02 2013 -0800
+
+     Adding test1.php and test2.php to the repository
+
+     Signed-off-by: Chris Pollett &lt;chris@pollett.org&gt;
+
+ commit e3e4f20674cf19cf5840f431066de0bccd1b226c
+ Author: Chris Pollett &lt;chris@pollett.org&gt;
+ Date:   Tue Jan 1 15:48:34 2013 -0800
+
+     modify string id in settings_view, remove _REQUEST variable from
+ machinelog_element, a=chris
+At this point the patch seems good to go, so we can upload it to the issue tracker!
+
+[[Coding#contents|Return to table of contents]].
+
+==New Version Quality Assurance Checklist==
+
+The following should be check before creating a new release of Yioop:
+
+#All unit tests pass.
+#Included sqlite database default.db is up-to-date.
+#Install guides are up to date and installation can be performed as described for each of the major platforms (Linux variants, MAC OSX, Windows, HHVM).
+#Upgrade functions successfully upgrade Yioop from last version. Upgrade functions need only be written from the last official release to the current official release.
+#Yioop can perform a regular and archive crawl on each of the platforms for which an install guide has been made.
+#Each kind of archive iterator has been tested on the development platform to be still working.
+#Multi-queue server crawls should be tested. Mirror and Media updater processes should be tested.
+#Documentation reflects changes since last version of Yioop, screenshots have been updated.
+#Source code documentation has been updated. The current command used to do this is
+ phpdoc -d ./yioop -t ./yioop_docs --ignore=&quot;work_directory/*,LocalConfig.php,*/vendor/*&quot; \
+ --sourcecode --title=&quot;Yioop_Vversion_Source_Code_Documentation&quot;
+This should be executed from one directory up from the Yioop source code
+#Each admin panel activity and each setting within each activity works as described.
+#Web app still appears correctly for major browsers: Firefox, Chrome, Internet Explorer, Safari released in the last two years.
+
+[[Coding#contents|Return to table of contents]].
+EOD;
+$public_pages["en-US"]["Composer"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Using Composer
+
+author=Chris Pollett
+
+robots=
+
+description=Describes how to use Yioop as a part of a project build with Composer
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS==Integrating Yioop Libraries with Composer==
+
+Yioop provides a large variety of search-engine related and natural language related
+libraries that you might want to use in your own custom web application.
+[[https://getcomposer.org/|Composer]] allows you to easily combine packages you need
+from several PHP projects into your project and manage their dependencies. In this article,
+we explore how to add Yioop to a project managed by Composer.
+
+The Composer site describes how to download and install composer so that it can be run from
+the command line via commands like:
+ composer some_directive_for_composer
+Once you&#039;ve installed composer you are set to create a new PHP project with it. Make a new folder, and open a command/terminal prompt in that folder. A composer project has at a minimum a &#039;&#039;composer.json&#039;&#039; file, and a sub-folder labeled &#039;&#039;vendor&#039;&#039;. The composer.json file is used to specify what version of which projects your project depends on, the vendor folder is where composer downloads and stores the correct versions of these projects.
+
+To create a composer.json file, one can within the folder of our project type:
+ composer init
+This starts  a wizard that guide you through the process of creating a composer.json file.
+You don&#039;t need to use this wizard, in fact, the file format is relatively simple and a composer.json file can be created/modified in a text editor. Below is a simple example composer.json file suitable for a project that uses Yioop.
+ {
+     &quot;name&quot;: &quot;cpollett/test_composer&quot;,
+     &quot;description&quot;: &quot;test out installing yioop as a required package&quot;,
+     &quot;authors&quot;: [
+         {
+             &quot;name&quot;: &quot;Chris Pollett&quot;,
+             &quot;email&quot;: &quot;chris@pollett.org&quot;
+         }
+     ],
+     &quot;require&quot;: {
+         &quot;seekquarry/yioop&quot;: &quot;&gt;=3.0.1&quot;
+     }
+ }
+The name field is the vendor/package you are creating; the description field says what your software does authors says who you are; the repositories field explicitly says where to find the Yioop git repository; and the require field says what versions of which packages your project depends on, in this case, greater than or equal to version 3.0.1 of Yioop. The above composer.json file makes use of the website [[https://packagist.org/|https://packagist.org/]] so that the Yioop repository doesn&#039;t explicitly have to be listed. If you don&#039;t want to use Packagist, you can add
+     &quot;repositories&quot;: [
+         {
+             &quot;type&quot;: &quot;vcs&quot;,
+             &quot;url&quot;: &quot;http://seekquarry.com/git/yioop.git&quot;
+         }
+     ],
+to the body of composer.json object above.
+
+Below is a file test.php that we could create in our project folder that uses Yioop&#039;s library for stemming to stem the word &#039;&#039;jumping&#039;&#039; down to &#039;&#039;jump&#039;&#039;.
+ &lt;?php
+ namespace cpollett\test_composer;
+
+ use seekquarry\yioop\library\PhraseParser;
+
+ require_once &quot;vendor/autoload.php&quot;;
+
+ print_r(PhraseParser::stemTerms(&quot;jumping&quot;, &#039;en-US&#039;));
+The &#039;&#039;namespace&#039;&#039; line says the namespace of our project, the &#039;&#039;use&#039;&#039; line says that we will be using the PhraseParser class for the seekquarry\yioop\library package, the require_once loads the autoloader created by Composer for loading class files of packages it manages, finally, the print_r line calls the stemmer in Yioop&#039;s PhraseParser class, specifying the string to stem the words in as well as the language to use. To get Composer to create the autoload.php file as well as install any packages your project depends on, you simply type:
+ composer install
+Thereafter, if we want to upgrade our project&#039;s dependencies to their latest compatible versions we can type:
+ composer update
+To run the program we just created we can type:
+ php test.php
+
+Yioop has a variety of classes which might be useful to your project. The file YIOOP_FOLDER/src/examples/SearchApi.php shows an example of how to use Yioop&#039;s search api to do queries on an existing Yioop index. The PhraseParser class also has methods for char-gramming and segmenting.
+Yioop&#039;s Utility class has functions for various index compression codes. Yioop has classes for text summarization, url manipulation, suffix trees, tries, Bloom filters, compression algorithms, etc, all of which might be useful for project. The online [[http://www.seekquarry.com/yioop-docs/|Source Code Documention]] is a good place to start exploring what classes are available in Yioop.
+
+EOD;
+$public_pages["en-US"]["Demos"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=
+
+title=Demos
+
+author=Chris Pollett
+
+robots=
+
+description=Information about various sites that demo Yioop software.
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS==Sites which use Yioop Software==
+
+* &#039;&#039;&#039;[[http://yioop.com/|yioop.com]]&#039;&#039;&#039; is the main demo site for yioop. Currently, the default crawl is only being served from disk-based (rather than SSD) hard-drives from six Mac Minis and is around 760 million pages. In previous testing, moving the dictionary and shards to SSD brings the response times to about a second. For crawls of a few million pages you can expect much quicker responses even on disk-based drives.
+* &#039;&#039;&#039;[[http://seekquarry.com|seekquarry.com]]&#039;&#039;&#039;. Seekquarry itself was created using the wikis within a vanilla install of Yioop. The download yioop software form was a simple customization added to the app directory.
+* &#039;&#039;&#039;[[http://findcan.ca|findcan.ca]]&#039;&#039;&#039; demonstrates doing a niche crawl of just Canadian websites. [[http://findcan.ca/thread/58| This how to do a niche crawl blog entry]] explains how this crawl was created. This site also demonstrates using Yioop software&#039;s built-in support for keyword advertising.
+* &#039;&#039;&#039;[[http://newspiler.com/|http://newspiler.com/]]&#039;&#039;&#039; is a news search engine focussing on current events. Users can get an at a glance summary of trending news topics and also search the news.
+* &#039;&#039;&#039;[[https://p3x981.com/|p3x981.com]]&#039;&#039;&#039; uses Yioop&#039;s news feed features to track common vulnerability and exposure announcements.
+* &#039;&#039;&#039;[[http://zeerch.com/|zeerch.com]]&#039;&#039;&#039; a safe/family-friendly search engine.
+
+{{class=&quot;green&quot;
+Do you run a version of Yioop? Would you like a link here? Just drop me a line at chris@pollett.org
+}}
+
+EOD;
+$public_pages["en-US"]["Discussion"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Discussion
+
+author=Chris Pollett
+
+robots=
+
+description=Links to Yioop related discussion boards.
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS==Yioop Software Discussion==
+
+*[[https://yioop.com/group/212|Yioop Discussion on yioop.com]]. To join the
+discussion sign up for a Yioop.com account, log in on the discussion page, and request to add the group.
+*[[https://www.seekquarry.com/phpBB|Old Discussion Archive]]
+
+
+EOD;
+$public_pages["en-US"]["DocDev"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=dashed-border
+
+toc=true
+
+title=Docs Under Dev
+
+author=
+
+robots=
+
+description=
+
+page_header=main_header
+
+page_footer=
+
+END_HEAD_VARS{{id=&quot;contents&quot;
+=Yioop Documentation v 3.0=
+}}
+
+==Overview==
+===Getting Started===
+
+This document serves as a detailed reference for the Yioop search engine. If you want to get started using Yioop now, you probably want to first read the [[Install|Installation Guides]] page and look at the [[http://www.yioop.com/?c=group&amp;group_id=20&amp;arg=read&amp;a=wiki&amp;page_name=Main|Yioop Video Tutorials Wiki]]. If you cannot find your particular machine configuration there, you can check the Yioop [[Documentation#Requirements|Requirements]] section followed by the more general Installation and Configuration instructions.
+
+[[Yioop.com]], the demo site for Yioop software, allows people to register accounts. Once registered, if you have questions about Yioop and its installation, you can join the
+[[https://yioop.com/?c=group&amp;just_group_id=212|Yioop Software Help]] group and post your questions there. This group is frequently checked by the creators of Yioop, and you will likely get a quick response.
+
+Having a Yioop account also allows you to experiment with some of the features of Yioop beyond search such as Yioop Groups, Wikis, and Crawl Mixes without needing to install the software yourself. The [[Documentation#Search%20and%20User%20Interface|Search and User Interface]], [[Documentation#Managing%20Users,%20Roles,%20and%20Groups|Managing Users, Roles, and Groups]], [[Documentation#Feeds%20and%20Wikis|Feeds and Wikis]], and [[Documentation#Mixing%20Crawl%20Indexes|Mixing Crawl Indexes]] sections below could serve as a guide to testing the portion of the site general users have access to on Yioop.com.
+
+When using Yioop software and do not understand a feature, make sure to also check out the integrated help system throughout Yioop. Clicking on a question mark icon will reveal an additional blue column on a page with help information as seen below:
+{{class=&quot;docs&quot;
+((resource:Documentation:IntegratedHelp.png|Integrated Help Example))
+}}
+
+===Introduction===
+
+The Yioop search engine is designed to allow users to produce indexes of a web-site or a collection of web-sites. The number of pages a Yioop index can handle range from small site to those containing tens or hundreds of millions of pages. In contrast, a search-engine like Google maintains an index of tens of billions of pages. Nevertheless, since you, the user, have control over the exact sites which are being indexed with Yioop, you have much better control over the kinds of results that a search will return. Yioop provides a traditional web interface to do queries, an rss api, and a function api. It also supports many common features of a search portal such as user discussion group, blogs, wikis, and a news aggregator. In this section we discuss some of the different search engine technologies which exist today, how Yioop fits into this eco-system, and when Yioop might be the right choice for your search engine needs. In the remainder of this document after the introduction, we discuss how to get and install Yioop; the files and folders used in Yioop; the various crawl, search, social portal, and administration facilities in the Yioop; localization in the Yioop system; building a site using the Yioop framework; embedding Yioop in an existing web-site; customizing Yioop; and the Yioop command-line tools.
+
+Since the mid-1990s a wide variety of search engine technologies have been explored. Understanding some of this history is useful in understanding Yioop capabilities. In 1994, Web Crawler, one of the earliest still widely-known search engines, only had an index of about 50,000 pages which was stored in an Oracle database. Today, databases are still used to create indexes for small to medium size sites. An example of such a search engine written in PHP is [[http://www.sphider.eu/|Sphider]]. Given that a database is being used, one common way to associate a word with a document is to use a table with a columns like word id, document id, score. Even if one is only extracting about a hundred unique words per page, this table&#039;s size would need to be in the hundreds of millions for even a million page index. This edges towards the limits of the capabilities of database systems although techniques like table sharding can help to some degree. The Yioop engine uses a database to manage some things like users and roles, but uses its own web archive format and indexing technologies to handle crawl data. This is one of the reasons that Yioop can scale to larger indexes.
+
+When a site that is being indexed consists of dynamic pages rather than the largely static page situation considered above, and those dynamic pages get most of their text content from a table column or columns, different search index approaches are often used. Many database management systems like [[http://www.mysql.com/|MySQL]]/[[https://mariadb.org/|MariaDB]], support the ability to create full text indexes for text columns. A faster more robust approach is to use a stand-alone full text index server such as [[http://www.sphinxsearch.com/|Sphinx]]. However, for these approaches to work the text you are indexing needs to be in a database column or columns, or have an easy to define &quot;XML mapping&quot;. Nevertheless, these approaches illustrate another common thread in the development of search systems: Search as an appliance, where you either have a separate search server and access it through either a web-based API or through function calls.
+
+Yioop has both a search function API as well as a web API that can return [[http://www.opensearch.org/|Open Search RSS]] results or a JSON variant. These can be used to embed Yioop within your existing site. If you want to create a new search engine site, Yioop
+provides all the basic features of web search portal. It has its own account management system with the ability to set up groups that have both discussions boards and wikis with various levels of access control. The built in Public group&#039;s wiki together with the GUI configure page can be used to completely customize the look and feel of Yioop. Third party display ads can also be added through the GUI interface. If you want further customization, Yioop
+offers a web-based, model-view-adapter (a variation on model-view-controller) framework with a web-interface for localization.
+
+By 1997 commercial sites like Inktomi and AltaVista already had tens or hundreds of millions of pages in their indexes [ [[Documentation#P1994|P1994]] ] [ [[Documentation#P1997a|P1997a]] ] [ [[Documentation#P1997b|P1997b]] ]. Google [ [[Documentation#BP1998|BP1998]] ] circa 1998 in comparison had an index of about 25 million pages. These systems used many machines each working on parts of the search engine problem. On each machine there would, in addition, be several search related processes, and for crawling, hundreds of simultaneous threads would be active to manage open connections to remote machines. Without threading, downloading millions of pages would be very slow. Yioop is written in [[http://www.php.net/|PHP]]. This language is the `P&#039; in the very popular [[http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29|LAMP]] web platform. This is one of the reasons PHP was chosen as the language of Yioop. Unfortunately, PHP does not have built-in threads. However, the PHP language does have a multi-curl library (implemented in C) which uses threading to support many simultaneous page downloads. This is what Yioop uses. Like these early systems Yioop also supports the ability to distribute the task of downloading web pages to several machines. As the problem of managing many machines becomes more difficult as the number of machines grows, Yioop further has a web interface for turning on and off the processes related to crawling on remote machines managed by Yioop.
+
+There are several aspects of a search engine besides downloading web pages that benefit from a distributed computational model. One of the reasons Google was able to produce high quality results was that it was able to accurately rank the importance of web pages. The computation of this page rank involves repeatedly applying Google&#039;s normalized variant of the web adjacency matrix to an initial guess of the page ranks. This problem naturally decomposes into rounds. Within a round the Google matrix is applied to the current page ranks estimates of a set of sites. This operation is reasonably easy to distribute to many machines. Computing how relevant a word is to a document is another task that benefits from multi-round, distributed computation. When a document is processed by indexers on multiple machines, words are extracted and a stemming algorithm such as [ [[Documentation#P1980|P1980]] ] or a character n-gramming technique might be employed (a stemmer would extract the word jump from words such as jumps, jumping, etc; converting jumping to 3-grams would make terms of length 3, i.e., jum, ump, mpi, pin, ing). For some languages like Chinese, where spaces between words are not always used, a segmenting algorithm like reverse maximal match might be used. Next a statistic such as BM25F [ [[Documentation#ZCTSR2004|ZCTSR2004]] ] (or at least the non-query time part of it) is computed to determine the importance of that word in that document compared to that word amongst all other documents. To do this calculation one needs to compute global statistics concerning all documents seen, such as their average-length, how often a term appears in a document, etc. If the crawling is distributed it might take one or more merge rounds to compute these statistics based on partial computations on many machines. Hence, each of these computations benefit from allowing distributed computation to be multi-round. Infrastructure such as the Google File System [ [[Documentation#GGL2003|GGL2003]] ], the MapReduce model [ [[Documentation#DG2004|DG2004]] ], and the Sawzall language [ [[Documentation#PDGQ2006|PDGQ2006]] ] were built to make these multi-round distributed computation tasks easier. In the open source community, the [[http://hadoop.apache.org/docs/hdfs/current/hdfs_design.html|Hadoop Distributed File System]], [[http://hadoop.apache.org/docs/mapreduce/current/index.html|Hadoop MapReduce]], and [[http://hadoop.apache.org/pig/|Pig]] play an analogous role [ [[Documentation#W2009|W2009]] ]. Recently, a theoretical framework for what algorithms can be carried out as rounds of map inputs to sequence of key value pairs, shuffle pairs with same keys to the same nodes, reduce key-value pairs at each node by some computation has begun to be developed [ [[Documentation#KSV2010|KSV2010]] ]. This framework shows the map reduce model is capable of solving quite general cloud computing problems -- more than is needed just to deploy a search engine.
+
+Infrastructure such as this is not trivial for a small-scale business or individual to deploy. On the other hand, most small businesses and homes do have available several machines not all of whose computational abilities are being fully exploited. So the capability to do distributed crawling and indexing in this setting exists. Further high-speed internet for homes and small businesses is steadily getting better. Since the original Google paper, techniques to rank pages have been simplified [ [[Documentation#APC2003|APC2003]] ]. It is also possible to approximate some of the global statistics needed in BM25F using suitably large samples. More details on the exact ranking mechanisms used by Yioop and be found on the [[Ranking|Yioop Ranking Mechanisms]] page.
+
+Yioop tries to exploit these advances to use a simplified distributed model which might be easier to deploy in a smaller setting. Each node in a Yioop system is assumed to have a web server running. One of the Yioop nodes web app&#039;s is configured to act as a coordinator for crawls. It is called the &#039;&#039;&#039;name server&#039;&#039;&#039;. In addition to the name server, one might have several processes called &#039;&#039;&#039;queue servers&#039;&#039;&#039; that perform scheduling and indexing jobs, as well as &#039;&#039;&#039;fetcher&#039;&#039;&#039; processes which are responsible for downloading pages and the page processing such as stemming, char-gramming and segmenting mentioned above. Through the name server&#039;s web app, users can send messages to the queue servers and fetchers. This interface writes message files that queue servers periodically looks for. Fetcher processes periodically ping the name server to find the name of the current crawl as well as a list of queue servers. Fetcher programs then periodically make requests in a round-robin fashion to the queue servers for messages and schedules. A schedule is data to process and a message has control information about what kind of processing should be done. A given queue_server is responsible for generating schedule files for data with a certain hash value, for example, to crawl urls for urls with host names that hash to queue server&#039;s id. As a fetcher processes a schedule, it periodically POSTs the result of its computation back to the responsible queue server&#039;s web server. The data is then written to a set of received files. The queue_server as part of its loop looks for received files and merges their results into the index so far. So the model is in a sense one round: URLs are sent to the fetchers, summaries of downloaded pages are sent back to the queue servers and merged into their indexes. As soon as the crawl is over one can do text search on the crawl. Deploying this computation model is relatively simple: The web server software needs to be installed on each machine, the Yioop software (which has the the fetcher, queue_server, and web app components) is copied to the desired location under the web server&#039;s document folder, each instance of Yioop is configured to know who the name server is, and finally, the fetcher programs and queue server programs are started.
+
+As an example of how this scales, 2010 Mac Mini running a queue server program can schedule and index about 100,000 pages/hour. This corresponds to the work of about 7 fetcher processes (which may be on different machines -- roughly, you want 1GB and 1core/fetcher). The checks by fetchers on the name server are lightweight, so adding another machine with a queue server and the corresponding additional fetchers allows one to effectively double this speed. This also has the benefit of speeding up query processing as when a query comes in, it gets split into queries for each of the queue server&#039;s web apps, but the query only &quot;looks&quot; slightly more than half as far into the posting list as would occur in a single queue server setting. To further increase query throughput, the number queries that can be handled at a given time, Yioop installations can also be configured as &quot;mirrors&quot; which keep an exact copy of the data stored in the site being mirrored. When a query request comes into a Yioop node, either it or any of its mirrors might handle it. Query processing, for multi-word queries can actually be a major bottleneck if you don&#039;t have many machines and you do have a large index. To further speed this up, Yioop uses a hybrid inverted index/suffix tree approach to store word lookups. The suffix tree ideas being motivated by [ [[Documentation#PTSHVC2011|PTSHVC2011]] ].
+
+Since a multi-million page crawl involves both downloading from the web rapidly over several days, Yioop supports the ability to dynamically change its crawl parameters as a crawl is going on. This allows a user on request from a web admin to disallow Yioop from continuing to crawl a site or to restrict the number of urls/hours crawled from a site without having to stop the overall crawl. One can also through a web interface inject new seed sites, if you want, while the crawl is occurring. This can help if someone suggests to you a site that might otherwise not be found by Yioop given its original list of seed sites. Crawling at high-speed can cause a website to become congested and unresponsive. As of Version 0.84, if Yioop detects a site is becoming congested it can automatically slow down the crawling of that site. Finally, crawling at high-speed can cause your domain name server (the server that maps www.yioop.com to 173.13.143.74) to become slow. To reduce the effect of this Yioop supports domain name caching.
+
+Despite its simpler one-round model, Yioop does a number of things to improve the quality of its search results. While indexing, Yioop can make use Lasso regression classifiers [ [[Documentation#GLM2007|GLM2007]] ] using data from earlier crawls to help label and/or rank documents in the active crawl. Yioop also takes advantage of the link structure that might exist between documents in a one-round way: For each link extracted from a page, Yioop creates a micropage which it adds to its index. This includes relevancy calculations for each word in the link as well as an [ [[Documentation#APC2003|APC2003]] ]-based ranking of how important the link was. Yioop supports a number of iterators which can be thought of as implementing a stripped-down relational algebra geared towards word-document indexes (this is much the same idea as Pig). One of these operators allows one to make results from unions of stored crawls. This allows one to do many smaller topic specific crawls and combine them with your own weighting scheme into a larger crawl. A second useful operator allows you to display a certain number of results from a given subquery, then go on to display results from other subqueries. This allows you to make a crawl presentation like: the first result should come from the open crawl results, the second result from Wikipedia results, the next result should be an image, and any remaining results should come from the open search results. Yioop comes with a GUI facility to make the creation of these crawl mixes easy. To speed up query processing for these crawl mixes one can also create materialized versions of crawl mix results, which makes a separate index of crawl mix results. Another useful operator Yioop supports allows one to perform groupings of document results. In the search results displayed, grouping by url allows all links and documents associated with a url to be grouped as one object. Scoring of this group is a sum of all these scores. Thus, link text is used in the score of a document. How much weight a word from a link gets also depends on the link&#039;s rank. So a low-ranked link with the word &quot;stupid&quot; to a given site would tend not to show up early in the results for the word &quot;stupid&quot;. Grouping also is used to handle deduplication: It might be the case that the pages of many different URLs have essentially the same content. Yioop creates a hash of the web page content of each downloaded url. Amongst urls with the same hash only the one that is linked to the most will be returned after grouping. Finally, if a user wants to do more sophisticated post-processing such as clustering or computing page rank, Yioop supports a straightforward architecture for indexing plugins.
+
+There are several open source crawlers which can scale to crawls in the millions to hundred of millions of pages. Most of these are written in Java, C, C++, C#, not PHP. Three important ones are [[http://nutch.apache.org/|Nutch]]/ [[http://lucene.apache.org/|Lucene]]/ [[http://lucene.apache.org/solr/|Solr]] [ [[Documentation#KC2004|KC2004]] ], [[http://www.yacy.net/|YaCy]], and [[http://crawler.archive.org/|Heritrix]] [ [[Documentation#MKSR2004|MKSR2004]] ]. Nutch is the original application for which the Hadoop infrastructure described above was developed. Nutch is a crawler, Lucene is for indexing, and Solr is a search engine front end. The YaCy project uses an interesting distributed hash table peer-to-peer approach to crawling, indexing, and search. Heritrix is a web crawler developed at the [[http://www.archive.org/|Internet Archive]]. It was designed to do archival quality crawls of the web. Its ARC file format inspired the use of WebArchive objects in Yioop. WebArchives are Yioop&#039;s container file format for storing web pages, web summary data, url lists, and other kinds of data used by Yioop. A WebArchive is essentially a linked-list of compressed, serialized PHP objects, the last element in this list containing a header object with information like version number and a total count of objects stored. The compression format can be chosen to suit the kind of objects being stored. The header can be used to store auxiliary data structures into the list if desired. One nice aspect of serialized PHP objects versus serialized Java Objects is that they are humanly readable text strings. The main purpose of Web Archives is to allow one to store many small files compressed as one big file. They also make data from web crawls very portable, making them easy to copy from one location to another. Like Nutch and Heritrix, Yioop also has a command-line tool for quickly looking at the contents of such archive objects.
+
+The [[http://www.archive.org/web/researcher/ArcFileFormat.php|ARC format]] is one example of an archival file format for web data. Besides at the Internet Archive, ARC and its successor [[http://www.digitalpreservation.gov/formats/fdd/fdd000236.shtml|WARC format]] are often used by TREC conferences to store test data sets such as [[http://ir.dcs.gla.ac.uk/test_collections/|GOV2]] and the [[http://lemurproject.org/clueweb09/|ClueWeb 2009]] / [[http://lemurproject.org/clueweb12/|ClueWeb 2012]] Datasets. In addition, it was used by grub.org (hopefully, only on a temporary hiatus), a distributed, open-source, search engine project in C#. Another important format for archiving web pages is the XML format used by Wikipedia for archiving MediaWiki wikis. [[http://www.wikipedia.org/|Wikipedia]] offers [[http://en.wikipedia.org/wiki/Wikipedia:Database_download|creative common-licensed downloads]] of their site in this format. The [[http://www.dmoz.org/|Open Directory Project]] makes available its [[http://www.dmoz.org/rdf.html|ODP data set]] in an RDF-like format licensed using the Open Directory License. Thus, we see that there are many large scale useful data sets that can be easily licensed. Raw data dumps do not contain indexes of the data though. This makes sense because indexing technology is constantly improving and it is always possible to re-index old data. Yioop supports importing and indexing data from ARC, WARC, database queries results, MediaWiki XML dumps, and Open Directory RDF. Yioop further has a generic text importer which can be used to index log records, mail, Usenet posts, etc. Yioop also supports re-indexing of old Yioop data files created after version 0.66, and indexing crawl mixes. This means using Yioop you can have searchable access to many data sets as well as have the ability to maintain your data going forward. When displaying caches of web pages in Yioop, the interface further supports the ability to display a history of all cached copies of that page, in a similar fashion to Internet Archives interface.
+
+Another important aspect of creating a modern search engine is the ability to display in an appropriate way various media sources. Yioop comes with built-in subsearch abilities for images, where results are displayed as image strips; video, where thumbnails for video are shown; and news, where news items are grouped together and a configurable set of news/twitter feeds can be set to be updated on an hourly basis.
+
+This concludes the discussion of how Yioop fits into the current and historical landscape of search engines and indexes.
+
+===Feature List===
+
+Here is a summary of the features of Yioop:
+
+*&#039;&#039;&#039;General&#039;&#039;&#039;
+**Yioop is an open-source, distributed crawler and search engine written in PHP.
+**Crawling, indexing, and serving search results can be done on a single machine or distributed across several machines.
+**The fetcher/queue_server processes on several machines can be managed through the web interface of a main Yioop instance.
+**Yioop installations can be created with a variety of topologies: one queue_server and many fetchers or several queue_servers and many fetchers.
+**Using web archives, crawls can be mirrored amongst several machines to speed-up serving search results. This can be further sped-up by using memcache or filecache.
+**Yioop can be used to create web sites via its own built-in wiki system. For more complicated customizations, Yioop&#039;s model-view-adapter framework is designed to be easily extendible. This framework also comes with a GUI which makes it easy to localize strings and static pages.
+**Yioop search result and feed pages can be configured to display banner or skyscraper ads through an Site Admin GUI (if desired).
+**Yioop has been optimized to work well with smart phone web browsers and with tablet devices.
+*&#039;&#039;&#039;Social and User Interface&#039;&#039;&#039;
+**Yioop can be configured to allow or not to allow users to register for accounts.
+**If allowed, user accounts can create discussion groups, blogs, and wikis.
+** Blogs and wiki support attaching images, videos, and files and also support including math using LaTeX or AsciiMathML.
+** Yioop comes with two built in groups: Help and Public. Help&#039;s wiki pages allow one to customize the integrated help throughout the Yioop system. The Public Groups discussion can be used as a site blog, its wiki page can be used to customize the look-and-feel of the overall Yioop site without having to do programming.
+** Wiki pages support different types such as standard wiki page, page alias, media gallery, and slide presentation.
+** Video on wiki pages and in discussion posts is served using HTTP-pseudo streaming so users can scrub through video files. For uploaded video files below a configurable size limit, videos are automatically converted to web friendly mp4 and webm formats.
+** Wiki pages can be configured to have auto-generated tables of contents, to make use of common headers and footers, and to output meta tags for SEO purposes.
+**Users can share their own mixes of crawls that exist in the Yioop system.
+**If user accounts are enabled, Yioop has a search tools page on which people can suggest urls to crawl.
+**Yioop has three different captcha&#039;ing mechanisms that can be used in account registration and for suggest urls: a standard graphics-based captcha, a text-based captcha, and a hash-cash-like catpha.
+**Password authentication can be configured to either use a standard password hash based system, or make use of Fiat Shamir zero-knowledge authentication.
+*&#039;&#039;&#039;Search&#039;&#039;&#039;
+**Yioop supports subsearches geared towards presenting certain kinds of media such as images, video, and news. The list of video and news sites can be configured through the GUI. Yioop has a media_updater process which can be used to automatically update news feeds hourly.
+**News feeds can either be RSS or Atom feed or can be scraped from an HTML page using XPath queries. What image is used for a news feed item can also be configured using XPath queries.
+**Yioop determines search results using a number of iterators which can be combined like a simplified relational algebra.
+**Yioop can be configured to display word suggestions as a user types a query. It can also suggest spell corrections for mis-typed queries. This feature can be localized.
+**Yioop can also make use of a thesaurus facility such as provided by WordNet to suggest related queries.
+**Yioop supports the ability to filter out urls from search results after a crawl has been performed. It also has the ability to edit summary information that will be displayed for urls.
+**A given Yioop installation might have several saved crawls and it is very quick to switch between any of them and immediately start doing text searches.
+**Besides the standard output of a web page with ten links, Yioop can output query results in Open Search RSS format, a JSON variant of this format, and also to query Yioop data via a function api.
+*&#039;&#039;&#039;Indexing&#039;&#039;&#039;
+**Yioop is capable of indexing small sites to sites or collections of sites containing low hundreds of millions of documents.
+**Yioop uses a hybrid inverted index/suffix tree approach for word lookup to make multi-word queries faster on disk bound machines.
+**Yioop indexes are positional rather than bag of word indexes, and a index compression scheme called Modified9 is used.
+**Yioop has a web interface which makes it easy to combine results from several crawl indexes to create unique result presentations. These combinations can be done in a conditional manner using &quot;if:&quot; meta words.
+**Yioop supports the indexing of many different filetypes including: HTML, Atom, BMP, DOC, DOCX ePub, GIF, JPG, PDF, PPT, PPTX, PNG, RSS, RTF, sitemaps, SVG, XLSX, and XML. It has a web interface for controlling which amongst these filetypes (or all of them) you want to index. It supports also attempting to extract information from unknown filetypes.
+**Yioop supports extracting data from zipped formats like DOCX even if it only did a partial download of the file.
+**Yioop has a simple page rule language for controlling what content should be extracted from a page or record.
+**Yioop has two different kinds of text summarizers which can be used to further affect what words are index: a basic web page scraper, and a centroid algorithm summarizer. The latter can be used to generate word clouds of crawled documents.
+**Indexing occurs as crawling happens, so when a crawl is stopped, it is ready to be used to handle search queries immediately.
+**Yioop Indexes can be used to create classifiers which then can be used in labeling and ranking future indexes.
+**Yioop comes with stemmers for English, French, German, Italian, and Russian, and a word segmenter for Chinese. It uses char-gramming for other languages. Yioop has a simple architecture for adding stemmers for other languages.
+**Yioop uses a web archive file format which makes it easy to copy crawl results amongst different machines. It has a command-line tool for inspecting these archives if they need to examined in a non-web setting. It also supports command-line search querying of these archives.
+**Yioop supports an indexing plugin architecture to make it possible to write one&#039;s own indexing modules that do further post-processing.
+*&#039;&#039;&#039;Web and Archive Crawling&#039;&#039;&#039;
+**Yioop supports open web crawls, but through its web interface one can configure it also to crawl only specifics site, domains, or collections of sites and domains. One can customize a crawl using regex in disallowed directives to crawl a site to a fixed depth.
+**Yioop uses multi-curl to support many simultaneous downloads of pages.
+**Yioop obeys robots.txt files including Google and Bing extensions such as the Crawl-delay and Sitemap directives as well as * and $ in allow and disallow. It further supports the robots meta tag directives NONE, NOINDEX, NOFOLLOW, NOARCHIVE, and NOSNIPPET and the link tag directive rel=&quot;canonical&quot;. It also supports anchor tags with rel=&quot;nofollow&quot; attributes. It also supports X-Robots-Tag HTTP headers. Finally, it tries to detect if a robots.txt became a redirect due to congestion.
+**Yioop comes with a word indexing plugin which can be used to control how Yioop crawls based on words on the page and the domain. This is useful for creating niche subject specific indexes.
+**Yioop has its own DNS caching mechanism and it adjusts the number of simultaneous downloads it does in one go based on the number of lookups it will need to do.
+** Yioop can crawl over HTTP, HTTPS, and Gopher protocols.
+**Yioop supports crawling TOR networks (.onion urls).
+**Yioop supports crawling through a list of proxy servers.
+**Yioop supports crawling Git Repositories and can index Java and Python code.
+**Yioop supports crawl quotas for web sites. I.e., one can control the number of urls/hour downloaded from a site.
+**Yioop can detect website congestion and slow down crawling a site that it detects as congested.
+**Yioop supports dynamically changing the allowed and disallowed sites while a crawl is in progress. Yioop also supports dynamically injecting new seeds site via a web interface into the active crawl.
+**Yioop has a web form that allows a user to control the recrawl frequency for a page during a crawl.
+**Yioop keeps track of ETag: and Expires: HTTP headers to avoid downloading content it already has in its index.
+**Yioop supports importing data from ARC, WARC, database queries, MediaWiki XML, and ODP RDF files. It has generic importing facility to import text records such as access log, mail log, usenet posts, etc., which are either not compressed, or compressed using gzip or bzip2. It also supports re-indexing of data from WebArchives.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Set-up==
+===Requirements===
+
+The Yioop search engine requires: (1) a web server, (2) PHP 5.3 or better (Yioop used only to serve search results from a pre-built index has been tested to work in PHP 5.2), (3) Curl libraries for downloading web pages. To be a little more specific Yioop has been tested with Apache 2.2 and I&#039;ve been told Version 0.82 or newer works with lighttpd. It should work with other webservers, although it might take some finessing. For PHP, you need a build of PHP that incorporates multi-byte string (mb_ prefixed) functions, Curl, Sqlite (or at least PDO with Sqlite driver), the GD graphics library and the command-line interface. If you are using Mac OSX Snow Leopard or newer, the version of Apache2 and PHP that come with it suffice. For Windows, Mac, and Linux, another easy way to get the required software is to download a Apache/PHP/MySql suite such as [[http://www.apachefriends.org/en/xampp.html|XAMPP]]. On Windows machines, find the the php.ini file under the php folder in your Xampp folder and change the line:
+ ;extension=php_curl.dll
+to
+ extension=php_curl.dll
+The php.ini file has a post_max_size setting you might want to change. You might want to change it to:
+ post_max_size = 32M
+Yioop will work with the post_max_size set to as little as two megabytes bytes, but will be faster with the larger post capacity. If you intend to make use of Yioop Discussion Groups and Wiki and their ability to upload documents. You might want to consider also adjusting the value of the variable &#039;&#039;upload_max_filesize&#039;&#039;. This value should be set to at most what you set post_max_size to.
+
+If you are using WAMP, similar changes as with XAMPP must be made, but be aware that WAMP has two php.ini files and both of these must be changed.
+
+If you are using the Ubuntu-variant of Linux, the following lines would get the software you need:
+ sudo apt-get install curl
+ sudo apt-get install apache2
+ sudo apt-get install php5
+ sudo apt-get install php5-cli
+ sudo apt-get install php5-sqlite
+ sudo apt-get install php5-curl
+ sudo apt-get install php5-gd
+For both Mac and Linux, you might want to alter the post_max_size variable in your php.ini file as in the Windows case above.
+
+In addition to the minimum installation requirements above, if you want to use the [[Documentation#GUI%20for%20Managing%20Machines%20and%20Servers|Manage Machines]] feature in Yioop, you might need to do some additional configuration. The Manage Machines activity allows you through a web interface to start/stop and look at the log files for each of the queue_servers, and fetchers that you want Yioop to manage. If it is not configured then these task would need to be done via the command line. &#039;&#039;&#039;Also, if you do not use the Manage Machine interface your Yioop site can make use of only one queue_server.&#039;&#039;&#039;
+
+As a final step, after installing the necessary software, &#039;&#039;&#039;make sure to start/restart your web server and verify that it is running.&#039;&#039;&#039;
+
+====Memory Requirements====
+
+In addition, to the prerequisite software listed above, Yioop allows specifies for its process certain upper bounds on the amounts of memory they can use. By default bin/queue_server.php&#039;s limit is set to 2500MB, bin/fetcher.php&#039;s limit is set to 1200MB. You can expect that index.php might need up to 500MB. These values are set near the tops of each of these files in turn with a line like:
+ ini_set(&quot;memory_limit&quot;,&quot;2500M&quot;);
+For the index.php file, you may need to set the limit at well in your php.ini file for the instance of PHP used by your web server. If the value is too low for the index.php Web app you might see messages in the Fetcher logs that begin with: &quot;Trouble sending to the scheduler at url...&quot;
+
+Often in a VM setting these requirements are somewhat steep. It is possible to get Yioop to work in environments like EC2 (be aware this might violate your service agreement). To reduce these memory requirements, one can manually adjust the variables NUM_DOCS_PER_GENERATION, SEEN_URLS_BEFORE_UPDATE_SCHEDULER, NUM_URLS_QUEUE_RAM, MAX_FETCH_SIZE, and URL_FILTER_SIZE in the configs/config.php file. Experimenting with these values you should be able to trade-off memory requirements for speed.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Installation and Configuration===
+
+The Yioop application can be obtained using [[Download|the download page at seekquarry.com]]. After downloading and unzipping it, move the Yioop search engine into some folder under your web server&#039;s document root. Yioop makes use of an auxiliary folder to store profile/crawl data. Before Yioop will run you must configure this directory. This can be done in one of two ways: either through the web interface (the preferred way), as we will now describe or using the configs/configure_tool.php script (which is harder, but might be suitable for some VPS settings) which will be described in the [[Documentation#Yioop%20Command-line%20 Tools|command line tools section]]. From the web interface, to configure this directory point your web browser to where your Yioop folder is located, a configuration page should appear and let you set the path to the auxiliary folder (Search Engine Work Directory). This page looks like:
+{{class=&quot;docs&quot;
+((resource:Documentation:ConfigureScreenForm1.png|The work directory form))
+}}
+For this step, as a security precaution, you must connect via localhost. If you are in a web hosting environment (for example, if you are using cPanel to set up Yioop) where it is difficult to connect using localhost, you can add a file, configs/local_config.php, with the following content:
+ &lt;?php
+ define(&#039;NO_LOCAL_CHECK&#039;, &#039;true&#039;);
+ ?&gt;
+Returning to our installation discussion, notice under the text field there is a heading &quot;Component Check&quot; and there is red text under it, this section is used to indicate any requirements that Yioop has that might not be met yet on your machine. In the case above, the web server needs permissions on the file configs/config.php to write in the value of the directory you choose in the form for the Work Directory. Another common message asks you to make sure the web server has permissions on the place where this auxiliary folder needs to be created. When filling out the form of this page, on both *nix-like, and Windows machines, you should use forward slashes for the folder location. For example,
+
+ /Applications/XAMPP/xamppfiles/htdocs  #Mac, Linux system similar
+ c:/xampp/htdocs/yioop_data   #Windows
+
+Once you have set the folder, you should see a second Profile Settings form beneath the Search Engine Work Directory form. If you are asked to sign-in before this, and you have not previously created accounts in this Work Directory, then the default account has login root, and an empty password. Once you see it, The Profile Settings form allows you to configure the debug, search access, database, queue server, and robot settings. It will look something like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ConfigureScreenForm2.png|Basic configure form))
+}}
+
+These settings suffice if you are only doing single machine crawling. The &#039;&#039;&#039;Crawl Robot Set-up&#039;&#039;&#039; fieldset is used to provide websites that you crawl with information about who is crawling them. The field Crawl Robot Name is used to say the name of your robot. You should choose a common name for all of the fetchers in your set-up, but the name should be unique to your web-site. It is bad form to pretend to be someone else&#039;s robot, for example, the googlebot. As Yioop crawls it sends the web-site it crawls a User-Agent string, this string contains the url back to the bot.php file in the Yioop folder. bot.php is supposed to provide a detailed description of your robot. The contents of textarea Robot Description is supposed to provide this description and is inserted between &lt;body&gt; &lt;/body&gt; tags on the bot.php page.
+
+You might need to click {{id=&quot;advance&quot; &#039;&#039;&#039;Toggle Advance Settings&#039;&#039;&#039;}} if you are doing Yioop development or if you are crawling in a multi-machine setting. The advanced settings look like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ConfigureScreenForm3.png|Advanced configure form))
+}}
+
+The &#039;&#039;&#039;Debug Display&#039;&#039;&#039; fieldset has three checkboxes: Error Info, Query Info, and Test Info. Checking Error Info will mean that when the Yioop web app runs, any PHP Errors, Warnings, or Notices will be displayed on web pages. This is useful if you need to do debugging, but should not be set in a production environment. The second checkbox, Query Info, when checked, will cause statistics about the time, etc. of database queries to be displayed at the bottom of each web page. The last checkbox, Test Info, says whether or not to display automated tests of some of the systems library classes if the browser is navigated to http://YIOOP_INSTALLATION/tests/. None of these debug settings should be checked in a production environment.
+
+The &#039;&#039;&#039;Search Access&#039;&#039;&#039; fieldset has three checkboxes: Web, RSS, and API. These control whether a user can use the web interface to get query results, whether RSS responses to queries are permitted, or whether or not the function based search API is available. Using the Web Search interface and formatting a query url to get an RSS response are describe in the Yioop [[Documentation#Search%20and%20User%20Interface|Search and User Interface]] section. The Yioop Search Function API is described in the section [[Documentation#Embedding%20Yioop%20in%20an%20Existing%20Site|Embedding Yioop]], you can also look in the examples folder at the file search_api.php to see an example of how to use it. &#039;&#039;&#039;If you intend to use Yioop in a configuration with multiple queue servers (not fetchers), then the RSS checkbox needs to be checked.&#039;&#039;&#039;
+
+The &#039;&#039;&#039;Site Customizations&#039;&#039;&#039; fieldset lets you configure the overall look and feel of a Yioop instance. The &#039;&#039;&#039;Use Wiki Public Main Page as Landing Page&#039;&#039;&#039; checkbox lets you set the main page of the Public wiki to be the landing page of the whole Yioop site rather than the default centered search box landing page. Several of the text fields in Site Customizations control various colors used in drawing the Yioop interface. These include &#039;&#039;&#039;Background Color&#039;&#039;&#039;, &#039;&#039;&#039;Foreground Color&#039;&#039;&#039;, &#039;&#039;&#039;Top Bar Color&#039;&#039;&#039;, &#039;&#039;&#039;Side Bar Color&#039;&#039;&#039;. The values of these fields can be any legitimate style-sheet color such as a # followed by an red, green, blue value (between 0-9 A-F), or a color word such as: yellow, cyan, etc. If you would like to use a background image, you can either use the picker link or drag and drop one into the rounded square next to the &#039;&#039;&#039;Background Image&#039;&#039;&#039; label. Various other images such as the &#039;&#039;&#039;Site Logo&#039;&#039;&#039;, &#039;&#039;&#039;Mobile Logo&#039;&#039;&#039; (the logo used for mobile devices), and &#039;&#039;&#039;Favicon&#039;&#039;&#039; (the little logo that appears in the title tab of a page or in the url bar) can similarly be chosen or dragged-and-dropped.
+
+A &#039;&#039;&#039;Search Toolbar&#039;&#039;&#039; is a short file that can be used to add your search engine to the search bar of a browser. You can drag such a file into the gray area next to this label and click save to set this for your site. The link to install the search bar is visible on the Settings page. There is also a link tag on every page of the Yioop site that allows a browser to auto-discover this as well. As a starting point, one can try tweaking the default Yioop search bar, yioopbar.xml, in the base folder of Yioop.
+
+The three fields &#039;&#039;&#039;Timezone&#039;&#039;&#039;, &#039;&#039;&#039;Web Cookie Name&#039;&#039;&#039;, and &#039;&#039;&#039;Web Token Name&#039;&#039;&#039; control respectively, the timezone used by Yioop when it does date conversions, the name of the cookie it sets in a browser&#039;s cookie cache, and the name used for the tokens to prevent cross-site request forgery that appear in Yioop URLs when one is logged-in.
+
+Finally, if one knows cascading stylesheets (CSS) and wants greater control of the the look and feel of the site, then one can enter standard stylesheet command in the &#039;&#039;&#039;Auxiliary Style Directives&#039;&#039;&#039; textarea.
+
+===Optional Server and Security Configurations===
+The configuration activity just described suffices to set up Yioop for a single server crawl. If that is what you are interested in you may want to skip ahead to the section on the [[Documentation#Search%20and%20User%20Interface|Yioop Search Interface]] to learn about the different search features available in Yioop or you may want to skip ahead to [[Documentation#Performing%20and%20Managing%20Crawls|Performing and Managing Crawls]] to learn about how to perform a crawl. In this section, we describe the Server Settings and Security activities which might be useful in a multi-machine, multi-user setting and which might also be useful for crawling hidden websites or crawling through proxies.
+
+The Server Settings activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ServerSettings.png|The Server Settings Activity))
+}}
+
+The &#039;&#039;&#039;Name Server Set-up&#039;&#039;&#039; fieldset is used to tell Yioop which machine is going to act as a name server during a crawl and what secret string to use to make sure that communication is being done between legitimate queue_servers and fetchers of your installation. You can choose anything for your secret string as long as you use the same string amongst all of the machines in your Yioop installation. The reason why you have to set the name server url is that each machine that is going to run a fetcher to download web pages needs to know who the queue servers are so they can request a batch of urls to download. There are a few different ways this can be set-up:
+
+#If the particular instance of Yioop is only being used to display search results from crawls that you have already done, then this fieldset can be filled in however you want.
+#If you are doing crawling on only one machine, you can put http://localhost/path_to_yioop/ or http://127.0.0.1/path_to_yioop/, where you appropriately modify &quot;path_to_yioop&quot;.
+#Otherwise, if you are doing a crawl on multiple machines, use the url of Yioop on the machine that will act as the name server.
+
+In communicating between the fetcher and the server, Yioop uses curl. Curl can be particular about redirects in the case where posted data is involved. i.e., if a redirect happens, it does not send posted data to the redirected site. For this reason, Yioop insists on a trailing slash on your queue server url. Beneath the Queue Server Url field, is a Memcached checkbox and a Filecache checkbox. Only one of these can be checked at a time. The Memcached check box only shows if you have [[http://php.net/manual/en/book.memcache.php|PHP Memcache]] installed. Checking the Memcached checkbox allows you to specify memcached servers that, if specified, will be used to cache in memory search query results as well as index pages that have been accessed. Checking the Filecache box, tells Yioop to cache search query results in temporary files. Memcache probably gives a better performance boost than Filecaching, but not all hosting environments have Memcache available.
+
+The &#039;&#039;&#039;Database Set-up&#039;&#039;&#039; fieldset is used to specify what database management system should be used, how it should be connected to, and what user name and password should be used for the connection. At present [[http://www.php.net/manual/en/intro.pdo.php|PDO]] (PHP&#039;s generic DBMS interface), sqlite3, and Mysql databases are supported. The database is used to store information about what users are allowed to use the admin panel and what activities and roles these users have. Unlike many database systems, if an sqlite3 database is being used then the connection is always a file on the current filesystem and there is no notion of login and password, so in this case only the name of the database is asked for. For sqlite, the database is stored in WORK_DIRECTORY/data. For single user settings with a limited number of news feeds, sqlite is probably the most convenient database system to use with Yioop. If you think you are going to make use of Yioop&#039;s social functionality and have many users, feeds, and crawl mixes, using a system like Mysql or Postgres might be more appropriate.
+
+If you would like to use a different DBMS than Sqlite or Mysql, then the easiest way is to select PDO as the Database System and for the Hostname given use the DSN with the appropriate DBMS driver. For example, for Postgres one might have something like:
+ pgsql:host=localhost;port=5432;dbname=test;user=bruce;password=mypass
+You can put the username and password either in the DSN or in the Username and Password fields. The database name field must be filled in with the name of the database you want to connect to. It is also include needs to be included in the dsn, as in the above. PDO and Yioop has been tested to work with Postgres and sqlite, for other DBMS&#039;s it might take some tinkering to get things to work.
+
+When switching database information, Yioop checks first if a usable database with the user supplied data exists. If it does, then it uses it; otherwise, it tries to create a new database. Yioop comes with a small sqlite demo database in the data directory and this is used to populate the installation database in this case. This database has one account root with no password which has privileges on all activities. Since different databases associated with a Yioop installation might have different user accounts set-up after changing database information you might have to sign in again.
+
+The &#039;&#039;&#039;Account Registration&#039;&#039;&#039; fieldset is used to control how user&#039;s can obtain accounts on a Yioop installation. The dropdown at the start of this fieldset allows one to select one of four possibilities: Disable Registration, users cannot register themselves, only the root account can add users; No Activation, user accounts are immediately activated once a user signs up; Email Activation, after registering, users must click on a link which comes in a separate email to activate their accounts; and Admin Activation, after registering, an admin account must activate the user before the user is allowed to use their account. When Disable Registration is selected, the Suggest A Url form and link on the tool.php page is disabled as well, for all other registration type this link is enabled. If Email Activation is chosen, then the reset of this fieldset can be used to specify the email address that the email comes to the user. The checkbox Use PHP mail() function controls whether to use the mail function in PHP to send the mail, this only works if mail can be sent from the local machine. Alternatively, if this is not checked like in the image above, one can configure an outgoing SMTP server to send the email through.
+
+The &#039;&#039;&#039;Proxy Server&#039;&#039;&#039; fieldset is used to control which proxies to use while crawling. By default Yioop does not use any proxies while crawling. A Tor Proxy can serve as a gateway to the Tor Network. Yioop can use this proxy to download .onion URLs on the [[https://en.wikipedia.org/wiki/Tor_%28anonymity_network%29|Tor network]]. The configuration given in the example above works with the Tor Proxy that comes with the
+[[https://www.torproject.org/projects/torbrowser.html|Tor Browser]]. Obviously, this proxy needs to be running though for Yioop to make use of it. Beneath the Tor Proxy input field is a checkbox labelled Crawl via Proxies. Checking this box, will reveal a textarea labelled Proxy Servers. You can enter the address:port or address:port:proxytype of proxy servers you would like to crawl through. If proxy servers are used, Yioop will make any requests to download pages to a randomly chosen server on the list which will proxy the request to the site which has the page to download. To some degree this can make the download site think the request is coming from a different ip (and potentially location) than it actually is. In practice, servers can often use HTTP headers to guess that a proxy is being used.
+
+The &#039;&#039;&#039;Ad Server Configuration&#039;&#039;&#039; fieldset can be used to specify advertising scripts (such as Google Ad Words, Bidvertiser, Adspeed, etc) which are to be added on search result pages or on discussion thread pages . There are four possible placements of ads: None -- don&#039;t display advertising at all, Top -- display banner ads beneath the search bar but above search results, Side -- display skyscraper Ads in a column beside the search results, and Both -- display both banner and skyscraper ads. Choosing any option other than None reveals text areas where one can insert the Javascript one would get from the Ad network. The &#039;&#039;&#039;Global Ad Script&#039;&#039;&#039; text area is used for any Javascript or HTML the Ad provider wants you to include in the HTML head tag for the web page (many advertisers don&#039;t need this).
+
+The Security activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:Security.png|The Security Activity))
+}}
+
+The &#039;&#039;&#039;Authentication Type&#039;&#039;&#039; fieldset is used to control the protocol used to log people into Yioop. This can either be Normal Authentication, passwords are checked against stored as salted hashes of the password; or ZKP (zero knowledge protocol) authentication, the server picks challenges at random and send these to the browser the person is logging in from, the browser computes based on the password an appropriate response according to the [[https://en.wikipedia.org/wiki/Feige%3C?php%20?%3E%E2%80%93Fiat%E2%80%93Shamir_identification_scheme|Fiat Shamir]] protocol. The password is never sent over the internet and is not stored on the server. These are the main advantages of ZKP, its drawback is that it is slower than Normal Authentication as to prove who you are with a low probability of error requires several browser-server exchanges. You should choose which authentication scheme you want before you create many users as if you switch everyone will need to get a new password.
+
+The &#039;&#039;&#039;Captcha Type&#039;&#039;&#039; fieldset controls what kind of [[https://en.wikipedia.org/wiki/Captcha|captcha]] will be used during account registration, password recovery, and if a user wants to suggest a url. The captcha type only has an effect if under the Server Settings activity, Account Registration is not set to Disable Registration. The choices for captcha are: Text Captcha, the user has to select from a series of dropdown answers to questions of the form: Which in the following list is the most/largest/etc? or Which is the following list is the least/smallest/etc?; Graphic Captcha, the user needs to enter a sequence of characters from a distorted image; and hash captcha, the user&#039;s browser (the user doesn&#039;t need to do anything) needs to extend a random string with additional characters to get a string whose hash begins with a certain lead set of characters. Of these, Hash Captcha is probably the least intrusive but requires Javascript and might run slowly on older browsers. A text captcha might be used to test domain expertise of the people who are registering for an account. Finally, the graphic captcha is probably the one people are most familiar with.
+
+The Captcha and Recovery Questions section of the Security activity provides links to edit the Text Captcha and Recovery Questions for the current locale (you can change the current locale in Settings). In both cases, there are a fixed list of tests you can localize. A single test consists of a more question, a less question, and a comma separate list of possibilities. For example,
+ Which lives or lasts the longest?
+ Which lives or lasts the shortest?
+ lightning,bacteria,ant,dog,horse,person,oak tree,planet,star,galaxy
+When challenging a user, Yioop picks a subset of tests. For each test, it randomly chooses between more or less question. It then picks a subset of the ordered list of choices, randomly permutes them, and presents them to the user in a dropdown.
+
+Yioop&#039;s captcha-ing system tries to prevent attacks where a machine quickly tries several possible answers to a captcha. Yioop has a IP address based timeout system (implemented in models/visitor_model.php). Initially a timeout of one second between requests involving a captcha is in place. An error screen shows up if multiple requests from the same IP address for a captcha page are made within the time out period. Every mistaken entry of a captcha doubles this timeout period. The timeout period for an IP address is reset on a daily basis back to one second.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Upgrading Yioop===
+
+If you have an older version of Yioop that you would like to upgrade, make sure to back up your data. Then download the latest version of Yioop and unzip it to the location you would like. Set the Search Engine Work Directory by the same method and to the same value as your old Yioop Installation. See the Installation section above for instructions on this, if you have forgotten how you did this. Knowing the old Work Directory location, should allow Yioop to complete or instruct you how to complete the upgrade process.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Summary of Files and Folders===
+
+The Yioop search engine consists of three main scripts:
+
+;&#039;&#039;&#039;bin/fetcher.php&#039;&#039;&#039;: Used to download batches of urls provided the queue_server.
+;&#039;&#039;&#039;bin/queue_server.php&#039;&#039;&#039;: Maintains a queue of urls that are going to be scheduled to be seen. It also keeps track of what has been seen and robots.txt info. Its last responsibility is to create the index_archive that is used by the search front end.
+;&#039;&#039;&#039;index.php&#039;&#039;&#039;: Acts as the search engine web page. It is also used to handle message passing between the fetchers (multiple machines can act as fetchers) and the queue_server.
+
+The file index.php is used when you browse to an installation of a Yioop website. The description of how to use a Yioop web site is given in the sections starting from the The Yioop User Interface section. The files fetcher.php and queue_server.php are only connected with crawling the web. If one already has a stored crawl of the web, then you no longer need to run or use these programs. For instance, you might obtain a crawl of the web on your home machine and upload the crawl to a an instance of Yioop on the ISP hosting your website. This website could serve search results without making use of either fetcher.php or queue_server.php. To perform a web crawl you need to use both of these programs however as well as the Yioop web site. This is explained in detail in the section on [[Documentation#Performing%20and%20Managing%20Crawls|Performing and Managing Crawls]].
+
+The Yioop folder itself consists of several files and sub-folders. The file index.php as mentioned above is the main entry point into the Yioop web application. yioopbar.xml is the xml file specifying how to access Yioop as an Open Search Plugin. favicon.ico is used to display the little icon in the url bar of a browser when someone browses to the Yioop site. A URL to the file bot.php is given by the Yioop robot as it crawls websites so that website owners can find out information about who is crawling their sites. Here is a rough guide to what the Yioop folder&#039;s various sub-folders contain:
+
+;&#039;&#039;&#039;bin&#039;&#039;&#039;: This folder is intended to hold command-line scripts and daemons which are used in conjunction with Yioop. In addition to the fetcher.php and queue_server.php script already mentioned, it contains: &#039;&#039;&#039;arc_tool.php&#039;&#039;&#039;, &#039;&#039;&#039;classifier_tool.php&#039;&#039;&#039;, &#039;&#039;&#039;classifier_trainer.php&#039;&#039;&#039;, &#039;&#039;&#039;code_tool.php&#039;&#039;&#039;, &#039;&#039;&#039;mirror.php&#039;&#039;&#039;,&#039;&#039;&#039; media_updater.php&#039;&#039;&#039;, and &#039;&#039;&#039;query_tool.php&#039;&#039;&#039;. arc_tool.php can be used to examine the contents of WebArchiveBundle&#039;s and IndexArchiveBundle&#039;s from the command line. classifier_tool.php is a command line tool for creating a classifier it can be used to perform some of the tasks that can also be done through the [[Documentation#Classifying Web Pages|Web Classifier Interface]]. classifier_trainer.php is a daemon used in the finalization stage of building a classifier. code_tool.php is for use by developers to maintain the Yioop code-base in various ways. mirror.php can be used if you would like to create a mirror/copy of a Yioop installation. media_updater.php can be used to do hourly updates of news feed search sources in Yioop. It also does video conversions of video files into web formats. Finally, query_tool.php can be used to run queries from the command-line.
+;{{id=&quot;configs&quot; &#039;&#039;&#039;configs&#039;&#039;&#039;}} : This folder contains configuration files. You will probably not need to edit any of these files directly as you can set the most common configuration settings from with the admin panel of Yioop. The file &#039;&#039;&#039;config.php&#039;&#039;&#039; controls a number of parameters about how data is stored, how, and how often, the queue_server and fetchers communicate, and which file types are supported by Yioop. &#039;&#039;&#039;configure_tool.php&#039;&#039;&#039; is a command-line tool which can perform some of the configurations needed to get a Yioop installation running. It is only necessary in some virtual private server settings -- the preferred way to configure Yioop is through the web interface. &#039;&#039;&#039;createdb.php&#039;&#039;&#039; can be used to create a bare instance of the Yioop database with a root admin user having no password. This script is not strictly necessary as the database should be creatable via the admin panel; however, it can be useful if the database isn&#039;t working for some reason. createdb.php includes the file &#039;&#039;&#039;public_help_pages.php&#039;&#039;&#039; from WORK_DIRECTORY/app/configs if present or from BASE_DIR/configs if not. This file contains the initial rows for the Public and Help group wikis. When upgrading, it is useful to export the changes you have made to these wikis to WORK_DIRECTORY/app/configs/public_help_pages.php. This can be done by running the file &#039;&#039;&#039;export_public_help_db.php&#039;&#039;&#039; which is in the configs folder.
+Also, in the configs folder is the file default_crawl.ini. This file is copied to WORK_DIRECTORY after you set this folder in the admin/configure panel. There it is renamed as &#039;&#039;&#039;crawl.ini&#039;&#039;&#039; and serves as the initial set of sites to crawl until you decide to change these. The file &#039;&#039;&#039;token_tool.php&#039;&#039;&#039; is a tool which can be used to help in term extraction during crawls and for making trie&#039;s which can be used for word suggestions for a locale. To help word extraction this tool can generate in a locale folder (see below) a word bloom filter. This filter can be used to segment strings into words for languages such as Chinese that don&#039;t use spaces to separate words in sentences. For trie and segmenter filter construction, this tool can use a file that lists words one on a line.
+;&#039;&#039;&#039;controllers&#039;&#039;&#039;: The controllers folder contains all the controller classes used by the web component of the Yioop search engine. Most requests coming into Yioop go through the top level index.php file. The query string (the component of the url after the ?) then says who is responsible for handling the request. In this query string there is a part which reads c= ... This says which controller should be used. The controller uses the rest of the query string such as the a= variable for activity function to call and the arg= variable to determine which data must be retrieved from which models, and finally which view with what elements on it should be displayed back to the user. Within the controller folder is a sub-folder components, a component is a collection of activities which may be added to a controller so that it can handle a request.
+;&#039;&#039;&#039;css&#039;&#039;&#039;: This folder contains the stylesheets used to control how web page tags should look for the Yioop site when rendered in a browser.
+;&#039;&#039;&#039;data&#039;&#039;&#039;: This folder contains a default sqlite database for a new Yioop installation. Whenever the WORK_DIRECTORY is changed it is this database which is initially copied into the WORK_DIRECTORY to serve as the database of allowed users for the Yioop system.
+;&#039;&#039;&#039;examples&#039;&#039;&#039;: This folder contains a file search_api.php whose code gives an example of how to use the Yioop search function api.
+;&#039;&#039;&#039;lib&#039;&#039;&#039;: This folder is short for library. It contains all the common classes for things like indexing, storing data to files, parsing urls, etc. lib contains six subfolders: &#039;&#039;archive_bundle_iterators&#039;&#039;, &#039;&#039;classifiers&#039;&#039;, &#039;&#039;compressors&#039;&#039;, &#039;&#039;index_bundle_iterators&#039;&#039;, &#039;&#039;indexing_plugins&#039;&#039;, &#039;&#039;processors&#039;&#039;. The &#039;&#039;archive_bundle_iterators&#039;&#039; folder has iterators for iterating over the objects of various kinds of web archive file formats, such as arc, wiki-media, etc. These iterators are used to iterate over such archives during a recrawl. The classifier folder contains code for training classifiers used by Yioop. The &#039;&#039;compressors&#039;&#039; folder contains classes that might be used to compress objects in a web_archive. The &#039;&#039;index_bundle_iterator&#039;&#039; folder contains a variety of iterators useful for iterating over lists of documents which might be returned during a query to the search engine. The &#039;&#039;processors&#039;&#039; folder contains processors to extract page summaries for a variety of different mimetypes.
+;&#039;&#039;&#039;locale&#039;&#039;&#039;: This folder contains the default locale data which comes with the Yioop system. A locale encapsulates data associated with a language and region. A locale is specified by an [[http://en.wikipedia.org/wiki/IANA_language_tag|IETF language tag]]. So, for instance, within the locale folder there is a folder en-US for the locale consisting of English in the United States. Within a given locale tag folder there is a file configure.ini which contains translations of string ids to string in the language of the locale. This approach is the same idea as used in [[http://en.wikipedia.org/wiki/Gettext|Gettext]] .po files. Yioop&#039;s approach does not require a compilation step nor a restart of the webserver for translations to appear. On the other hand, it is slower than the Gettext approach, but this could be easily mitigated using a memory cache such as [[http://memcached.org/|memcached]] or [[archive_bundle_iterators|apc]]. Besides the file configure.ini, there is a statistics.txt file which has info about what percentage of the id&#039;s have been translated. In addition to configure.ini and statistics.txt, the locale folder for a language contains two sub-folders: pages, containing static html (with extension .thtml) files which might need to be translated, and resources. The resources folder contains the files: &#039;&#039;locale.js&#039;&#039;, which contains locale specify Javascript code such as the variable alpha which is used to list out the letters in the alphabet for the language in question for spell check purposes, and roman_array for mapping between roman alphabet and the character system of the locale in question; &#039;&#039;suggest-trie.txt.gz&#039;&#039;, a Trie data structure used for search bar word suggestions; and &#039;&#039;tokenizer.php&#039;&#039;, which can specify the number of characters for this language to constitute a char gram, might contain segmenter to split strings into words for this language, a stemmer class used to stem terms for this language, a stopword remover for the centroid summarizer, a part of speech tagger, or thesaurus lookup procedure for the locale.
+;&#039;&#039;&#039;models&#039;&#039;&#039;: This folder contains the subclasses of Model used by Yioop Models are used to encapsulate access to secondary storage. i.e., Accesses to databases or the filesystem. They are responsible for marshalling/de-marshalling objects that might be stored in more than one table or across serveral files. The models folder has within it a datasources folder. A datasource is an abstraction layer for the particular filesystem and database system that is being used by a Yioop installation. At present, datasources have been defined for PDO (PHP&#039;s generic DBMS interface), sqlite3, and mysql databases.
+;&#039;&#039;&#039;resources&#039;&#039;&#039;: Used to store binary resources such as graphics, video, or audio. For now, just stores the Yioop logo.
+;&#039;&#039;&#039;scripts&#039;&#039;&#039;: This folder contains the Javascript files used by Yioop.
+;&#039;&#039;&#039;tests&#039;&#039;&#039;: This folder contains UnitTest&#039;s and JavascriptUnitTests for various lib and script components. Yioop comes with its own minimal UnitTest and JavascriptUnitTest classes which defined in the lib/unit_test.php and lib/javascript_unit_test.php. It also contains a few files used for experiments. For example, string_cat_experiment.php was used to test which was the faster way to do string concatenation in PHP. many_user_experiment.php can be used to create a test Yioop installation with many users, roles, and groups. Some unit testing of the wiki Help system makes use of [[http://phantomjs.org/|PhantomJS]]. If PhantomJS is not configured, these tests will be skipped. To configure PhantomJS you simply add a define for your path to PhatomJS to your local_config.php file. For example, one might have add the define:
+define(&quot;PHANTOM_JS&quot;, &quot;/usr/local/bin/phantomjs&quot;);
+;&#039;&#039;&#039;views&#039;&#039;&#039;: This folder contains View subclasses as well as folders for elements, helpers, and layouts. A View is responsible for taking data given to it by a controller and formatting it in a suitable way. Most Views output a web page; however, some of the views responsible for communication between the fetchers and the queue_server output serialized objects. The elements folder contains Element classes which are typically used to output portions of web pages. For example, the html that allows one to choose an Activity in the Admin portion of the website is rendered by an ActivityElement. The helpers folder contains Helper subclasses. A Helper is used to automate the task of outputting certain kinds of web tags. For instance, the OptionsHelper when given an array can be used to output select tags and option tags using data from the array. The layout folder contains Layout subclasses. A Layout encapsulates the header and footer information for the kind of a document a View lives on. For example, web pages on the Yioop site all use the WebLayout class as their Layout. The WebLayout class has a render method for outputting the doctype, open html tag, head of the document including links for style sheets, etc. This method then calls the render methods of the current View, and finally outputs scripts and the necessary closing document tags.
+
+In addition to the Yioop application folder, Yioop makes use of a WORK DIRECTORY. The location of this directory is set during the configuration of a Yioop installation. Yioop stores crawls, and other data local to a particular Yioop installation in files and folders in this directory. In the event that you upgrade your Yioop installation you should only need to replace the Yioop application folder and in the configuration process of Yioop tell it where your WORK DIRECTORY is. Of course, it is always recommended to back up one&#039;s data before performing an upgrade. Within the WORK DIRECTORY, Yioop stores four main files: profile.php, crawl.ini, bot.txt, and robot_table.txt. Here is a rough guide to what the WORK DIRECTORY&#039;s sub-folder contain:
+
+;&#039;&#039;&#039;app&#039;&#039;&#039;: This folder is used to contain your overrides to the views, controllers, models, resources, locale etc. For example, if you wanted to change how the search results were rendered, you could add a views/search_view.php file to the app folder and Yioop would use it rather than the one in the Yioop base directory&#039;s views folder. Using the app dir makes it easier to have customizations that won&#039;t get messed up when you upgrade Yioop.
+;&#039;&#039;&#039;cache&#039;&#039;&#039;: The directory is used to store folders of the form ArchiveUNIX_TIMESTAMP, IndexDataUNIX_TIMESTAMP, and QueueBundleUNIX_TIMESTAMP. ArchiveUNIX_TIMESTAMP folders hold complete caches of web pages that have been crawled. These folders will appear on machines which are running fetcher.php. IndexDataUNIX_TIMESTAMP folders hold a word document index as well as summaries of pages crawled. A folder of this type is needed by the web app portion of Yioop to serve search results. These folders can be moved from machine to whichever machine you want to server results from. QueueBundleUNIX_TIMESTAMP folders are used to maintain the priority queue during the crawling process. The queue_server.php program is responsible for creating both IndexDataUNIX_TIMESTAMP and QueueBundleUNIX_TIMESTAMP folders.
+;&#039;&#039;&#039;data&#039;&#039;&#039;: If an sqlite or sqlite3 (rather than say MySQL) database is being used then a seek_quarry.db file is stored in the data folder. In Yioop, the database is used to manage users, roles, locales, and crawls. Data for crawls themselves are NOT stored in the database. Suggest a url data is stored in data in the file suggest_url.txt, certain cron information about machines is saved in cron_time.txt, and plugin configuration information can also be stored in this folder.
+;&#039;&#039;&#039;locale&#039;&#039;&#039;: This is generally a copy of the locale folder mentioned earlier. In fact, it is the version that Yioop will try to use first. It contains any customizations that have been done to locale for this instance of Yioop. If you using a version of Yioop after Yioop 2.0, this folder have been moved to app/locale.
+;&#039;&#039;&#039;log&#039;&#039;&#039;: When the fetcher and queue_server are run as daemon processes log messages are written to log files in this folder. Log rotation is also done. These log files can be opened in a text editor or console app.
+;&#039;&#039;&#039;query&#039;&#039;&#039;: This folder is used to stored caches of already performed queries when file caching is being used.
+;&#039;&#039;&#039;schedules&#039;&#039;&#039;: This folder has four kinds of subfolders: media_convert, IndexDataUNIX_TIMESTAMP, RobotDataUNIX_TIMESTAMP, and ScheduleDataUNIX_TIMESTAMP. The easiest to explain is the media_convert folder. It is used by media_updater.php to stored job information about video files that need to be converted. For the other folder, when a fetcher communicates with the web app to say what it has just crawled, the web app writes data into these folders to be processed later by the queue_server. The UNIX_TIMESTAMP is used to keep track of which crawl the data is destined for. IndexData folders contain mini-inverted indexes (word document records) which are to be added to the global inverted index (called the dictionary) for that crawl. RobotData folders contain information that came from robots.txt files. Finally, ScheduleData folders have data about found urls that could eventually be scheduled to crawl. Within each of these three kinds of folders there are typical many sub-folders, one for each day data arrived, and within these subfolders there are files containing the respective kinds of data.
+;&#039;&#039;&#039;search_filters&#039;&#039;&#039;: This folder is used to store text files containing global after crawl search filter and summary data. The global search filter allows a user to specify after a crawl is done that certain urls be removed from the search results. The global summary data can be used to edit the summaries for a small number of web pages whose summaries seem inaccurate or inappropriate. For example, some sites like Facebook only allow big search engines like Google to crawl them. Still there are many links to Facebook, so Facebook on an open web crawl will appear, but with a somewhat confused summary based only on link text; the results editor allows one to give a meaningful summary for Facebook.
+;&#039;&#039;&#039;temp&#039;&#039;&#039;: This is used for storing temporary files that Yioop creates during the crawl process. For example, temporary files used while making thumbnails. Each fetcher has its own temp folder, so you might also see folders 0-temp, 1-temp, etc.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Search and User Interface==
+
+At this point one hopefully has installed Yioop. If you used one of the [[Install|install guides]], you may also have performed a simple crawl. We are now going to describe some of the basic search features of Yioop as well as the Yioop administration interface. We will describe how to perform crawls with Yioop in more detail in the [[Documentation#Crawling%20and%20Customizing%20Results|Crawling and Customizing Results]] chapter. If you do not have a crawl available, you can test some of these features on the [[http://www.yioop.com/|Yioop Demo Site]].
+
+===Search Basics===
+The main search form for Yioop looks like:
+
+{{class=&#039;docs width-three-quarter&#039;
+((resource:Documentation:SearchScreen.png|The Search form))
+}}
+
+The HTML for this form is in views/search_views.php and the icon is stored in resources/yioop.png. You may want to modify these to incorporate Yioop search into your site. For more general ways to modify the look of this pages, consult the [[Documentation#Building%20a%20Site%20using%20Yioop%20as%20Framework|Building a site using Yioop]] documentation. The Yioop logo on any screen in the Yioop interface is clickable and returns the user to the main search screen. One performs a search by typing a query into the search form field and clicking the Search button. As one is typing, Yioop suggests possible queries, you can click, or use the up down arrows to select one of these suggestion to also perform a search
+
+{{class=&#039;docs width-three-quarter&#039;
+((resource:Documentation:Autosuggest.png|Example suggestions as you type))
+}}
+
+For some non-roman alphabet scripts such as Telugu you can enter words using how they sound using roman letters and get suggestions in the script in question:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:TeluguAutosuggest.png|Telugu suggestions for roman text))
+}}
+
+The [More Statistics] link only shows if under the Admin control panel you clicked on more statistics for the crawl. This link goes to a page showing many global statistics about the web crawl. Beneath this link are the Blog and Privacy links (as well as a link back to the SeekQuarry site). These two links are to static pages which can be customized through the Manage Locale activity. Typical search results might look like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchResults.png|Example Search Results))
+}}
+
+Thesaurus results might appear to one side and suggest alternative queries based on a thesaurus look up (for English, this is based on Wordnet). The terms next Words: are a word cloud of important terms in the document. These are created if the indexer user the centroid summarizer. Hovering over the Score of a search result reveals its component scores. These might include: Rank, Relevance, Proximity, as well as any Use to Rank Classifier scores and Word Net scores (if installed).
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ScoreToolTip.png|Example Score Components Tool Tip))
+}}
+
+If one slightly mistypes a query term, Yioop can sometimes suggest a spelling correction:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchSpellCorrect.png|Example Search Results with a spelling correction))
+}}
+
+Each result back from the query consists of several parts: First comes a title, which is a link to the page that matches the query term. This is followed by a brief summary of that page with the query words in bold. Then the document rank, relevancy, proximity, and overall scores are listed. Each of these numbers is a grouped statistic -- several &quot;micro index entry&quot; are grouped together/summed to create each. So even though a given &quot;micro index entry&quot; might have a document rank between 1 and 10 there sum could be a larger value. Further, the overall score is a generalized inner product of the scores of the &quot;micro index entries&quot;, so the separated scores will not typically sum to the overall score. After these scores there are three links: Cached, Similar, and Inlinks. Clicking on Cached will display Yioop&#039;s downloaded copy of the page in question. We will describe this in more detail in a moment. Clicking on Similar causes Yioop to locate the five words with the highest relevancy scores for that document and then to perform a search on those words. Clicking on Inlinks will take you to a page consisting of all the links that Yioop found to the document in question. Finally, clicking on an IP address link returns all documents that were crawled from that IP address.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:Cache.png|Example Cache Results))
+}}
+
+As the above illustrates, on a cache link click, Yioop will display a cached version of the page. The cached version has a link to the original version and download time at the top. Next there is a link to display all caches of this page that Yioop has in any index. This is followed by a link for extracted summaries, then in the body of the cached document the query terms are highlighted. Links within the body of a cache document first target a cached version of the page that is linked to which is as near into the future of the current cached page as possible. If Yioop doesn&#039;t have a cache for a link target then it goes to location pointed to by that target. Clicking on the history toggle, produces the following interface:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CacheHistory.png|Example Cache History UI))
+}}
+
+This lets you select different caches of the page in question.
+
+Clicking the &quot;Toggle extracted summary&quot; link will show the title, summary, and links that were extracted from the full page and indexed. No other terms on the page are used to locate the page via a search query. This can be viewed as an &quot;SEO&quot; view of the page.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CacheSEO.png|Example Cache SEO Results))
+}}
+
+It should be noted that cached copies of web pages are stored on the fetcher which originally downloaded the page. The IndexArchive associated with a crawl is stored on the queue server and can be moved around to any location by simply moving the folder. However, if an archive is moved off the network on which fetcher lives, then the look up of a cached page might fail.
+
+In addition, to a straightforward web search, one can also do image, video, news searches by clicking on the Images, Video, or News links in the top bar of Yioop search pages. Below are some examples of what these look like for a search on &quot;Obama&quot;:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ImageSearch.png|Example Image Search Results))
+((resource:Documentation:VideoSearch.png|Example Video Search Results))
+((resource:Documentation:NewsSearch.png|Example News Search Results))
+}}
+
+When Yioop crawls a page it adds one of the following meta words to the page media:text, media:image, or media:video. RSS (or Atom) feed sources that have been added to Media Sources under the [[Documentation#Search%20Sources|Search Sources]] activity are downloaded from each hour. Each RSS item on such a downloaded pages has the meta word media:news added to it. A usual web search just takes the search terms provided to perform a search. An Images, Video, News search tacks on to the search terms, media:image or media:video, or media:news. Detection of images is done via mimetype at initial page download time. At this time a thumbnail is generated. When search results are presented it is this cached thumbnail that is shown. So image search does not leak information to third party sites. On any search results page with images, Yioop tries to group the images into a thumbnail strip. This is true of both normal and images search result pages. In the case of image search result pages, except for not-yet-downloaded pages, this results in almost all of the results being the thumbnail strip. Video page detection is not done through mimetype as popular sites like YouTube, Vimeo, and others vary in how they use Flash or video tags to embed video on a web page. Yioop uses the Video Media sources that have been added in the Search Sources activity to detect whether a link is in the format of a video page. To get a thumbnail for the video it again uses the method for rewriting the video url to an image link specified for the particular site in question in Search Sources. i.e., the thumbnail will be downloaded from the orginal site. &#039;&#039;&#039;This could leak information to third party sites about your search.&#039;&#039;&#039;
+
+The format of News search results is somewhat different from usual search results. News search results can appear during a normal web search, in which case they will appear clustered together, with a leading link &quot;News results for ...&quot;. No snippets will be shown for these links, but the original media source for the link will be displayed and the time at which the item first appeared will be displayed. On the News subsearch page, the underneath the link to the item, the complete RSS description of the new item is displayed. In both settings, it is possible to click on the media source name next to the news item link. This will take one to a page of search results listing all articles from that media source. For instance, if one were to click on the Yahoo News text above one would go to results for all Yahoo News articles. This is equivalent to doing a search on: media:news:Yahoo+News . If one clicks on the News subsearch, not having specified a query yet, then all stored news items in the current language will be displayed, roughly ranked by recentness. If one has RSS media sources which are set to be from different locales, then this will be taken into account on this blank query News page.
+
+[[Documentation#contents|Return to table of contents]].
+
+
+===Search Tools Page===
+
+As one can see from the image of the main search form shown previously, the footer of each search and search result page has several links. Blog takes one to the group feed of the built in PUBLIC group which is editable from the root account, Privacy takes one to the Yioop installations privacy policy, and Terms takes one to the Yioop installations terms of service. The YioopBot link takes one to a page describing the installation&#039;s web crawler. These static pages are all Wiki pages of the PUBLIC group and can be edited by the root account. The Tools link takes one to the following page:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchTools.png|Search Tools Page))
+}}
+
+Beneath the Other Search Sources section is a complete listing of all the search sources that were created using [[Documentation#Search%20Sources|Search Sources]]. This might be more than just the Images, Video, and News that come by default with Yioop. The My Account section of this page gives another set of links for signing into, modifying the settings of, and creating account. The Other Tools section has a link to the form below where user&#039;s can suggest links for the current or future crawls.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SuggestAUrl.png|Suggest A Url Form))
+}}
+
+This link only appears if under Server Settings, Account Registration is not set to Disable registration. The Wiki Pages link under Other Tools takes one to a searchable list of all Wiki pages of the default PUBLIC group.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Search Operators===
+
+Turning now to the topic of how to enter a query in Yioop: A basic query to the Yioop search form is typically a sequence of words seperated by whitespace. This will cause Yioop to compute a &quot;conjunctive query&quot;, it will look up only those documents which contain all of the terms listed. Yioop also supports a variety of other search box commands and query types:
+
+* &#039;&#039;&#039;#num#&#039;&#039;&#039; in a query are treated as query presentation markers. When a query is first parsed, it is split into columns based with &#039;&#039;#num#&#039;&#039; as the column boundary. For example, bob #2# bob sally #3# sally #1#. A given column is used to present &#039;&#039;#num#&#039;&#039; results, where &#039;&#039;#num#&#039;&#039; is what is between the hash marks immediately after it. So in the query above, the subquery &#039;&#039;bob&#039;&#039; is used for the first two search results, then the subquery &#039;&#039;bob sally&#039;&#039; is used for the next three results, finally the last column is always used for any remaining results. In this case, the subquery &#039;&#039;sally&#039;&#039; would be used for all remaining results even though its &#039;&#039;#num#&#039;&#039; is 1. If a query does not have any #num#&#039;s it is assumed that it has only one column.
+* Separating query terms with a vertical bar | results in a disjunctive query. These are parsed for after the presentation markers above. So a search on: &#039;&#039;Chris | Pollett&#039;&#039; would return pages that have either the word &#039;&#039;Chris&#039;&#039; or the word &#039;&#039;Pollett&#039;&#039; or both.
+* Putting the query in quotes, for example &quot;Chris Pollett&quot;, will cause Yioop to perform an exact match search. Yioop in this case would only return documents that have the string &quot;Chris Pollett&quot; rather than just the words Chris and Pollett possibly not next to each other in the document. Also, using the quote syntax, you can perform searches such as &quot;Chris * Homepage&quot; which would return documents which have the word Chris followed by some text followed by the word Homepage.
+* If the query has at least one word not prefixed by -, then adding a `-&#039; in front of a word in a query means search for results not containing that term. So a search on: of &#039;&#039;-the&#039;&#039; would return results containing the word &quot;of&quot; but not containing the word &quot;the&quot;.
+* Searches of the forms: &#039;&#039;&#039;related:url&#039;&#039;&#039;, &#039;&#039;&#039;cache:url&#039;&#039;&#039;, &#039;&#039;&#039;link:url&#039;&#039;&#039;, &#039;&#039;&#039;ip:ip_address&#039;&#039;&#039; are equivalent to having clicked on the Similar, Cached, InLinks, IP address links, respectively, on a summary with that url and ip address.
+
+The remaining query types we list in alphabetical order:
+
+;&#039;&#039;&#039;code&amp;#58;http_error_code&#039;&#039;&#039; : returns the summaries of all documents downloaded with that HTTP response code. For example, code:04 would return all summaries where the response was a Page Not Found error.
+;&#039;&#039;&#039;date&amp;#58;Y, date&amp;#58;Y-m, date&amp;#58;Y-m-d, date&amp;#58;Y-m-d-H, date&amp;#58;Y-m-d-H-i, date&amp;#58;Y-m-d-H-i-s&#039;&#039;&#039; : returns summaries of all documents crawled on the given date. For example, &#039;&#039;date:2011-01&#039;&#039; returns all document crawled in January, 2011. As one can see detail goes down to the second level, so one can have an idea about how frequently the crawler is hitting a given site at a given time.
+;&#039;&#039;&#039;dns&amp;#58;num_seconds&#039;&#039;&#039; : returns summaries of all documents whose DNS lookup time was between num_seconds and num_seconds + 0.5 seconds. For example, dns:0.5.
+;&#039;&#039;&#039;filetype&amp;#58;extension&#039;&#039;&#039;: returns summaries of all documents found with the given extension. So a search: Chris Pollett filetype&amp;#58;pdf would return all documents containing the words Chris and Pollett and with extension pdf.
+;&#039;&#039;&#039;host&amp;#58;all&#039;&#039;&#039;: returns summaries of all domain level pages (pages where the path was /).
+;&#039;&#039;&#039;index&amp;#58;timestamp or i&amp;#58;timestamp&#039;&#039;&#039; : causes the search to make use of the IndexArchive with the given timestamp. So a search like: &#039;&#039;Chris Pollett i&amp;#58;1283121141 | Chris Pollett&#039;&#039; take results from the index with timestamp 1283121141 for Chris Pollett and unions them with results for Chris Pollett in the default index
+;&#039;&#039;&#039;if&amp;#58;keyword!add_keywords_on_true!add_keywords_on_false&#039;&#039;&#039; : checks the current conjunctive query clause for &quot;keyword&quot;; if present, it adds &quot;add_keywords_on_true&quot; to the clause, else it adds the keywords &quot;add_keywords_on_true&quot;. This meta word is typically used as part of a crawl mix. The else condition does not need to be present. As an example, &#039;&#039;if&amp;#58;oracle!info&amp;#58;http://oracle.com/!site&amp;#58;none&#039;&#039; might be added to a crawl mix so that if a query had the keyword oracle then the site http://oracle.com/ would be returned by the given query clause. As part of a larger crawl mix this could be used to make oracle&#039;s homepage appear at the top of the query results. If you would like to inject multiple keywords then separate the keywords using plus rather than white space. For example, if:corvette!fast+car.
+;&#039;&#039;&#039;info&amp;#58;url&#039;&#039;&#039; : returns the summary in the Yioop index for the given url only. For example, one could type info:http://www.yahoo.com/ or info:www.yahoo.com to get the summary for just the main Yahoo! page. This is useful for checking if a particular page is in the index.
+;&#039;&#039;&#039;lang&amp;#58;IETF_language_tag&#039;&#039;&#039; : returns summaries of all documents whose language can be determined to match the given language tag. For example, &#039;&#039;lang:en-US&#039;&#039;.
+;&#039;&#039;&#039;media&amp;#58;kind&#039;&#039;&#039; : returns summaries of all documents found of the given media kind. Currently, the text, image, news, and video are the four supported media kinds. So one can add to the search terms &#039;&#039;media:image&#039;&#039; to get only image results matching the query keywords.
+&#039;&#039;&#039;mix&amp;#58;name or m&amp;#58;name &#039;&#039;&#039;: tells Yioop to use the crawl mix &quot;name&quot; when computing the results of the query. The section on mixing crawl indexes has more details about crawl mixes. If the name of the original mix had spaces, for example, cool mix then to use the mix you would need to replace the spaces with plusses, &#039;&#039;m:cool+mix&#039;&#039;.
+;&#039;&#039;&#039;modified&amp;#58;Y, modified&amp;#58;Y-M, modified&amp;#58;Y-M-D&#039;&#039;&#039; : returns summaries of all documents which were last modified on the given date. For example, modified:2010-02 returns all document which were last modifed in February, 2010.
+;&#039;&#039;&#039;no&amp;#58;some_command&#039;&#039;&#039; is used to tell Yioop not to perform some default transformation of the search terms. For example, &#039;&#039;no:guess&#039;&#039; tells Yioop not to try to guess the semantics of the search before doing the search. This would mean for instance, that Yioop would not rewrite the query &#039;&#039;yahoo.com&#039;&#039; into &#039;&#039;site:yahoo.com. no:network&#039;&#039; tells Yioop to only return search results from the current machine and not to send the query to all machines in the Yioop instance. &#039;&#039;no:cache&#039;&#039; says to recompute the query and not to make use of memcache or file cache.
+;&#039;&#039;&#039;numlinks&amp;#58;some_number&#039;&#039;&#039;: returns summaries of all documents which had some_number of outgoing links. For example, numlinks:5.
+;&#039;&#039;&#039;os&amp;#58;operating_system&#039;&#039;&#039;: returns summaries of all documents served on servers using the given operating system. For example, &#039;&#039;os:centos&#039;&#039;, make sure to use lowercase.
+;&#039;&#039;&#039;path&amp;#58;path_component_of_url&#039;&#039;&#039;: returns summaries of all documents whose path component begins with path_component_of_url. For example, &#039;&#039;path:/phpBB&#039;&#039; would return all documents whose path started with phpBB, &#039;&#039;path:/robots.txt&#039;&#039; would return summaries for all robots.txt files.
+;&#039;&#039;&#039;raw&amp;#58;number&#039;&#039;&#039; : control whether or not Yioop tries to do deduplication on results and whether links and pages for the same url should be grouped. Any number greater than zero says don&#039;t do deduplication.
+;&#039;&#039;&#039;robot&amp;#58;user_agent_name&#039;&#039;&#039; : returns robots.txt pages that contained that user_agent_name (after lower casing). For example, &#039;&#039;robot:yioopbot&#039;&#039; would return all robots.txt pages explicitly having a rule for YioopBot.
+;&#039;&#039;&#039;safe&amp;#58;boolean_value&#039;&#039;&#039; : is used to provide &quot;safe&quot; or &quot;unsafe&quot; search results. Yioop has a crude, &quot;hand-tuned&quot;, linear classifier for whether a site contains pornographic content. If one adds safe:true to a search, only those pages found which were deemed non-pornographic will be returned. Adding safe:false has the opposite effect.
+;&#039;&#039;&#039;server&amp;#58;web_server_name&#039;&#039;&#039; : returns summaries of all documents served on that kind of web server. For example, &#039;&#039;server:apache&#039;&#039;.
+;&#039;&#039;&#039;site&amp;#58;url, site&amp;#58;host, or site&amp;#58;domain&#039;&#039;&#039;: returns all of the summaries of pages found at that url, host, or domain. As an example, &#039;&#039;site:http://prints.ucanbuyart.com/lithograph_art.html&#039;&#039;, &#039;&#039;site:http://prints.ucanbuyart.com/&#039;&#039;, &#039;&#039;site:prints.ucanbuyart.com&#039;&#039;, &#039;&#039;site:.ucanbuyart.com&#039;&#039;, site:ucanbuyart.com, site:com, will all returns with decreasing specificity. To return all pages and links to pages in the Yioop index, you can do &#039;&#039;site:any&#039;&#039;. To return all pages (as opposed to pages and links to pages) listed in a Yioop index you can do &#039;&#039;site:all&#039;&#039;. &#039;&#039;site:all&#039;&#039; doesn&#039;t return any links, so you can&#039;t group links to urls and pages of that url together. If you want all sites where one has a page in the index as well as links to that site, than you can do &#039;&#039;site:doc&#039;&#039;.
+;&#039;&#039;&#039;size&amp;#58;num_bytes&#039;&#039;&#039;: returns summaries of all documents whose download size was between num_bytes and num_bytes + 5000. num_bytes must be a multiple of 5000. For example, &#039;&#039;size:15000&#039;&#039;.
+;&#039;&#039;&#039;time&amp;#58;num_seconds&#039;&#039;&#039; : returns summaries of all documents whose download time excluding DNS lookup time was between num_seconds and num_seconds + 0.5 seconds. For example, &#039;&#039;time:1.5&#039;&#039;.
+;&#039;&#039;&#039;version&amp;#58;version_number&#039;&#039;&#039; : returns summaries of all documents served on web servers with the given version number. For example, one might have a query &#039;&#039;server:apache version:2.2.9&#039;&#039;.
+;&#039;&#039;&#039;weight&amp;#58;some_number or w&amp;#58;some_number&#039;&#039;&#039; : has the effect of multiplying all score for this portion of a query by some_number. For example, &#039;&#039;Chris Pollett | Chris Pollett site:wikipedia.org w:5 &#039;&#039;would multiply scores satisfying &#039;&#039;Chris Pollett&#039;&#039; and on &#039;&#039;wikipedia.org&#039;&#039; by 5 and union these with those satisfying &#039;&#039;Chris Pollett&#039;&#039;.
+
+Although we didn&#039;t say it next to each query form above, if it makes sense, there is usually an &#039;&#039;all&#039;&#039; variant to a form. For example, &#039;&#039;os:all&#039;&#039; returns all documents from servers for which os information appeared in the headers.
+
+===Result Formats===
+In addition to using the search form interface to query Yioop, it is also possible to query Yioop and get results in Open Search RSS format. To do that you can either directly type a URL into your browser of the form:
+ http://my-yioop-instance-host/?f=rss&amp;q=query+terms
+Or you can write AJAX code that makes requests of URLs in this format. Although, there is no official Open Search JSON format, one can get a JSON object with the same structure as the RSS search results using a query to Yioop such as:
+ http://my-yioop-instance-host/?f=json&amp;q=query+terms
+
+[[Documentation#contents|Return to table of contents]].
+
+===Settings===
+
+In the corner of the page with the main search form is a Settings-Signin element:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SettingsSignin.png|Settings Sign-in Element))
+}}
+
+This element provides access for a user to change their search settings by clicking Settings. The Sign In link provides access to the Admin and User Accounts panels for the website. Clicking the Sign In link also takes one to a page where one can register for an account if Yioop is set up to allow user registration.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:Settings.png|The Settings Form))
+}}
+
+On the Settings page, there are currently three items which can be adjusted: The number of results per page when doing a search, the language Yioop should use, and the particular search index Yioop should use. When a user clicks save, the data is stored by Yioop. The user can then click &quot;Return to Yioop&quot; to go back the search page. Thereafter, interaction with Yioop will make use of any settings&#039; changes. Data is stored in Yioop and associated with a given user via a cookies mechanism. In order for this to work, the user&#039;s browser must allow cookies to be set. This is usually the default for most browsers; however, it can sometimes be disabled in which case the browser option must be changed back to the default for Settings to work correctly. It is possible to control some of these settings by tacking on stuff to the URL. For instance, adding &amp;l=fr-FR to the URL query string (the portion of the URL after the question mark) would tell Yioop to use the French from France for outputting text. You can also add &amp;its= the Unix timestamp of the search index you want.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Mobile Interface===
+
+Yioop&#039;s user interface is designed to display reasonably well on tablet devices such as the iPad. For smart phones, such as iPhone, Android, Blackberry, or Windows Phone, Yioop has a separate user interface. For search, settings, and login, this looks fairly similar to the non-mobile user interface:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:MobileSearch.png|Mobile Search Landing Page))
+((resource:Documentation:MobileSettings.png|Mobile Settings Page))
+((resource:Documentation:MobileSignin.png|Mobile Admin Panel Login))
+}}
+
+For Admin pages, each activity is controlled in an analgous fashion to the non-mobile setting, but the Activity element has been replaced with a dropdown:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:MobileAdmin.png|Example Mobile Admin Activity))
+}}
+
+We now resume our discussion of how to use each of the Yioop admin activities for the default, non-mobile, setting, simply noting that except for the above minor changes, these instructions will also apply to the mobile setting.
+
+[[Documentation#contents|Return to table of contents]].
+
+==User Accounts and Social Features==
+===Registration and Signin===
+
+Clicking on the Sign In link on the corner of the Yioop web site will bring up the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SigninScreen.png|Admin Panel Login))
+}}
+
+Correctly, entering a username and password will then bring the user to the User Account portion of the Yioop website. Each Account page has on it an Activity element as well as a main panel where the current activity is displayed. The Activity element allows the user to choose what is the current activity for the session. The choices available on the Activity element depend on the roles the user has. A default installation of Yioop comes with two predefined roles Admin and User. If someone has the Admin role then the Activity element looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AdminActivityElement.png|Admin Activity Element))
+}}
+
+On the other hand, if someone just has the User role, then their Acitivity element looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:UserActivityElement.png|User Activity Element))
+}}
+
+Over the next several sections we will discuss each of the Yioop account activities in turn. Before we do that we make a couple remarks about using Yioop from a mobile device.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Managing Accounts===
+
+By default, when a user first signs in to the Yioop admin panel the current activity is the Manage Account activity. This activity just lets user&#039;s change their account information using the form pictured below. It also has summary information about Crawls and Indexes (Admin account only), Groups and Feeds, and Crawl mixes. There are also helpful links from each of these sections to a related activity for managing them.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageAccount.png|Manage Account Page))
+}}
+
+Initially, the Account Details fields are grayed out. To edit them, or to edit the user icon next to them, click the lock icon next to account details. This will allow a user to change information using their account password. A new user icon can either be selected by clicking the choose link underneath it, or by dragging and dropping an icon into the image area. The user&#039;s password must be entered correctly into the password field for changes to take effect when Save is clicked. Clicking the now opened Lock icon will cause the lock to close, these details to be grayed out, and not editable.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ChangeAccountInfo.png|Change Account Information Form))
+}}
+
+If a user wants to change their password they can click the Password link label for the password field. This reveals the following additional form fields where the password can be changed:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ChangePassword.png|Change Password Form))
+}}
+
+[[Documentation#contents|Return to table of contents]].
+
+===Managing Users, Roles, and Groups===
+
+The Manage Users, Manage Groups, and Manage Roles activities have similar looking forms as well as related functions. All three of these activities are available to accounts with the Admin role, but only Manage Groups is a available to those with a standard User role. To describe these activities, let&#039;s start at the beginning... Users are people who have accounts to connect with a Yioop installation. Users, once logged in may engage in various Yioop activities such as Manage Crawls, Mix Crawls, and so on. A user is not directly assigned which activities they have permissions on. Instead, they derive their permissions from which roles they have been directly assigned and by which groups they belong to. When first launched, Manage User activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AddUser.png|The Add User form))
+}}
+
+The purpose is this activity is to allow an administrator to add, monitor and modify the accounts of users of a Yioop installation. At the top of the activity is the &quot;Add User&quot; form. This would allow an administrator to add a new user to the Yioop system. Most of the fields on this form are self explanatory except the Status field which we will describe in a moment. Beneath this is a User List table. At the top of this table is a dropdown used to control how many users to display at one time. If there are more than that many users, there will be arrow links to page through the user list. There is a also a search link which can be used to bring up the following Search User form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchUser.png|The Search User form))
+}}
+
+This form can be used to find and sort various users out of the complete User List. If we look at the User List, the first four columns, Username, First Name, Last Name, and Email Address are pretty self-explanatory. The Groups column says how many groups the user belongs to. The Status column has a dropdown for each user row, this dropdown also appear in the Add User form. It represents the current status of the User and can be either Inactive, Active, or Banned. An Inactive user is typically a user that has used the Yioop registration form to sign up for an account, but who hasn&#039;t had the account activated by the administrator, nor had the account activated by using an email link. Such a user can&#039;t create or post to groups or log in. On the other hand, such a user has reserved that username so that other people can&#039;t use it. A Banned user is a user who has been banned from logging, but might have groups or posts that the administrator wants to retain. Selecting a different dropdown value changes that user&#039;s status. Next to the Status column are two action columns which can be used to edit a user or to delete a user. Deleting a user, deletes their account, any groups that the user owns, and deletes any posts the user made. The Edit User form looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditUser.png|The Edit User form))
+}}
+
+This form let&#039;s you modify some of the attributes of a users. There are also two links on it: one with the number of roles that a user has, the other with the number of groups that a user has. Here the word &quot;role&quot; means a set of activities. Clicking on one of these links brings up a paged listing of the particular roles/groups the user has/belongs to. It will also let you add or delete roles/groups. Adding a role to a user means that the user can do the set of activities that the role contains, adding a group to the user means the user can read that group, and if the privileges for non-owners allow posting then can also post or comment to that group&#039;s feed and edit the group&#039;s wiki. This completes the description of the Manage
+User Activity.
+
+Roles are managed through the Manage Role activity, which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AddRole.png|The Add Role form))
+}}
+
+Similar to the Manage User form, at the top of this activity, there is an Add Role form, and beneath this a Role List. The controls of the Role List operate in much the same fashion as those of the User List described earlier. Clicking on the Edit link of a role brings up a form which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditRole.png|The Edit Role form))
+}}
+
+In the above, we have a Localizer role. We might have created this role, then used the Select Activity dropdown to add all the activities of the User role. A localizer is a person who can localize Yioop to a new language. So we might then want to use the Select dropdown to add Manage Locales to the list of activities. Once we have created a role that we like, we can then assign user&#039;s that role and they will be able to perform all of the activities listed on it. If a user has more than one role, than they can perform an activity as long as it is listed in at least one role.
+
+Groups are collections of users that have access to a group feed and a set of wiki pages. Groups are managed through the Manage Groups activity which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageGroups.png|The Manage Groups form))
+}}
+
+Unlike Manage Users and Manage Roles, the Manage Group activity belongs to the standard User role, allowing any user to create and manage groups. As one can see from the image above The Create/Join Group form takes the name of a group. If you enter a name that currently does not exist the following form will appear:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CreateGroup.png|The Create Group form))
+}}
+
+The user who creates a group is set as the initial group owner.
+
+The &#039;&#039;&#039;Register dropdown&#039;&#039;&#039; says how other users are allowed to join the group: &#039;&#039;&#039;No One&#039;&#039;&#039; means no other user can join the group (you can still invite other users), &#039;&#039;&#039;By Request&#039;&#039;&#039; means that other users can request the group owner to join the group, but that the group is not publicly visible in the browsable group directory; &#039;&#039;&#039;Public Request&#039;&#039;&#039; is the same as By Request, but the group is publicly visible in the browsable group directory;  and &#039;&#039;&#039;Anyone&#039;&#039;&#039; means all users are allowed to join the group and the group appears in the browseable directory of groups. It should be noted that the root account can always join and browse for any group. The root account can also always take over ownership of any group.
+
+The &#039;&#039;&#039;Access dropdown&#039;&#039;&#039; controls how users who belong/subscribe to a group other than the owner can access that group. The possibilities are &#039;&#039;&#039;No Read&#039;&#039;&#039; means that non-members of the group cannot read the group feed or wiki, a non-owner member of the group can read but not write the group news feed and wiki; &#039;&#039;&#039;Read&#039;&#039;&#039; means that a non-member of the group can read the group news feed and the groups wiki page, but non-owners cannot write the feed or wiki; &#039;&#039;&#039;Read Comment&#039;&#039;&#039; means that a non-owner member of the group can read the group feed and wikis and can comment on any existing threads, but cannot start new ones, &#039;&#039;&#039;Read Write&#039;&#039;&#039; means that a non-owner member of the group can start new threads and comment on existing ones in the group feed, but cannot edit the group&#039;s wiki; finally, &#039;&#039;&#039;Read Write Wiki&#039;&#039;&#039; is wiki Read Write except a non-owner member can edit the group&#039;s wiki. The access to a group can be changed by the owner after a group is created. No Read and Read are often suitable if a group&#039;s owner wants to perform some kind of moderation. Read and Read Comment groups are often suitable if someone wants to use a Yioop Group as a blog. Read Write makes sense for a more traditional bulletin board.
+
+The &#039;&#039;&#039;Voting dropdown&#039;&#039;&#039; controls to what degree users can vote on posts. &#039;&#039;&#039;No Voting&#039;&#039;&#039; means group feed posts cannot be voted on; &#039;&#039;&#039;+ Voting&#039;&#039;&#039; means that a post can be voted up but not down; and &#039;&#039;&#039;+/- Voting&#039;&#039;&#039; means a post can be voted up or down. Yioop restricts a user to at most one vote/post.
+
+The &#039;&#039;&#039;Post Lifetime dropdown&#039;&#039;&#039; controls how long a group feed post is retained by the Yioop system before it is automatically deleted. The possible values are &#039;&#039;&#039;Never Expires&#039;&#039;&#039;, &#039;&#039;&#039;One Hour&#039;&#039;&#039;, &#039;&#039;&#039;One Day&#039;&#039;&#039;, or &#039;&#039;&#039;One Month&#039;&#039;&#039;.
+
+A default installation of Yioop has two built-in groups: &#039;&#039;&#039;Public&#039;&#039;&#039; and &#039;&#039;&#039;Help&#039;&#039;&#039; owned by root. Public has Read access and all users automatically subscribed to it and cannot unsubscribe it. It is useful for general announcements and its wiki can be used as part of building a site for Yioop. The Help group&#039;s wiki is used to maintain all the wiki pages related to Yioop&#039;s integrated help system. When a user clicks on the help icon [?], the page that is presented in blue comes from this wiki. This group&#039;s registration is by default by Public Request and its access is Read Write Wiki.
+
+If on the Create/Join Group form, the name of a group entered already exists, but is not joinable, then an error message that the group&#039;s name is in use is displayed. If either anyone can join the group or the group can be joined by request, then that group will be added to the list of subscribed to groups. If membership is by request, then initially in the list of groups it will show up with access Request Join.
+
+Beneath the Create/Join Group form is the Groups List table. This lists all the groups that a user is currently subscribed to:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:GroupsList.png|Groups List Table))
+}}
+
+The controls at the top of this table are similar in functionality to the controls we have already discussed for the User Lists table of Manage Users and the Roles List table of Manage Roles. This table let&#039;s a user manage their existing groups, but does not let a user to see what groups already exist. If one looks back at the Create/Join Groups form though, one can see next to it there is a link &quot;Browse&quot;. Clicking this link takes one to the Discover Groups form and the Not Subscribed to Groups table:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:BrowseGroups.png|The Browse Groups form))
+}}
+
+If a group is subscribable then the Join link in the Actions column of Not Subscribed to Groups table should be clickable. Let&#039;s briefly now consider the other columns of either the Groups List or not Subscribed to Groups table. The Name column gives the name of the group. Group name are unique identifiers for a group on a Yioop system. In the Groups List table the name is clickable and takes you to the group feed for that group. The Owner column gives the username of the owner of the group and beneath this the number of members of the group. If you are the root account or if you are the owner of the group, then this field should be a clickable link that take you to the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:TransferGroup.png|The Transfer Group form))
+}}
+
+that can be used to transfer the ownership of a group. The next two column give the register and access information for the group. If you are the owner of the group these will be dropdowns allow you to change these settings. We have already explained what the Join link does in the actions column. Other links which can appear in the actions column are Unsubscribe, which let&#039;s you leave a group which you have joined but are not the owner of; Delete, which, if you are the owner of a group, let&#039;s you delete the group, its feed, and all its wiki pages; and Edit, which displays the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditGroup.png|The Edit Group form))
+}}
+
+The Register, Access, Voting, Post Lifetime dropdowns lets one modify the registration, group access, voting, and post lifetime properties for the group which we have already described before. Next to the Members table header is a link with the number of current memebers of the group. Clicking this link expands this area into a listing of users in the group as seen above. This allows one to change access of different members to the group, for example, approving a join request or banning a user. It also allows one to delete a member from a group. Beneath the user listing is a link which can take one to a form to invite more users.
+
+===Feeds and Wikis===
+
+The initial screen of the Feeds and Wikis page has an integrated list of all the recent posts to any groups to which a user subscribes:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:FeedsWikis.png|The Main Feeds and Wiki Page))
+}}
+
+The arrow icon next to the feed allow one to collapse the Activities element to free up screen real estate for the feed. Once collapsed, an arrow icon pointing the opposite direction will appear to let you show the Activities element again. Next to the Group Activity header at the top of the page are two icons:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:GroupingIcons.png|The Group Icons))
+}}
+
+These control whether the Feed View above has posts in order of time or if posts are arranged by group as below:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:FeedsWikis2.png|The Grouped Feeds and Wiki Page))
+}}
+
+
+Going back to the original feed view above, notice posts are displayed with the most recent post at the top. If there has been very recent activity (within the last five minute), this page will refresh every 15 seconds for up to twenty minutes, checking for new posts. Each post has a title which links to a thread for that post. This is followed by the time when the post first appeared and the group title. This title, although gray, can be clicked to go to that particular group feed. If the user has the ability to start new threads in a group and one is in single feed mode, an icon with a plus-sign and a pencil appears next ot the group name, which when clicked allows a user to start a new thread in that group. Beneath the title of the post, is the username of the person who posted. Again, this is clickable and will take you to a page of all recent posts of that person. Beneath the username, is the content of the post. On the opposite side of the post box may appear links to Edit or X (delete) the post, as well as a link to comment on a post. The Edit and X delete links only appear if you are the poster or the owner of the group the post was made in. The Comment link let&#039;s you make a follow up post to that particular thread in that group. For example, for the &quot;I just learned an interesting thing!&quot; post above, the current user could start a new thread by clicking the plus-pencil icon or comment on this post by clicking the Comment link. If you are not the owner of a group then the Comment and Start a New Thread links only appear if you have the necessary privileges on that group.
+
+The image below shows what happens when one clicks on a group link, in this case, the Chris Blog link.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SingleGroupFeed.png|A Single Group Feed))
+}}
+
+On the opposite side of the screen there is a link My Group Feeds, which let&#039;s one go back to the previous screen. At the top of this screen is clickable title of the group, in this case, Chris Blog, this takes one to the Manage Groups activity where properties of this group could be examined. Next we see a toggle between Feed and Wiki. Currently, on group feed page, clicking Wiki would take one to the Main page of the wiki. Posts in the single group view are grouped by thread with the thread containing the most recent activity at the top. Notice next to each thread link there is a count of the number of posts to that thread. The content of the thread post is the content of the starting post to the thread, to see latter comments one has to click the thread link. There is now a Start New Thread button at the top of the single group feed as it is clear which group the thread will be started in. Clicking this button would reveal the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:StartNewThread.png|Starting a new thread from a group feed))
+}}
+
+Adding a Subject and Post to this form and clicking save would start a new thread. Posts can make use of [[Syntax|Yioop&#039;s Wiki Syntax]] to achieve effects like bolding text, etc. The icons above the text area can be used to quickly add this mark-up to selected text. Although the icons are relatively standard, hovering over an icon will display a tooltip which should aid in figuring out what it does. Beneath the text area is a dark gray area with instructions on how to add resources to a page such as images, videos, or other documents. For images and videos these will appear embedded in the text of the post when it is saved, for other media a link to the resource will appear when the source is saved. The size allowed for uploaded media is determined by your php instances php.ini configuration file&#039;s values for post_max_size and upload_max_filesize. Yioop uses the value of the constant MAX_VIDEO_CONVERT_SIZE set in a configs/local_config.php or from configs/config.php to determine if a video should be automatically converted to the two web friendly formats mp4 and webm. This conversion only happens if, in addition, [[http://ffmpeg.org/|FFMPEG]] has been installed and the path to it has been given as a constant FFMPEG in either a configs/local_config.php or in configs/config.php.
+
+Clicking the comment link of any existing thread reveals the following form to add a comment to that thread:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AddComment.png|Adding a comment to an existing thread))
+}}
+
+Below we see an example of the feed page we get after clicking on the My First Blog Post thread in the Chris Blog group:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:FeedThread.png|A Group Feed Thread))
+}}
+
+Since we are now within a single thread, there is no Start New Thread button at the top. Instead, we have a Comment button at the top and bottom of the page. The starting post of the thread is listed first and ending most recent post is listed last (paging buttons both on the group and single thread page, let one jump to the last post). The next image below is an example of the feed page one gets when one clicks on a username link, in this case, cpollett:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:UserFeed.png|User Feed))
+}}
+
+When a user starts a new thread or comments to an existing thread, several people will be notified via email provided they have their email address configured properly. For a new thread, the groups owner will be notified if they themselves weren&#039;t the ones starting the thread. If it was in fact the group&#039;s owner that starts a thread, then everyone who belongs to the group will be notified. For a comment to a thread, excluding the commenter, the group&#039;s owner, the person who started the thread, and anyone else who has commented on the thread would be notified via email. Note for a comment by the group&#039;s owner, it is still only the people participating in the thread who are notified.
+
+Single Group, Threads, and User feeds of groups which anyone can join (i.e., public groups) all have RSS feeds which could be used in a news aggregator or crawled by Yioop. To see what the link would be for the item you are interested in, first collapse the activity element if its not collapsed (i.e., click the [&lt;&lt;] link at the top of the page). Take the URL in the browser in the url bar, and add &amp;f=rss to it. It is okay to remove the YIOOP_TOKEN= variable from this URL. Doing this for the cpollett user feed, one gets the url:
+ http://www.yioop.com/?c=group&amp;a=groupFeeds&amp;just_user_id=4&amp;f=rss
+whose RSS feed looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:UserRssFeed.png|User Rss Feed))
+}}
+
+As we mentioned above when we described the single group feed page, if we click on the Wiki link at the top we go to the Main wiki page of the group, where we could read that page. If the Main Wiki page (or for that if matter if we go to any wiki page that) does not exist, then we would get like the following:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:NonexistantPage.png|Screenshot of going to location of a non-existant wiki page))
+}}
+
+This page might be slightly different depending on whether the user has write access to the given group. The [[Syntax|Wiki Syntax Guide]] link in the above takes one to a page that describes how to write wiki pages. The Edit link referred to in the above looks slightly different and is in a slightly different location depending on whether we are viewing the page with the Activity element collapsed or not. If the Activity element is not collapsed then it appears one of three links within the current activity as:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AdminHeading.png|Read Edit Page Headings on Admin view))
+}}
+
+On the other hand, if the Activity element is collapsed, then it appear on the navigation bar at the top of the screen as:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:GroupHeading.png|Read Edit Page Headings on Group view))
+}}
+
+Notice besides editing a page there is a link to read the page and a link Pages. The Pages link takes us to a screen where we can see all the pages that have been created for a group:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WikiPageList.png|List of Groups Wiki Pages))
+}}
+
+The search bar can be used to search within the titles of wiki pages of this group for a particular page. Suppose now we clicked on Test Page in the above, then we would go to that page initially in Read view:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WikiPage.png|Example Viewing a Wiki Page))
+}}
+
+If we have write access, and we click the Edit link for this page, we work see the following edit page form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditWikiPage.png|Editing a Wiki Page))
+}}
+
+This page is written using Wiki mark-up whose syntax which as we mentioned above can be
+found in the [[Syntax|Yioop Wiki Syntax Guide]]. So for example, the heading at the top of the page is written as
+&lt;nowiki&gt;
+ =Test Page=
+&lt;/nowiki&gt;
+in this mark-up. The buttons above the textarea can help you insert the mark-up you need without having to remember it. Also, as mentioned above the dark gray area below the textarea describes how to associate images, video, and other media to the document. Unlike with posts, a complete list of currently associated media can be found at the bottom of the document under the &#039;&#039;&#039;Page Resources&#039;&#039;&#039; heading. Links to Rename, Add a resource to the page, and Delete each resource can also be found here. Clicking on the icon next to a resource let&#039;s you look at the resource on a page by itself. This icon will be a thumbnail of the resource for images and videos. In the case of videos, the thumbnail is only generated if the FFMPEG software mentioned earlier is installed and the FFMPEG constant is defined. In this case, as with posts, if the video is less than MAX_VIDEO_CONVERT_SIZE, Yioop will automatically try to convert it to mp4 and webm so that it can be streamed by Yioop using HTTP pseudo-streaming.
+
+Clicking the &#039;&#039;&#039;Settings Link&#039;&#039;&#039; next to the wiki page name reveals the following additional form elements:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WikiPageSettings.png|Wiki Page Settings))
+}}
+
+The meaning of these various settings is described in [[Syntax#Page%20Settings,%20Page%20Type|Page Settings, Page Type]] section of the Yioop Wiki Syntax Guide.
+
+
+The &#039;&#039;&#039;Discuss link&#039;&#039;&#039; takes you to a thread in the current group where the contents of the wiki page should be discussed. Underneath the textarea above is a Save button. Every time one clicks the save button a new version of the page is saved, but the old one is not discarded. We can use the Edit Reason field to provide a reason for the changes between versions. When we read a page it is the most recent version that is displayed. However, by clicking the History link above we can see a history of prior version. For example:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:HistoryPage.png|An example History Page of a Wiki Page))
+}}
+
+The Revert links on this history page can be used to change the current wiki page to a prior version. The time link for each version can be clicked to view that prior version without reverting. The First and Second links next to a version can be used to set either the first field or second field at the top of the history page which is labelled Difference: . Clicking the Go button for the Difference form computes the change set between two selected versions of a wiki document. This might look like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:DiffPage.png|An example diff page of two versions of a Wiki Page))
+}}
+
+This completes the description of group feeds and wiki pages.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Crawling and Customizing Results==
+===Performing and Managing Crawls===
+
+The Manage Crawl activity in Yioop looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageCrawl.png|Manage Crawl Form))
+}}
+
+This activity will actually list slightly different kinds of peak memory usages depending on whether the queue_server&#039;s are run from a terminal or through the web interface. The screenshot above was done when a single queue_server was being run from the terminal. The first form in this activity allows you to name and start a new web crawl. Next to the Start New Crawl button is an Options link, which allows one to set the parameters under which the crawl will execute. We will return to what the Options page looks like in a moment. When a crawl is executing, under the start crawl form appears statistics about the crawl as well as a Stop Crawl button. Crawling continues until this Stop Crawl button is pressed or until no new sites can be found. As a crawl occurs, a sequence of IndexShard&#039;s are written. These keep track of which words appear in which documents for groups of 50,000 or so documents. In addition an IndexDictionary of which words appear in which shard is written to a separate folder and subfolders. When the Stop button is clicked the &quot;tiers&quot; of data in this dictionary need to be logarithmically merged, this process can take a couple of minutes, so after clicking stop do not kill the queue_server (if you were going to) until after it says waiting for messages again. Beneath this stop button line, is a link which allows you to change the crawl options of the currently active crawl. Changing the options on an active crawl may take some time to fully take effect as the currently processing queue of urls needs to flush. At the bottom of the page is a table listing previously run crawls. Next to each previously run crawl are three links. The first link lets you resume this crawl, if this is possible, and say Closed otherwise. Resume will cause Yioop to look for unprocessed fetcher data regarding that crawl, and try to load that into a fresh priority queue of to crawl urls. If it can do this, crawling would continue. The second link let&#039;s you set this crawl&#039;s result as the default index. In the above picture there were only two saved crawls, the second of which was set as the default index. When someone comes to your Yioop installation and does not adjust their settings, the default index is used to compute search results. The final link allows one to Delete the crawl. For both resuming a crawl and deleting a crawl, it might take a little while before you see the process being reflected in the display. This is because communication might need to be done with the various fetchers, and because the on screen display refreshes only every 20 seconds or so.
+
+{{id=&#039;prerequisites&#039;
+====Prerequisites for Crawling====
+}}
+
+Before you can start a new crawl, you need to run at least one queue_server.php script and you need to run at least one fetcher.php script. These can be run either from the same Yioop installation or from separate machines or folder with Yioop installed. Each installation of Yioop that is going to participate in a crawl should be configured with the same name server and server key. Running these scripts can be done either via the command line or through a web interface. As described in the Requirements section you might need to do some additional initial set up if you want to take the web interface approach. On the other hand, the command-line approach only works if you are using only one queue server. You can still have more than one fetcher, but the crawl speed in this case probably won&#039;t go faster after ten to twelve fetchers. Also, in the command-line approach the queue server and name server should be the same instance of Yioop. In the remainder of this section we describe how to start the queue_server.php and fetcher.php scripts via the command line; the GUI for Managing Machines and Servers section describes how to do it via a web interface. To begin open a command shell and cd into the bin subfolder of the Yioop folder. To start a queue_server type:
+
+ php queue_server.php terminal
+
+To start a fetcher type:
+
+ php fetcher.php terminal
+
+The above lines are under the assumption that the path to php has been properly set in your PATH environment variable. If this is not the case, you would need to type the path to php followed by php then the rest of the line. If you want to stop these programs after starting them simply type CTRL-C. Assuming you have done the additional configuration mentioned above that are needed for the GUI approach managing these programs, it is also possible to run the queue_server and fetcher programs as daemons. To do this one could type respectively:
+
+ php queue_server.php start
+
+or
+
+ php fetcher.php start
+
+When run as a daemon, messages from these programs are written into log files in the log subfolder of the WORK_DIRECTORY folder. To stop these daemons one types:
+
+ php queue_server.php stop
+
+or
+
+ php fetcher.php stop
+
+Once the queue_server is running and at least one fetcher is running, the Start New Crawl button should work to commence a crawl. Again, it will up to a minute or so for information about a running crawl to show up in the Currently Processing fieldset. During a crawl, it is possible for a fetcher or the queue server to crash. This usually occurs due to lack of memory for one of these programs. It also can sometimes happen for a fetcher due to flakiness in multi-curl. If this occurs simply restart the fetcher in question and the crawl can continue. A queue server crash should be much rarer. If it occurs, all of the urls to crawl that reside in memory will be lost. To continue crawling, you would need to resume the crawl through the web interface. If there are no unprocessed schedules for the given crawl (which usually means you haven&#039;t been crawling very long), it is not possible to resume the crawl. We have now described what is necessary to perform a crawl we now return to how to set the options for how the crawl is conducted.
+
+====Common Crawl and Search Configurations====
+
+When testing Yioop, it is quite common just to have one instance of the fetcher and one instance of the queue_server running, both on the same machine and same installation of Yioop. In this subsection we wish to briefly describe some other configurations which are possible and also some configs/config.php configurations that can affect the crawl and search speed. The most obvious config.php setting which can affect the crawl speed is NUM_MULTI_CURL_PAGES. A fetcher when performing downloads, opens this many simultaneous connections, gets the pages corresponding to them, processes them, then proceeds to download the next batch of NUM_MULTI_CURL_PAGES pages. Yioop uses the fact that there are gaps in this loop where no downloading is being done to ensure robots.txt Crawl-delay directives are being honored (a Crawl-delayed host will only be scheduled to at most one fetcher at a time). The downside of this is that your internet connection might not be used to its fullest ability to download pages. Thus, it can make sense rather than increasing NUM_MULTI_CURL_PAGES, to run multiple copies of the Yioop fetcher on a machine. To do this one can either install the Yioop software multiple times or give an instance number when one starts a fetcher. For example:
+
+ php fetcher.php start 5
+
+would start instance 5 of the fetcher program.
+
+Once a crawl is complete, one can see its contents in the folder WORK DIRECTORY/cache/IndexDataUNIX_TIMESTAMP. In the multi-queue server setting each queue server machine would have such a folder containing the data for the hosts that queue server crawled. Putting the WORK_DIRECTORY on a solid-state drive can, as you might expect, greatly speed-up how fast search results will be served. Unfortunately, if a given queue server is storing ten million or so pages, the corresponding IndexDataUNIX_TIMESTAMP folder might be around 200 GB. Two main sub-folders of IndexDataUNIX_TIMESTAMP largely determine the search performance of Yioop handling queries from a crawl. These are the dictionary subfolder and the posting_doc_shards subfolder, where the former has the greater influence. For the ten million page situation these might be 5GB and 30GB respectively. It is completely possible to copy these subfolders to a SSD and use symlinks to them under the original crawl directory to enhance Yioop&#039;s search performance.
+
+====Specifying Crawl Options and Modifying Options of the Active Crawl====
+
+As we pointed out above, next to the Start Crawl button is an Options link. Clicking on this link, let&#039;s you set various aspect of how the next crawl should be conducted. If there is a currently processing crawl, there will be an options link under its stop button. Both of these links lead to similar pages, however, for an active crawl fewer parameters can be changed. So we will only describe the first link. We do mention here though that under the active crawl options page it is possible to inject new seed urls into the crawl as it is progressing. In the case of clicking the Option link next to the start button, the user should be taken to an activity screen which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WebCrawlOptions.png|Web Crawl Options Form))
+}}
+
+The Back link in the corner returns one to the previous activity.
+
+There are two kinds of crawls that can be performed by Yioop either a crawl of sites on the web or a crawl of data that has been previously stored in a supported archive format such as data that was crawled by Versions 0.66 and above of Yioop, data coming from a database or text archive via Yioop&#039;s importing methods described below, [[http://www.archive.org/web/researcher/ArcFileFormat.php|Internet Archive ARC file]], [[http://archive-access.sourceforge.net/warc/|ISO WARC Files]], [[http://en.wikipedia.org/wiki/Wikipedia:Database_download|MediaWiki xml dump]], [[http://rdf.dmoz.org/|Open Directory Project RDF file]]. In the next subsection, we describe new web crawls and then return to archive crawls subsection after that. Finally, we have a short section on some advanced crawl options which can only be set in config.php or local_config.php. You will probably not need these features but we mention them for completeness
+
+=====Web Crawl Options=====
+
+On the web crawl tab, the first form field, &quot;Get Crawl Options From&quot;, allows one to read in crawl options either from the default_crawl.ini file or from the crawl options used in a previous crawl. The rest of the form allows the user to change the existing crawl options. The second form field is labeled Crawl Order. This can be set to either Bread First or Page Importance. It specifies the order in which pages will be crawled. In breadth first crawling, roughly all the seeds sites are visited first, followed by sites linked directly from seed sites, followed by sites linked directly from sites linked directly from seed sites, etc. Page Importance is our modification of [ [[Documentation#APC2003|APC2003]]]. In this order, each seed sites starts with a certain quantity of money. When a site is crawled it distributes its money equally amongst sites it links to. When picking sites to crawl next, one chooses those that currently have the most money. Additional rules are added to handle things like the fact that some sites might have no outgoing links. Also, in our set-up we don&#039;t revisit already seen sites. To handle these situation we take a different tack from the original paper. This crawl order roughly approximates crawling according to page rank.
+
+The next checkbox is labelled Restrict Sites by Url. If it is checked then a textarea with label Allowed To Crawl Sites appears. If one checks Restricts Sites by Url then only pages on those sites and domains listed in the Allowed To Crawl Sites textarea can be crawled. We will say how to specify domains and sites in a moment, first let&#039;s discuss the last two textareas on the Options form. The Disallowed sites textarea allows you to specify sites that you do not want the crawler to crawl under any circumstance. There are many reasons you might not want a crawler to crawl a site. For instance, some sites might not have a good robots.txt file, but will ban you from interacting with their site if they get too much traffic from you.
+
+Just above the Seed Sites textarea are two links &quot;Add User Suggest Data&quot;. If on the Server Settings activity Account Registration is set to anything other than Disable Registration, it is possible for a search site user to suggest urls to crawl. This can be done by going to the [[Documentation#Search%20Tools%20Page|Search Tools Page]] and clicking on the Suggest a Url link. Suggested links are stored in WORK_DIRECTORY/data/suggest_url.txt. Clicking Add User Suggest Data adds any suggested urls in this file into the Seed Site textarea, then deletes the contents of this file. The suggested urls which are not already in the seed site list are added after comment lines (lines starting with #) which give the time at which the urls were added. Adding Suggest data can be done either for new crawls or to inject urls into currently running crawls.
+The Seed sites textarea allows you to specify a list of urls that the crawl should start from. The crawl will begin using these urls. This list can include &quot;.onion&quot; urls if you want to crawl [[http://en.wikipedia.org/wiki/Tor_network|TOR networks]].
+
+The format for sites, domains, and urls are the same for each of these textareas, except that the Seed site area can only take urls (or urls and title/descriptions) and in the Disallowed Sites/Sites with Quotas one can give a url followed by #. Otherwise, in this common format, there should be one site, url, or domain per line. You should not separate sites and domains with commas or other punctuation. White space is ignored. A domain can be specified as:
+ domain:.sjsu.edu
+Urls like:
+ http://www.sjsu.edu/
+ https://www.sjsu.edu/gape/
+ http://bob.cs.sjsu.edu/index.html
+would all fall under this domain. The word domain above is a slight misnomer as domain:sjsu.edu, without the leading period, also matches a site like http://mysjsu.edu/.  A site can be specified as scheme://domain/path. Currently, Yioop recognizes the three schemas: http, https, and gopher (an older web protocol). For example, https://www.somewhere.com/foo/ . Such a site includes https://www.somewhere.com/foo/anything_more . Yioop also recognizes * and $ within urls. So http://my.site.com/*/*/ would match http://my.site.com/subdir1/subdir2/rest and http://my.site.com/*/*/$ would require the last symbol in the url to be &#039;/&#039;. This kind of pattern matching can be useful in the to restrict the depth of a crawl to within a url to a certain fixed depth -- you can allow crawling a site, but disallow the downloading of pages with more than a certain number of `/&#039; in them.
+
+In the Disallowed Sites/Sites with Quotas, a number after a # sign indicates that at most that many pages should be downloaded from that site in any given hour. For example,
+ http://www.ucanbuyart.com/#100
+indicates that at most 100 pages are to be downloaded from http://www.ucanbuyart.com/ per hour.
+
+In the seed site area one can specify title and page descriptions for pages that Yioop would otherwise be forbidden to crawl by the robots.txt file. For example,
+ http://www.facebook.com/###!Facebook###!A%20famous%20social%20media%20site
+tells Yioop to generate a placeholder page for http://www.facebook.com/ with title &quot;Facebook&quot; and description &quot;A famous social media site&quot; rather than to attempt to download the page. The [[Documentation#Results%20Editor|Results Editor]] activity can only be used to affect pages which are in a Yioop index. This technique allows one to add arbitrary pages to the index.
+
+When configuring a new instance of Yioop the file default_crawl.ini is copied to WORK_DIRECTORY/crawl.ini and contains the initial settings for the Options form.
+
+{{id=&quot;archive&quot;
+=====Archive Crawl Options=====
+}}
+
+We now consider how to do crawls of previously obtained archives. From the initial crawl options screen, clicking on the Archive Crawl tab gives one the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ArchiveCrawlOptions.png|Archive Crawl Options Form))
+}}
+
+The dropdown lists all previously done crawls that are available for recrawl.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ArchiveCrawlDropDown.png|Archive Crawl dropdown))
+}}
+
+These include both previously done Yioop crawls, previously down recrawls (prefixed with RECRAWL::), Yioop Crawl Mixes (prefixed with MIX::), and crawls of other file formats such as: arc, warc, database data, MediaWiki XML, and ODP RDF, which have been appropriately prepared in the PROFILE_DIR/cache folder (prefixed with ARCFILE::). In addition, Yioop also has a generic text file archive importer (also, prefixed with ARCFILE::).
+
+You might want to re-crawl an existing Yioop crawl if you want to add new meta-words, new cache page links, extract fields in a different manner, or if you are migrating a crawl from an older version of Yioop for which the index isn&#039;t readable by your newer version of Yioop. For similar reasons, you might want to recrawl a previously re-crawled crawl. When you archive crawl a crawl mix, Yioop does a search on the keyword site:any using the crawl mix in question. The results are then indexed into a new archive. This new archive might have considerably better query performance (in terms of speed) as compared to queries performed on the original crawl mix. How to make a crawl mix is described in the [[Documentation#Mixing%20Crawl%20Indexes|Crawl Mixes]] section. You might want to do an archive crawl of other file formats if you want Yioop to be able to provide search results of their content. Once you have selected the archive you want to crawl, you can add meta words as discussed in the Crawl Time Tab Page Rule portion of the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] section. Afterwards,go back to the Create Crawl screen to start your crawl. As with a Web Crawl, for an archive crawl you need both the queue_server running and a least one fetcher running to perform a crawl.
+
+To re-crawl a previously created web archive that was made using several fetchers, each of the fetchers that was used in the creation process should be running. This is because the data used in the recrawl will come locally from the machine of that fetcher. For other kinds of archive crawls and mix crawls, which fetchers one uses, doesn&#039;t matter because archive crawl data comes through the name server. You might also notice that the number of pages in a web archive re-crawl is actually larger than the initial crawl. This can happen because during the initial crawl data was stored in the fetcher&#039;s archive bundle and a partial index of this data sent to appropriate queue_servers but was not yet processed by these queue servers. So it was waiting in a schedules folder to be processed in the event the crawl was resumed.
+
+To get Yioop to detect arc, database data, MediaWiki, ODP RDF, or generic text archive files you need to create an PROFILE_DIR/cache/archives folder on the name server machine. Yioop checks subfolders of this for files with the name arc_description.ini. For example, to do a Wikimedia archive crawl, one could make a subfolder PROFILE_DIR/cache/archives/my_wiki_media_files and put in it a file arc_description.ini in the format to be discussed in a moment. In addition to the arc_description.ini, you would also put in this folder all the archive files (or links to them) that you would like to index. When indexing, Yioop will process each archive file in turn. Returning to the arc_description.ini file, arc_description.ini&#039;s contents are used to give a description of the archive crawl that will be displayed in the archive dropdown as well as to specify the kind of archives the folder contains and how to extract it. An example arc_description.ini for MediaWiki dumps might look like:
+
+ arc_type = &#039;MediaWikiArchiveBundle&#039;;
+ description = &#039;English Wikipedia 2012&#039;;
+
+In the Archive Crawl dropdown the description will appear with the prefix ARCFILE:: and you can then select it as the source to crawl. Currently, the supported arc_types are: ArcArchiveBundle, DatabaseBundle, MediaWikiArchiveBundle, OdpRdfArchiveBundle, TextArchiveBundle, and WarcArchiveBundle. For the ArcArchiveBundle, OdpRdfArchiveBundle, MediaWikiArchiveBundle, WarcArchiveBundle arc_types, generally a two line arc_description.ini file like above suffices. We now describe how to import from the other kind of formats in a little more detail. In general, the arc_description.ini will tell Yioop how to get string items (in a associative array with a minimal amount of additional information) from the archive in question. Processing on these string items can then be controlled using Page Rules, described in the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] section.
+
+An example arc_description.ini where the arc_type is DatabaseBundle might be:
+ arc_type = &#039;DatabaseBundle&#039;;
+ description = &#039;DB Records&#039;;
+ dbms = &quot;mysql&quot;;
+ db_host = &quot;localhost&quot;;
+ db_name = &quot;MYGREATDB&quot;;
+ db_user = &quot;someone&quot;;
+ db_password = &quot;secret&quot;;
+ encoding = &quot;UTF-8&quot;;
+ sql = &quot;SELECT MYCOL1, MYCOL2 FROM MYTABLE1 M1, MYTABLE2 M2 WHERE M1.FOO=M2.BAR&quot;;
+ field_value_separator = &#039;|&#039;;
+ column_separator = &#039;##&#039;;
+
+Here is a specific example that gets the rows out of the TRANSLATION table of Yioop where the database was stored in a Postgres DBMS. In the comments I indicate how to alter it for other DBMS&#039;s.
+
+ arc_type = &#039;DatabaseBundle&#039;;
+ description = &#039;DB Records&#039;;
+ ;sqlite3 specific
+ ;dbms =&quot;sqlite3&quot;;
+ ;mysql specific
+ ;dbms = &quot;mysql&quot;;
+ ;db_host = &quot;localhost&quot;;
+ ;db_user = &quot;root&quot;;
+ ;db_password = &quot;&quot;;
+ dbms = &quot;pdo&quot;;
+ ;below is for postgres; similar if want db2 or oracle
+ db_host = &quot;pgsql:host=localhost;port=5432;dbname=seek_quarry&quot;
+ db_name = &quot;seek_quarry&quot;;
+ db_user = &quot;cpollett&quot;;
+ db_password = &quot;&quot;;
+ encoding = &quot;UTF-8&quot;;
+ sql = &quot;SELECT * from TRANSLATION&quot;;
+ field_value_separator = &#039;|&#039;;
+ column_separator = &#039;##&#039;;
+
+Possible values for dbms are pdo, mysql, sqlite3. If pdo is chosen, then db_host should be a PHP DSN specifying which DBMS driver to use. db_name is the name of the database you would like to connect to, db_user is the database username, db_password is the password for that user, and encoding is the character set of rows that the database query will return.
+
+The sql variable is used to give a query whose result rows will be the items indexed by Yioop. Yioop indexes string &quot;pages&quot;, so to make these rows into a string each column result will be made into a string: field field_value_separator value. Here field is the name of the column, value is the value for that column in the given result row. Columns are concatenated together separated by the value of of column_separator. The resulting string is then sent to Yioop&#039;s TextProcessor page processor.
+
+We next give a few examples of arc_description.ini files where the arc_type is TextArchiveBundle. First, suppose we wanted to index access log file records that look like:
+ 127.0.0.1 - - [21/Dec/2012:09:03:01 -0800] &quot;POST /git/yioop2/ HTTP/1.1&quot; 200 - \
+     &quot;-&quot; &quot;Mozilla/5.0 (compatible; YioopBot; \
+     +http://localhost/git/yioop/bot.php)&quot;
+Here each record is delimited by a newline and the character encoding is UTF-8. The records are stored in files with the extension .log and these files are uncompressed. We then might use the following arc_description.ini file:
+ arc_type = &#039;TextArchiveBundle&#039;;
+ description = &#039;Log Files&#039;;
+ compression = &#039;plain&#039;;
+ file_extension = &#039;log&#039;;
+ end_delimiter = &quot;\n&quot;;
+ encoding = &quot;UTF-8&quot;;
+In addition to compression = &#039;plain&#039;, Yioop supports gzip and bzip2. The end_delimeter is a regular expression indicating how to know when a record ends. To process a TextArchiveBundle Yioop needs either an end_delimeter or a start_delimiter (or both) to be specified. As another example, for a mail.log file with entries of the form:
+ From pollett@mathcs.sjsu.edu Wed Aug  7 10:59:04 2002 -0700
+ Date: Wed, 7 Aug 2002 10:59:04 -0700 (PDT)
+ From: Chris Pollett &lt;pollett@mathcs.sjsu.edu&gt;
+ X-Sender: pollett@eniac.cs.sjsu.edu
+ To: John Doe &lt;johndoe@mail.com&gt;
+ Subject: Re: a message
+ In-Reply-To: &lt;5.1.0.14.0.20020723093456.00ac9c00@mail.com&gt;
+ Message-ID: &lt;Pine.GSO.4.05.10208071057420.9463-100000@eniac.cs.sjsu.edu&gt;
+ MIME-Version: 1.0
+ Content-Type: TEXT/PLAIN; charset=US-ASCII
+ Status: O
+ X-Status:
+ X-Keywords:
+ X-UID: 17
+
+ Hi John,
+
+ I got your mail.
+
+ Chris
+The following might be used:
+
+ arc_type = &#039;TextArchiveBundle&#039;;
+ description = &#039;Mail Logs&#039;;
+ compression = &#039;plain&#039;;
+ file_extension = &#039;log&#039;;
+ start_delimiter = &quot;\n\nFrom\s&quot;;
+ encoding = &quot;ASCII&quot;;
+
+Notice here we are splitting records using a start delimeter. Also, we have chosen ASCII as the character encoding. As a final example, we show how to import tar gzip files of Usenet records as found, in the [[http://archive.org/details/utzoo-wiseman-usenet-archive|UTzoo Usenet Archive 1981-1991]]. Further discussion on how to process this collection is given in the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] section.
+
+ arc_type = &#039;TextArchiveBundle&#039;;
+ description = &#039;Utzoo Usenet Archive&#039;;
+ compression = &#039;gzip&#039;;
+ file_extension = &#039;tgz&#039;;
+ start_delimiter = &quot;\0\0\0\0Path:&quot;;
+ end_delimiter = &quot;\n\0\0\0\0&quot;;
+ encoding = &quot;ASCII&quot;;
+
+Notice in the above we set the compression to be gzip. Then we have Yioop act on the raw tar file. In tar files, content objects are separated by long paddings of null&#039;s. Usenet posts begin with Path, so to keep things simple we grab records which begin with a sequence of null&#039;s the Path and end with another sequence of null&#039;s.
+
+As a final reminder for this section, remember that, in addition, to the arc_description.ini file, the subfolder should also contain instances of the files in question that you would like to archive crawl. So for arc files, these would be files of extension .arc.gz; for MediaWiki, files of extension .xml.bz2; and for ODP-RDF, files of extension .rdf.u8.gz .
+Crawl Options of config.php or local_config.php
+
+There are a couple of flags which can be set in the config.php or in a local_config.php file that affect web crawling which we now mention for completeness. As was mentioned before, when Yioop is crawling it makes use of Etag: and Expires: HTTP headers received during web page download to determine when a page can be recrawled. This assumes one has not completely turned off recrawling under the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Indexing and Search Options]] activity. To turn Etag and Expires checking off, one can add to a local_config.php file the line:
+
+define(&quot;USE_ETAG_EXPIRES&quot;, false);
+
+
+Yioop can be run using the [[https://github.com/facebook/hhvm/|Hip Hop Virtual Machine from FaceBook]]. This will tend to make Yioop run faster and use less memory than running it under the standard PHP interpreter. Hip Hop can be used on various Linux flavors and to some degree runs under OSX (the queue server and fetcher will run, but the web app doesn&#039;t). If you want to use the Hip Hop on Mac OSX, and if you install it via Homebrew, then you will need to set a force variable and set the path for Hip Hop in your local_config.php file with lines like:
+ define(&#039;FORCE_HHVM&#039;, true);
+ define(&#039;HHVM_PATH&#039;, &#039;/usr/local/bin&#039;);
+The above lines are only needed on OSX to run Hip Hop.
+
+[[Documentation#contents|Return to table of contents]]
+
+===Mixing Crawl Indexes===
+
+Once you have performed a few crawls with Yioop, you can use the Mix Crawls activity to create mixture of your crawls. This activity is available to users who have either Admin role or just the standard User role. This section describes how to create crawl mixes which are processed when a query comes in to Yioop. Once one has created such a crawl mix, an admin user can make a new index which consists of results of the crawl mix (&quot;materialize it&quot;) by doing an archive crawl of the crawl mix. The [[Documentation#archive|Archive Crawl Options]] subsection has more details on how to do this latter operation. The main Mix Crawls activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageMixes.png|The Manage Mixes form))
+}}
+
+The first form allows you to name and create a new crawl mixture. Clicking &quot;Create&quot; sends you to a second page where you can provide information about how the mixture should be built. Beneath the Create mix form is a table listing all the previously created crawl mixes. Above this listing, but below the Create form is a standard set of nav elements for selecting which mixes will be displayed in this table. A Crawl mix is &quot;owned&quot; by the user who creates that mix. The table only lists crawl mixes &quot;owned&quot; by the user. The first column has the name of the mix, the second column says how the mix is built out of component crawls, and the actions columns allows you to edit the mix, set it as the default index for Yioop search results, or delete the mix. You can also append &quot;m:name+of+mix&quot; or &quot;mix:name+of+mix&quot; to a query to use that quiz without having to set it as the index. When you create a new mix, and are logged in so Yioop knows the mix belongs to you, your mix will also show up on the Settings page. The &quot;Share&quot; column pops a link where you can share a crawl mix with a Yioop Group. This will post a message with a link to that group so that others can import your mix into their lists of mixes. Creating a new mix or editing an existing mix sends you to a second page:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditMix.png|The Edit Mixes form))
+}}
+
+Using the &quot;Back&quot; link on this page will take you to the prior screen. The first text field on the edit page lets you rename your mix if you so desire. Beneath this is an &quot;Add Groups&quot; button. A group is a weighted list of crawls. If only one group were present, then search results would come from any crawl listed for this group. A given result&#039;s score would be the weighted sum of the scores of the crawls in the group it appears in. Search results are displayed in descending order according to this total score. If more that one group is present then the number of results field for that group determines how many of the displayed results should come from that group. For the Crawl Mix displayed above, there are three groups: The first group is used to display the first result, the second group is used to display the second result, the last group is used to display any remaining search results.
+
+The UI for groups works as follows: The top row has three columns. To add new components to a group use the dropdown in the first column. The second column controls for how many results the particular crawl group should be used. Different groups results are presented in the order they appear in the crawl mix. The last group is always used to display any remaining results for a search. The delete group link in the third column can be used to delete a group. Beneath the first row of a group, there is one row for each crawl that belongs to the group. The first link for a crawl says how its scores should be weighted in the search results for that group. The second column is the name of the crawl. The third column is a space separated list of words to add to the query when obtaining results for that crawl. So for example, in the first group above, there are two indexes which will be unioned: Default Crawl with a weight of 1, and CanCrawl Test with a weight of 2. For the Default Crawl we inject two keywords media:text and Canada to the query we get from the user. media:text means we will get whatever results from this crawl that consisted of text rather than image pages. Keywords can be used to make a particular component of a crawl mix behave in a conditional many by using the &quot;if:&quot; meta word described in the search and user interface section. The last link in a crawl row allows you to delete a crawl from a crawl group. For changes on this page to take effect, the &quot;Save&quot; button beneath this dropdown must be clicked.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Classifying Web Pages===
+
+Sometimes searching for text that occurs within a page isn&#039;t enough to find what one is looking for. For example, the relevant set of documents may have many terms in common, with only a small subset showing up on any particular page, so that one would have to search for many disjoint terms in order to find all relevant pages. Or one may not know which terms are relevant, making it hard to formulate an appropriate query. Or the relevant documents may share many key terms with irrelevant documents, making it difficult to formulate a query that fetches one but not the other. Under these circumstances (among others), it would be useful to have meta words already associated with the relevant documents, so that one could just search for the meta word. The Classifiers activity provides a way to train classifiers that recognize classes of documents; these classifiers can then be used during a crawl to add appropriate meta words to pages determined to belong to one or more classes.
+
+Clicking on the Classifiers activity displays a text field where you can create a new classifier, and a table of existing classifiers, where each row corresponds to a classifier and provides some statistics and action links. A classifier is identified by its class label, which is also used to form the meta word that will be attached to documents. Each classifier can only be trained to recognize instances of a single target class, so the class label should be a short description of that class, containing only alphanumeric characters and underscores (e.g., &quot;spam&quot;, &quot;homepage&quot;, or &quot;menu&quot;). Typing a new class label into the text box and hitting the Create button initializes a new classifier, which will then show up in the table.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageClassifiers.png|The Manage Classifiers page))
+}}
+
+Once you have a fresh classifier, the natural thing to do is edit it by clicking on the Edit action link. If you made a mistake, however, or no longer want a classifier for some reason, then you can click on the Delete action link to delete it; this cannot be undone. The Finalize action link is used to prepare a classifier to classify new web pages, which cannot be done until you&#039;ve added some training examples. We&#039;ll discuss how to add new examples next, then return to the Finalize link.
+
+====Editing a Classifier====
+
+Clicking on the Edit action link takes you to a new page where you can change a classifier&#039;s class label, view some statistics, and provide examples of positive and negative instances of the target class. The first two options should be self-explanatory, but the last is somewhat involved. A classifier needs labeled training examples in order to learn to recognize instances of a particular class, and you help provide these by picking out example pages from previous crawls and telling the classification system whether they belong to the class or do not belong to the class. The Add Examples section of the Edit Classifier page lets you select an existing crawl to draw potential examples from, and optionally narrow down the examples to those that satisfy a query. Once you&#039;ve done this, clicking the Load button will send a request to the server to load some pages from the crawl and choose the next one to receive a label. You&#039;ll be presented with a record representing the selected document, similar to a search result, with several action links along the side that let you mark this document as either a positive or negative example of the target class, or skip this document and move on to the next one:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ClassifiersEdit.png|The Classifiers edit page))
+}}
+
+When you select any of the action buttons, your choice is sent back to the server, and a new example to label is sent back (so long as there are more examples in the selected index). The old example record is shifted down the page and its background color updated to reflect your decision&mdash;green for a positive example, red for a negative one, and gray for a skip; the statistics at the top of the page are updated accordingly. The new example record replaces the old one, and the process repeats. Each time a new label is sent to the server, it is added to the training set that will ultimately be used to prepare the classifier to classify new web pages during a crawl. Each time you label a set number of new examples (10 by default), the classifier will also estimate its current accuracy by splitting the current training set into training and testing portions, training a simple classifier on the training portion, and testing on the remainder (checking the classifier output against the known labels). The new estimated accuracy, calculated as the proportion of the test pages classified correctly, is displayed under the Statistics section. You can also manually request an updated accuracy estimate by clicking the Update action link next to the Accuracy field. Doing this will send a request to the server that will initiate the same process described previously, and after a delay, display the new estimate.
+
+All of this happens without reloading the page, so avoid using the web browser&#039;s Back button. If you do end up reloading the page somehow, then the current example record and the list of previously-labeled examples will be gone, but none of your progress toward building the training set will be lost.
+
+====Finalizing a Classifier====
+
+Editing a classifier adds new labeled examples to the training set, providing the classifier with a more complete picture of the kinds of documents it can expect to see in the future. In order to take advantage of an expanded training set, though, you need to finalize the classifier. This is broken out into a separate step because it involves optimizing a function over the entire training set, which can be slow for even a few hundred example documents. It wouldn&#039;t be practical to wait for the classifier to re-train each time you add a new example, so you have to explicitly tell the classifier that you&#039;re done adding examples for now by clicking on the Finalize action link either next to the Load button on the edit classifier page or next to the given classifier&#039;s name on the classifier management page.
+
+Clicking this link will kick off a separate process that trains the classifier in the background. When the page reloads, the Finalize link should have changed to text that reads &quot;Finalizing...&quot; (but if the training set is very small, training may complete almost immediately). After starting finalization, it&#039;s fine to walk away for a bit, reload the page, or carry out some unrelated task for the user account. You should not however, make further changes to the classifier&#039;s training set, or start a new crawl that makes use of the classifier. When the classifier finishes its training phase, the Finalizing message will be replaced by one that reads &quot;Finalized&quot; indicating that the classifier is ready for use.
+
+====Using a Classifier====
+
+Using a classifier is as simple as checking the &quot;Use to Classify&quot; or &quot;Use to Rank&quot; checkboxes next to the classifier&#039;s label on the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] activity, under the &quot;Classifiers and Rankers&quot; heading. When the next crawl starts, the classifier (and any other selected classifiers) will be applied to each fetched page. If &quot;Use to Rank&quot; is checked then the classifier score for that page will be recorded. If &quot;Use to Classify&quot; is checked and if a page is determined to belong to a target class, it will have several meta words added. As an example, if the target class is &quot;spam&quot;, and a page is determined to belong to the class with probability .79, then the page will have the following meta words added:
+
+*class:spam
+*class:spam:50plus
+*class:spam:60plus
+*class:spam:70plus
+*class:spam:70
+
+These meta words allow one to search for all pages classified as spam at any probability over the preset threshold of .50 (with class:spam), at any probability over a specific multiple of .1 (e.g., over .6 with class:spam:60plus), or within a specific range (e.g., .60&ndash;.69 with class:spam:60). Note that no meta words are added if the probability falls below the threshold, so no page will ever have the meta words class:spam:10plus, class:spam:20plus, class:spam:20, and so on.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Page Indexing and Search Options===
+
+Several properties about how web pages are indexed and how pages are looked up at search time can be controlled by clicking on Page Options. There are three tabs for this activity: Crawl Time, Search Time, and Test Options. We will discuss each of these in turn.
+
+====Crawl Time Tab====
+
+Clicking on Page Options leads to the default Crawl Time Tab:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:PageOptionsCrawl.png|The Page Options Crawl form))
+}}
+
+This tab controls some aspects about how a page is processed and indexed at crawl time. The form elements before Page Field Extraction Rules are relatively straightforward and we will discuss these briefly below. The Page Rules textarea allows you to specify additional commands for how you would like text to be extracted from a page document summary. The description of this language will take the remainder of this subsection.
+
+The Get Options From dropdown allows one to load in crawl time options that were used in a previous crawl. Beneath this, The Byte Range to Download dropdown controls how many bytes out of any given web page should be downloaded. Smaller numbers reduce the requirements on disk space needed for a crawl; bigger numbers would tend to improve the search results. If whole pages are being cached, these downloaded bytes are stored in archives with the fetcher. The Summarizer dropdown control what summarizer is used on a page during page processing. Yioop uses a summarizer to control what portions of a page will be put into the index and are available at search time for snippets. The two available summarizers are Basic, which picks the pages meta title, meta description, h1 tags, etc in a fixed order until the summary size is reached; and Centroid, which computes an &quot;average sentence&quot; for the document and adds phrases from the actual document according to nearness to this average. If Centroid summarizer is used Yioop also generates a word cloud for each document. Centroid tends to produces slightly better results than Basic but is slower. How to tweak the Centroid summarizer for a particular locale, is described in the [[Documentation#Localizing%20Yioop%20to%20a%20New%20Language|Localizing Yioop]] section. The Max Page Summary Length in Bytes controls how many of the total bytes can be used to make a page summary which is sent to the queue server. It is only words in this summary which can actually be looked up in search result. Care should be taken in making this value larger as it can increase the both the RAM memory requirements (you might have to change the memory_limit variable at the start of queue_server.php to prevent crashing) while crawling and it can slow the crawl process down. The Cache whole crawled pages checkbox says whether to when crawling to keep both the whole web page downloaded as well as the summary extracted from the web page (checked) or just to keep the page summary (unchecked). The next dropdown, Allow Page Recrawl After, controls how many days that Yioop keeps track of all the URLs that it has downloaded from. For instance, if one sets this dropdown to 7, then after seven days Yioop will clear its Bloom Filter files used to store which urls have been downloaded, and it would be allowed to recrawl these urls again if they happened in links. It should be noted that all of the information from before the seven days will still be in the index, just that now Yioop will be able to recrawl pages that it had previously crawled. Besides letting Yioop get a fresher version of page it already has, this also has the benefit of speeding up longer crawls as Yioop doesn&#039;t need to check as many Bloom filter files. In particular, it might just use one and keep it in memory.
+
+The Page File Types to Crawl checkboxes allow you to decide which file extensions you want Yioop to download during a crawl. This check is done before any download is attempted, so Yioop at that point can only guess the [[http://en.wikipedia.org/wiki/MIME|MIME Type]], as it hasn&#039;t received this information from the server yet. An example of a url with a file extension is:
+    http://flickr.com/humans.txt
+which has the extension txt. So if txt is unchecked, then Yioop won&#039;t try to download this page even though Yioop can process plain text files. A url like:
+    http://flickr.com/
+has no file extension and will be assumed to be have a html extension. To crawl sites which have a file extension, but no one in the above list check the unknown checkbox in the upper left of this list.
+
+The Classifiers and Rankers checkboxes allow you to select the classifiers that will be used to classify or rank pages. Each classifier (see the [[Documentation#Classifying%20Web%20Pages|Classifiers]] section for details) is represented in the list by its class label and two checkboxes. Checking the box under Use to classify indicates that the associated classifier should be used (made active) during the next crawl for classifying, checking the &quot;Use to Rank&quot; indicates that the classifier should be be used (made active) and its score for the document should be stored so that it can be used as part of the search time score. Each active classifier is run on each page downloaded during a crawl. If &quot;Use to Crawl&quot; was checked and the page is determined to belong to the class that the classifier has been trained to recognize, then a meta word like &quot;class:label&quot;, where label is the class label, is added to the page summary. For faster access to pages that contain a single term and a label, for example, pages that contain &quot;rich&quot; and are labeled as &quot;non-spam&quot;, Yioop actually uses the first character of the label &quot;non-spam&quot; and embeds it as part of the term ID of &quot;rich&quot; on &quot;non-spam&quot; pages with the word &quot;rich&quot;. To ensure this speed-up can be used it is useful to make sure ones classifier labels begin with different first characters. If &quot;Use to Rank&quot; is checked then when a classifier is run on the page, the score from the classifier is recorded. When a search is done that might retrieve this page, this score is then used as one component of the overall score that this page receives for the query.
+
+The Indexing Plugins checkboxes allow you to select which plugins to use during the crawl. Yioop comes with three built-in plugins: AddressesPlugin, RecipePlugin, and WordFilterPlugin. One can also write or downlaod additional plugins. If the plugin can be configured, next to the checkbox will be a link to a configuration screen. Let&#039;s briefly look at each of these plugins in turn...
+
+Checking the AddressesPlugin enables Yioop during a crawl to try to calculate addresses for each page summary it creates. When Yioop processes a page it by default creates a summary of the page with a TITLE and a DESCRIPTION as well as a few other fields. With the addresses plugin activated, it will try to extract data to three additional fields: EMAILS, PHONE_NUMBERS, and ADDRESSES. If you want to test out how these behave, pick some web page, view source on the web page, copy the source, and then paste into the Test Options Tab on the page options page (the Test Options Tab is described later in this section).
+
+Clicking the RecipePlugin checkbox causes Yioop during a crawl to run the code in indexing_plugins/recipe_plugin.php. This code tries to detect pages which are food recipes and separately extracts these recipes and clusters them by ingredient. It then add search meta words ingredient: and recipe:all to allow one to search recipes by ingredient or only documents containing recipes.
+
+Checking the WordFilterPlugin causes Yioop to run code in indexing_plugins/wordfilter_plugin.php on each downloaded page.
+The [[http://www.yioop.com/?c=group&amp;a=wiki&amp;group_id=20&amp;arg=media&amp;page_id=26&amp;n=04%20Niche%20or%20Subject%20Specific%20Crawling%20With%20Yioop.mp4| Niche Crawling Video Tutorial]] has information about how to use this plugin to create subject-specific crawls of the web. This code checks if the downloaded page has one of the words listed in the textarea one finds on the plugin&#039;s configure page. If it does, then the plugin follows the actions listed for pages that contain that term. Below is an example WordFilterPlugin configure page:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WordFilterConfigure.png|Word Filter Configure Page))
+}}
+
+Lines in the this configure file either specify a url or domain using a syntax like [url_or_domain] or specify a rule or a comment. Whitespace is ignored and everything after a semi-colon on a line is treated as a comment. The rules immediately following a url or domain line up till the next url or domain line are in effect if one crawling is crawling a prage with that url or domain. Each &#039;&#039;&#039;rule line&#039;&#039;&#039; in the textarea consists of a comma separated list of literals followed by a colon followed by a comma separated list of what to do if the literal condition is satisfied. A single literal in the list of literals is an optional + or - followed by a sequence of non-space characters. After the + or -, up until a ; symbol is called the term in the literal. If the literal sign is + or if no sign is present, then the literal holds for a document if it contains the term, if the literal sign is - then the literal holds for a document if it does not contain the term, if there is a decimal number between 0 and 1, say x, after the # up to a comma or the first white-space character, then this is modified so the literal holds only if x&#039;th fraction of the documents length comes from the literal&#039;s term. If rather than a decimal x were a positive natural number then the term would need to occur x times. If all the literal in the comma separated list hold, then the rule is said to hold, and the actions will apply. The line -term0:JUSTFOLLOW says that if the downloaded page does not contain the word &quot;term0&quot; then do not index the page, but do follow outgoing links from the page. The line term1:NOPROCESS says if the document has the word &quot;term1&quot; then do not index it or follow links from it. The last line +term2:NOFOLLOW,NOSNIPPET says if the page contains &quot;term2&quot; then do not follow any outgoing links. NOSNIPPET means that if the page is returned from search results, the link to the page should not have a snippet of text from that page beneath it. As an example of a more complicated rule, consider:
+
+ surfboard#2,bikini#0.02:NOINDEX, NOFOLLOW
+
+Here for the rule to hold the condition surfboard#2 requires that the term surfboard occurred at least twice in the document and the condition bikini#0.02 requires that 0.02 percent of the documents total length also come from copies of the word bikini. In addition, to the commands just mentioned, WordFilterPlugin supports standard robots.txt directives such as: NOINDEX, NOCACHE, NOARCHIVE, NOODP, NOYDIR, and NONE. More details about how indexing plugins work and how to write your own indexing plugin can be found in the [[Documentation#Modifying%20Yioop%20Code|Modifying Yioop]] section.
+
+====Page Field Extraction Language====
+
+We now return to the Page Field Extraction Rules textarea of the Page Options - Crawl Time tab. Commands in this area allow a user to control what data is extracted from a summary of a page. The textarea allows you to do things like modify the summary, title, and other fields extracted from a page summary; extract new meta words from a summary; and add links which will appear when a cache of a page is shown. Page Rules are especially useful for extracting data from generic text archives and database archives. How to import such archives is described in the Archive Crawls sub-section of
+[[Documentation#Performing%20and%20Managing%20Crawls|Performing and Managing Crawls]]. The input to the page rule processor is an asscociative array that results from Yioop doing initial processing on a page. To see what this array looks like one can take a web page and paste it into the form on the Test Options tab. There are two types of page rule statements that a user can define: command statements and assignment statements. In addition, a semicolon &#039;;&#039; can be used to indicate the rest of a line is a comment. Although the initial textarea for rules might appear small. Most modern browsers allow one to resize this area by dragging on the lower right hand corner of the area. This makes it relatively easy to see large sets of rules.
+
+A command statement takes a key field argument for the page associative array and does a function call to manipulate that page. Below is a list of currently supported commands followed by comments on what they do:
+
+    addMetaWords(field)     ;add the field and field value to the META_WORD
+                            ;array for the page
+    addKeywordLink(field)   ;split the field on a comma, view this as a search
+                            ;keywords =&gt; link text association, and add this to
+                            ;the KEYWORD_LINKS array.
+    setStack(field)         ;set which field value should be used as a stack
+    pushStack(field)        ;add the field value for field to the top of stack
+    popStack(field)         ;pop the top of the stack into the field value for
+                            ;field
+    setOutputFolder(dir)    ;if auxiliary output, rather than just to the
+                            ;a yioop index, is being done, then set the folder
+                            ;for this output to be dir
+    setOutputFormat(format) ;set the format of auxiliary output.
+                            ;Should be either CSV or SQL
+                            ;SQL mean that writeOutput will write an insert
+                            ;statement
+    setOutputTable(table)   ;if output is SQL then what table to use for the
+                            ;insert statements
+    toArray(field)          ;splits field value for field on a comma and
+                            ;assign field value to be the resulting array
+    toString(field)         ;if field value is an array then implode that
+                            ;array using comma and store the result in field
+                            ;value
+    unset(field)            ;unset that field value
+    writeOutput(field)      ;use the contents of field value viewed as an array
+                            ;to fill in the columns of a SQL insert statement
+                            ;or CSV row
+
+
+Page rule assignments can either be straight assignments with &#039;=&#039; or concatenation assignments with &#039;.=&#039;. Let $page indicate the associative array that Yioop supplies the page rule processor. There are four kinds of values that one can assign:
+    field = some_other_field ; sets $page[&#039;field&#039;] = $page[&#039;some_other_field&#039;]
+    field = &quot;some_string&quot; ; sets $page[&#039;field&#039;] to &quot;some string&quot;
+    field = /some_regex/replacement_where_dollar_vars_allowed/
+        ; computes the results of replacing matches to some_regex
+        ;  in $page[&#039;field&#039;] with replacement_where_dollar_vars_allowed
+    field = /some_regex/g ;sets $page[&#039;field&#039;] to the array of all matches
+        ; of some regex in $page[&#039;field&#039;]
+For each of the above assignments we could have used &quot;.=&quot; instead of &quot;=&quot;. We next give a simple example and followed by a couple more complicated examples of page rules and the context in which they were used:
+
+In the first example, we just want to extract meaningful titles for mail log records that were read in using a TextArchiveBundleIterator. Here after initial page processing a whole email would end up in the DESCRIPTION field of the $page associative array given tot the page rule processor. So we use the following two rules:
+ TITLE = DESCRIPTION
+ TITLE = /(.|\n|\Z)*?Subject:[\t ](.+?)\n(.|\n|\Z)*/$2/
+We initially set the TITLE to be the whole record, then use a regex to extract out the correct portion of the subject line. Between the first two slashes recognizes the whole record where the pattern inside the second pair of parentheses (.+?) matches the subject text. The $2 after the second parenthesis says replace the value of TITLE with just this portion.
+
+The next example was used to do a quick first pass processing of record from the [[http://archive.org/details/utzoo-wiseman-usenet-archive|UTzoo Archive of Usenet Posts from 1981-1991]]. What each block does is described in the comments below
+ ;
+ ; Set the UI_FLAGS variable. This variable in a summary controls
+ ; which of the header elements should appear on cache pages.
+ ; UI_FLAGS should be set to a string with a comma separated list
+ ; of the options one wants. In this case, we use: yioop_nav, says that
+ ; we do want to display header; version, says that we want to display
+ ; when a cache item was crawled by Yioop; and summaries, says to display
+ ; the toggle extracted summaries link and associated summary data.
+ ; Other possible UI_FLAGS are history, whether to display the history
+ ; dropdown to other cached versions of item; highlight, whether search
+ ; keywords should be highlighted in cached items
+ ;
+ UI_FLAGS = &quot;yioop_nav,version,summaries&quot;
+ ;
+ ; Use Post Subject line for title
+ ;
+ TITLE = DESCRIPTION
+ TITLE = /(.|\n)*?Subject:([^\n]+)\n(.|\n)*/$2/
+ ;
+ ; Add a link with a blank keyword search so cache pages have
+ ; link back to yioop
+ ;
+ link_yioop = &quot;,Yioop&quot;
+ addKeywordLink(link_yioop)
+ unset(link_yioop) ;using unset so don&#039;t have link_yioop in final summary
+ ;
+ ; Extract y-M and y-M-j dates as meta word u:date:y-M and u:date:y-M-j
+ ;
+ date = DESCRIPTION
+ date = /(.|\n)*?Date:([^\n]+)\n(.|\n)*/$2/
+ date = /.*,\s*(\d*)-(\w*)-(\d*)\s*.*/$3-$2-$1/
+ addMetaWord(date)
+ date = /(\d*)-(\w*)-.*/$1-$2/
+ addMetaWord(date)
+ ;
+ ; Add a link to articles containing u:date:y-M meta word. The link text
+ ; is Date:y-M
+ ;
+ link_date = &quot;u:date:&quot;
+ link_date .= date
+ link_date .= &quot;,Date:&quot;
+ link_date .= date
+ addKeywordLink(link_date)
+ ;
+ ; Add u:date:y meta-word
+ ;
+ date = /(\d*)-.*/$1/
+ addMetaWord(date)
+ ;
+ ; Get the first three words of subject ignoring re: separated by underscores
+ ;
+ subject = TITLE
+ subject = /(\s*(RE:|re:|rE:|Re:)\s*)?(.*)/$3/
+ subject_word1 = subject
+ subject_word1 = /\s*([^\s]*).*/$1/
+ subject_word2 = subject
+ subject_word2 = /\s*([^\s]*)\s*([^\s]*).*/$2/
+ subject_word3 = subject
+ subject_word3 = /\s*([^\s]*)\s*([^\s]*)\s*([^\s]*).*/$3/
+ subject = subject_word1
+ unset(subject_word1)
+ subject .= &quot;_&quot;
+ subject .= subject_word2
+ unset(subject_word2)
+ subject .= &quot;_&quot;
+ subject .= subject_word3
+ unset(subject_word3)
+ ;
+ ; Get the first newsgroup listed in the Newsgroup: line, add a meta-word
+ ; u:newsgroup:this-newgroup. Add a link to cache page for a search
+ ; on this meta word
+ ;
+ newsgroups = DESCRIPTION
+ newsgroups = /(.|\n)*?Newsgroups:([^\n]+)\n(.|\n)*/$2/
+ newsgroups = /\s*((\w|\.)+).*/$1/
+ addMetaWord(newsgroups)
+ link_news = &quot;u:newsgroups:&quot;
+ link_news .= newsgroups
+ link_news .= &quot;,Newsgroup: &quot;
+ link_news .= newsgroups
+ addKeywordLink(link_news)
+ unset(link_news)
+ ;
+ ; Makes a thread meta u:thread:newsgroup-three-words-from-subject.
+ ; Adds a link to cache page to search on this meta word
+ ;
+ thread = newsgroups
+ thread .= &quot;:&quot;
+ thread .= subject
+ addMetaWord(thread)
+ unset(newsgroups)
+ link_thread = &quot;u:thread:&quot;
+ link_thread .= thread
+ link_thread .= &quot;,Current Thread&quot;
+ addKeywordLink(link_thread)
+ unset(subject)
+ unset(thread)
+ unset(link_thread)
+As a last example of page rules, suppose we wanted to crawl the web and whenever we detected a page had an address we wanted to write that address as a SQL insert statement to a series of text files. We can do this using page rules and the AddressesPlugin. First, we would check the AddressesPlugin and then we might use page rules like:
+ summary = ADDRESSES
+ setStack(summary)
+ pushStack(DESCRIPTION)
+ pushStack(TITLE)
+ setOutputFolder(/Applications/MAMP/htdocs/crawls/data)
+ setOutputFormat(sql)
+ setOutputTable(SUMMARY);
+ writeOutput(summary)
+The first line says copy the contents of the ADDRESSES field of the page into a new summary field. The next line says use the summary field as the current stack. At this point the stack would be an array with all the addresses found on the given page. So you could use the command like popStack(first_address) to copy the first address in this array over to a new variable first_address. In the above case what we do instead is push the contents of the DESCRIPTION field onto the top of the stack. Then we push the contents of the TITLE field. The line
+ setOutputFolder(/Applications/MAMP/htdocs/crawls/data)
+sets /Applications/MAMP/htdocs/crawls/data as the folder that any auxiliary output from the page_processor should go to. setOutputFormat(sql) says we want to output sql, the other possibility is csv. The line setOutputTable(SUMMARY); says the table name to use for INSERT statements should be called SUMMARY. Finally, the line writeOutput(summary) would use the contents of the array entries of the summary field as the column values for an INSERT statement into the SUMMARY table. This writes a line to the file data.txt in /Applications/MAMP/htdocs/crawls/data. If data.txt exceeds 10MB, it is compressed into a file data.txt.0.gz and a new data.txt file is started.
+
+====Search Time Tab====
+
+The Page Options Search Time tab looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:PageOptionsSearch.png|The Page Options Search form))
+}}
+
+The Search Page Elements and Links control group is used to tell which element and links you would like to have presented on the search landing and search results pages. The Word Suggest checkbox controls whether a dropdown of word suggestions should be presented by Yioop when a user starts typing in the Search box. It also controls whether spelling correction and thesaurus suggestions will appear The Subsearch checkbox controls whether the links for Image, Video, and News search appear in the top bar of Yioop You can actually configure what these links are in the [[Documentation#Search%20Sources|Search Sources]] activity. The checkbox here is a global setting for displaying them or not. In addition, if this is unchecked then the hourly activity of downloading any RSS media sources for the News subsearch will be turned off. The Signin checkbox controls whether to display the link to the page for users to sign in to Yioop The Cache checkbox toggles whether a link to the cache of a search item should be displayed as part of each search result. The Similar checkbox toggles whether a link to similar search items should be displayed as part of each search result. The Inlinks checkbox toggles whether a link for inlinks to a search item should be displayed as part of each search result. Finally, the IP address checkbox toggles whether a link for pages with the same ip address should be displayed as part of each search result.
+
+The Search Ranking Factors group of controls: Title Weight, Description Weight, Link Weight field are used by Yioop to decide how to weigh each portion of a document when it returns query results to you.
+
+When Yioop ranks search results it search out in its postings list until it finds a certain number of qualifying documents. It then sorts these by their score, returning usually the top 10 results. In a multi-queue-server setting the query is simultaneously asked by the name server machine of each of the queue server machines and the results are aggregated. The Search Results Grouping controls allow you to affect this behavior. Minimum Results to Group controls the number of results the name server want to have before sorting of results is done. When the name server request documents from each queue server, it requests for alpha*(Minimum Results to Group)/(Number of Queue Servers) documents. Server Alpha controls the number alpha.
+
+The Save button of course saves any changes you make on this form.
+
+====Test Options Tab====
+
+The Page Options Test Options tab looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:PageOptionsTest.png|The Page Options Test form))
+}}
+
+In the Type dropdown one can select a [[http://en.wikipedia.org/wiki/Internet_media_type|MIME Type]] used to select the page processor Yioop uses to extract text from the data you type or paste into the textarea on this page. Test Options let&#039;s you see how Yioop would process a web page and add summary data to its index. After filling in the textarea with a page, clicking Test Process Page will show the $summary associative array Yioop would create from the page after the appropriate page processor is applied. Beneath it shows the $summary array that would result after user-defined page rules from the crawl time tab are applied. Yioop stores a serialized form of this array in a IndexArchiveBundle for a crawl. Beneath this array is an array of terms (or character n-grams) that were extracted from the page together with their positions in the document. Finally, a list of meta words that the document has are listed. Either extracted terms or meta-word could be used to look up this document in a Yioop index.
+
+===Results Editor===
+
+Sometimes after a large crawl one finds that there are some results that appear that one does not want in the crawl or that the summary for some result is lacking. The Result Editor activity allows one to fix these issues without having to do a completely new crawl. It has three main forms: An edited urls forms, a url editing form, and a filter websites form.
+
+If one has already edited the summary for a url, then the dropdown in the edited urls form will list this url. One can select it and click load to get it to display in the url editing form. The purpose of the url editing form is to allow a user to change the title and description for a url that appears on a search results page. By filling out the three fields of the url editing form, or by loading values into them through the previous form and changing them, and then clicking save, updates the appearance of the summary for that url. To return to using the default summary, one only fills out the url field, leaves the other two blank, and saves. This form does not affect whether the page is looked up for a given query, only its final appearance. It can only be used to edit the appearance of pages which appear in the index, not to add pages to the index. Also, the edit will affect the appearance of that page for all indexes managed by Yioop If you know there is a page that won&#039;t be crawled by Yioop, but would like it to appear in an index, please look at the crawl options section of [[Documentation#Performing%20and%20Managing%20Crawls|Manage Crawls]] documentation.
+
+To understand the filter websites form, recall the disallowed sites crawl option allows a user to specify they don&#039;t want Yioop to crawl a given web site. After a crawl is done though one might be asked to removed a website from the crawl results, or one might want to remove a website from the crawl results because it has questionable content. A large crawl can take days to replace, to make the job of doing such filtering faster while one is waiting for a replacement crawl where the site has been disallowed, one can use a search filter.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ResultsEditor.png|The Results Editor form))
+}}
+
+Using the filter websites form one can specify a list of hosts which should be excluded from the search results. The sites listed in the Sites to Filter textarea are required to be hostnames. Using a filter, any web page with the same host name as one listed in the Sites to Filter will not appear in the search results. So for example, the filter settings in the example image above contain the line http://www.cs.sjsu.edu/, so given these settings, the web page http://www.cs.sjsu.edu/faculty/pollett/ would not appear in search results.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Search Sources===
+
+The Search Sources activity is used to manage the media sources available to Yioop, and also to control the subsearch links displayed on the top navigation bar. The Search Sources activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchSources.png|The Search Sources form))
+}}
+
+The top form is used to add a media source to Yioop. Currently, the Media Kind can be either Video, RSS, or HTML. &#039;&#039;&#039;Video Media&#039;&#039;&#039; sources are used to help Yioop recognize links which are of videos on a web video site such as YouTube. This helps in both tagging such pages with the meta word media:video in a Yioop index and in being able to render a thumbnail of the video in the search results. When the media kind is set to video, this form has three fields: Name, which should be a short familiar name for the video site (for example, YouTube); URL, which should consist of a url pattern by which to recognize a video on that site; and Thumb, which consist of a url pattern to replace the original pattern by to find the thumbnail for that video. For example, the value of URL for YouTube is:
+ http://www.youtube.com/watch?v={}&amp;
+This will match any url which begins with http://www.youtube.com/watch?v= followed by some string followed by &amp; followed by another string. The {} indicates that from v= to the &amp; should be treated as the identifier for the video. The Thumb url in the case of YouTube is:
+ http://img.youtube.com/vi/{}/2.jpg
+If the identifier in the first video link was yv0zA9kN6L8, then using the above, when displaying a thumb for the video, Yioop would use the image source:
+ http://img.youtube.com/vi/{yv0zA9kN6L8}/2.jpg
+Some video sites have more complicated APIs for specifying thumbnails. In which case, you can still do media:video tagging but display a blank thumbnail rather than suggest a thumbnail link. To do this one uses the thumb url.
+ http://www.yioop.com/resources/blank.png?{}
+If one selects the media kind to be &#039;&#039;&#039;RSS&#039;&#039;&#039; (really simple syndication, a kind of news feed, you can also use Atom feeds as sources), then the media sources form has four fields: &#039;&#039;&#039;Name&#039;&#039;&#039;, again a short familiar name for the RSS feed; &#039;&#039;&#039;URL&#039;&#039;&#039;, the url of the RSS feed, &#039;&#039;&#039;Language&#039;&#039;&#039;, what language the RSS feed is; and Image XPath, an optional field which allows you to specify and XPath relative to a RSS item, an image url if it is in the item. This language element is used to control whether or not a news item will display given the current language settings of Yioop. If under Manage Machines the Media Updater on the Name Server is turned on, then these RSS feeds will be downloaded hourly. If under the Search Time screen of the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] activity, the subsearch checkbox is checked, then there will be a link to News which appears on the top of the search page. Clicking on this link will display news items in order of recentness.
+
+An &#039;&#039;&#039;HTML Feed&#039;&#039;&#039; is a web page that has news articles like an RSS page that you want the Media Updater to scrape on an hourly basis. To specify where in the HTML page the news items appear you specify different XPath information. For example,
+&lt;pre&gt;
+ Name: Cape Breton Post
+ URL: http://www.capebretonpost.com/News/Local-1968
+ Channel: //div[contains(@class, &quot;channel&quot;)]
+ Item: //article
+ Title:	//a
+ Description: //div[contains(@class, &quot;dek&quot;)]
+ Link: //a
+&lt;/pre&gt;
+The Channel field is used to specify the tag that encloses all the news items. Relative to this as the root tag, //article says the path to an individual news item. Then relative to an individual news item, //a gets the title, etc. Link extracts the href attribute of that same //a .
+
+Returning again to Image Xpath, which is a field of both the RSS form and the HTML Feed form. Not all RSS feeds use the same tag to specify the image associated with a news item. The Image XPath allows you to specify relative to a news item (either RSS or HTML) where an image thumbnail exists. If a site does not use such thumbnail one can prefix the path with ^ to give the path relative to the root of the whole file to where a thumb nail for the news source exists. Yioop automatically removes escaping from RSS containing escaped HTML when computing this. For example, the following works for the feed:
+&lt;pre&gt;
+  http://feeds.wired.com/wired/index
+ //description/div[contains(@class,
+    &quot;rss_thumbnail&quot;)]/img/@src
+&lt;/pre&gt;
+
+Beneath this media sources form is a table listing all the currently added media sources, their urls, and a links that allows one to edit or delete sources.
+
+The second form on the page is the Add a Subsearch form. The form allows you to add a new specialized search link which may appear at the top the search page. If there are more that three of these subsearch are added or if one is seeing the page on a mobile platform, one instead gets a &quot;More&quot; link. This links to the tool.php page which then lists out all possible specialized search, some account links, and other useful Yioop tools. The Add a Subsearch form has three fields: Folder Name is a short familiar name for the subsearch, it will appear as part of the query string when the given subsearch is being performed. For example, if the folder names was news, then s=news will appear as part of the query string when a news subsearch is being done. Folder Name is also used to make the localization identifier used in translating the subsearch&#039;s name into different languages. This identifer will have the format db_subsearch_identifier. For example, db_subsearch_news. Index Source, the second form element, is used to specify a crawl or a crawl mix that the given subsearch should use in returning results. Results per Page, the last form element, controls the number of search results which should appear when using this kind of subsearch.
+
+Beneath this form is a table listing all the currently added subsearches and their properties. The actions column at the end of this table let&#039;s one either edit, localize or delete a given subsearch. Clicking localize takes one to the Manage Locale&#039;s page for the default locale and that particular subsearch localization identifier, so that you can fill in a value for it. Remembering the name of this identifier, one can then in Manage Locales navigate to other locales, and fill in translations for them as well, if desired.
+
+[[Documentation#contents|Return to table of contents]].
+
+===GUI for Managing Machines and Servers===
+
+Rather than use the command line as described in the [[Documentation#prerequisites|Prerequisites for Crawling]] section, it is possible to start/stop and view the log files of queue servers and fetcher through the Manage Machines activity. In order to do this, the additional requirements for this activity mentioned in the [[Documentation#Requirements|Requirements]] section must have been met. The Manage Machines activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageMachines.png|The Manage Machines form))
+}}
+
+The Add machine form at the top of the page allows one to add a new machine to be controlled by this Yioop instance. The Machine Name field lets you give this machine an easy to remember name. The Machine URL field should be filled in with the URL to the installed Yioop instance. The Mirror checkbox says whether you want the given Yioop installation to act as a mirror for another Yioop installation. Checking it will reveal a Parent Name textfield that allows you to choose which installation amongst the previously entered machines names (not urls) you want to mirror. The Has Queue Server checkbox is used to say whether the given Yioop installation will be running a queue server or not. Finally, the Number of Fetchers dropdown allows you to say how many fetcher instances you want to be able to manage for that machine. Beneath the Add machine form is the Machine Information listings. This shows the currently known about machines. This list always begins with the Name Server itself and a toggle to control whether or not the Media Updater process is running on the Name Server. This allows you to control whether or not Yioop attempts to update its RSS (or Atom) search sources on an hourly basis. There is also a link to the log file of the Media Updater process. Under the Name Server information is a dropdown that can be used to control the number of current machine statuses that are displayed for all other machines that have been added. It also might have next and previous arrow links to go through the currently available machines. To modify a machine that you have already added,
+
+Beneath this dropdown is a set of boxes for each machine you have added to Yioop. In the far corner of this box is a link to Delete that machine from the list of known machines, if desired. Besides this, each box lists the queue server, if any, and each of the fetchers you requested to be able to manage on that machine. Next to these there is a link to the log file for that server/fetcher and below this there is an On/Off switch for starting and stopping the server/fetcher. This switch is green if the server/fetcher is running and red otherwise. A similar On/Off switch is present to turn on and off mirroring on a machine that is acting as a mirror. It is possible for a switch to be yellow if the machine is crashed but where it is possible that the machine might be automatically restarted by Yioop without your intervention.
+
+==Building Sites with Yioop==
+
+===Building a Site using Yioop&#039;s Wiki System===
+
+As was mentioned in the Configure Activity [[Documentation#advance|Toggle Advance Settings]] section of the documentation, background color, icons, title, and SEO meta information for a Yioop instance call all be configured from the Configure Activity. Adding advertisements such as banner and skyscraper ads can be done using the form on the [[Documentation#Optional%20Server%20and%20Security%20Configurations|Server Settings]] activity. If you would like a site with a more custom landing page, then one can check &#039;&#039;&#039;Use Wiki Public Main Page as Landing Page&#039;&#039;&#039; under Toggle Advance
+Settings : Site Customizations. The Public Main page will then be the page you see when you first go to your site. You can then build out your site using the wiki system for the public group. Common headers and footers can be specified for pages on your site using each wiki page&#039;s Settings attributes. More advanced styling of pages can be done by specifying the auxiliary css data under Toggle Advance Settings. As Wiki pages can be set to be galleries, or slide presentations, and as Yioop supports including images, video, and embedding search bars and math equations on pages using its [[Syntax|Yioop&#039;s Wiki Syntax]], one can develop quite advanced sites using just this approach. The video tutorial [[https://yioop.com/?c=group&amp;a=wiki&amp;group_id=20&amp;arg=media&amp;page_id=26&amp;n=03%20Building%20Web%20Sites%20with%20Yioop.mp4|Building Websites Using Yioop]] explains how the Seekquarry.com site was built using Yioop Software in this way.
+
+===Building a Site using Yioop as Framework===
+
+For more advanced, dynamic websites than the wiki approach described above, the Yioop code base can still serve as the code base for new custom search web sites. The web-app portion of Yioop uses a [[https://en.wikipedia.org/wiki/Model-view-adapter|model-view-adapter (MVA) framework]]. This is a common, web-suitable variant on the more well-known Model View Controller design pattern. In this set-up, sub-classes of the Model class should handle file I/O and database function, sub-classes of Views should be responsible for rendering outputs, and sub-classes of the Controller class do calculations on data received from the web and from the models to give the views the data they finally need to render. In the remainder of this section we describe how this framework is implemented in Yioop and how to add code to the WORK_DIRECTORY/app folder to customize things for your site. In this discussion we will use APP_DIR to refer to WORK_DIRECTORY/app and BASE_DIR to refer to the directory where Yioop is installed.
+
+The index.php script is the first script run by the Yioop web app. It has an array $available_controllers which lists the controllers available to the script. The names of the controllers in this array are lowercase. Based on whether the $_REQUEST[&#039;c&#039;] variable is in this array index.php either loads the file {$_REQUEST[&#039;c&#039;]}_controller.php or loads whatever the default controller is. index.php also checks for the existing of APP_DIR/index.php and loads it if it exists. This gives the app developer a chance to change the available controllers and which controller is set for a given request. A controller file should have in it a file which extends the class Controller. Controller files should always have names of the form somename_controller.php and the class inside them should be named SomenameController. Notice it is Somename rather than SomeName. These general naming conventions are used for models, views, etc. Any Controller subclass has methods component($name), model($name), view($name), and indexing_plugin($name). These methods load, instantiate, and return a class with the given name. For example, $my_controller-&gt;model(&quot;crawl&quot;); checks to see if a CrawlModel has already been instantiated, if so, it returns it; if not, it does a r equire_once on model/crawl_model.php and then instantiates a CrawlModel saves a reference to it, and returns it.
+
+If a require once is needed. Yioop first looks in APP_DIR. For example, $my_controller-&gt;view(&quot;search&quot;) would first look for a file: APP_DIR/views/search_view.php to include, if it cannot find such a file then it tries to include BASE_DIR/views/search_view.php. So to change the behavior of an existing BASE_DIR file one just has a modified copy of the file in the appropriate place in your APP_DIR. This holds in general for other program files such as components, models, and plugins. It doesn&#039;t hold for resources such as images -- we&#039;ll discuss those in a moment. Notice because it looks in APP_DIR first, you can go ahead and create new controllers, models, views, etc which don&#039;t exists in BASE_DIR and get Yioop to load them.
+A Controller must implement the abstract method processRequest. The index.php script after finishing its bootstrap process calls the processRequest method of the Controller it chose to load. If this was your controller, the code in your controller should make use of data gotten out of the loaded models as well as data from the web request to do some calculations. Typically, to determine the calculation performed, the controller cleans and looks at $_REQUEST[&#039;a&#039;], the request activity, and uses the method call($activity) to call a method that can handle the activity. When a controller is constructed it makes use of the global variable $COMPONENT_ACTIVITIES defined in configs/config.php to know which components have what activities. The call method checks if there is a Component repsonsible for the requested activity, if there is it calls that Component&#039;s $activity method, otherwise, the method that handles $activity is assumed to come from the controller itself. The results of the calculations done in $activity would typically be put into an associative array $data. After the call method complete, processRequest would typically take $data and call the base Controller method displayView($view, $data). Here $view is the whichever loaded view object you would like to display.
+
+To complete the picture of how Yioop eventually produces a web page or other output, we now describe how subclasses of the View class work. Subclasses of View have a field $layout and two methods helper($name), and element($name). A subclass of View has at most one Layout and it is used for rendering the header and footer of the page. It is included and instantiated by setting $layout to be the name of the layout one wants to load. For example, $layout=&quot;web&quot;; would load either the file APP_DIR/views/layouts/web_layout.php or BASE_DIR/views/layouts/web_layout.php. This file is expected to have in it a class WebLayout extending Layout. The contructor of a Layout take as argument a view which it sets to an instance variable. The way Layout&#039;s get drawn is as follows: When the controller calls displayView($view, $data), this method does some initialization and then calls the render($data) of the base View class. This in turn calls the render($data) method of whatever Layout was on the view. This render method then draws the header and then calls $this-&gt;view-&gt;renderView($data); to draw the view, and finally draws the footer.
+
+The methods helper($name) and element($name) of View load and intantiate, if necessary, and return the Helper or Element $name in a similar fashion to the model($name) method of Controller. Element&#039;s have render($data) methods and can be used to draw out portions of pages which may be common across Views. Helper&#039;s on the other hand are used typically to render UI elements. For example, OptionsHelper has a render($id, $name, $options, $selected) method and is used to draw select dropdowns.
+
+When rendering a View or Element one often has css, scripts, images, videos, objects, etc. In BASE_DIR, the targets of these tags would typically be stored in the css, scripts, or resources folders. The APP_DIR/css, APP_DIR/scripts, and APP_DIR/resources folder are a natural place for them in your customized site. One wrinkle, however, is that APP_DIR, unlike BASE_DIR, doesn&#039;t have to be under your web servers DOCUMENT_ROOT. So how does one refer in a link to these folders? To this one uses Yioop&#039;s ResourceController class which can be invoked by a link like:
+ &lt;img src=&quot;?c=resource&amp;a=get&amp;n=myicon.png&amp;f=resources&quot; /&gt;
+Here c=resource specifies the controller, a=get specifies the activity -- to get a file, n=myicon.png specifies we want the file myicon.png -- the value of n is cleaned to make sure it is a filename before being used, and f=resources specifies the folder -- f is allowed to be one of css, script, or resources. This would get the file APP_DIR/resources/myicon.png .
+
+This completes our description of the Yioop framework and how to build a new site using it. It should be pointed out that code in the APP_DIR can be localized using the same mechanism as in BASE_DIR. More details on this can be found in the section on [[Documentation#Localizing%20Yioop%20to%20a%20New%20Language|Localizing Yioop]].
+
+[[Documentation#contents|Return to table of contents]].
+
+===Embedding Yioop in an Existing Site===
+
+One use-case for Yioop is to serve search result for your existing site. There are three common ways to do this: (1) On your site have a web-form or links with your installation of Yioop as their target and let Yioop format the results. (2) Use the same kind of form or links, but request an OpenSearch RSS Response from Yioop and then you format the results and display the results within your site. (3) Your site makes functions calls of the Yioop Search API and gets either PHP arrays or a string back and then does what it wants with the results. For access method (1) and (2) it is possible to have Yioop on an different machine so that it doesn&#039;t consume your main web-site&#039;s machines resources. As we mentioned in the configuration section it is possible to disable each of these access paths from within the Admin portion of the web-site. This might be useful for instance if you are using access methods (2) or (3) and don&#039;t want users to be able to access the Yioop search results via its built in web form. We will now spend a moment to look at each of these access methods in more detail...
+
+====Accessing Yioop via a Web Form====
+
+A very minimal code snippet for such a form would be:
+ &lt;form method=&quot;get&quot; action=&#039;YIOOP_LOCATION&#039;&gt;
+ &lt;input type=&quot;hidden&quot; name=&quot;its&quot; value=&quot;TIMESTAMP_OF_CRAWL_YOU_WANT&quot; /&gt;
+ &lt;input type=&quot;hidden&quot; name=&quot;l&quot; value=&quot;LOCALE_TAG&quot; /&gt;
+ &lt;input type=&quot;text&quot;  name=&quot;q&quot; value=&quot;&quot; /&gt;
+ &lt;button type=&quot;submit&quot;&gt;Search&lt;/button&gt;
+ &lt;/form&gt;
+In the above form, you should change YIOOP_LOCATION to your instance of Yioop&#039;s web location, TIMESTAMP_OF_CRAWL_YOU_WANT should be the Unix timestamp that appears in the name of the IndexArchive folder that you want Yioop to serve results from, LOCALE_TAG should be the locale you want results displayed in, for example, en-US for American English. In addition, to embedding this form on some page on your site, you would probably want to change the resources/yioop.png image to something more representative of your site. You might also want to edit the file views/search_view.php to give a link back to your site from the search results.
+
+If you had a form such as above, clicking Search would take you to the URL:
+ YIOOP_LOCATION?its=TIMESTAMP_OF_CRAWL_YOU_WANT&amp;l=LOCALE_TAG&amp;q=QUERY
+where QUERY was what was typed in the search form. Yioop supports two other kinds of queries: Related sites queries and cache look-up queries. The related query format is:
+ YIOOP_LOCATION?its=TIMESTAMP_OF_CRAWL_YOU_WANT&amp;l=LOCALE_TAG&amp;a=related&amp;arg=URL
+where URL is the url that you are looking up related URLs for. To do a look up of the Yioop cache of a web page the url format is:
+ YIOOP_LOCATION?its=TIMESTAMP_OF_CRAWL_YOU_WANT&amp;l=LOCALE_TAG&amp;q=QUERY&amp;a=cache&amp;arg=URL
+Here the terms listed in QUERY will be styled in different colors in the web page that is returned; URL is the url of the web page you want to look up in the cache.
+
+===Accessing Yioop and getting and OpenSearch RSS or JSON Response===
+
+The same basic urls as above can return RSS or JSON results simply by appending to the end of the them &amp;f=rss or &amp;f=json. This of course only makes sense for usual and related url queries -- cache queries return web-pages not a list of search results. Here is an example of what a portion of an RSS result might look like:
+
+ &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
+ &lt;rss version=&quot;2.0&quot; xmlns:opensearch=&quot;http://a9.com/-/spec/opensearch/1.1/&quot;
+ xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;
+ &gt;
+    &lt;channel&gt;
+        &lt;title&gt;PHP Search Engine - Yioop : art&lt;/title&gt;
+        &lt;language&gt;en-US&lt;/language&gt;
+        &lt;link&gt;http://localhost/git/yioop/?f=rss&amp;q=art&amp;its=1317152828&lt;/link&gt;
+        &lt;description&gt;Search results for: art&lt;/description&gt;
+        &lt;opensearch:totalResults&gt;1105&lt;/opensearch:totalResults&gt;
+        &lt;opensearch:startIndex&gt;0&lt;/opensearch:startIndex&gt;
+        &lt;opensearch:itemsPerPage&gt;10&lt;/opensearch:itemsPerPage&gt;
+        &lt;atom:link rel=&quot;search&quot; type=&quot;application/opensearchdescription+xml&quot;
+            href=&quot;http://localhost/git/yioop/yioopbar.xml&quot;/&gt;
+        &lt;opensearch:Query role=&quot;request&quot; searchTerms=&quot;art&quot;/&gt;
+
+                &lt;item&gt;
+                &lt;title&gt; An Online Fine Art Gallery U Can Buy Art  -
+                Buy Fine Art Online&lt;/title&gt;
+
+                &lt;link&gt;http://www.ucanbuyart.com/&lt;/link&gt;
+                &lt;description&gt; UCanBuyArt.com is an online art gallery
+                and dealer designed... art gallery and dealer designed for art
+                sales of high quality and original... art sales of high quality
+                and original art from renowned artists. Art&lt;/description&gt;
+                &lt;/item&gt;
+                ...
+                ...
+     &lt;/channel&gt;
+ &lt;/rss&gt;
+
+Notice the opensearch: tags tell us the totalResults, startIndex and itemsPerPage. The opensearch:Query tag tells us what the search terms were.
+
+===Accessing Yioop via the Function API===
+
+The last way we will consider to get search results out of Yioop is via its function API. The Yioop Function API consists of the following three methods in controllers/search_controller.php :
+ function queryRequest($query, $results_per_page, $limit = 0)
+
+ function relatedRequest($url, $results_per_page, $limit = 0,
+     $crawl_time = 0)
+
+ function cacheRequest($url, $highlight=true, $terms =&quot;&quot;,
+     $crawl_time = 0)
+These methods handle basic queries, related queries, and cache of web page requests respectively. The arguments of the first two are reasonably self-explanatory. The $highlight and $terms arguments to cacheRequest are to specify whether or not you want syntax highlighting of any of the words in the returned cached web-page. If wanted then $terms should be a space separated list of terms.
+
+An example script showing what needs to be set-up before invoking these methods as well as how to extract results from what is returned can be found in the file examples/search_api.php .
+
+[[Documentation#contents|Return to table of contents]].
+
+===Localizing Yioop to a New Language===
+
+The Manage Locales activity can be used to configure Yioop for use with different languages and for different regions. If you decide to customize your Yioop installation by adding files to WORK_DIRECTORY/app as described in the [[Documentation#Building%20a%20Site%20using%20Yioop%20as%20Framework|Building a Site using Yioop as a Framework]] section, then the localization tools described in this section can also be used to localize your custom site. Clicking the Manage Locales activity one sees a page like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageLocales.png|The Manage Locales form))
+}}
+
+The first form on this activity allows you to create a new locale -- an object representing a language and a region. The first field on this form should be filled in with a name for the locale in the language of the locale. So for French you would put Fran&ccedil;ais. The locale tag should be the IETF language tag. The &#039;&#039;&#039;Writing Mode&#039;&#039;&#039; element on the form is to specify how the language is written. There are four options: lr-tb -- from left-to-write from the top of the page to the bottom as in English, rl-tb from right-to-left from the top the page to the bottom as in Hebrew and Arabic, tb-rl from the top of the page to the bottom from right-to-left as in Classical Chinese, and finally, tb-lr from the top of the page to the bottom from left-to-right as in non-cyrillic Mongolian or American Sign Language. lr-tb and rl-tb support work better than the vertical language support. As of this writing, Internet Explorer and WebKit based browsers (Chrome/Safari) have some vertical language support and the Yioop stylesheets for vertical languages still need some tweaking. For information on the status in Firefox check out this [[https://bugzilla.mozilla.org/show_bug.cgi?id=writing-mode|writing mode bug]]. Finally, the &#039;&#039;&#039;Locale Enabled &#039;&#039;&#039; checkbox controls whether or not to present the locale on the Settings Page. This allows you to choose only the locales you want for your website without having to delete the locale data for other locales you don&#039;t want, but may want in the future as more translate strings become available.
+
+Beneath the Add Locale form is an alphabetical in the local-tah table listing some of the current locales. The Show Dropdown let&#039;s you control let&#039;s you control how many of these locales are displayed in one go. The Search link lets you bring up an advance search form to search for particular locales and also allows you to control the direction of the listing. The Locale List table first colume has a link with the name of the locale. Clicking on this link brings up a page where one can edit the strings for that locale. The next two columns of the Locale List table give the locale tag and writing direction of the locale, this is followed by the percent of strings translated. Clicking the Edit link in the column let&#039;s one edit the locale tag, and text direction of a locale. Finally, clicking the Delete link let&#039;s one delete a locale and all its strings.
+
+To translate string ids for a locale click on its name link. This should display the following forms and table of string id and their transated values:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditLocaleStrings.png|The Edit Locales form))
+}}
+
+In the above case, the link for English was clicked. The Back link in the corner can be used to written to the previous form. The drop down controls whether to display all localizable strings or just those missing translations. The Filter field can be used to restrict the list of string id&#039;s presented to just those matching what is this field. Beneath this dropdown, the Edit Locale page mainly consists of a two column table: the right column being string ids, the left column containing what should be their translation into the given locale. If no translation exists yet, the field will be displayed in red. String ids are extracted by Yioop automatically from controller, view, helper, layout, and element class files which are either in the Yioop Installation itself or in the installation WORK_DIRECTORY/app folder. Yioop looks for tl() function calls to extract ids from these files, for example, on seeing tl(&#039;search_view_query_results&#039;) Yioop would extract the id search_view_query_results; on seeing tl(&#039;search_view_calculated&#039;, $data[&#039;ELAPSED_TIME&#039;]) Yioop would extract the id, &#039;search_view_calculated&#039;. In the second case, the translation is expected the translation to have a %s in it for the value of $data[&#039;ELAPSED_TIME&#039;]. Note %s is used regardless of the the type, say int, float, string, etc., of $data[&#039;ELAPSED_TIME&#039;]. tl() can handle additional arguments, whenever an additional argument is supplied an additional %s would be expected somewhere in the translation string. If you make a set of translations, be sure to submit the form associated with this table by scrolling to the bottom of the page and clicking the Submit link. This saves your translations; otherwise, your work will be lost if you navigate away from this page. One aid to translating is if you hover your mouse over a field that needs translation, then its translation in the default locale (usually English) is displayed. If you want to find where in the source code a string id comes from the ids follow the rough convention file_name_approximate_english_translation. So you would expect to find admin_controller_login_successful in the file controllers/admin_controller.php . String ids with the prefix db_ (such as the names of activities) are stored in the database. So you cannot find these ids in the source code. The tooltip trick mentioned above does not work for database string ids.
+
+====Localizing Wiki Pages====
+When a user goes to a wiki page with a URL such as
+ YIOOP_LOCATION?c=group&amp;group_id=some_integer&amp;a=wiki&amp;arg=read&amp;page_name=Some_Page_Name
+or
+ YIOOP_LOCATION?c=admin&amp;group_id=some_integer&amp;a=wiki&amp;arg=read&amp;page_name=Some_Page_Name
+or for the public group possible with
+ YIOOP_LOCATION?c=static&amp;p=Some_Page_Name
+the page that is displayed is in the locale that has been most recently set for the user. If no locale was set, then Yioop tries to determine the locale based on browser header info, and if this fails, falls back to the Default Locale set when Yioop was configure. When one edits a wiki page the locale that one is editing the page for is displayed under the page name such as en-US in the image below:
+{{class=&quot;docs&quot;
+((resource:Documentation:LocaleOnWikiPage.png|Locale on a wiki page))
+}}
+To edit the page for a different locale, choose the locale you want using the Settings page while logged in and then navigate to the wiki page you would like to edit (using the same name from the original language). Suppose you were editing the Dental_Floss page in en-US locale. To make the French page, you click Settings on the top bar of Yioop, go to your account settings, and choose French (fr-FR) as the language. Now one would navigate back the the wiki you were on to the Dental_Floss page which doesn&#039;t exist for French. You could click Edit now and make the French page at this location, but this would be sub-optimal as the French word for dental floss is dentrifice. So instead, on the fr-FR Dental_Floss edit page, you edit the page Settings to make this page a Page Alias for Dentrifice, and then create and edit the French Dentrifice article. If a user then starts on the English version of the page and switches locales to French they will end up on the Dentrifice page. You should also set up the page alias in the reverse direction as well, to handle when someone start on the French Dentrifice page and switches to the en-US Dentrifice.
+
+====Adding a stemmer, segmenter or supporting character n-gramming for your language====
+
+Depending on the language you are localizing to, it may make sense to write a stemmer for words that will be inserted into the index. A stemmer takes inflected or sometimes derived words and reduces them to their stem. For instance, jumps and jumping would be reduced to jump in English. As Yioop crawls it attempts to detect the language of a given web page it is processing. If a stemmer exists for this language it will call the Tokenizer class&#039;s stem($word) method on each word it extracts from the document before inserting information about it into the index. Similarly, if an end-user is entering a simple conjunctive search query and a stemmer exists for his language settings, then the query terms will be stemmed before being looked up in the index. Currently, Yioop comes with stemmers for English, French, German, Italian, and Russian. The English stemmer uses the Porter Stemming Algorithm [ [[Documentation#P1980|P1980]]], the other stemmers are based on the algorithms presented at snowball.tartoros.org. Stemmers should be written as a static method located in the file WORK_DIRECTORY/locale/en-US/resources/tokenizer.php . The [[snowball.tartoros.org]] link points to a site that has source code for stemmers for many other languages (unfortunately, not written in PHP). It would not be hard to port these to PHP and then add modify the tokenizer.php file of the appropriate locale folder. For instance, one could modify the file WORK_DIRECTORY/locale/pt/resources/tokenizer.php to contain a class PtTokenizer with a static method stem($word) if one wanted to add a stemmer for Portuguese.
+
+The class inside tokenizer.php can also be used by Yioop to do word segmentation. This is the process of splitting a string of words without spaces in some language into its component words. Yioop comes with an example segmenter for the zh-CN (Chinese) locale. It works by starting at the ned of the string and trying to greedily find the longest word that can be matched with the portion of the suffix of the string that has been processed yet (reverse maximal match). To do this it makes use of a word Bloom filter as part of how it detects if a string is a word or not. We describe how to make such filter using token_tool.php in a moment.
+
+In addition to supporting the ability to add stemmers and segmenters, Yioop also supports a default technique which can be used in lieu of a stemmer called character n-grams. When used this technique segments text into sequences of n characters which are then stored in Yioop as a term. For instance if n were 3 then the word &quot;thunder&quot; would be split into &quot;thu&quot;, &quot;hun&quot;, &quot;und&quot;, &quot;nde&quot;, and &quot;der&quot; and each of these would be asscociated with the document that contained the word thunder. N-grams are useful for languages like Chinese and Japanese in which words in the text are often not separated with spaces. It is also useful for languages like German which can have long compound words. The drawback of n-grams is that they tend to make the index larger. For Yioop built-in locales that do not have stemmer the file, the file WORK_DIRECTORY/locale/LOCALE-TAG/resources/tokenizer.php has a line of the form $CHARGRAMS[&#039;LOCALE_TAG&#039;] = SOME_NUMBER; This number is the length of string to use in doing char-gramming. If you add a language to Yioop and want to use char gramming merely add a tokenizer.php to the corresponding locale folder with such a line in it.
+
+{{id=&#039;token_tool&#039;
+====Using token_tool.php to improve search performance and relevance for your language====
+}}
+
+configs/token_tool.php is used to create suggest word dictionaries and word filter files for the Yioop search engine. To create either of these items, the user puts a source file in Yioop&#039;s WORK_DIRECTORY/prepare folder. Suggest word dictionaries are used to supply the content of the dropdown of search terms that appears as a user is entering a query in Yioop. They are also used to do spell correction suggestions after a search has been performed. To make a suggest dictionary one can use a command like:
+
+ php token_tool.php dictionary filename locale endmarker
+
+Here &#039;&#039;filename&#039;&#039; should be in the current folder or PREP_DIR, locale is the locale this suggest (for example, en-US) file is being made for and where a file suggest_trie.txt.gz will be written, and endmarker is the end of word symbol to use in the trie. For example, $ works pretty well. The format of &#039;&#039;filename&#039;&#039; should be a sequence of line, each line containing a word or phrase followed by a space followed by a frequency count. i.e., the last thing on the line should be a number. Given a corpus of documents a frequency for a word would be the number of occurences of that word in the document.
+
+token_tool.php can also be used to make filter files used by a word segmenter. To make a filter file token_tool.php is run from the command line as:
+ php token_tool.php segment-filter dictionary_file locale
+
+Here dictionary_file should be a text file with one word/line, locale is the IANA language tag of the locale to store the results for.
+====Obtaining data sets for token_tool.php====
+
+Many word lists with frequencies are obtainable on the web for free with Creative Commons licenses. A good starting point is:
+ [[http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists|http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists]]
+A little script-fu can generally take such a list and output it with the line format of &quot;word/phrase space frequency&quot; needed by token_tool.php and as the word/line format used for filter files.
+
+====Spell correction and romanized input with locale.js====
+
+Yioop supports the ability to suggest alternative queries after a search is performed. These queries are mainly restricted to fixing typos in the original query. In order to calculate these spelling corrections, Yioop takes the query and for each query term computes each possible single character change to that term. For each of these it looks up in the given locale&#039;s suggest_trie.txt.gz a frequency count of that variant, if it exists. If the best suggestion is some multiple better than the frequency count of the original query then Yioop suggests this alternative query. In order for this to work, Yioop needs to know what constitutes a single character in the original query. The file locale.js in the WORK_DIRECTORY/locale/LOCALE_TAG/resources folder can be used to specify this for the locale given by LOCALE_TAG. To do this, all you need to do is specify a Javascript variable alpha. For example, for French (fr-FR) this looks like:
+ var alpha = &quot;a&aring;&agrave;bc&ccedil;de&eacute;&ecirc;fghi&icirc;&iuml;jklmno&ocirc;pqrstu&ucirc;vwxyz&quot;;
+The letters do not have to be in any alphabetical order, but should be comprehensive of the non-punctuation symbols of the language in question.
+
+Another thing locale.js can be used for is to given mappings between roman letters and other scripts for use in the Yioop&#039;s autosuggest dropdown that appears as you type a query. As you type, scripts/suggest.js function onTypeTerm is called. This in turn will cause a particular locale&#039;s locale.js function transliterate(query) if it exists. This function should return a string with the result of the transliteration. An example of doing this is given for the Telugu locale in Yioop.
+
+====Thesaurus Results and Part of Speech Tagging====
+
+As mentioned in the [[Documentation#Search%20Basics|Search Basics]] topic, for some queries Yioop displays a list of related queries to one side of the search results. These are obtained from a &quot;computer thesaurus&quot;. In this subsection, we describe how to enable this facility for English and how you could add this functionality for other languages. If enabled, the thesaurus also can be used to modify search ranking as described in the [[Ranking#Final%20Reordering|Final Reordering]] of the Yioop Ranking Mechanisms document.
+
+In order to generate suggested related queries, Yioop first tags the original query terms according to part of speech. For the en-US, this is done by calling a method: tagTokenizePartOfSpeech($text) in WORK_DIRECTORY/locale/en-US/resources/tokenizer.php. For en-US, a simple Brill tagger (see Ranking document for more info) is implemented to do this. After this method is called the terms in $text should have a suffix ~part-of-speech where ~part-of-speeech where part-of-speech is one of NN for noun, VB for verb, AJ for adjective, AV for adverb, or some other value (which would be ignored by Yioop). For example, the noun dog might become dog~NN after tagging. To localize to another language this method in the corresponding tokenizer.php file would need to be implemented.
+
+The second method needed for Thesaurus results is scoredThesaurusMatches($term, $word_type, $whole_query) which should also be in tokenizer.php for the desired locale. Here $term is a term (without a part-of-speech tag), $word_type is the part of speech (one of the ones listed above), and $whole_query is the original query. The output of this method should be an array of (score =&gt; array of thesaurus terms) associations. The score representing one word sense of term. In the case, of English, this method is implemented using [[http://wordnet.princeton.edu/|WordNet]]. So for thesaurus results to work for English, WordNet needs to be installed and in either the config.php file or local_config.php you need to define the constant WORDNET_EXEC to the path to the WordNet executable on your file system. On a Linux or OSX system, this might be something like: /usr/local/bin/wn .
+
+====Using Stop Words to improve Centroid Summarization====
+
+While crawling, Yioop makes use of a summarizer to extract the important portions of the web page both for indexing and for search result snippet purposes. There are two summarizers that come with Yioop a Basic summarizer, which uses an ad hoc approach to finding the most important parts of the document, and a centroid summarizer which tries to compute an &quot;average sentence&quot; for the document and uses this to pick representative sentence based on nearness to this average. The summarizer that is used can be set under the Crawl Time tab of [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]]. This latter summarizer works better if certain common words (stop words) from the documents language are removed. When using centroid summarizer, Yioop check to see if tokenizer.php for the current locale contains a method stopwordsRemover($page). If it does it calls it, this method takes a string of words are returns a string with all the stop words removed. This method exists for en-US, but, if desired, could also be implemented for other locales to improve centroid summarization.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Advanced Topics==
+===Modifying Yioop Code===
+One advantage of an open-source project is that you have complete access to the source code. Thus, Yioop can be modified to fit in with your existing project. You can also freely add new features onto Yioop. In this section, we look a little bit at some of the common ways you might try to modify Yioop as well as ways to examine the output of a crawl in a more technical manner. If you decide to modify the source code it is recommended that you look at the [[Documentation#Summary%20of%20Files%20and%20Folders|Summary of Files and Folders]] above again, as well as look at the [[http://www.seekquarry.com/yioop-docs/|online Yioop code documentation]].
+
+====Handling new File Types====
+One relatively easy enhancement to Yioop is to enhance the way it processes an existing file type or to get it to process new file types. Yioop was written from scratch without dependencies on existing projects. So the PHP processors for Microsoft file formats and for PDF are only approximate. These processors can be found in lib/processors. To write your own processor, you should extend either the TextProcessor or ImageProcessor class. You then need to write in your subclass a static method process($page, $url). Here $page is a string representation of a downloaded document of the file type you are going to handle and $url is the a canonical url from which this page is downloaded. This method should return an array of the format:
+ $summary[&#039;TITLE&#039;] = a title for the document
+ $summary[&#039;DESCRIPTION&#039;] = a text summary extracted from the document
+ $summary[&#039;LINKS&#039;] = an array of links (canonical not relative) extracted
+     from the document.
+A good reference implementation of a TextProcessor subclass can be found in html_processor.php. If you are trying to support a new file type, then to get Yioop to use your processor you need to add lines to some global variables at the top of the file. You should add the extension of the file type you are going to process to the array $INDEXED_FILE_TYPES. You will also need to add an entry $PAGE_PROCESSORS[&quot;new_mime_type_handle&quot;] = &quot;NewProcessor&quot;. As an example, these are the relevant lines at the top of ppt_processor.php:
+ $INDEXED_FILE_TYPES[] = &quot;ppt&quot;;
+ $PAGE_PROCESSORS[&quot;application/vnd.ms-powerpoint&quot;] = &quot;PptProcessor&quot;;
+If your processor is cool, only relies on code you wrote, and you want to contribute it back to the Yioop, please feel free to e-mail it to chris@pollett.org .
+
+====Writing an Indexing Plugin====
+An indexing plugin provides a way that an advanced end-user can extend the indexing capabilities of Yioop. Bundled with Yioop are three example indexing plugins. These are found in the lib/indexing_plugins folder. We will discuss the code for the recipe and word filter plugin here. The code for the address plugin, used to extract snail mail address from web pages follows the same kind of structure. If you decide to write your own plugin or want to install a third-party plugin you can put it in the folder: WORK_DIRECTORY/app/lib/indexing_plugins. The recipe indexing plugin can serve as a guide for writing your own plugin if you don&#039;t need your plugin to have a configure screen. The recipe plugin is used to detect food recipes which occur on pages during a crawl. It creates &quot;micro-documents&quot; associated with found recipes. These are stored in the index during the crawl under the meta-word &quot;recipe:all&quot;. After the crawl is over, the recipe plugin&#039;s postProcessing method is called. It looks up all the documents associated with the word &quot;recipe:all&quot;. It extracts ingredients from these and does clustering of recipes based on ingredient. It finally injects new meta-words of the form &quot;ingredient:some_food_ingredient&quot;, which can be used to retrieve recipes most closely associated with a given ingredient. As it is written, recipe plugin assumes that all the recipes can be read into memory in one go, but one could easily imagine reading through the list of recipes in batches of the amount that could fit in memory in one go.
+
+The recipe plugin illustrates the kinds of things that can be written using indexing plugins. To make your own plugin, you would need to write a subclass of the class IndexingPlugin with a file name of the form mypluginname_plugin.php. Then you would need to put this file in the folder WORK_DIRECTORY/app/lib/indexing_plugins. RecipePlugin subclasses IndexingPlugin and implements the following four methods: pageProcessing($page, $url), postProcessing($index_name), getProcessors(), getAdditionalMetaWords() so they don&#039;t have their return NULL default behavior. We explain what each of these is for in a moment. During a web crawl, after a fetcher has downloaded a batch of web pages, it uses a page&#039;s mimetype to determine a page processor class to extract summary data from that page. The page processors that Yioop implements can be found in the folder lib/processors. They have file names of the form someprocessorname_processor.php. As a crawl proceeds, your plugin will typically be called to do further processing of a page only in addition to some of these processors. The static method getProcessors() should return an array of the form array( &quot;someprocessorname1&quot;, &quot;someprocessorname2&quot;, ...), listing the processors that your plugin will do additional processing of documents for. A page processor has a method handle($page, $url) called by Yioop with a string $page of a downloaded document and a string $url of where it was downloaded from. This method first calls the process($page, $url) method of the processor to do initial summary extraction and then calls method pageProcessing($page, $url) of each indexing_plugin associated with the given processor. A pageProcessing($page, $url) method is expected to return an array of subdoc arrays found on the given page. Each subdoc array should haves a CrawlConstants::TITLE and a CrawlConstants::DESCRIPTION. The handle method of a processor will add to each subdoc the fields: CrawlConstants::LANG, CrawlConstants::LINKS, CrawlConstants::PAGE, CrawlConstants::SUBDOCTYPE. The SUBDOCTYPE is the name of the plugin. The resulting &quot;micro-document&quot; is inserted by Yioop into the index under the word nameofplugin:all . After the crawl is over, Yioop will call the postProcessing($index_name) method of each indexing plugin that was in use. Here $index_name is the timestamp of the crawl. Your plugin can do whatever post processing it wants in this method. For example, the recipe plugin does searches of the index and uses the results of these searches to inject new meta-words into the index. In order for Yioop to be aware of the meta-words you are adding, you need to implement the method getAdditionalMetaWords(). Also, the web snippet you might want in the search results for things like recipes might be longer or shorter than a typical result snippet. The getAdditionalMetaWords() method also tells Yioop this information. For example, for the recipe plugin, getAdditionalMetaWords() returns the associative array:
+ array(&quot;recipe:&quot; =&gt; HtmlProcessor::MAX_DESCRIPTION_LEN,
+      &quot;ingredient:&quot; =&gt; HtmlProcessor::MAX_DESCRIPTION_LEN);
+The WordFilterPlugin illustrates how one can write an indexing plugin with a configure screen. It overrides the base class&#039; pageSummaryProcessing(&amp;$summary) and getProcessors() methods as well as implements the methods saveConfiguration($configuration), loadConfiguration(), setConfiguration($configuration), configureHandler(&amp;$data), and configureView(&amp;$data). The purpose of getProcessors() was already mentioned under recipe plugin description above. pageSummaryProcessing(&amp;$summary) is called by a page processor after a page has been processed and a summary generated. WordFilterPlugin uses this callback to check if the title or the description in this summary have any of the words the filter is filtering for and if so takes the appropriate action. loadConfiguration, saveConfiguration($configuration), and setConfiguration are three methods to handle persistence for any plugin data that the user can change. The first two operate on the name server, the last might operate on a queue_server or a fetcher. loadConfiguration is be called by configureHandler(&amp;$data) to read in any current configuration, unserialize it and modify it according to any data sent by the user. saveConfiguration($configuration) would then be called by configureHandler(&amp;$data) to serialize and write any $configuration data that needs to be stored by the plugin. For WordFilterPlugin, a list of filter terms and actions are what is saved by saveConfiguration($configuration) and loaded by loadConfiguration. When a crawl is started or when a fetcher contacts the name server, plugin configuration data is sent by the name server. The method setConfiguration($configuration) is used to initialize the local copy of a fetcher&#039;s or queue_server&#039;s process with the configuration settings from the name server. For WordFilterPlugin, the filter terms and actions are stored in a field variable by this function.
+
+As has already been hinted at by the configuration discussion above, configureHandler(&amp;$data) plays the role of a controller for an index plugin. It is in fact called by the AdminController activity pageOptions if the configure link for a plugin has been clicked. In addition, to managing the load and save configuration process, it also sets up any data needed by configureView(&amp;$data). For WordFilterPlugin, this involves setting a variable $data[&quot;filter_words&quot;] so that configureView(&amp;$data) has access to a list of filter words and actions to draw. Finally, the last method of the WordFilterPlugin we describe, configureView(&amp;$data), outputs using $data the HTML that will be seen in the configure screen. This HTML will appear in a div tag on the final page. It is initially styled so that it is not displayed. Clicking on the configure link will cause the div tag data to be displayed in a light box in the center of the screen. For WordFilterPlugin, this methods draws a title and textarea form with the currently filtered terms in it. It makes use of Yioop&#039;s tl() functions so that the text of the title can be localized to different languages. This form has hidden field c=admin, a=pageOptions option-type=crawl_time, so that hte AdminController will know to call pageOption and pageOption will know in turn to let plugin&#039;s configureHandler methods to get a chance to handle this data.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Yioop Command-line Tools===
+In addition to [[Documentation#token_tool|token_tool.php]] which we describe in the section on localization, and to [[Documentation#configs|export_public_help_db.php]] whcih we describe in the section on the Yioop folder structure, Yioop comes with several useful command-line tools and utilities. We next describe these in roughly their order of likely utility:
+
+* [[Documentation#configure_tool|bin/configure_tool.php]]: Used to configure Yioop from the command-line
+* [[Documentation#arc_tool|bin/arc_tool.php]]: Used to examine the contents of WebArchiveBundle&#039;s and IndexArchiveBundles&#039;s
+* [[Documentation#query_tool|bin/query_tool.php]]: Used to query an index from the command-line
+* [[Documentation#code_tool|bin/code_tool.php]]: Used to help code Yioop and to help make clean patches for Yioop.
+* [[Documentation#classifier_tool|bin/classifier_tool.php]]: Used to make Yioop a Yioop classifier from the command line rather than using the GUI interface.
+
+{{id=&#039;configure_tool&#039;
+====Configuring Yioop from the Command-line====
+}}
+
+In a multiple queue server and fetcher setting, one might have web access only to the name server machine -- all the other machines might be on virtual private servers to which one has only command-line access. Hence, it is useful to be able to set up a work directory and configure Yioop through the command-line. To do this one can use the script configs/configure_tool.php. One can run it from the command-line within the configs folder, with a line like:
+ php configure_tool.php
+When launched, this program will display a menu like:
+ Yioop CONFIGURATION TOOL
+ +++++++++++++++++++++++++
+
+ Checking Yioop configuration...
+ ===============================
+ Check Passed.
+ Using configs/local_config.php so changing work directory above may not work.
+ ===============================
+
+ Available Options:
+ ==================
+ (1) Create/Set Work Directory
+ (2) Change root password
+ (3) Set Default Locale
+ (4) Debug Display Set-up
+ (5) Search Access Set-up
+ (6) Search Page Elements and Links
+ (7) Name Server Set-up
+ (8) Crawl Robot Set-up
+ (9) Exit program
+
+ Please choose an option:
+Except for the Change root password option, these correspond to the different fieldsets on the Configure activity. The command-line forms one gets from selecting one of these choices let one set the same values as were described earlier in the [[Documentation#Installation%20and%20Configuration|Installation]] section. The change root password option lets one set the account password for root. I.e., the main admin user. On a non-nameserver machine, it is probably simpler to go with a sqlite database, rather than hit on a global mysql database from each machine. Such a barebones local database set-up would typically only have one user, root
+
+Another thing to consider when configuring a collection of Yioop machines in such a setting, is, by default, under Search Access Set-up, subsearch is unchecked. This means the RSS feeds won&#039;t be downloaded hourly on such machines. If one unchecks this, they can be.
+
+{{id=&#039;arc_tool&#039;
+====Examining the contents of WebArchiveBundle&#039;s and IndexArchiveBundles&#039;s====
+}}
+
+The command-line script bin/arc_tool.php can be used to examine and manipulate the contents of a WebArchiveBundle or an IndexArchiveBundle. Below is a summary of the different command-line uses of arc_tool.php:
+
+;&#039;&#039;&#039;php arc_tool.php count bundle_name&#039;&#039;&#039;
+ or
+&#039;&#039;&#039;php arc_tool.php count bundle_name save&#039;&#039;&#039; : returns the counts of docs and links for each shard in bundle  as well as an overall total. The second command saves the just computed count into the index description (can be used to fix the index count if it gets screwed up).
+; &#039;&#039;&#039;php arc_tool.php dict bundle_name word&#039;&#039;&#039; : returns index dictionary records for word stored in index archive bundle.
+; &#039;&#039;&#039;php arc_tool.php info bundle_name&#039;&#039;&#039; : return info about documents stored in archive.
+; &#039;&#039;&#039;php arc_tool.php inject timestamp file&#039;&#039;&#039; : injects the urls in file as a schedule into crawl of given timestamp. This can be used to make a closed index unclosed and to allow for continued crawling.
+; &#039;&#039;&#039;php arc_tool.php list&#039;&#039;&#039; : returns a list of all the archives in the Yioop! crawl directory, including non-Yioop! archives in the /archives sub-folder.
+; &#039;&#039;&#039;php arc_tool.php mergetiers bundle_name max_tier&#039;&#039;&#039; : merges tiers of word dictionary into one tier up to max_tier
+; &#039;&#039;&#039;php arc_tool.php posting bundle_name generation offset&#039;&#039;&#039;
+ or
+&#039;&#039;&#039;php arc_tool.php posting bundle_name generation offset num&#039;&#039;&#039; : returns info about the posting (num many postings) in bundle_name at the given generation and offset
+; &#039;&#039;&#039;php arc_tool.php rebuild bundle_name&#039;&#039;&#039; : Re-extracts words from summaries files in bundle_name into index shards then builds a new dictionary
+; &#039;&#039;&#039;php arc_tool.php reindex bundle_name&#039;&#039;&#039; : Reindex the word dictionary in bundle_name using existing index shards
+; &#039;&#039;&#039;php arc_tool.php shard bundle_name generation&#039;&#039;&#039; : Prints information about the number of words and frequencies of words within the generation&#039;th index shard in the bundle
+; &#039;&#039;&#039;php arc_tool.php show bundle_name start num&#039;&#039;&#039; : outputs items start through num from bundle_name or name of non-Yioop archive crawl folder
+
+The bundle name can be a full path name, a relative path from the current directory, or it can be just the bundle directory&#039;s file name in which case WORK_DIRECTORY/cache will be assumed to be the bundle&#039;s location. The following are some examples of using arc tool. Recall a backslash in Unix/OSX terminal is the line continuation character, so we can image lines where it is indicated below as being all on one line. They are not all from the same session:
+ |chris-polletts-macbook-pro:bin:108&gt;php arc_tool.php list
+ Found Yioop Archives:
+ =====================
+ 0-Archive1334468745
+ 0-Archive1336527560
+ IndexData1334468745
+ IndexData1336527560
+
+ Found Non-Yioop Archives:
+ =========================
+ english-wikipedia2012
+ chris-polletts-macbook-pro:bin:109&gt;
+
+ ...
+
+ |chris-polletts-macbook-pro:bin:158&gt;php arc_tool.php info \
+    /Applications/XAMPP/xamppfiles/htdocs/crawls/cache/IndexData1293767731
+
+ Bundle Name: IndexData1293767731
+ Bundle Type: IndexArchiveBundle
+ Description: test
+ Number of generations: 1
+ Number of stored links and documents: 267260
+ Number of stored documents: 16491
+ Crawl order was: Page Importance
+ Seed sites:
+    http://www.ucanbuyart.com/
+    http://www.ucanbuyart.com/fine_art_galleries.html
+    http://www.ucanbuyart.com/indexucba.html
+ Sites allowed to crawl:
+    domain:ucanbuyart.com
+    domain:ucanbuyart.net
+ Sites not allowed to be crawled:
+    domain:arxiv.org
+    domain:ask.com
+ Meta Words:
+    http://www.ucanbuyart.com/(.+)/(.+)/(.+)/(.+)/
+
+ |chris-polletts-macbook-pro:bin:159&gt;
+ |chris-polletts-macbook-pro:bin:202&gt;php arc_tool.php show \
+     /Applications/XAMPP/xamppfiles/htdocs/crawls/cache/Archive1293767731 0 3
+
+ BEGIN ITEM, LENGTH:21098
+ [URL]
+ http://www.ucanbuyart.com/robots.txt
+ [HTTP RESPONSE CODE]
+ 404
+ [MIMETYPE]
+ text/html
+ [CHARACTER ENCODING]
+ ASCII
+ [PAGE DATA]
+ &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
+   &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
+
+ &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot;&gt;
+
+ &lt;head&gt;
+     &lt;base href=&quot;http://www.ucanbuyart.com/&quot; /&gt;
+    &lt;/pre&gt;
+ ...
+
+ |chris-polletts-macbook-pro:bin:117&gt;php arc_tool.php reindex IndexData1317414152
+
+ Shard 0
+ [Sat, 01 Oct 2011 11:05:17 -0700] Adding shard data to dictionary files...
+ [Sat, 01 Oct 2011 11:05:28 -0700] Merging tiers of dictionary
+
+ Final Merge Tiers
+
+ Reindex complete!!
+
+The mergetiers command is like a partial reindex. It assumes all the shard words have been added to the dictionary, but that the dictionary still has more than one tier (tiers are the result of incremental log-merges which are made during the crawling process). The mergetiers command merges these tiers into one large tier which is then usable by Yioop for query processing.
+
+{{id=&#039;query_tool&#039;
+====Querying an Index from the command-line====
+}}
+
+The command-line script bin/query_tool.php can be used to query indices in the Yioop WORK_DIRECTORY/cache. This tool can be used on an index regardless of whether or not Apache is running. It can be used for long running queries that might timeout when run within a browser to put their results into memcache or filecache. The command-line arguments for the query tool are:
+ php query_tool.php query num_results start_num lang_tag
+The default num_results is 10, start_num is 0, and lang_tag is en-US. The following shows how one could do a query on &quot;Chris Pollett&quot;:
+
+ |chris-polletts-macbook-pro:bin:141&gt;php query_tool.php &quot;Chris Pollett&quot;
+
+ ============
+ TITLE: ECCC - Pointers to
+ URL: http://eccc.hpi-web.de/static/pointers/personal_www_home_pages_of_complexity_theorists/
+ IPs: 141.89.225.3
+ DESCRIPTION: Homepage of the Electronic Colloquium on Computational Complexity located
+ at the Hasso Plattner Institute of Potsdam, Germany Personal WWW pages of
+ complexity people 2011 2010 2009 2011...1994 POINTE
+ Rank: 3.9551158411
+ Relevance: 0.492443777769
+ Proximity: 1
+ Score: 4.14
+ ============
+
+ ============
+ TITLE: ECCC - Pointers to
+ URL: http://www.eccc.uni-trier.de/static/pointers/personal_www_home_pages_of_complexity_theorists/
+ IPs: 141.89.225.3
+ DESCRIPTION: Homepage of the Electronic Colloquium on Computational Complexity located
+ at the Hasso Plattner Institute of Potsdam, Germany Personal WWW pages of
+ complexity people 2011 2010 2009 2011...1994 POINTE
+ Rank: 3.886318974
+ Relevance: 0.397622570289
+ Proximity: 1
+ Score: 4.03
+ ============
+
+ .....
+
+The index the results are returned from is the default index; however, all of the Yioop meta words should work so you can do queries like &quot;my_query i:timestamp_of_index_want&quot;. Query results depend on the kind of language stemmer/char-gramming being used, so French results might be better if one specifies fr-FR then if one relies on the default en-US.
+
+{{id=&#039;code_tool&#039;
+====A Tool for Coding and Making Patches for Yioop====
+}}
+
+&#039;&#039;&#039;bin/code_tool.php&#039;&#039;&#039; can perform several useful tasks to help developers program for the Yioop environment. Below is a brief summary of its functionality:
+
+;&#039;&#039;&#039;php code_tool.php clean path&#039;&#039;&#039; : Replaces all tabs with four spaces and trims all whitespace off ends of lines in the folder or file path.
+;&#039;&#039;&#039;php code_tool.php copyright path&#039;&#039;&#039; : Adjusts all lines in the files in the folder at path (or if path is a file just that) of the form 2009 - \d\d\d\d to the form 2009 - this_year where this_year is the current year.
+;&#039;&#039;&#039;php code_tool.php longlines path&#039;&#039;&#039; : Prints out all lines in files in the folder or file path which are longer than 80 characters.
+;&#039;&#039;&#039;php code_tool.php replace path pattern replace_string&#039;&#039;&#039;
+ or
+&#039;&#039;&#039;php code_tool.php replace path pattern replace_string effect&#039;&#039;&#039; : Prints all lines matching the regular expression pattern followed by the result of replacing pattern with replace_string in the folder or file path. Does not change files.
+;&#039;&#039;&#039;php code_tool.php replace path pattern replace_string interactive&#039;&#039;&#039; : Prints each line matching the regular expression pattern followed by the result of replacing pattern with replace_string in the folder or file path. Then it asks if you want to update the line. Lines you choose for updating will be modified in the files.
+;&#039;&#039;&#039;php code_tool.php replace path pattern replace_string change&#039;&#039;&#039; : Each line matching the regular expression pattern is update by replacing pattern with replace_string in the folder or file path. This format doe not echo anything, it does a global replace without interaction.
+;&#039;&#039;&#039;php code_tool.php search path pattern&#039;&#039;&#039; :Prints all lines matching the regular expression pattern in the folder or file path.
+
+{{id=&#039;classifier_tool&#039;
+====A Command-line Tool for making Yioop Classifiers====
+}}
+
+&#039;&#039;&#039;bin/classifier_tool.php&#039;&#039;&#039; is used to automate the building and testing of classifiers, providing an alternative to the web interface when a labeled training set is available.
+
+&#039;&#039;&#039;classifier_tool.php&#039;&#039;&#039; takes an activity to perform, the name of a dataset to use, and a label for the constructed classifier. The activity is the name of one of the &#039;run*&#039; functions implemented by this class, without the common &#039;run&#039; prefix (e.g., &#039;TrainAndTest&#039;). The dataset is specified as the common prefix of two indexes that have the suffixes &quot;Pos&quot; and &quot;Neg&quot;, respectively. So if the prefix were &quot;DATASET&quot;, then this tool would look for the two existing indexes &quot;DATASET Pos&quot; and &quot;DATASET Neg&quot; from which to draw positive and negative examples. Each document in these indexes should be a positive or negative example of the target class, according to whether it&#039;s in the &quot;Pos&quot; or &quot;Neg&quot; index. Finally, the label is just the label to be used for the constructed classifier.
+
+Beyond these options (set with the -a, -d, and -l flags), a number of other options may be set to alter parameters used by an activity or a classifier. These options are set using the -S, -I, -F, and -B flags, which correspond to string, integer, float, and boolean parameters respectively. These flags may be used repeatedly, and each expects an argument of the form NAME=VALUE, where NAME is the name of a parameter, and VALUE is a value parsed according to the flag. The NAME should match one of the keys of the options member of this class, where a period (&#039;.&#039;) may be used to specify nesting. For example:
+ -I debug=1         # set the debug level to 1
+ -B cls.use_nb=0    # tell the classifier to use Naive Bayes
+To build and evaluate a classifier for the label &#039;spam&#039;, trained using the two indexes &quot;DATASET Neg&quot; and &quot;DATASET Pos&quot;, and a maximum of the top 25 most informative features:
+ php bin/classifier_tool.php -a TrainAndTest -d &#039;DATASET&#039; -l &#039;spam&#039;
+    -I cls.chi2.max=25
+
+==References==
+
+;{{id=&#039;APC2003&#039; &#039;&#039;&#039;[APC2003]&#039;&#039;&#039;}} : Serge Abiteboul and Mihai Preda and Gregory Cobena. [[http://leo.saclay.inria.fr/publifiles/gemo/GemoReport-290.pdf|Adaptive on-line page importance computation]]. In: Proceedings of the 12th international conference on World Wide Web. pp.280-290. 2003.
+;{{id=&#039;B1970&#039; &#039;&#039;&#039;[B1970]&#039;&#039;&#039;}} : Bloom, Burton H. [[http://www.lsi.upc.edu/~diaz/p422-bloom.pdf|Space/time trade-offs in hash coding with allowable errors]]. Communications of the ACM Volume 13 Issue 7. pp. 422&ndash;426. 1970.
+;{{id=&#039;BSV2004&#039; &#039;&#039;&#039;[BSV2004]&#039;&#039;&#039;}} : Paolo Boldi and Massimo Santini and Sebastiano Vigna. [[http://vigna.di.unimi.it/ftp/papers/ParadoxicalPageRank.pdf|Do Your Worst to Make the Best: Paradoxical Effects in PageRank Incremental Computations]]. Algorithms and Models for the Web-Graph. pp. 168&ndash;180. 2004.
+;{{id=&#039;BP1998&#039; &#039;&#039;&#039;[BP1998]&#039;&#039;&#039;}} : Brin, S. and Page, L. [[http://infolab.stanford.edu/~backrub/google.html|The Anatomy of a Large-Scale Hypertextual Web Search Engine]]. In: Seventh International World-Wide Web Conference (WWW 1998). April 14-18, 1998. Brisbane, Australia. 1998.
+;{{id=&#039;BCC2010&#039; &#039;&#039;&#039;[BCC2010]&#039;&#039;&#039;}} : S. B&uuml;ttcher, C. L. A. Clarke, and G. V. Cormack. [[http://mitpress.mit.edu/books/information-retrieval|Information Retrieval: Implementing and Evaluating Search Engines]]. MIT Press. 2010.
+;{{id=&#039;DG2004&#039; &#039;&#039;&#039;[DG2004]&#039;&#039;&#039;}} : Jeffrey Dean and Sanjay Ghemawat. [[http://research.google.com/archive/mapreduce-osdi04.pdf|MapReduce: Simplified Data Processing on Large Clusters]]. OSDI&#039;04: Sixth Symposium on Operating System Design and Implementation. 2004
+;{{id=&#039;GGL2003&#039; &#039;&#039;&#039;[GGL2003]&#039;&#039;&#039;}} : Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung. [[http://research.google.com/archive/gfs-sosp2003.pdf|The Google File System]]. 19th ACM Symposium on Operating Systems Principles. 2003.
+;{{id=&#039;GLM2007&#039; &#039;&#039;&#039;[GLM2007]&#039;&#039;&#039;}} : A. Genkin, D. Lewis, and D. Madigan. [[http://www.stat.columbia.edu/~madigan/PAPERS/techno.pdf|Large-scale bayesian logistic regression for text categorization]]. Technometrics. Volume 49. Issue 3. pp. 291--304, 2007.
+;{{id=&#039;H2002&#039; &#039;&#039;&#039;[H2002]&#039;&#039;&#039;}} : T. Haveliwala. [[http://infolab.stanford.edu/~taherh/papers/topic-sensitive-pagerank.pdf|Topic-Sensitive PageRank]]. Proceedings of the Eleventh International World Wide Web Conference (Honolulu, Hawaii). 2002.
+;{{id=&#039;KSV2010&#039; &#039;&#039;&#039;[KSV2010]&#039;&#039;&#039;}} : Howard Karloff, Siddharth Suri, and Sergei Vassilvitskii. [[http://theory.stanford.edu/~sergei/papers/soda10-mrc.pdf|A Model of Computation for MapReduce]]. Proceedings of the ACM Symposium on Discrete Algorithms. 2010. pp. 938-948.
+;{{id=&#039;KC2004&#039; &#039;&#039;&#039;[KC2004]&#039;&#039;&#039;}} : Rohit Khare and Doug Cutting. [[http://www.master.netseven.it/files/262-Nutch.pdf|Nutch: A flexible and scalable open-source web search engine]]. CommerceNet Labs Technical Report 04. 2004.
+;{{id=&#039;LDH2010&#039; &#039;&#039;&#039;[LDH2010]&#039;&#039;&#039;}} : Jimmy Lin and Chris Dyer. [[http://www.umiacs.umd.edu/~jimmylin/MapReduce-book-final.pdf|Data-Intensive Text Processing with MapReduce]]. Synthesis Lectures on Human Language Technologies. Morgan and Claypool Publishers. 2010.
+;{{id=&#039;LM2006&#039; &#039;&#039;&#039;[LM2006]&#039;&#039;&#039;}} : Amy N. Langville and Carl D. Meyer. [[http://press.princeton.edu/titles/8216.html|Google&#039;s PageRank and Beyond]]. Princton University Press. 2006.
+;{{id=&#039;MRS2008&#039; &#039;&#039;&#039;[MRS2008]&#039;&#039;&#039;}} : C. D. Manning, P. Raghavan and H. Sch&uuml;tze. [[http://nlp.stanford.edu/IR-book/information-retrieval-book.html|Introduction to Information Retrieval]]. Cambridge University Press. 2008.
+;{{id=&#039;MKSR2004&#039; &#039;&#039;&#039;[MKSR2004]&#039;&#039;&#039;}} : G. Mohr, M. Kimpton, M. Stack, and I.Ranitovic. [[http://iwaw.europarchive.org/04/Mohr.pdf|Introduction to Heritrix, an archival quality web crawler]]. 4th International Web Archiving Workshop. 2004.
+;{{id=&#039;PTSHVC2011&#039; &#039;&#039;&#039;[PTSHVC2011]&#039;&#039;&#039;}} : Manish Patil, Sharma V. Thankachan, Rahul Shah, Wing-Kai Hon, Jeffrey Scott Vitter, Sabrina Chandrasekaran. [[http://www.ittc.ku.edu/~jsv/Papers/PTS11.InvertedIndexSIGIR.pdf|Inverted indexes for phrases and strings]]. Proceedings of the 34nth Annual International ACM SIGIR Conference on Research and Development in Information Retrieval. pp 555--564. 2011.
+;{{id=&#039;P1997a&#039; &#039;&#039;&#039;[P1997a]&#039;&#039;&#039;}} : J. Peek. [[http://www.usenix.org/publications/library/proceedings/ana97/summaries/monier.html|Summary of the talk: The AltaVista Web Search Engine]] by Louis Monier. USENIX Annual Technical Conference Anaheim. California. ;login: Volume 22. Number 2. April 1997.
+;{{id=&#039;P1997b&#039; &#039;&#039;&#039;[P1997b]&#039;&#039;&#039;}} : J. Peek. [[http://www.usenix.org/publications/library/proceedings/ana97/summaries/brewer.html|Summary of the talk: The Inktomi Search Engine by Louis Monier]]. USENIX Annual Technical Conference. Anaheim, California. ;login: Volume 22. Number 2. April 1997.
+;{{id=&#039;P1994&#039; &#039;&#039;&#039;[P1994]&#039;&#039;&#039;}} : B. Pinkerton. [[http://web.archive.org/web/20010904075500/http://archive.ncsa.uiuc.edu/SDG/IT94/Proceedings/Searching/pinkerton/WebCrawler.html|Finding what people want: Experiences with the WebCrawler]]. In Proceedings of the First World Wide Web Conference, Geneva, Switzerland. 1994.
+;{{id=&#039;P1980&#039; &#039;&#039;&#039;[P1980]&#039;&#039;&#039;}} : M.F. Porter. [[http://tartarus.org/~martin/PorterStemmer/def.txt|An algorithm for suffix stripping]]. Program. Volume 14 Issue 3. 1980. pp 130&minus;137. On the same website, there are [[http://snowball.tartarus.org/|stemmers for many other languages]].
+;{{id=&#039;PDGQ2006&#039; &#039;&#039;&#039;[PDGQ2006]&#039;&#039;&#039;}} : Rob Pike, Sean Dorward, Robert Griesemer, Sean Quinlan. [[http://research.google.com/archive/sawzall-sciprog.pdf|Interpreting the Data: Parallel Analysis with Sawzall]]. Scientific Programming Journal. Special Issue on Grids and Worldwide Computing Programming Models and Infrastructure.Volume 13. Issue 4. 2006. pp.227-298.
+;{{id=&#039;W2009&#039; &#039;&#039;&#039;[W2009]&#039;&#039;&#039;}} : Tom White. [[http://www.amazon.com/gp/product/1449389732/ref=pd_lpo_k2_dp_sr_1?pf_rd_p=486539851&amp;pf_rd_s=lpo-top-stripe-1&amp;pf_rd_t=201&amp;pf_rd_i=0596521979&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0N5VCGFDA7V7MJXH69G6|Hadoop: The Definitive Guide]]. O&#039;Reilly. 2009.
+;{{id=&#039;ZCTSR2004&#039; &#039;&#039;&#039;[ZCTSR2004]&#039;&#039;&#039;}} : Hugo Zaragoza, Nick Craswell, Michael Taylor, Suchi Saria, and Stephen Robertson. [[http://trec.nist.gov/pubs/trec13/papers/microsoft-cambridge.web.hard.pdf|Microsoft Cambridge at TREC-13: Web and HARD tracks]]. In Proceedings of 3th Annual Text Retrieval Conference. 2004.
+
+[[Documentation#contents|Return to table of contents]].
+EOD;
+$public_pages["en-US"]["Documentation"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Open Source Search Engine Software - Seekquarry :: Documentation
+
+author=Chris Pollett
+
+robots=
+
+description=
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS{{id=&quot;contents&quot;
+=Yioop Documentation v 3.0=
+}}
+
+==Overview==
+===Getting Started===
+If you have downloaded Version 2.1 of the software you may prefer to use a capture of the ((resource:Version210.pdf|Version2.10 Documentation-PDF)) .
+
+This document serves as a detailed reference for the Yioop search engine. If you want to get started using Yioop now, you probably want to first read the [[Install|Installation Guides]] page and look at the [[http://www.yioop.com/group/20/Main|Yioop Video Tutorials Wiki]]. If you cannot find your particular machine configuration there, you can check the Yioop [[Documentation#Requirements|Requirements]] section followed by the more general Installation and Configuration instructions.
+
+[[Yioop.com]], the demo site for Yioop software, allows people to register accounts. Once registered, if you have questions about Yioop and its installation, you can join the
+[[https://yioop.com/group/212|Yioop Software Help]] group and post your questions there. This group is frequently checked by the creators of Yioop, and you will likely get a quick response.
+
+Having a Yioop account also allows you to experiment with some of the features of Yioop beyond search such as Yioop Groups, Wikis, and Crawl Mixes without needing to install the software yourself. The [[Documentation#Search%20and%20User%20Interface|Search and User Interface]], [[Documentation#Managing%20Users,%20Roles,%20and%20Groups|Managing Users, Roles, and Groups]], [[Documentation#Feeds%20and%20Wikis|Feeds and Wikis]], and [[Documentation#Mixing%20Crawl%20Indexes|Mixing Crawl Indexes]] sections below could serve as a guide to testing the portion of the site general users have access to on Yioop.com.
+
+When using Yioop software and do not understand a feature, make sure to also check out the integrated help system throughout Yioop. Clicking on a question mark icon will reveal an additional blue column on a page with help information as seen below:
+{{class=&quot;docs&quot;
+((resource:Documentation:IntegratedHelp.png|Integrated Help Example))
+}}
+
+===Introduction===
+
+The Yioop search engine is designed to allow users to produce indexes of a web-site or a collection of web-sites. The number of pages a Yioop index can handle range from small site to those containing tens or hundreds of millions of pages. In contrast, a search-engine like Google maintains an index of tens of billions of pages. Nevertheless, since you, the user, have control over the exact sites which are being indexed with Yioop, you have much better control over the kinds of results that a search will return. Yioop provides a traditional web interface to do queries, an rss api, and a function api. It also supports many common features of a search portal such as user discussion group, blogs, wikis, and a news aggregator. In this section we discuss some of the different search engine technologies which exist today, how Yioop fits into this eco-system, and when Yioop might be the right choice for your search engine needs. In the remainder of this document after the introduction, we discuss how to get and install Yioop; the files and folders used in Yioop; the various crawl, search, social portal, and administration facilities in the Yioop; localization in the Yioop system; building a site using the Yioop framework; embedding Yioop in an existing web-site; customizing Yioop; and the Yioop command-line tools.
+
+Since the mid-1990s a wide variety of search engine technologies have been explored. Understanding some of this history is useful in understanding Yioop capabilities. In 1994, Web Crawler, one of the earliest still widely-known search engines, only had an index of about 50,000 pages which was stored in an Oracle database. Today, databases are still used to create indexes for small to medium size sites. An example of such a search engine written in PHP is [[http://www.sphider.eu/|Sphider]]. Given that a database is being used, one common way to associate a word with a document is to use a table with a columns like word id, document id, score. Even if one is only extracting about a hundred unique words per page, this table&#039;s size would need to be in the hundreds of millions for even a million page index. This edges towards the limits of the capabilities of database systems although techniques like table sharding can help to some degree. The Yioop engine uses a database to manage some things like users and roles, but uses its own web archive format and indexing technologies to handle crawl data. This is one of the reasons that Yioop can scale to larger indexes.
+
+When a site that is being indexed consists of dynamic pages rather than the largely static page situation considered above, and those dynamic pages get most of their text content from a table column or columns, different search index approaches are often used. Many database management systems like [[http://www.mysql.com/|MySQL]]/[[https://mariadb.org/|MariaDB]], support the ability to create full text indexes for text columns. A faster more robust approach is to use a stand-alone full text index server such as [[http://www.sphinxsearch.com/|Sphinx]]. However, for these approaches to work the text you are indexing needs to be in a database column or columns, or have an easy to define &quot;XML mapping&quot;. Nevertheless, these approaches illustrate another common thread in the development of search systems: Search as an appliance, where you either have a separate search server and access it through either a web-based API or through function calls.
+
+Yioop has both a search function API as well as a web API that can return [[http://www.opensearch.org/|Open Search RSS]] results or a JSON variant. These can be used to embed Yioop within your existing site. If you want to create a new search engine site, Yioop
+provides all the basic features of web search portal. It has its own account management system with the ability to set up groups that have both discussions boards and wikis with various levels of access control. The built in Public group&#039;s wiki together with the GUI configure page can be used to completely customize the look and feel of Yioop. Third party display ads can also be added through the GUI interface. If you want further customization, Yioop
+offers a web-based, model-view-adapter (a variation on model-view-controller) framework with a web-interface for localization.
+
+By 1997 commercial sites like Inktomi and AltaVista already had tens or hundreds of millions of pages in their indexes [ [[Documentation#P1994|P1994]] ] [ [[Documentation#P1997a|P1997a]] ] [ [[Documentation#P1997b|P1997b]] ]. Google [ [[Documentation#BP1998|BP1998]] ] circa 1998 in comparison had an index of about 25 million pages. These systems used many machines each working on parts of the search engine problem. On each machine there would, in addition, be several search related processes, and for crawling, hundreds of simultaneous threads would be active to manage open connections to remote machines. Without threading, downloading millions of pages would be very slow. Yioop is written in [[http://www.php.net/|PHP]]. This language is the `P&#039; in the very popular [[http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29|LAMP]] web platform. This is one of the reasons PHP was chosen as the language of Yioop. Unfortunately, PHP does not have built-in threads. However, the PHP language does have a multi-curl library (implemented in C) which uses threading to support many simultaneous page downloads. This is what Yioop uses. Like these early systems Yioop also supports the ability to distribute the task of downloading web pages to several machines. As the problem of managing many machines becomes more difficult as the number of machines grows, Yioop further has a web interface for turning on and off the processes related to crawling on remote machines managed by Yioop.
+
+There are several aspects of a search engine besides downloading web pages that benefit from a distributed computational model. One of the reasons Google was able to produce high quality results was that it was able to accurately rank the importance of web pages. The computation of this page rank involves repeatedly applying Google&#039;s normalized variant of the web adjacency matrix to an initial guess of the page ranks. This problem naturally decomposes into rounds. Within a round the Google matrix is applied to the current page ranks estimates of a set of sites. This operation is reasonably easy to distribute to many machines. Computing how relevant a word is to a document is another task that benefits from multi-round, distributed computation. When a document is processed by indexers on multiple machines, words are extracted and a stemming algorithm such as [ [[Documentation#P1980|P1980]] ] or a character n-gramming technique might be employed (a stemmer would extract the word jump from words such as jumps, jumping, etc; converting jumping to 3-grams would make terms of length 3, i.e., jum, ump, mpi, pin, ing). For some languages like Chinese, where spaces between words are not always used, a segmenting algorithm like reverse maximal match might be used. Next a statistic such as BM25F [ [[Documentation#ZCTSR2004|ZCTSR2004]] ] (or at least the non-query time part of it) is computed to determine the importance of that word in that document compared to that word amongst all other documents. To do this calculation one needs to compute global statistics concerning all documents seen, such as their average-length, how often a term appears in a document, etc. If the crawling is distributed it might take one or more merge rounds to compute these statistics based on partial computations on many machines. Hence, each of these computations benefit from allowing distributed computation to be multi-round. Infrastructure such as the Google File System [ [[Documentation#GGL2003|GGL2003]] ], the MapReduce model [ [[Documentation#DG2004|DG2004]] ], and the Sawzall language [ [[Documentation#PDGQ2006|PDGQ2006]] ] were built to make these multi-round distributed computation tasks easier. In the open source community, the [[http://hadoop.apache.org/docs/hdfs/current/hdfs_design.html|Hadoop Distributed File System]], [[http://hadoop.apache.org/docs/mapreduce/current/index.html|Hadoop MapReduce]], and [[http://hadoop.apache.org/pig/|Pig]] play an analogous role [ [[Documentation#W2009|W2009]] ]. Recently, a theoretical framework for what algorithms can be carried out as rounds of map inputs to sequence of key value pairs, shuffle pairs with same keys to the same nodes, reduce key-value pairs at each node by some computation has begun to be developed [ [[Documentation#KSV2010|KSV2010]] ]. This framework shows the map reduce model is capable of solving quite general cloud computing problems -- more than is needed just to deploy a search engine.
+
+Infrastructure such as this is not trivial for a small-scale business or individual to deploy. On the other hand, most small businesses and homes do have available several machines not all of whose computational abilities are being fully exploited. So the capability to do distributed crawling and indexing in this setting exists. Further high-speed internet for homes and small businesses is steadily getting better. Since the original Google paper, techniques to rank pages have been simplified [ [[Documentation#APC2003|APC2003]] ]. It is also possible to approximate some of the global statistics needed in BM25F using suitably large samples. More details on the exact ranking mechanisms used by Yioop and be found on the [[Ranking|Yioop Ranking Mechanisms]] page.
+
+Yioop tries to exploit these advances to use a simplified distributed model which might be easier to deploy in a smaller setting. Each node in a Yioop system is assumed to have a web server running. One of the Yioop nodes web app&#039;s is configured to act as a coordinator for crawls. It is called the &#039;&#039;&#039;name server&#039;&#039;&#039;. In addition to the name server, one might have several processes called &#039;&#039;&#039;queue servers&#039;&#039;&#039; that perform scheduling and indexing jobs, as well as &#039;&#039;&#039;fetcher&#039;&#039;&#039; processes which are responsible for downloading pages and the page processing such as stemming, char-gramming and segmenting mentioned above. Through the name server&#039;s web app, users can send messages to the queue servers and fetchers. This interface writes message files that queue servers periodically looks for. Fetcher processes periodically ping the name server to find the name of the current crawl as well as a list of queue servers. Fetcher programs then periodically make requests in a round-robin fashion to the queue servers for messages and schedules. A schedule is data to process and a message has control information about what kind of processing should be done. A given queue server is responsible for generating schedule files for data with a certain hash value, for example, to crawl urls for urls with host names that hash to queue server&#039;s id. As a fetcher processes a schedule, it periodically POSTs the result of its computation back to the responsible queue server&#039;s web server. The data is then written to a set of received files. The queue server as part of its loop looks for received files and merges their results into the index so far. So the model is in a sense one round: URLs are sent to the fetchers, summaries of downloaded pages are sent back to the queue servers and merged into their indexes. As soon as the crawl is over one can do text search on the crawl. Deploying this computation model is relatively simple: The web server software needs to be installed on each machine, the Yioop software (which has the the fetcher, queue server, and web app components) is copied to the desired location under the web server&#039;s document folder, each instance of Yioop is configured to know who the name server is, and finally, the fetcher programs and queue server programs are started.
+
+As an example of how this scales, 2010 Mac Mini running a queue server program can schedule and index about 100,000 pages/hour. This corresponds to the work of about 7 fetcher processes (which may be on different machines -- roughly, you want 1GB and 1core/fetcher). The checks by fetchers on the name server are lightweight, so adding another machine with a queue server and the corresponding additional fetchers allows one to effectively double this speed. This also has the benefit of speeding up query processing as when a query comes in, it gets split into queries for each of the queue server&#039;s web apps, but the query only &quot;looks&quot; slightly more than half as far into the posting list as would occur in a single queue server setting. To further increase query throughput, the number queries that can be handled at a given time, Yioop installations can also be configured as &quot;mirrors&quot; which keep an exact copy of the data stored in the site being mirrored. When a query request comes into a Yioop node, either it or any of its mirrors might handle it. Query processing, for multi-word queries can actually be a major bottleneck if you don&#039;t have many machines and you do have a large index. To further speed this up, Yioop uses a hybrid inverted index/suffix tree approach to store word lookups. The suffix tree ideas being motivated by [ [[Documentation#PTSHVC2011|PTSHVC2011]] ].
+
+Since a multi-million page crawl involves both downloading from the web rapidly over several days, Yioop supports the ability to dynamically change its crawl parameters as a crawl is going on. This allows a user on request from a web admin to disallow Yioop from continuing to crawl a site or to restrict the number of urls/hours crawled from a site without having to stop the overall crawl. One can also through a web interface inject new seed sites, if you want, while the crawl is occurring. This can help if someone suggests to you a site that might otherwise not be found by Yioop given its original list of seed sites. Crawling at high-speed can cause a website to become congested and unresponsive. As of Version 0.84, if Yioop detects a site is becoming congested it can automatically slow down the crawling of that site. Finally, crawling at high-speed can cause your domain name server (the server that maps www.yioop.com to 173.13.143.74) to become slow. To reduce the effect of this Yioop supports domain name caching.
+
+Despite its simpler one-round model, Yioop does a number of things to improve the quality of its search results. While indexing, Yioop can make use Lasso regression classifiers [ [[Documentation#GLM2007|GLM2007]] ] using data from earlier crawls to help label and/or rank documents in the active crawl. Yioop also takes advantage of the link structure that might exist between documents in a one-round way: For each link extracted from a page, Yioop creates a micropage which it adds to its index. This includes relevancy calculations for each word in the link as well as an [ [[Documentation#APC2003|APC2003]] ]-based ranking of how important the link was. Yioop supports a number of iterators which can be thought of as implementing a stripped-down relational algebra geared towards word-document indexes (this is much the same idea as Pig). One of these operators allows one to make results from unions of stored crawls. This allows one to do many smaller topic specific crawls and combine them with your own weighting scheme into a larger crawl. A second useful operator allows you to display a certain number of results from a given subquery, then go on to display results from other subqueries. This allows you to make a crawl presentation like: the first result should come from the open crawl results, the second result from Wikipedia results, the next result should be an image, and any remaining results should come from the open search results. Yioop comes with a GUI facility to make the creation of these crawl mixes easy. To speed up query processing for these crawl mixes one can also create materialized versions of crawl mix results, which makes a separate index of crawl mix results. Another useful operator Yioop supports allows one to perform groupings of document results. In the search results displayed, grouping by url allows all links and documents associated with a url to be grouped as one object. Scoring of this group is a sum of all these scores. Thus, link text is used in the score of a document. How much weight a word from a link gets also depends on the link&#039;s rank. So a low-ranked link with the word &quot;stupid&quot; to a given site would tend not to show up early in the results for the word &quot;stupid&quot;. Grouping also is used to handle deduplication: It might be the case that the pages of many different URLs have essentially the same content. Yioop creates a hash of the web page content of each downloaded url. Amongst urls with the same hash only the one that is linked to the most will be returned after grouping. Finally, if a user wants to do more sophisticated post-processing such as clustering or computing page rank, Yioop supports a straightforward architecture for indexing plugins.
+
+There are several open source crawlers which can scale to crawls in the millions to hundred of millions of pages. Most of these are written in Java, C, C++, C#, not PHP. Three important ones are [[http://nutch.apache.org/|Nutch]]/ [[http://lucene.apache.org/|Lucene]]/ [[http://lucene.apache.org/solr/|Solr]] [ [[Documentation#KC2004|KC2004]] ], [[http://www.yacy.net/|YaCy]], and [[http://crawler.archive.org/|Heritrix]] [ [[Documentation#MKSR2004|MKSR2004]] ]. Nutch is the original application for which the Hadoop infrastructure described above was developed. Nutch is a crawler, Lucene is for indexing, and Solr is a search engine front end. The YaCy project uses an interesting distributed hash table peer-to-peer approach to crawling, indexing, and search. Heritrix is a web crawler developed at the [[http://www.archive.org/|Internet Archive]]. It was designed to do archival quality crawls of the web. Its ARC file format inspired the use of WebArchive objects in Yioop. WebArchives are Yioop&#039;s container file format for storing web pages, web summary data, url lists, and other kinds of data used by Yioop. A WebArchive is essentially a linked-list of compressed, serialized PHP objects, the last element in this list containing a header object with information like version number and a total count of objects stored. The compression format can be chosen to suit the kind of objects being stored. The header can be used to store auxiliary data structures into the list if desired. One nice aspect of serialized PHP objects versus serialized Java Objects is that they are humanly readable text strings. The main purpose of Web Archives is to allow one to store many small files compressed as one big file. They also make data from web crawls very portable, making them easy to copy from one location to another. Like Nutch and Heritrix, Yioop also has a command-line tool for quickly looking at the contents of such archive objects.
+
+The [[http://www.archive.org/web/researcher/ArcFileFormat.php|ARC format]] is one example of an archival file format for web data. Besides at the Internet Archive, ARC and its successor [[http://www.digitalpreservation.gov/formats/fdd/fdd000236.shtml|WARC format]] are often used by TREC conferences to store test data sets such as [[http://ir.dcs.gla.ac.uk/test_collections/|GOV2]] and the [[http://lemurproject.org/clueweb09/|ClueWeb 2009]] / [[http://lemurproject.org/clueweb12/|ClueWeb 2012]] Datasets. In addition, it was used by grub.org (hopefully, only on a temporary hiatus), a distributed, open-source, search engine project in C#. Another important format for archiving web pages is the XML format used by Wikipedia for archiving MediaWiki wikis. [[http://www.wikipedia.org/|Wikipedia]] offers [[http://en.wikipedia.org/wiki/Wikipedia:Database_download|creative common-licensed downloads]] of their site in this format. The [[http://www.dmoz.org/|Open Directory Project]] makes available its [[http://www.dmoz.org/rdf.html|ODP data set]] in an RDF-like format licensed using the Open Directory License. Thus, we see that there are many large scale useful data sets that can be easily licensed. Raw data dumps do not contain indexes of the data though. This makes sense because indexing technology is constantly improving and it is always possible to re-index old data. Yioop supports importing and indexing data from ARC, WARC, database queries results, MediaWiki XML dumps, and Open Directory RDF. Yioop further has a generic text importer which can be used to index log records, mail, Usenet posts, etc. Yioop also supports re-indexing of old Yioop data files created after version 0.66, and indexing crawl mixes. This means using Yioop you can have searchable access to many data sets as well as have the ability to maintain your data going forward. When displaying caches of web pages in Yioop, the interface further supports the ability to display a history of all cached copies of that page, in a similar fashion to Internet Archives interface.
+
+Another important aspect of creating a modern search engine is the ability to display in an appropriate way various media sources. Yioop comes with built-in subsearch abilities for images, where results are displayed as image strips; video, where thumbnails for video are shown; and news, where news items are grouped together and a configurable set of news/twitter feeds can be set to be updated on an hourly basis.
+
+This concludes the discussion of how Yioop fits into the current and historical landscape of search engines and indexes.
+
+===Feature List===
+
+Here is a summary of the features of Yioop:
+
+*&#039;&#039;&#039;General&#039;&#039;&#039;
+**Yioop is an open-source, distributed crawler and search engine written in PHP.
+**Crawling, indexing, and serving search results can be done on a single machine or distributed across several machines.
+**The fetcher/queue server processes on several machines can be managed through the web interface of a main Yioop instance.
+**Yioop installations can be created with a variety of topologies: one queue server and many fetchers or several queue servers and many fetchers.
+**Using web archives, crawls can be mirrored amongst several machines to speed-up serving search results. This can be further sped-up by using memcache or filecache.
+**Yioop can be used to create web sites via its own built-in wiki system. For more complicated customizations, Yioop&#039;s model-view-adapter framework is designed to be easily extendible. This framework also comes with a GUI which makes it easy to localize strings and static pages.
+**Yioop can be used as a package in other project using [[Composers|Composer]].
+**Yioop search result and feed pages can be configured to display banner or skyscraper ads through an Site Admin GUI (if desired).
+**Yioop search result and feed pages can also be configured to use Yioop&#039;s built-in keyword advertising system.
+**Yioop has been optimized to work well with smart phone web browsers and with tablet devices.
+*&#039;&#039;&#039;Social and User Interface&#039;&#039;&#039;
+**Yioop can be configured to allow or not to allow users to register for accounts.
+**If allowed, user accounts can create discussion groups, blogs, and wikis.
+** Blogs and wiki support attaching images, videos, and files and also support including math using LaTeX or AsciiMathML.
+** Yioop comes with two built in groups: Help and Public. Help&#039;s wiki pages allow one to customize the integrated help throughout the Yioop system. The Public Groups discussion can be used as a site blog, its wiki page can be used to customize the look-and-feel of the overall Yioop site without having to do programming.
+** Wiki pages support different types such as standard wiki page, page alias, media gallery, and slide presentation.
+** Video on wiki pages and in discussion posts is served using HTTP-pseudo streaming so users can scrub through video files. For uploaded video files below a configurable size limit, videos are automatically converted to web friendly mp4 format, provided the distributed version of the media updater is in use.
+** Wiki pages can be configured to have auto-generated tables of contents, to make use of common headers and footers, and to output meta tags for SEO purposes.
+**Users can share their own mixes of crawls that exist in the Yioop system.
+**If user accounts are enabled, Yioop has a search tools page on which people can suggest urls to crawl.
+**Yioop has three different captcha&#039;ing mechanisms that can be used in account registration and for suggest urls: a standard graphics-based captcha, a text-based captcha, and a hash-cash-like catpha.
+**Password authentication can be configured to either use a standard password hash based system, or make use of Fiat Shamir zero-knowledge authentication.
+*&#039;&#039;&#039;Search&#039;&#039;&#039;
+**Yioop supports subsearches geared towards presenting certain kinds of media such as images, video, and news. The list of video and news sites can be configured through the GUI. Yioop has a media updater process which can be used to automatically update news feeds hourly.
+**News feeds can either be RSS or Atom feed or can be scraped from an HTML page using XPath queries. What image is used for a news feed item can also be configured using XPath queries.
+**Several hourly processes such as news updates, video conversion, and mail delivery can be configured to be distributed across several machines automatically.
+**Yioop determines search results using a number of iterators which can be combined like a simplified relational algebra.
+**Yioop can be configured to display word suggestions as a user types a query. It can also suggest spell corrections for mis-typed queries. This feature can be localized.
+**Yioop can also make use of a thesaurus facility such as provided by WordNet to suggest related queries.
+**Yioop supports the ability to filter out urls from search results after a crawl has been performed. It also has the ability to edit summary information that will be displayed for urls.
+**A given Yioop installation might have several saved crawls and it is very quick to switch between any of them and immediately start doing text searches.
+**Besides the standard output of a web page with ten links, Yioop can output query results in Open Search RSS format, a JSON variant of this format, and also to query Yioop data via a function api.
+*&#039;&#039;&#039;Indexing&#039;&#039;&#039;
+**Yioop is capable of indexing small sites to sites or collections of sites containing low hundreds of millions of documents.
+**Yioop uses a hybrid inverted index/suffix tree approach for word lookup to make multi-word queries faster on disk bound machines.
+**Yioop indexes are positional rather than bag of word indexes, and a index compression scheme called Modified9 is used.
+**Yioop has a web interface which makes it easy to combine results from several crawl indexes to create unique result presentations. These combinations can be done in a conditional manner using &quot;if:&quot; meta words.
+**Yioop supports the indexing of many different filetypes including: HTML, Atom, BMP, DOC, DOCX ePub, GIF, JPG, PDF, PPT, PPTX, PNG, RSS, RTF, sitemaps, SVG, XLSX, and XML. It has a web interface for controlling which amongst these filetypes (or all of them) you want to index. It supports also attempting to extract information from unknown filetypes.
+**Yioop supports extracting data from zipped formats like DOCX even if it only did a partial download of the file.
+**Yioop has a simple page rule language for controlling what content should be extracted from a page or record.
+**Yioop has three different kinds of text summarizers which can be used to further affect what words are index: a basic web page scraper, a graph-base summarizer, and a centroid algorithm summarizer. The latter can be used to generate word clouds of crawled documents.
+**Indexing occurs as crawling happens, so when a crawl is stopped, it is ready to be used to handle search queries immediately.
+**Yioop Indexes can be used to create classifiers which then can be used in labeling and ranking future indexes.
+**Yioop comes with stemmers for English, Arabic, Dutch, French, German, Hindi, Italian, Persian, Portuguese, Russian, and Spanish, and a word segmenter for Chinese. It uses char-gramming for other languages. Yioop has a simple architecture for adding stemmers for other languages.
+**Yioop uses a web archive file format which makes it easy to copy crawl results amongst different machines. It has a command-line tool for inspecting these archives if they need to examined in a non-web setting. It also supports command-line search querying of these archives.
+**Yioop supports an indexing plugin architecture to make it possible to write one&#039;s own indexing modules that do further post-processing.
+*&#039;&#039;&#039;Web and Archive Crawling&#039;&#039;&#039;
+**Yioop supports open web crawls, but through its web interface one can configure it also to crawl only specifics site, domains, or collections of sites and domains. One can customize a crawl using regex in disallowed directives to crawl a site to a fixed depth.
+**Yioop uses multi-curl to support many simultaneous downloads of pages.
+**Yioop obeys robots.txt files including Google and Bing extensions such as the Crawl-delay and Sitemap directives as well as * and $ in allow and disallow. It further supports the robots meta tag directives NONE, NOINDEX, NOFOLLOW, NOARCHIVE, and NOSNIPPET and the link tag directive rel=&quot;canonical&quot;. It also supports anchor tags with rel=&quot;nofollow&quot; attributes. It also supports X-Robots-Tag HTTP headers. Finally, it tries to detect if a robots.txt became a redirect due to congestion.
+**Yioop comes with a word indexing plugin which can be used to control how Yioop crawls based on words on the page and the domain. This is useful for creating niche subject specific indexes.
+**Yioop has its own DNS caching mechanism and it adjusts the number of simultaneous downloads it does in one go based on the number of lookups it will need to do.
+** Yioop can crawl over HTTP, HTTPS, and Gopher protocols.
+**Yioop supports crawling TOR networks (.onion urls).
+**Yioop supports crawling through a list of proxy servers.
+**Yioop supports crawling Git Repositories and can index Java and Python code.
+**Yioop supports crawl quotas for web sites. I.e., one can control the number of urls/hour downloaded from a site.
+**Yioop can detect website congestion and slow down crawling a site that it detects as congested.
+**Yioop supports dynamically changing the allowed and disallowed sites while a crawl is in progress. Yioop also supports dynamically injecting new seeds site via a web interface into the active crawl.
+**Yioop has a web form that allows a user to control the recrawl frequency for a page during a crawl.
+**Yioop keeps track of ETag: and Expires: HTTP headers to avoid downloading content it already has in its index.
+**Yioop supports importing data from ARC, WARC, database queries, MediaWiki XML, and ODP RDF files. It has generic importing facility to import text records such as access log, mail log, usenet posts, etc., which are either not compressed, or compressed using gzip or bzip2. It also supports re-indexing of data from WebArchives.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Set-up==
+===Requirements===
+
+The Yioop search engine requires: (1) a web server, (2) PHP 5.4 or better, (3) Curl libraries for downloading web pages, (4) mod_rewrite enabled. To be a little more specific Yioop has been tested with Apache 2.2 and I&#039;ve been told Version 0.82 or newer works with lighttpd. It should work with other webservers, although it might take some finessing. For PHP, you need a build of PHP that incorporates multi-byte string (mb_ prefixed) functions, Curl, Sqlite (or at least PDO with Sqlite driver), the GD graphics library and the command-line interface. If you are using Mac OSX Snow Leopard or newer, the version of Apache2 and PHP that come with it suffice. For Windows, Mac, and Linux, another easy way to get the required software is to download a Apache/PHP/MySql suite such as [[http://www.apachefriends.org/en/xampp.html|XAMPP]].
+
+On any platform, make sure that the Apache mod_rewrite module is enabled and that .htaccess files work for the directory in question (often this is the case by default with packages such as Xampp, but please check the Yioop install guide for the platform in question in order to see if anything is required). It is possible to get Yioop to work without mod_rewrite, you can use the src directory location as the url for Yioop, but URLs used by your installation will look uglier.
+
+On Windows machines, find the the php.ini file under the php folder in your Xampp folder and change the line:
+ ;extension=php_curl.dll
+to
+ extension=php_curl.dll
+The php.ini file has a post_max_size setting you might want to change. You might want to change it to:
+ post_max_size = 32M
+Yioop will work with the post_max_size set to as little as two megabytes bytes, but will be faster with the larger post capacity. If you intend to make use of Yioop Discussion Groups and Wiki and their ability to upload documents. You might want to consider also adjusting the value of the variable &#039;&#039;upload_max_filesize&#039;&#039;. This value should be set to at most what you set post_max_size to.
+
+If you are using WAMP, similar changes as with XAMPP must be made, but be aware that WAMP has two php.ini files and both of these must be changed.
+
+If you are using the Ubuntu-variant of Linux, the following lines would get the software you need:
+ sudo apt-get install curl
+ sudo apt-get install apache2
+ sudo apt-get install php5
+ sudo apt-get install php5-cli
+ sudo apt-get install php5-sqlite
+ sudo apt-get install php5-curl
+ sudo apt-get install php5-gd
+For both Mac and Linux, you might want to alter the post_max_size variable in your php.ini file as in the Windows case above.
+
+In addition to the minimum installation requirements above, if you want to use the [[Documentation#GUI%20for%20Managing%20Machines%20and%20Servers|Manage Machines]] feature in Yioop, you might need to do some additional configuration. Namely, some sites disable the PHP popen, pclose, and exec functions, and so might have to edit your php.ini file to enable these functions if you want this activity to work. The Manage Machines activity allows you through a web interface to start/stop and look at the log files for each of the QueueServer&#039;s, and Fetchers that you want Yioop to manage. It also allows you to start and stop the Media Updater process/processes. If it is not configured then these task would need to be done via the command line. &#039;&#039;&#039;Also, if you do not use the Manage Machine interface your Yioop site can make use of only one QueueServer.&#039;&#039;&#039;
+
+As a final step, after installing the necessary software, &#039;&#039;&#039;make sure to start/restart your web server and verify that it is running.&#039;&#039;&#039;
+
+====Memory Requirements====
+
+In addition, to the prerequisite software listed above, Yioop allows specifies for its process certain upper bounds on the amounts of memory they can use. By default src/executables/QueueServer.php&#039;s limit is set to 2500MB, src/executables/Fetcher.php&#039;s limit is set to 1200MB. You can expect that index.php might need up to 500MB. These values are set near the tops of each of these files in turn with a line like:
+ ini_set(&quot;memory_limit&quot;,&quot;2500M&quot;);
+For the index.php file, you may need to set the limit at well in your php.ini file for the instance of PHP used by your web server. If the value is too low for the index.php Web app you might see messages in the Fetcher logs that begin with: &quot;Trouble sending to the scheduler at url...&quot;
+
+Often in a VM setting these requirements are somewhat steep. It is possible to get Yioop to work in environments like EC2 (be aware this might violate your service agreement). To reduce these memory requirements, one can manually adjust the variables NUM_DOCS_PER_GENERATION, SEEN_URLS_BEFORE_UPDATE_SCHEDULER, NUM_URLS_QUEUE_RAM, MAX_FETCH_SIZE, and URL_FILTER_SIZE in the configs/config.php file. Experimenting with these values you should be able to trade-off memory requirements for speed.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Installation and Configuration===
+
+The Yioop application can be obtained using [[Download|the download page at seekquarry.com]]. After downloading and unzipping it, move the Yioop search engine into some folder under your web server&#039;s document root. Point your browser to the location where you have just unzipped the file. You should see the default Yioop landing page:
+
+{{class=&quot;docs&quot;
+((resource:DefaultYioopLandingPage.png|Resource Description for DefaultYioopLandingPage.png))
+}}
+
+If you don&#039;t see this page, check that your have installed and configured all the prerequisite software in the [[Documentation#Requirements|Requirements section]]. The most common sources
+of problems are that mod_rewrite package is not loaded for Apache, the .htaccess file of Yioop
+is not being processed because Apache is configured so as not to allow overrides on that directory, or the webserver doesn&#039;t have write permissions on YIOOP_DIR/configs/Configs.php and the YIOOP_DIR/work_directory folder. If you have gotten the above screen, then congratulations,
+Yioop is essentially installed! In this section, we will give a first pass at how to customize some general aspects of your site. These will include configuring your site for development versus production, describing your crawler to the websites you will crawl, customizing the icons, color scheme, and timezone settings of your site. The next section, describes more advanced configurations such as user registration and advertisement serving.
+
+====Configurations for Development, Production, Testing, and Crawling====
+Click on the Sign In link to log on to the administrative panel for Yioop. The default username is &#039;&#039;root&#039;&#039; with an empty password. Under the &#039;&#039;&#039;System Settings&#039;&#039;&#039; activity group on the side of the screen, click on the &#039;&#039;&#039;Configure Activity&#039;&#039;&#039;. This activity page looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ConfigureScreenForm1.png|Configure Screen form))
+}}
+
+The Search Engine Work Directory form let&#039;s you specify the name of a folder where all of the data specific to your copy of Yioop should be stored. This defaults to YIOOP_DIR/work_directory, and you probably don&#039;t want to change this, but you can customize its locations to where you want with this form. The web server needs permissions to be able to write this directory for Yioop to work. Notice under the text field there is a heading &quot;Component Check&quot; and it says &quot;Checks Passed&quot;. Yioop does an automatic check to see if it can find all the common built-in classes and functions it needs to run, making sure they have not been disabled. If says something other than &quot;Checks passed&quot;, you will probably need to edit your php.ini file to get Yioop to be able to do crawls.
+
+In the above Configure Screen image, there is a Profile Settings form beneath the Search Engine Work Directory form. The Profile Settings form allows you to configure the debug, search access, database, queue server, and robot settings.
+
+The &#039;&#039;&#039;Debug Display&#039;&#039;&#039; fieldset has three checkboxes: Error Info, Query Info, and Test Info. Checking Error Info will mean that when the Yioop web app runs, any PHP Errors, Warnings, or Notices will be displayed on web pages. This is useful if you need to do debugging, but should not be set in a production environment. The second checkbox, Query Info, when checked, will cause statistics about the time, etc. of database queries to be displayed at the bottom of each web page. The last checkbox, Test Info, says whether or not to display automated tests of some of the systems library classes if the browser is navigated to http://YIOOP_INSTALLATION/tests/. None of these debug settings should be checked in a production environment.
+
+The &#039;&#039;&#039;Search Access&#039;&#039;&#039; fieldset has three checkboxes: Web, RSS, and API. These control whether a user can use the web interface to get query results, whether RSS responses to queries are permitted, or whether or not the function based search API is available. Using the Web Search interface and formatting a query url to get an RSS response are describe in the Yioop [[Documentation#Search%20and%20User%20Interface|Search and User Interface]] section. The Yioop Search Function API is described in the section [[Documentation#Embedding%20Yioop%20in%20an%20Existing%20Site|Embedding Yioop]], you can also look in the examples folder at the file SearchApi.php to see an example of how to use it. &#039;&#039;&#039;If you intend to use Yioop in a configuration with multiple queue servers (not fetchers), then the RSS checkbox needs to be checked.&#039;&#039;&#039;
+
+The &#039;&#039;&#039;Crawl Robot Set-up&#039;&#039;&#039; fieldset is used to provide websites that you crawl with information about who is crawling them. The field Crawl Robot Name is used to say the name of your robot. You should choose a common name for all of the fetchers in your set-up, but the name should be unique to your web-site. It is bad form to pretend to be someone else&#039;s robot, for example, the googlebot. As Yioop crawls it sends the web-site it crawls a User-Agent string, this string contains the url back to the bot.php file in the Yioop folder. bot.php is supposed to provide a detailed description of your robot. The contents of textarea Robot Description is supposed to provide this description and is inserted between &lt;body&gt; &lt;/body&gt; tags on the bot.php page.
+
+{{id=&quot;appearance&quot;
+====Changing the Global Appearance of Yioop====
+}}
+To change the global appearance of Yioop, gnder the &#039;&#039;&#039;System Settings&#039;&#039;&#039; activity group on the side of the screen, click on the &#039;&#039;&#039;Appearance&#039;&#039;&#039;. This activity page looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AppearanceActivity.png|Appearance Activity form))
+}}
+
+The &#039;&#039;&#039;Use Wiki Public Main Page as Landing Page&#039;&#039;&#039; checkbox lets you set the main page of the Public wiki to be the landing page of the whole Yioop site rather than the default centered search box landing page. Several of the text fields in Site Customizations control various colors used in drawing the Yioop interface. These include &#039;&#039;&#039;Background Color&#039;&#039;&#039;, &#039;&#039;&#039;Foreground Color&#039;&#039;&#039;, &#039;&#039;&#039;Top Bar Color&#039;&#039;&#039;, &#039;&#039;&#039;Side Bar Color&#039;&#039;&#039;. The values of these fields can be any legitimate style-sheet color such as a # followed by an red, green, blue value (between 0-9 A-F), or a color word such as: yellow, cyan, etc. If you would like to use a background image, you can either use the picker link or drag and drop one into the rounded square next to the &#039;&#039;&#039;Background Image&#039;&#039;&#039; label. Various other images such as the &#039;&#039;&#039;Site Logo&#039;&#039;&#039;, &#039;&#039;&#039;Mobile Logo&#039;&#039;&#039; (the logo used for mobile devices), and &#039;&#039;&#039;Favicon&#039;&#039;&#039; (the little logo that appears in the title tab of a page or in the url bar) can similarly be chosen or dragged-and-dropped.
+
+A &#039;&#039;&#039;Search Toolbar&#039;&#039;&#039; is a short file that can be used to add your search engine to the search bar of a browser. You can drag such a file into the gray area next to this label and click save to set this for your site. The link to install the search bar is visible on the Settings page. There is also a link tag on every page of the Yioop site that allows a browser to auto-discover this as well. As a starting point, one can try tweaking the default Yioop search bar, yioopbar.xml, in the base folder of Yioop.
+
+The three fields &#039;&#039;&#039;Timezone&#039;&#039;&#039;, &#039;&#039;&#039;Web Cookie Name&#039;&#039;&#039;, and &#039;&#039;&#039;Web Token Name&#039;&#039;&#039; control respectively, the timezone used by Yioop when it does date conversions, the name of the cookie it sets in a browser&#039;s cookie cache, and the name used for the tokens to prevent cross-site request forgery that appear in Yioop URLs when one is logged-in.
+
+Finally, if one knows cascading stylesheets (CSS) and wants greater control of the the look and feel of the site, then one can enter standard stylesheet command in the &#039;&#039;&#039;Auxiliary Style Directives&#039;&#039;&#039; textarea.
+
+===Optional Server and Security Configurations===
+The configuration and appearance activities just described suffices to set up Yioop for a single server crawl and do simple customization on how your Yioop site looks. If that is all that you are interested in, you may want to skip ahead to the section on the [[Documentation#Search%20and%20User%20Interface|Yioop Search Interface]] to learn about the different search features available in Yioop or you may want to skip ahead to [[Documentation#Performing%20and%20Managing%20Crawls|Performing and Managing Crawls]] to learn about how to perform a crawl. In this section, we describe the Server Settings and Security activities which might be useful in a multi-machine, multi-user setting and which might also be useful for crawling hidden websites or crawling through proxies. We also describe the form used to configure advertisements in Yioop.
+
+The Server Settings activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ServerSettings.png|The Server Settings Activity))
+}}
+
+The &#039;&#039;&#039;Name Server Set-up&#039;&#039;&#039; fieldset is used to tell Yioop which machine is going to act as a name server during a crawl and what secret string to use to make sure that communication is being done between legitimate queue servers and fetchers of your installation. You can choose anything for your secret string as long as you use the same string amongst all of the machines in your Yioop installation. The reason why you have to set the name server url is that each machine that is going to run a fetcher to download web pages needs to know who the queue servers are so they can request a batch of urls to download. There are a few different ways this can be set-up:
+
+#If the particular instance of Yioop is only being used to display search results from crawls that you have already done, then this fieldset can be filled in however you want.
+#If you are doing crawling on only one machine, you can put http://localhost/path_to_yioop/ or http://127.0.0.1/path_to_yioop/, where you appropriately modify &quot;path_to_yioop&quot;.
+#Otherwise, if you are doing a crawl on multiple machines, use the url of Yioop on the machine that will act as the name server.
+
+In communicating between the fetcher and the server, Yioop uses curl. Curl can be particular about redirects in the case where posted data is involved. i.e., if a redirect happens, it does not send posted data to the redirected site. For this reason, Yioop insists on a trailing slash on your queue server url. Beneath the Queue Server Url field, is a Memcached checkbox and a Filecache checkbox. Only one of these can be checked at a time. The Memcached check box only shows if you have [[http://php.net/manual/en/book.memcache.php|PHP Memcache]] installed. Checking the Memcached checkbox allows you to specify memcached servers that, if specified, will be used to cache in memory search query results as well as index pages that have been accessed. Checking the Filecache box, tells Yioop to cache search query results in temporary files. Memcache probably gives a better performance boost than Filecaching, but not all hosting environments have Memcache available.
+
+The &#039;&#039;&#039;Database Set-up&#039;&#039;&#039; fieldset is used to specify what database management system should be used, how it should be connected to, and what user name and password should be used for the connection. At present [[http://www.php.net/manual/en/intro.pdo.php|PDO]] (PHP&#039;s generic DBMS interface), sqlite3, and Mysql databases are supported. The database is used to store information about what users are allowed to use the admin panel and what activities and roles these users have. Unlike many database systems, if an sqlite3 database is being used then the connection is always a file on the current filesystem and there is no notion of login and password, so in this case only the name of the database is asked for. For sqlite, the database is stored in WORK_DIRECTORY/data. For single user settings with a limited number of news feeds, sqlite is probably the most convenient database system to use with Yioop. If you think you are going to make use of Yioop&#039;s social functionality and have many users, feeds, and crawl mixes, using a system like Mysql or Postgres might be more appropriate.
+
+If you would like to use a different DBMS than Sqlite or Mysql, then the easiest way is to select PDO as the Database System and for the Hostname given use the DSN with the appropriate DBMS driver. For example, for Postgres one might have something like:
+ pgsql:host=localhost;port=5432;dbname=test;user=bruce;password=mypass
+You can put the username and password either in the DSN or in the Username and Password fields. The database name field must be filled in with the name of the database you want to connect to. It is also include needs to be included in the dsn, as in the above. PDO and Yioop has been tested to work with Postgres and sqlite, for other DBMS&#039;s it might take some tinkering to get things to work.
+
+When switching database information, Yioop checks first if a usable database with the user supplied data exists. If it does, then it uses it; otherwise, it tries to create a new database. Yioop comes with a small sqlite demo database in the data directory and this is used to populate the installation database in this case. This database has one account root with no password which has privileges on all activities. Since different databases associated with a Yioop installation might have different user accounts set-up after changing database information you might have to sign in again.
+
+The &#039;&#039;&#039;Account Registration&#039;&#039;&#039; fieldset is used to control how user&#039;s can obtain accounts on a Yioop installation. The dropdown at the start of this fieldset allows one to select one of four possibilities: Disable Registration, users cannot register themselves, only the root account can add users; No Activation, user accounts are immediately activated once a user signs up; Email Activation, after registering, users must click on a link which comes in a separate email to activate their accounts; and Admin Activation, after registering, an admin account must activate the user before the user is allowed to use their account. When Disable Registration is selected, the Suggest A Url form and link on the tool.php page is disabled as well, for all other registration type this link is enabled. If Email Activation is chosen, then the reset of this fieldset can be used to specify the email address that the email comes to the user. The Send Mail From Media Updater checkbox controls whether emails are sent immediately from the web app or if they are queued, and then sent out by the Media Updater process/processes. The checkbox Use PHP mail() function controls whether to use the mail function in PHP to send the mail, this only works if mail can be sent from the local machine.  Alternatively, if this is not checked like in the image above, one can configure an outgoing SMTP server to send the email through.
+
+The &#039;&#039;&#039;Proxy Server&#039;&#039;&#039; fieldset is used to control which proxies to use while crawling. By default Yioop does not use any proxies while crawling. A Tor Proxy can serve as a gateway to the Tor Network. Yioop can use this proxy to download .onion URLs on the [[https://en.wikipedia.org/wiki/Tor_%28anonymity_network%29|Tor network]]. The configuration given in the example above works with the Tor Proxy that comes with the
+[[https://www.torproject.org/projects/torbrowser.html|Tor Browser]]. Obviously, this proxy needs to be running though for Yioop to make use of it. Beneath the Tor Proxy input field is a checkbox labelled Crawl via Proxies. Checking this box, will reveal a textarea labelled Proxy Servers. You can enter the address:port or address:port:proxytype of proxy servers you would like to crawl through. If proxy servers are used, Yioop will make any requests to download pages to a randomly chosen server on the list which will proxy the request to the site which has the page to download. To some degree this can make the download site think the request is coming from a different ip (and potentially location) than it actually is. In practice, servers can often use HTTP headers to guess that a proxy is being used.
+
+The &#039;&#039;&#039;Ad Server Configuration&#039;&#039;&#039; fieldset can be used to specify whether advertising will be served with Yioop search results, and if it is, what kind. The Advertising Source dropdown controls this, allowing the administrator to choose between &#039;&#039;&#039;No Advertisements&#039;&#039;&#039;, &#039;&#039;&#039;Keyword Advertisements&#039;&#039;&#039;, and &#039;&#039;&#039;External Ad Server&#039;&#039;&#039;. Yioop&#039;s built-in mechanism for keyword advertising is described in the [[Documentation#Keyword%20Advertising|Keyword Advertising]] section. External Ad Server refers to advertising scripts (such as Google Ad Words, Bidvertiser, Adspeed, etc) which are to be added on search result pages or on discussion thread pages. There are four possible placements of ads: None -- don&#039;t display advertising at all, Top -- display banner ads beneath the search bar but above search results, Side -- display skyscraper Ads in a column beside the search results, and Both -- display both banner and skyscraper ads. Choosing any option other than None reveals text areas where one can insert the Javascript one would get from the Ad network. The &#039;&#039;&#039;Global Ad Script&#039;&#039;&#039; text area is used for any Javascript or HTML the Ad provider wants you to include in the HTML head tag for the web page (many advertisers don&#039;t need this).
+
+The Security activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:Security.png|The Security Activity))
+}}
+
+The &#039;&#039;&#039;Authentication Type&#039;&#039;&#039; fieldset is used to control the protocol used to log people into Yioop. This can either be Normal Authentication, passwords are checked against stored as salted hashes of the password; or ZKP (zero knowledge protocol) authentication, the server picks challenges at random and send these to the browser the person is logging in from, the browser computes based on the password an appropriate response according to the [[https://en.wikipedia.org/wiki/Feige%3C?php%20?%3E%E2%80%93Fiat%E2%80%93Shamir_identification_scheme|Fiat Shamir]] protocol. The password is never sent over the internet and is not stored on the server. These are the main advantages of ZKP, its drawback is that it is slower than Normal Authentication as to prove who you are with a low probability of error requires several browser-server exchanges. You should choose which authentication scheme you want before you create many users as if you switch everyone will need to get a new password.
+
+The &#039;&#039;&#039;Captcha Type&#039;&#039;&#039; fieldset controls what kind of [[https://en.wikipedia.org/wiki/Captcha|captcha]] will be used during account registration, password recovery, and if a user wants to suggest a url. The captcha type only has an effect if under the Server Settings activity, Account Registration is not set to Disable Registration. The choices for captcha are: Text Captcha, the user has to select from a series of dropdown answers to questions of the form: Which in the following list is the most/largest/etc? or Which is the following list is the least/smallest/etc?; Graphic Captcha, the user needs to enter a sequence of characters from a distorted image; and hash captcha, the user&#039;s browser (the user doesn&#039;t need to do anything) needs to extend a random string with additional characters to get a string whose hash begins with a certain lead set of characters. Of these, Hash Captcha is probably the least intrusive but requires Javascript and might run slowly on older browsers. A text captcha might be used to test domain expertise of the people who are registering for an account. Finally, the graphic captcha is probably the one people are most familiar with.
+
+The Captcha and Recovery Questions section of the Security activity provides links to edit the Text Captcha and Recovery Questions for the current locale (you can change the current locale in Settings). In both cases, there are a fixed list of tests you can localize. A single test consists of a more question, a less question, and a comma separate list of possibilities. For example,
+ Which lives or lasts the longest?
+ Which lives or lasts the shortest?
+ lightning,bacteria,ant,dog,horse,person,oak tree,planet,star,galaxy
+When challenging a user, Yioop picks a subset of tests. For each test, it randomly chooses between more or less question. It then picks a subset of the ordered list of choices, randomly permutes them, and presents them to the user in a dropdown.
+
+Yioop&#039;s captcha-ing system tries to prevent attacks where a machine quickly tries several possible answers to a captcha. Yioop has a IP address based timeout system (implemented in models/visitor_model.php). Initially a timeout of one second between requests involving a captcha is in place. An error screen shows up if multiple requests from the same IP address for a captcha page are made within the time out period. Every mistaken entry of a captcha doubles this timeout period. The timeout period for an IP address is reset on a daily basis back to one second.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Upgrading Yioop===
+
+If you have an older version of Yioop that you would like to upgrade, make sure to back up your data. Be advised that the upgrade from a version 2 to version 3 or higher of Yioop is a reasonably major upgrade, your indexes should work after the upgrade, but version 2 classifiers do not work in Yioop version 3. Yioop stores data in two places: a database, the details of which can be found by looking at the Server Settings activity; and in a WORK_DIRECTORY folder, the path to this folder can be found in the Configure activity, Search Engine Work Directory form. Once your back up is done, how you should upgrade depends on how you installed Yioop in the first place. We give three techniques below, the first of which will always work but might be slightly more complicated then the other two.
+
+If you originally installed Yioop from the download page, download the latest version of Yioop. Extract the src subfolder of the zip file you get and replase the current src folder of the installation you have. If you had a file src/configs/LocalConfig.php, in your old installation make sure to copy this file to the upgrade. Make sure Yioop has write permissions on src/configs/Configs.php.  Yioop should be then able to complete the upgrade process. If it doesn&#039;t look like your old work directory data is showing up, please check the Configure activity, Search Engine Work Directory form and make sure it has the same value as before the upgrade. In the case of upgrading a version 2 to a version 3 instance of Yioop, you should extract the whole Yioop folder you download and replace the old Yioop folder with this new one. Then to complete the upgrade, make sure src/configs/Configs.php is writable by your web server, go to the
+Configure activity, Search Engine Work Directory form and enter the value you had from before the upgrade.
+
+If you have been getting Yioop directly from the git repository, then to upgrade Yioop you can just issue the command:
+ git pull
+from a command prompt after you&#039;ve switched into the Yioop directory.
+
+If you are using Yioop as part of a Composer project, then issue the command:
+ composer update
+should upgrade Yioop to the most recent version compatible with your project.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Summary of Files and Folders===
+
+The Yioop search engine consists of three main scripts:
+
+;&#039;&#039;&#039;src/executables/Fetcher.php&#039;&#039;&#039;: Used to download batches of urls provided the queue server.
+;&#039;&#039;&#039;src/executables/QueueServer.php&#039;&#039;&#039;: Maintains a queue of urls that are going to be scheduled to be seen. It also keeps track of what has been seen and robots.txt info. Its last responsibility is to create the index_archive that is used by the search front end.
+;&#039;&#039;&#039;index.php&#039;&#039;&#039;: Acts as the search engine web page. It is also used to handle message passing between the fetchers (multiple machines can act as fetchers) and the queue server.
+
+The file index.php is used when you browse to an installation of a Yioop website. The description of how to use a Yioop web site is given in the sections starting from the The Yioop User Interface section. The files Fetcher.php and QueueServer.php are only connected with crawling the web. If one already has a stored crawl of the web, then you no longer need to run or use these programs. For instance, you might obtain a crawl of the web on your home machine and upload the crawl to a an instance of Yioop on the ISP hosting your website. This website could serve search results without making use of either Fetcher.php or QueueServer.php. To perform a web crawl you need to use both of these programs as well as the Yioop web site. This is explained in detail in the section on [[Documentation#Performing%20and%20Managing%20Crawls|Performing and Managing Crawls]].
+
+The Yioop folder itself consists of several files and sub-folders. The file &#039;&#039;index.php&#039;&#039; as mentioned above is the main entry point into the Yioop web application. There is also an &#039;&#039;.htaccess&#039;&#039; file that is used to route most requests to the Yioop folder to go through this index.php file. If you look at the top folder structure of Yioop it has three main subfolders: &#039;&#039;&#039;src&#039;&#039;&#039;, &#039;&#039;&#039;work_directory&#039;&#039;&#039;, and &#039;&#039;&#039;tests&#039;&#039;&#039;. If you are developing a [[Composer| Composer project]] with Yioop there might also be a &#039;&#039;&#039;vendor&#039;&#039;&#039; folder which contains a class autoloader for the PHP classes used in your project. The &#039;&#039;&#039;src&#039;&#039;&#039; folder contains the source code for Yioop. The &#039;&#039;&#039;work_directory&#039;&#039;&#039; is the default location where Yioop stores indexes as well as where you can put any site specific customizations. As the location of where Yioop stores stuff is customizable, we will write WORK_DIRECTORY in caps to refer to location of this folder in the current instance of Yioop. Finally, &#039;&#039;&#039;tests&#039;&#039;&#039; is a folder of unit tests for various Yioop classes. We now describe the major files and folders in each of these folders in a little more detail.
+
+The &#039;&#039;&#039;src&#039;&#039;&#039; contains several useful files as well as additional sub-folders. &#039;&#039;yioopbar.xml&#039;&#039; is the xml file specifying how to access Yioop as an Open Search Plugin. &#039;&#039;favicon.ico&#039;&#039; is used to display the little icon in the url bar of a browser when someone browses to the Yioop site. A URL to the file &#039;&#039;bot.php&#039;&#039; is given by the Yioop robot as it crawls websites so that website owners can find out information about who is crawling their sites. Here is a rough guide to what the src folder&#039;s various sub-folders contain:
+
+;{{id=&quot;configs&quot; &#039;&#039;&#039;configs&#039;&#039;&#039;}} : This folder contains configuration files. You will probably not need to edit any of these files directly as you can set the most common configuration settings from with the admin panel of Yioop. The file &#039;&#039;Config.php&#039;&#039; controls a number of parameters about how data is stored, how, and how often, the queue server and fetchers communicate, and which file types are supported by Yioop. &#039;&#039;ConfigureTool.php&#039;&#039; is a command-line tool which can perform some of the configurations needed to get a Yioop installation running. It is only necessary in some virtual private server settings -- the preferred way to configure Yioop is through the web interface. &#039;&#039;Createdb.php&#039;&#039; can be used to create a bare instance of the Yioop database with a root admin user having no password. This script is not strictly necessary as the database should be creatable via the admin panel; however, it can be useful if the database isn&#039;t working for some reason. createdb.php includes the file &#039;&#039;PublicHelpPages.php&#039;&#039; from WORK_DIRECTORY/app/configs if present or from BASE_DIR/configs if not. This file contains the initial rows for the Public and Help group wikis. When upgrading, it is useful to export the changes you have made to these wikis to WORK_DIRECTORY/app/configs/PublicHelpPages.php. This can be done by running the file &#039;&#039;ExportPublicHelpDb.php&#039;&#039; which is in the configs folder.
+Also, in the configs folder is the file default_crawl.ini. This file is copied to WORK_DIRECTORY after you set this folder in the admin/configure panel. There it is renamed as &#039;&#039;crawl.ini&#039;&#039; and serves as the initial set of sites to crawl until you decide to change these. The file &#039;&#039;TokenTool.php&#039;&#039; is a tool which can be used to help in term extraction during crawls and for making trie&#039;s which can be used for word suggestions for a locale. To help word extraction this tool can generate in a locale folder (see below) a word bloom filter. This filter can be used to segment strings into words for languages such as Chinese that don&#039;t use spaces to separate words in sentences. For trie and segmenter filter construction, this tool can use a file that lists words one on a line.
+;&#039;&#039;&#039;controllers&#039;&#039;&#039;: The controllers folder contains all the controller classes used by the web component of the Yioop search engine. Most requests coming into Yioop go through the top level index.php file. The query string (the component of the url after the ?) then says who is responsible for handling the request. In this query string there is a part which reads c= ... This says which controller should be used. The controller uses the rest of the query string such as the a= variable for activity function to call and the arg= variable to determine which data must be retrieved from which models, and finally which view with what elements on it should be displayed back to the user. Within the controller folder is a sub-folder components, a component is a collection of activities which may be added to a controller so that it can handle a request.
+;&#039;&#039;&#039;css&#039;&#039;&#039;: This folder contains the stylesheets used to control how web page tags should look for the Yioop site when rendered in a browser.
+;&#039;&#039;&#039;data&#039;&#039;&#039;: This folder contains a default sqlite database for a new Yioop installation. Whenever the WORK_DIRECTORY is changed it is this database which is initially copied into the WORK_DIRECTORY to serve as the database of allowed users for the Yioop system.
+;&#039;&#039;&#039;examples&#039;&#039;&#039;: This folder contains a file SearchApi.php whose code gives an example of how to use the Yioop search function api.
+;&#039;&#039;&#039;executables&#039;&#039;&#039;: This folder is intended to hold command-line scripts and daemons which are used in conjunction with Yioop. In addition to the Fetcher.php and QueueServer.php script already mentioned, it contains: &#039;&#039;ArcTool.php&#039;&#039;, &#039;&#039;ClassifierTool.php&#039;&#039;, &#039;&#039;ClassifierTrainer.php&#039;&#039;, &#039;&#039;CodeTool.php&#039;&#039;, &#039;&#039;Mirror.php&#039;&#039;, &#039;&#039;MediaUpdater.php&#039;&#039;, and &#039;&#039;QueryTool.php&#039;&#039;. ArcTool.php can be used to examine the contents of WebArchiveBundle&#039;s and IndexArchiveBundle&#039;s from the command line. ClassifierTool.php is a command line tool for creating a classifier it can be used to perform some of the tasks that can also be done through the [[Documentation#Classifying Web Pages|Web Classifier Interface]]. ClassifierTrainer.php is a daemon used in the finalization stage of building a classifier. CodeTool.php is for use by developers to maintain the Yioop code-base in various ways. Mirror.php can be used if you would like to create a mirror/copy of a Yioop installation. MediaUpdater.php can be used to do hourly updates of news feed search sources in Yioop. It also does video conversions of video files into web formats. Finally, QueryTool.php can be used to run queries from the command-line.
+;&#039;&#039;&#039;library&#039;&#039;&#039;: This folder is short for library. It contains all the common classes for things like indexing, storing data to files, parsing urls, etc. lib contains six subfolders: &#039;&#039;archive_bundle_iterators&#039;&#039;, &#039;&#039;classifiers&#039;&#039;, &#039;&#039;compressors&#039;&#039;, &#039;&#039;index_bundle_iterators&#039;&#039;, &#039;&#039;indexing_plugins&#039;&#039;, &#039;&#039;processors&#039;&#039;. The &#039;&#039;archive_bundle_iterators&#039;&#039; folder has iterators for iterating over the objects of various kinds of web archive file formats, such as arc, wiki-media, etc. These iterators are used to iterate over such archives during a recrawl. The classifier folder contains code for training classifiers used by Yioop. The &#039;&#039;compressors&#039;&#039; folder contains classes that might be used to compress objects in a web_archive. The &#039;&#039;index_bundle_iterators&#039;&#039; folder contains a variety of iterators useful for iterating over lists of documents which might be returned during a query to the search engine. The &#039;&#039;processors&#039;&#039; folder contains processors to extract page summaries for a variety of different mimetypes.
+;&#039;&#039;&#039;locale&#039;&#039;&#039;: This folder contains the default locale data which comes with the Yioop system. A locale encapsulates data associated with a language and region. A locale is specified by an [[http://en.wikipedia.org/wiki/IANA_language_tag|IETF language tag]]. So, for instance, within the locale folder there is a folder en-US for the locale consisting of English in the United States. Within a given locale tag folder there is a file configure.ini which contains translations of string ids to string in the language of the locale. This approach is the same idea as used in [[http://en.wikipedia.org/wiki/Gettext|Gettext]] .po files. Yioop&#039;s approach does not require a compilation step nor a restart of the webserver for translations to appear. On the other hand, it is slower than the Gettext approach, but this could be easily mitigated using a memory cache such as [[http://memcached.org/|memcached]] or [[archive_bundle_iterators|apc]]. Besides the file configure.ini, there is a statistics.txt file which has info about what percentage of the id&#039;s have been translated. In addition to configure.ini and statistics.txt, the locale folder for a language contains a &#039;&#039;resources&#039;&#039; subfolder. The resources folder contains the files: &#039;&#039;locale.js&#039;&#039;, which contains locale specify Javascript code such as the variable alpha which is used to list out the letters in the alphabet for the language in question for spell check purposes, and roman_array for mapping between roman alphabet and the character system of the locale in question; &#039;&#039;suggest-trie.txt.gz&#039;&#039;, a Trie data structure used for search bar word suggestions; and &#039;&#039;Tokenizer.php&#039;&#039;, which can specify the number of characters for this language to constitute a char gram, might contain segmenter to split strings into words for this language, a stemmer class used to stem terms for this language, a stopword remover for the centroid summarizer, a part of speech tagger, or thesaurus lookup procedure for the locale.
+;&#039;&#039;&#039;models&#039;&#039;&#039;: This folder contains the subclasses of Model used by Yioop Models are used to encapsulate access to secondary storage. i.e., Accesses to databases or the filesystem. They are responsible for marshalling/de-marshalling objects that might be stored in more than one table or across serveral files. The models folder has within it a datasources folder. A datasource is an abstraction layer for the particular filesystem and database system that is being used by a Yioop installation. At present, datasources have been defined for PDO (PHP&#039;s generic DBMS interface), sqlite3, and mysql databases.
+;&#039;&#039;&#039;resources&#039;&#039;&#039;: Used to store binary resources such as graphics, video, or audio. For now, just stores the Yioop logo.
+;&#039;&#039;&#039;scripts&#039;&#039;&#039;: This folder contains the Javascript files used by Yioop.
+;&#039;&#039;&#039;views&#039;&#039;&#039;: This folder contains View subclasses as well as folders for elements, helpers, and layouts. A View is responsible for taking data given to it by a controller and formatting it in a suitable way. Most views output a web page; however, some of the views responsible for communication between the fetchers and the queue server output serialized objects. The elements folder contains Element classes which are typically used to output portions of web pages. For example, the html that allows one to choose an Activity in the Admin portion of the website is rendered by an ActivityElement. The helpers folder contains Helper subclasses. A Helper is used to automate the task of outputting certain kinds of web tags. For instance, the OptionsHelper when given an array can be used to output select tags and option tags using data from the array. The layout folder contains Layout subclasses. A Layout encapsulates the header and footer information for the kind of a document a View lives on. For example, web pages on the Yioop site all use the WebLayout class as their Layout. The WebLayout class has a render method for outputting the doctype, open html tag, head of the document including links for style sheets, etc. This method then calls the render methods of the current View, and finally outputs scripts and the necessary closing document tags.
+
+The second top level subfolder of a Yioop instance is the &#039;&#039;&#039;tests&#039;&#039;&#039; folder. This folder contains UnitTest&#039;s and JavascriptUnitTests for various library and script components. Yioop comes with its own minimal UnitTest and JavascriptUnitTest classes which defined in the src/library/Unit_Test.php and src/library/JavascriptUnitTest.php. It also contains a few files used for experiments. For example, StringCatExperiment.php was used to test which was the faster way to do string concatenation in PHP. ManyUserExperiment.php can be used to create a test Yioop installation with many users, roles, and groups. Some unit testing of the wiki Help system makes use of [[http://phantomjs.org/|PhantomJS]]. If PhantomJS is not configured, these tests will be skipped. To configure PhantomJS you simply add a define for your path to PhatomJS to your src/configs/LocalConfig.php file. For example, one might have add the define:
+define(&quot;PHANTOM_JS&quot;, &quot;/usr/local/bin/phantomjs&quot;);
+
+The last top level folder that Yioop makes use of is the  WORK DIRECTORY. The location of this directory is set during the configuration of a Yioop installation, but defaults to your yioop folder&#039;s work_directory sub-folder. Yioop stores crawls, and other data local to a particular Yioop installation in files and folders in this directory. In the event that you upgrade your Yioop installation you should only need to replace the Yioop src folder and in the configuration process of Yioop tell it where your WORK DIRECTORY is. Of course, it is always recommended to back up one&#039;s data before performing an upgrade. Within the WORK DIRECTORY, Yioop stores four main files: Profile.php, crawl.ini, bot.txt, and robot_table.txt. Here is a rough guide to what the WORK DIRECTORY&#039;s sub-folder contain:
+
+;&#039;&#039;&#039;app&#039;&#039;&#039;: This folder is used to contain your overrides to the views, controllers, models, resources, locale etc. For example, if you wanted to change how the search results were rendered, you could add a views/SearchView.php file to the app folder and Yioop would use it rather than the one in the Yioop base directory&#039;s views folder. Using the app dir makes it easier to have customizations that won&#039;t get messed up when you upgrade Yioop.
+;&#039;&#039;&#039;cache&#039;&#039;&#039;: The directory is used to store folders of the form ArchiveUNIX_TIMESTAMP, IndexDataUNIX_TIMESTAMP, and QueueBundleUNIX_TIMESTAMP. ArchiveUNIX_TIMESTAMP folders hold complete caches of web pages that have been crawled. These folders will appear on machines which are running fetcher.php. IndexDataUNIX_TIMESTAMP folders hold a word document index as well as summaries of pages crawled. A folder of this type is needed by the web app portion of Yioop to serve search results. These folders can be moved from machine to whichever machine you want to server results from. QueueBundleUNIX_TIMESTAMP folders are used to maintain the priority queue during the crawling process. The QueueServer.php program is responsible for creating both IndexDataUNIX_TIMESTAMP and QueueBundleUNIX_TIMESTAMP folders.
+;&#039;&#039;&#039;data&#039;&#039;&#039;: If an sqlite or sqlite3 (rather than say MySQL) database is being used then a default.db file is stored in the data folder. In Yioop, the database is used to manage users, roles, locales, and crawls. Data for crawls themselves are NOT stored in the database. Suggest a url data is stored in data in the file suggest_url.txt, certain cron information about machines is saved in cron_time.txt, and plugin configuration information can also be stored in this folder.
+;&#039;&#039;&#039;locale&#039;&#039;&#039;: This is generally a copy of the locale folder mentioned earlier. In fact, it is the version that Yioop will try to use first. It contains any customizations that have been done to locale for this instance of Yioop. If you using a version of Yioop after Yioop 2.0, this folder have been moved to app/locale.
+;&#039;&#039;&#039;log&#039;&#039;&#039;: When the fetcher and queue server are run as daemon processes log messages are written to log files in this folder. Log rotation is also done. These log files can be opened in a text editor or console app.
+;&#039;&#039;&#039;query&#039;&#039;&#039;: This folder is used to stored caches of already performed queries when file caching is being used.
+;&#039;&#039;&#039;schedules&#039;&#039;&#039;: This folder has four kinds of subfolders: media_convert, IndexDataUNIX_TIMESTAMP, RobotDataUNIX_TIMESTAMP, and ScheduleDataUNIX_TIMESTAMP. The easiest to explain is the media_convert folder. It is used by MediaUpdater.php to stored job information about video files that need to be converted. For the other folder, when a fetcher communicates with the web app to say what it has just crawled, the web app writes data into these folders to be processed later by the queue server. The UNIX_TIMESTAMP is used to keep track of which crawl the data is destined for. IndexData folders contain mini-inverted indexes (word document records) which are to be added to the global inverted index (called the dictionary) for that crawl. RobotData folders contain information that came from robots.txt files. Finally, ScheduleData folders have data about found urls that could eventually be scheduled to crawl. Within each of these three kinds of folders there are typical many sub-folders, one for each day data arrived, and within these subfolders there are files containing the respective kinds of data.
+;&#039;&#039;&#039;search_filters&#039;&#039;&#039;: This folder is used to store text files containing global after crawl search filter and summary data. The global search filter allows a user to specify after a crawl is done that certain urls be removed from the search results. The global summary data can be used to edit the summaries for a small number of web pages whose summaries seem inaccurate or inappropriate. For example, some sites like Facebook only allow big search engines like Google to crawl them. Still there are many links to Facebook, so Facebook on an open web crawl will appear, but with a somewhat confused summary based only on link text; the results editor allows one to give a meaningful summary for Facebook.
+;&#039;&#039;&#039;temp&#039;&#039;&#039;: This is used for storing temporary files that Yioop creates during the crawl process. For example, temporary files used while making thumbnails. Each fetcher has its own temp folder, so you might also see folders 0-temp, 1-temp, etc.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Search and User Interface==
+
+At this point one hopefully has installed Yioop. If you used one of the [[Install|install guides]], you may also have performed a simple crawl. We are now going to describe some of the basic search features of Yioop as well as the Yioop administration interface. We will describe how to perform crawls with Yioop in more detail in the [[Documentation#Crawling%20and%20Customizing%20Results|Crawling and Customizing Results]] chapter. If you do not have a crawl available, you can test some of these features on the [[http://www.yioop.com/|Yioop Demo Site]].
+
+===Search Basics===
+The main search form for Yioop looks like:
+
+{{class=&#039;docs width-three-quarter&#039;
+((resource:Documentation:SearchScreen.png|The Search form))
+}}
+
+The HTML for this form is in views/search_views.php and the icon is stored in resources/yioop.png. You may want to modify these to incorporate Yioop search into your site. For more general ways to modify the look of this pages, consult the [[Documentation#Building%20a%20Site%20using%20Yioop%20as%20Framework|Building a site using Yioop]] documentation. The Yioop logo on any screen in the Yioop interface is clickable and returns the user to the main search screen. One performs a search by typing a query into the search form field and clicking the Search button. As one is typing, Yioop suggests possible queries, you can click, or use the up down arrows to select one of these suggestion to also perform a search
+
+{{class=&#039;docs width-three-quarter&#039;
+((resource:Documentation:Autosuggest.png|Example suggestions as you type))
+}}
+
+For some non-roman alphabet scripts such as Telugu you can enter words using how they sound using roman letters and get suggestions in the script in question:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:TeluguAutosuggest.png|Telugu suggestions for roman text))
+}}
+
+The [More Statistics] link only shows if under the Admin control panel you clicked on more statistics for the crawl. This link goes to a page showing many global statistics about the web crawl. Beneath this link are the Blog and Privacy links (as well as a link back to the SeekQuarry site). These two links are to static pages which can be customized through the Manage Locale activity. Typical search results might look like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchResults.png|Example Search Results))
+}}
+
+Thesaurus results might appear to one side and suggest alternative queries based on a thesaurus look up (for English, this is based on Wordnet). The terms next Words: are a word cloud of important terms in the document. These are created if the indexer user the centroid summarizer. Hovering over the Score of a search result reveals its component scores. These might include: Rank, Relevance, Proximity, as well as any Use to Rank Classifier scores and Word Net scores (if installed).
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ScoreToolTip.png|Example Score Components Tool Tip))
+}}
+
+If one slightly mistypes a query term, Yioop can sometimes suggest a spelling correction:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchSpellCorrect.png|Example Search Results with a spelling correction))
+}}
+
+Each result back from the query consists of several parts: First comes a title, which is a link to the page that matches the query term. This is followed by a brief summary of that page with the query words in bold. Then the document rank, relevancy, proximity, and overall scores are listed. Each of these numbers is a grouped statistic -- several &quot;micro index entry&quot; are grouped together/summed to create each. So even though a given &quot;micro index entry&quot; might have a document rank between 1 and 10 there sum could be a larger value. Further, the overall score is a generalized inner product of the scores of the &quot;micro index entries&quot;, so the separated scores will not typically sum to the overall score. After these scores there are three links: Cached, Similar, and Inlinks. Clicking on Cached will display Yioop&#039;s downloaded copy of the page in question. We will describe this in more detail in a moment. Clicking on Similar causes Yioop to locate the five words with the highest relevancy scores for that document and then to perform a search on those words. Clicking on Inlinks will take you to a page consisting of all the links that Yioop found to the document in question. Finally, clicking on an IP address link returns all documents that were crawled from that IP address.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:Cache.png|Example Cache Results))
+}}
+
+As the above illustrates, on a cache link click, Yioop will display a cached version of the page. The cached version has a link to the original version and download time at the top. Next there is a link to display all caches of this page that Yioop has in any index. This is followed by a link for extracted summaries, then in the body of the cached document the query terms are highlighted. Links within the body of a cache document first target a cached version of the page that is linked to which is as near into the future of the current cached page as possible. If Yioop doesn&#039;t have a cache for a link target then it goes to location pointed to by that target. Clicking on the history toggle, produces the following interface:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CacheHistory.png|Example Cache History UI))
+}}
+
+This lets you select different caches of the page in question.
+
+Clicking the &quot;Toggle extracted summary&quot; link will show the title, summary, and links that were extracted from the full page and indexed. No other terms on the page are used to locate the page via a search query. This can be viewed as an &quot;SEO&quot; view of the page.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CacheSEO.png|Example Cache SEO Results))
+}}
+
+It should be noted that cached copies of web pages are stored on the fetcher which originally downloaded the page. The IndexArchive associated with a crawl is stored on the queue server and can be moved around to any location by simply moving the folder. However, if an archive is moved off the network on which fetcher lives, then the look up of a cached page might fail.
+
+In addition, to a straightforward web search, one can also do image, video, news searches by clicking on the Images, Video, or News links in the top bar of Yioop search pages. Below are some examples of what these look like for a search on &quot;Obama&quot;:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ImageSearch.png|Example Image Search Results))
+((resource:Documentation:VideoSearch.png|Example Video Search Results))
+((resource:Documentation:NewsSearch.png|Example News Search Results))
+}}
+
+When Yioop crawls a page it adds one of the following meta words to the page media:text, media:image, or media:video. RSS (or Atom) feed sources that have been added to Media Sources under the [[Documentation#Search%20Sources|Search Sources]] activity are downloaded from each hour. Each RSS item on such a downloaded pages has the meta word media:news added to it. A usual web search just takes the search terms provided to perform a search. An Images, Video, News search tacks on to the search terms, media:image or media:video, or media:news. Detection of images is done via mimetype at initial page download time. At this time a thumbnail is generated. When search results are presented it is this cached thumbnail that is shown. So image search does not leak information to third party sites. On any search results page with images, Yioop tries to group the images into a thumbnail strip. This is true of both normal and images search result pages. In the case of image search result pages, except for not-yet-downloaded pages, this results in almost all of the results being the thumbnail strip. Video page detection is not done through mimetype as popular sites like YouTube, Vimeo, and others vary in how they use Flash or video tags to embed video on a web page. Yioop uses the Video Media sources that have been added in the Search Sources activity to detect whether a link is in the format of a video page. To get a thumbnail for the video it again uses the method for rewriting the video url to an image link specified for the particular site in question in Search Sources. i.e., the thumbnail will be downloaded from the orginal site. &#039;&#039;&#039;This could leak information to third party sites about your search.&#039;&#039;&#039;
+
+The format of News search results is somewhat different from usual search results. News search results can appear during a normal web search, in which case they will appear clustered together, with a leading link &quot;News results for ...&quot;. No snippets will be shown for these links, but the original media source for the link will be displayed and the time at which the item first appeared will be displayed. On the News subsearch page, the underneath the link to the item, the complete RSS description of the new item is displayed. In both settings, it is possible to click on the media source name next to the news item link. This will take one to a page of search results listing all articles from that media source. For instance, if one were to click on the Yahoo News text above one would go to results for all Yahoo News articles. This is equivalent to doing a search on: media:news:Yahoo+News . If one clicks on the News subsearch, not having specified a query yet, then all stored news items in the current language will be displayed, roughly ranked by recentness. If one has RSS media sources which are set to be from different locales, then this will be taken into account on this blank query News page.
+
+[[Documentation#contents|Return to table of contents]].
+
+
+===Search Tools Page===
+
+As one can see from the image of the main search form shown previously, the footer of each search and search result page has several links. Blog takes one to the group feed of the built in PUBLIC group which is editable from the root account, Privacy takes one to the Yioop installations privacy policy, and Terms takes one to the Yioop installations terms of service. The YioopBot link takes one to a page describing the installation&#039;s web crawler. These static pages are all Wiki pages of the PUBLIC group and can be edited by the root account. The Tools link takes one to the following page:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchTools.png|Search Tools Page))
+}}
+
+Beneath the Other Search Sources section is a complete listing of all the search sources that were created using [[Documentation#Search%20Sources|Search Sources]]. This might be more than just the Images, Video, and News that come by default with Yioop. The My Account section of this page gives another set of links for signing into, modifying the settings of, and creating account. The Other Tools section has a link to the form below where user&#039;s can suggest links for the current or future crawls.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SuggestAUrl.png|Suggest A Url Form))
+}}
+
+This link only appears if under Server Settings, Account Registration is not set to Disable registration. The Wiki Pages link under Other Tools takes one to a searchable list of all Wiki pages of the default PUBLIC group.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Search Operators===
+
+Turning now to the topic of how to enter a query in Yioop: A basic query to the Yioop search form is typically a sequence of words seperated by whitespace. This will cause Yioop to compute a &quot;conjunctive query&quot;, it will look up only those documents which contain all of the terms listed. Yioop also supports a variety of other search box commands and query types:
+
+* &#039;&#039;&#039;#num#&#039;&#039;&#039; in a query are treated as query presentation markers. When a query is first parsed, it is split into columns based with &#039;&#039;#num#&#039;&#039; as the column boundary. For example, bob #2# bob sally #3# sally #1#. A given column is used to present &#039;&#039;#num#&#039;&#039; results, where &#039;&#039;#num#&#039;&#039; is what is between the hash marks immediately after it. So in the query above, the subquery &#039;&#039;bob&#039;&#039; is used for the first two search results, then the subquery &#039;&#039;bob sally&#039;&#039; is used for the next three results, finally the last column is always used for any remaining results. In this case, the subquery &#039;&#039;sally&#039;&#039; would be used for all remaining results even though its &#039;&#039;#num#&#039;&#039; is 1. If a query does not have any #num#&#039;s it is assumed that it has only one column.
+* Separating query terms with a vertical bar | results in a disjunctive query. These are parsed for after the presentation markers above. So a search on: &#039;&#039;Chris | Pollett&#039;&#039; would return pages that have either the word &#039;&#039;Chris&#039;&#039; or the word &#039;&#039;Pollett&#039;&#039; or both.
+* Putting the query in quotes, for example &quot;Chris Pollett&quot;, will cause Yioop to perform an exact match search. Yioop in this case would only return documents that have the string &quot;Chris Pollett&quot; rather than just the words Chris and Pollett possibly not next to each other in the document. Also, using the quote syntax, you can perform searches such as &quot;Chris * Homepage&quot; which would return documents which have the word Chris followed by some text followed by the word Homepage.
+* If the query has at least one word not prefixed by -, then adding a `-&#039; in front of a word in a query means search for results not containing that term. So a search on: of &#039;&#039;-the&#039;&#039; would return results containing the word &quot;of&quot; but not containing the word &quot;the&quot;.
+* Searches of the forms: &#039;&#039;&#039;related:url&#039;&#039;&#039;, &#039;&#039;&#039;cache:url&#039;&#039;&#039;, &#039;&#039;&#039;link:url&#039;&#039;&#039;, &#039;&#039;&#039;ip:ip_address&#039;&#039;&#039; are equivalent to having clicked on the Similar, Cached, InLinks, IP address links, respectively, on a summary with that url and ip address.
+
+The remaining query types we list in alphabetical order:
+
+;&#039;&#039;&#039;code&amp;#58;http_error_code&#039;&#039;&#039; : returns the summaries of all documents downloaded with that HTTP response code. For example, code:04 would return all summaries where the response was a Page Not Found error.
+;&#039;&#039;&#039;date&amp;#58;Y, date&amp;#58;Y-m, date&amp;#58;Y-m-d, date&amp;#58;Y-m-d-H, date&amp;#58;Y-m-d-H-i, date&amp;#58;Y-m-d-H-i-s&#039;&#039;&#039; : returns summaries of all documents crawled on the given date. For example, &#039;&#039;date:2011-01&#039;&#039; returns all document crawled in January, 2011. As one can see detail goes down to the second level, so one can have an idea about how frequently the crawler is hitting a given site at a given time.
+;&#039;&#039;&#039;dns&amp;#58;num_seconds&#039;&#039;&#039; : returns summaries of all documents whose DNS lookup time was between num_seconds and num_seconds + 0.5 seconds. For example, dns:0.5.
+;&#039;&#039;&#039;filetype&amp;#58;extension&#039;&#039;&#039;: returns summaries of all documents found with the given extension. So a search: Chris Pollett filetype&amp;#58;pdf would return all documents containing the words Chris and Pollett and with extension pdf.
+;&#039;&#039;&#039;host&amp;#58;all&#039;&#039;&#039;: returns summaries of all domain level pages (pages where the path was /).
+;&#039;&#039;&#039;index&amp;#58;timestamp or i&amp;#58;timestamp&#039;&#039;&#039; : causes the search to make use of the IndexArchive with the given timestamp. So a search like: &#039;&#039;Chris Pollett i&amp;#58;1283121141 | Chris Pollett&#039;&#039; take results from the index with timestamp 1283121141 for Chris Pollett and unions them with results for Chris Pollett in the default index
+;&#039;&#039;&#039;if&amp;#58;keyword!add_keywords_on_true!add_keywords_on_false&#039;&#039;&#039; : checks the current conjunctive query clause for &quot;keyword&quot;; if present, it adds &quot;add_keywords_on_true&quot; to the clause, else it adds the keywords &quot;add_keywords_on_true&quot;. This meta word is typically used as part of a crawl mix. The else condition does not need to be present. As an example, &#039;&#039;if&amp;#58;oracle!info&amp;#58;http://oracle.com/!site&amp;#58;none&#039;&#039; might be added to a crawl mix so that if a query had the keyword oracle then the site http://oracle.com/ would be returned by the given query clause. As part of a larger crawl mix this could be used to make oracle&#039;s homepage appear at the top of the query results. If you would like to inject multiple keywords then separate the keywords using plus rather than white space. For example, if:corvette!fast+car.
+;&#039;&#039;&#039;info&amp;#58;url&#039;&#039;&#039; : returns the summary in the Yioop index for the given url only. For example, one could type info:http://www.yahoo.com/ or info:www.yahoo.com to get the summary for just the main Yahoo! page. This is useful for checking if a particular page is in the index.
+;&#039;&#039;&#039;lang&amp;#58;IETF_language_tag&#039;&#039;&#039; : returns summaries of all documents whose language can be determined to match the given language tag. For example, &#039;&#039;lang:en-US&#039;&#039;.
+;&#039;&#039;&#039;media&amp;#58;kind&#039;&#039;&#039; : returns summaries of all documents found of the given media kind. Currently, the text, image, news, and video are the four supported media kinds. So one can add to the search terms &#039;&#039;media:image&#039;&#039; to get only image results matching the query keywords.
+&#039;&#039;&#039;mix&amp;#58;name or m&amp;#58;name &#039;&#039;&#039;: tells Yioop to use the crawl mix &quot;name&quot; when computing the results of the query. The section on mixing crawl indexes has more details about crawl mixes. If the name of the original mix had spaces, for example, cool mix then to use the mix you would need to replace the spaces with plusses, &#039;&#039;m:cool+mix&#039;&#039;.
+;&#039;&#039;&#039;modified&amp;#58;Y, modified&amp;#58;Y-M, modified&amp;#58;Y-M-D&#039;&#039;&#039; : returns summaries of all documents which were last modified on the given date. For example, modified:2010-02 returns all document which were last modifed in February, 2010.
+;&#039;&#039;&#039;no&amp;#58;some_command&#039;&#039;&#039; is used to tell Yioop not to perform some default transformation of the search terms. For example, &#039;&#039;no:guess&#039;&#039; tells Yioop not to try to guess the semantics of the search before doing the search. This would mean for instance, that Yioop would not rewrite the query &#039;&#039;yahoo.com&#039;&#039; into &#039;&#039;site:yahoo.com. no:network&#039;&#039; tells Yioop to only return search results from the current machine and not to send the query to all machines in the Yioop instance. &#039;&#039;no:cache&#039;&#039; says to recompute the query and not to make use of memcache or file cache.
+;&#039;&#039;&#039;numlinks&amp;#58;some_number&#039;&#039;&#039;: returns summaries of all documents which had some_number of outgoing links. For example, numlinks:5.
+;&#039;&#039;&#039;os&amp;#58;operating_system&#039;&#039;&#039;: returns summaries of all documents served on servers using the given operating system. For example, &#039;&#039;os:centos&#039;&#039;, make sure to use lowercase.
+;&#039;&#039;&#039;path&amp;#58;path_component_of_url&#039;&#039;&#039;: returns summaries of all documents whose path component begins with path_component_of_url. For example, &#039;&#039;path:/phpBB&#039;&#039; would return all documents whose path started with phpBB, &#039;&#039;path:/robots.txt&#039;&#039; would return summaries for all robots.txt files.
+;&#039;&#039;&#039;raw&amp;#58;number&#039;&#039;&#039; : control whether or not Yioop tries to do deduplication on results and whether links and pages for the same url should be grouped. Any number greater than zero says don&#039;t do deduplication.
+;&#039;&#039;&#039;robot&amp;#58;user_agent_name&#039;&#039;&#039; : returns robots.txt pages that contained that user_agent_name (after lower casing). For example, &#039;&#039;robot:yioopbot&#039;&#039; would return all robots.txt pages explicitly having a rule for YioopBot.
+;&#039;&#039;&#039;safe&amp;#58;boolean_value&#039;&#039;&#039; : is used to provide &quot;safe&quot; or &quot;unsafe&quot; search results. Yioop has a crude, &quot;hand-tuned&quot;, linear classifier for whether a site contains pornographic content. If one adds safe:true to a search, only those pages found which were deemed non-pornographic will be returned. Adding safe:false has the opposite effect.
+;&#039;&#039;&#039;server&amp;#58;web_server_name&#039;&#039;&#039; : returns summaries of all documents served on that kind of web server. For example, &#039;&#039;server:apache&#039;&#039;.
+;&#039;&#039;&#039;site&amp;#58;url, site&amp;#58;host, or site&amp;#58;domain&#039;&#039;&#039;: returns all of the summaries of pages found at that url, host, or domain. As an example, &#039;&#039;site:http://prints.ucanbuyart.com/lithograph_art.html&#039;&#039;, &#039;&#039;site:http://prints.ucanbuyart.com/&#039;&#039;, &#039;&#039;site:prints.ucanbuyart.com&#039;&#039;, &#039;&#039;site:.ucanbuyart.com&#039;&#039;, site:ucanbuyart.com, site:com, will all returns with decreasing specificity. To return all pages and links to pages in the Yioop index, you can do &#039;&#039;site:any&#039;&#039;. To return all pages (as opposed to pages and links to pages) listed in a Yioop index you can do &#039;&#039;site:all&#039;&#039;. &#039;&#039;site:all&#039;&#039; doesn&#039;t return any links, so you can&#039;t group links to urls and pages of that url together. If you want all sites where one has a page in the index as well as links to that site, than you can do &#039;&#039;site:doc&#039;&#039;.
+;&#039;&#039;&#039;size&amp;#58;num_bytes&#039;&#039;&#039;: returns summaries of all documents whose download size was between num_bytes and num_bytes + 5000. num_bytes must be a multiple of 5000. For example, &#039;&#039;size:15000&#039;&#039;.
+;&#039;&#039;&#039;time&amp;#58;num_seconds&#039;&#039;&#039; : returns summaries of all documents whose download time excluding DNS lookup time was between num_seconds and num_seconds + 0.5 seconds. For example, &#039;&#039;time:1.5&#039;&#039;.
+;&#039;&#039;&#039;version&amp;#58;version_number&#039;&#039;&#039; : returns summaries of all documents served on web servers with the given version number. For example, one might have a query &#039;&#039;server:apache version:2.2.9&#039;&#039;.
+;&#039;&#039;&#039;weight&amp;#58;some_number or w&amp;#58;some_number&#039;&#039;&#039; : has the effect of multiplying all score for this portion of a query by some_number. For example, &#039;&#039;Chris Pollett | Chris Pollett site:wikipedia.org w:5 &#039;&#039;would multiply scores satisfying &#039;&#039;Chris Pollett&#039;&#039; and on &#039;&#039;wikipedia.org&#039;&#039; by 5 and union these with those satisfying &#039;&#039;Chris Pollett&#039;&#039;.
+
+Although we didn&#039;t say it next to each query form above, if it makes sense, there is usually an &#039;&#039;all&#039;&#039; variant to a form. For example, &#039;&#039;os:all&#039;&#039; returns all documents from servers for which os information appeared in the headers.
+
+===Result Formats===
+In addition to using the search form interface to query Yioop, it is also possible to query Yioop and get results in Open Search RSS format. To do that you can either directly type a URL into your browser of the form:
+ http://my-yioop-instance-host/?f=rss&amp;q=query+terms
+Or you can write AJAX code that makes requests of URLs in this format. Although, there is no official Open Search JSON format, one can get a JSON object with the same structure as the RSS search results using a query to Yioop such as:
+ http://my-yioop-instance-host/?f=json&amp;q=query+terms
+Sometimes it is advantageous to get the json data back as an argument to a Javascript function -- so called, [[https://en.wikipedia.org/wiki/JSONP|JSONP Format]]. This can be acoomplished by add a callback parameter to your json query:
+ http://my-yioop-instance-host/?f=json&amp;callback=myJavascriptFunction&amp;q=query+terms
+
+[[Documentation#contents|Return to table of contents]].
+
+===Settings===
+
+In the corner of the page with the main search form is a Settings-Signin element:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SettingsSignin.png|Settings Sign-in Element))
+}}
+
+This element provides access for a user to change their search settings by clicking Settings. The Sign In link provides access to the Admin and User Accounts panels for the website. Clicking the Sign In link also takes one to a page where one can register for an account if Yioop is set up to allow user registration.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:Settings.png|The Settings Form))
+}}
+
+On the Settings page, there are currently three items which can be adjusted: The number of results per page when doing a search, the language Yioop should use, and the particular search index Yioop should use. When a user clicks save, the data is stored by Yioop. The user can then click &quot;Return to Yioop&quot; to go back the search page. Thereafter, interaction with Yioop will make use of any settings&#039; changes. Data is stored in Yioop and associated with a given user via a cookies mechanism. In order for this to work, the user&#039;s browser must allow cookies to be set. This is usually the default for most browsers; however, it can sometimes be disabled in which case the browser option must be changed back to the default for Settings to work correctly. It is possible to control some of these settings by tacking on stuff to the URL. For instance, adding &amp;l=fr-FR to the URL query string (the portion of the URL after the question mark) would tell Yioop to use the French from France for outputting text. You can also add &amp;its= the Unix timestamp of the search index you want.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Mobile Interface===
+
+Yioop&#039;s user interface is designed to display reasonably well on tablet devices such as the iPad. For smart phones, such as iPhone, Android, Blackberry, or Windows Phone, Yioop has a separate user interface. For search, settings, and login, this looks fairly similar to the non-mobile user interface:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:MobileSearch.png|Mobile Search Landing Page))
+((resource:Documentation:MobileSettings.png|Mobile Settings Page))
+((resource:Documentation:MobileSignin.png|Mobile Admin Panel Login))
+}}
+
+For Admin pages, each activity is controlled in an analgous fashion to the non-mobile setting, but the Activity element has been replaced with a dropdown:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:MobileAdmin.png|Example Mobile Admin Activity))
+}}
+
+We now resume our discussion of how to use each of the Yioop admin activities for the default, non-mobile, setting, simply noting that except for the above minor changes, these instructions will also apply to the mobile setting.
+
+[[Documentation#contents|Return to table of contents]].
+
+==User Accounts and Social Features==
+===Registration and Signin===
+
+Clicking on the Sign In link on the corner of the Yioop web site will bring up the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SigninScreen.png|Admin Panel Login))
+}}
+
+Correctly, entering a username and password will then bring the user to the User Account portion of the Yioop website. Each Account page has on it an Activity element as well as a main panel where the current activity is displayed. The Activity element allows the user to choose what is the current activity for the session. The choices available on the Activity element depend on the roles the user has. A default installation of Yioop comes with two predefined roles Admin and User. If someone has the Admin role then the Activity element looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AdminActivityElement.png|Admin Activity Element))
+}}
+
+On the other hand, if someone just has the User role, then their Activity element looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:UserActivityElement.png|User Activity Element))
+}}
+
+In addition to the Admin and User roles, there is a also a Business role that can be added to either.
+If under [[Documentation#Optional%20Server%20and%20Security%20Configurations|Server Settings]], the Advertisement Source is set to Keywords Advertisements, and a user has the Business role, then the Activity element will also contain:
+
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageAdvertisementElement.png|Manage Advertisement Element))
+}}
+
+Over the next several sections we will discuss each of the Yioop account activities in turn. Before we do that we make a couple remarks about using Yioop from a mobile device.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Managing Accounts===
+
+By default, when a user first signs in to the Yioop admin panel the current activity is the Manage Account activity. This activity just lets user&#039;s change their account information using the form pictured below. It also has summary information about Crawls and Indexes (Admin account only), Groups and Feeds, and Crawl mixes. There are also helpful links from each of these sections to a related activity for managing them.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageAccount.png|Manage Account Page))
+}}
+
+Initially, the Account Details fields are grayed out. To edit them, to toggle whether a user can do keyword advertising, or to edit the user icon next to them, click the lock icon next to account details. This will allow a user to change information using their account password. A new user icon can either be selected by clicking the choose link underneath it, or by dragging and dropping an icon into the image area. The user&#039;s password must be entered correctly into the password field for changes to take effect when Save is clicked.  Clicking the now opened Lock icon will cause the lock to close, these details to be grayed out, and not editable.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ChangeAccountInfo.png|Change Account Information Form))
+}}
+
+It should be noted that the &#039;&#039;&#039;Advertise With Us&#039;&#039;&#039; check box only appears if a Yioop site administrator has selected the Advertisement Source as Keywords Advertisements in the Server Settings Activity. When this box is checked and save, a Manage Advertisements like will appear on the Activity Element on the side of the screen. If a user wants to change their password they can click the Password link label for the password field. This reveals the following additional form fields where the password can be changed:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ChangePassword.png|Change Password Form))
+}}
+
+[[Documentation#contents|Return to table of contents]].
+
+===Managing Users, Roles, and Groups===
+
+The Manage Users, Manage Groups, and Manage Roles activities have similar looking forms as well as related functions. All three of these activities are available to accounts with the Admin role, but only Manage Groups is a available to those with a standard User role. To describe these activities, let&#039;s start at the beginning... Users are people who have accounts to connect with a Yioop installation. Users, once logged in may engage in various Yioop activities such as Manage Crawls, Mix Crawls, and so on. A user is not directly assigned which activities they have permissions on. Instead, they derive their permissions from which roles they have been directly assigned and by which groups they belong to. When first launched, Manage User activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AddUser.png|The Add User form))
+}}
+
+The purpose is this activity is to allow an administrator to add, monitor and modify the accounts of users of a Yioop installation. At the top of the activity is the &quot;Add User&quot; form. This would allow an administrator to add a new user to the Yioop system. Most of the fields on this form are self explanatory except the Status field which we will describe in a moment. Beneath this is a User List table. At the top of this table is a dropdown used to control how many users to display at one time. If there are more than that many users, there will be arrow links to page through the user list. There is a also a search link which can be used to bring up the following Search User form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchUser.png|The Search User form))
+}}
+
+This form can be used to find and sort various users out of the complete User List. If we look at the User List, the first four columns, Username, First Name, Last Name, and Email Address are pretty self-explanatory. The Groups column says how many groups the user belongs to. The Status column has a dropdown for each user row, this dropdown also appear in the Add User form. It represents the current status of the User and can be either Inactive, Active, or Banned. An Inactive user is typically a user that has used the Yioop registration form to sign up for an account, but who hasn&#039;t had the account activated by the administrator, nor had the account activated by using an email link. Such a user can&#039;t create or post to groups or log in. On the other hand, such a user has reserved that username so that other people can&#039;t use it. A Banned user is a user who has been banned from logging, but might have groups or posts that the administrator wants to retain. Selecting a different dropdown value changes that user&#039;s status. Next to the Status column are two action columns which can be used to edit a user or to delete a user. Deleting a user, deletes their account, any groups that the user owns, and deletes any posts the user made. The Edit User form looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditUser.png|The Edit User form))
+}}
+
+This form let&#039;s you modify some of the attributes of a users. There are also two links on it: one with the number of roles that a user has, the other with the number of groups that a user has. Here the word &quot;role&quot; means a set of activities. Clicking on one of these links brings up a paged listing of the particular roles/groups the user has/belongs to. It will also let you add or delete roles/groups. Adding a role to a user means that the user can do the set of activities that the role contains, adding a group to the user means the user can read that group, and if the privileges for non-owners allow posting then can also post or comment to that group&#039;s feed and edit the group&#039;s wiki. This completes the description of the Manage
+User Activity.
+
+Roles are managed through the Manage Role activity, which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AddRole.png|The Add Role form))
+}}
+
+Similar to the Manage User form, at the top of this activity, there is an Add Role form, and beneath this a Role List. The controls of the Role List operate in much the same fashion as those of the User List described earlier. Clicking on the Edit link of a role brings up a form which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditRole.png|The Edit Role form))
+}}
+
+In the above, we have a Localizer role. We might have created this role, then used the Select Activity dropdown to add all the activities of the User role. A localizer is a person who can localize Yioop to a new language. So we might then want to use the Select dropdown to add Manage Locales to the list of activities. Once we have created a role that we like, we can then assign user&#039;s that role and they will be able to perform all of the activities listed on it. If a user has more than one role, than they can perform an activity as long as it is listed in at least one role.
+
+Groups are collections of users that have access to a group feed and a set of wiki pages. Groups are managed through the Manage Groups activity which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageGroups.png|The Manage Groups form))
+}}
+
+Unlike Manage Users and Manage Roles, the Manage Group activity belongs to the standard User role, allowing any user to create and manage groups. As one can see from the image above The Create/Join Group form takes the name of a group. If you enter a name that currently does not exist the following form will appear:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CreateGroup.png|The Create Group form))
+}}
+
+The user who creates a group is set as the initial group owner.
+
+The &#039;&#039;&#039;Register dropdown&#039;&#039;&#039; says how other users are allowed to join the group: &#039;&#039;&#039;No One&#039;&#039;&#039; means no other user can join the group (you can still invite other users), &#039;&#039;&#039;By Request&#039;&#039;&#039; means that other users can request the group owner to join the group, but that the group is not publicly visible in the browsable group directory; &#039;&#039;&#039;Public Request&#039;&#039;&#039; is the same as By Request, but the group is publicly visible in the browsable group directory;  and &#039;&#039;&#039;Anyone&#039;&#039;&#039; means all users are allowed to join the group and the group appears in the browseable directory of groups. It should be noted that the root account can always join and browse for any group. The root account can also always take over ownership of any group.
+
+The &#039;&#039;&#039;Access dropdown&#039;&#039;&#039; controls how users who belong/subscribe to a group other than the owner can access that group. The possibilities are &#039;&#039;&#039;No Read&#039;&#039;&#039; means that non-members of the group cannot read the group feed or wiki, a non-owner member of the group can read but not write the group news feed and wiki; &#039;&#039;&#039;Read&#039;&#039;&#039; means that a non-member of the group can read the group news feed and the groups wiki page, but non-owners cannot write the feed or wiki; &#039;&#039;&#039;Read Comment&#039;&#039;&#039; means that a non-owner member of the group can read the group feed and wikis and can comment on any existing threads, but cannot start new ones, &#039;&#039;&#039;Read Write&#039;&#039;&#039; means that a non-owner member of the group can start new threads and comment on existing ones in the group feed, but cannot edit the group&#039;s wiki; finally, &#039;&#039;&#039;Read Write Wiki&#039;&#039;&#039; is wiki Read Write except a non-owner member can edit the group&#039;s wiki. The access to a group can be changed by the owner after a group is created. No Read and Read are often suitable if a group&#039;s owner wants to perform some kind of moderation. Read and Read Comment groups are often suitable if someone wants to use a Yioop Group as a blog. Read Write makes sense for a more traditional bulletin board.
+
+The &#039;&#039;&#039;Voting dropdown&#039;&#039;&#039; controls to what degree users can vote on posts. &#039;&#039;&#039;No Voting&#039;&#039;&#039; means group feed posts cannot be voted on; &#039;&#039;&#039;+ Voting&#039;&#039;&#039; means that a post can be voted up but not down; and &#039;&#039;&#039;+/- Voting&#039;&#039;&#039; means a post can be voted up or down. Yioop restricts a user to at most one vote/post.
+
+The &#039;&#039;&#039;Post Lifetime dropdown&#039;&#039;&#039; controls how long a group feed post is retained by the Yioop system before it is automatically deleted. The possible values are &#039;&#039;&#039;Never Expires&#039;&#039;&#039;, &#039;&#039;&#039;One Hour&#039;&#039;&#039;, &#039;&#039;&#039;One Day&#039;&#039;&#039;, or &#039;&#039;&#039;One Month&#039;&#039;&#039;.
+
+A default installation of Yioop has two built-in groups: &#039;&#039;&#039;Public&#039;&#039;&#039; and &#039;&#039;&#039;Help&#039;&#039;&#039; owned by root. Public has Read access and all users automatically subscribed to it and cannot unsubscribe it. It is useful for general announcements and its wiki can be used as part of building a site for Yioop. The Help group&#039;s wiki is used to maintain all the wiki pages related to Yioop&#039;s integrated help system. When a user clicks on the help icon [?], the page that is presented in blue comes from this wiki. This group&#039;s registration is by default by Public Request and its access is Read Write Wiki.
+
+If on the Create/Join Group form, the name of a group entered already exists, but is not joinable, then an error message that the group&#039;s name is in use is displayed. If either anyone can join the group or the group can be joined by request, then that group will be added to the list of subscribed to groups. If membership is by request, then initially in the list of groups it will show up with access Request Join.
+
+Beneath the Create/Join Group form is the Groups List table. This lists all the groups that a user is currently subscribed to:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:GroupsList.png|Groups List Table))
+}}
+
+The controls at the top of this table are similar in functionality to the controls we have already discussed for the User Lists table of Manage Users and the Roles List table of Manage Roles. This table let&#039;s a user manage their existing groups, but does not let a user to see what groups already exist. If one looks back at the Create/Join Groups form though, one can see next to it there is a link &quot;Browse&quot;. Clicking this link takes one to the Discover Groups form and the Not Subscribed to Groups table:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:BrowseGroups.png|The Browse Groups form))
+}}
+
+If a group is subscribable then the Join link in the Actions column of Not Subscribed to Groups table should be clickable. Let&#039;s briefly now consider the other columns of either the Groups List or not Subscribed to Groups table. The Name column gives the name of the group. Group name are unique identifiers for a group on a Yioop system. In the Groups List table the name is clickable and takes you to the group feed for that group. The Owner column gives the username of the owner of the group and beneath this the number of members of the group. If you are the root account or if you are the owner of the group, then this field should be a clickable link that take you to the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:TransferGroup.png|The Transfer Group form))
+}}
+
+that can be used to transfer the ownership of a group. The next two column give the register and access information for the group. If you are the owner of the group these will be dropdowns allow you to change these settings. We have already explained what the Join link does in the actions column. Other links which can appear in the actions column are Unsubscribe, which let&#039;s you leave a group which you have joined but are not the owner of; Delete, which, if you are the owner of a group, let&#039;s you delete the group, its feed, and all its wiki pages; and Edit, which displays the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditGroup.png|The Edit Group form))
+}}
+
+The Register, Access, Voting, Post Lifetime dropdowns lets one modify the registration, group access, voting, and post lifetime properties for the group which we have already described before. Next to the Members table header is a link with the number of current memebers of the group. Clicking this link expands this area into a listing of users in the group as seen above. This allows one to change access of different members to the group, for example, approving a join request or banning a user. It also allows one to delete a member from a group. Beneath the user listing is a link which can take one to a form to invite more users.
+
+===Feeds and Wikis===
+
+The initial screen of the Feeds and Wikis page has an integrated list of all the recent posts to any groups to which a user subscribes:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:FeedsWikis.png|The Main Feeds and Wiki Page))
+}}
+
+The arrow icon next to the feed allow one to collapse the Activities element to free up screen real estate for the feed. Once collapsed, an arrow icon pointing the opposite direction will appear to let you show the Activities element again. Next to the Group Activity header at the top of the page are two icons:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:GroupingIcons.png|The Group Icons))
+}}
+
+These control whether the Feed View above has posts in order of time or if posts are arranged by group as below:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:FeedsWikis2.png|The Grouped Feeds and Wiki Page))
+}}
+
+
+Going back to the original feed view above, notice posts are displayed with the most recent post at the top. If there has been very recent activity (within the last five minute), this page will refresh every 15 seconds for up to twenty minutes, checking for new posts. Each post has a title which links to a thread for that post. This is followed by the time when the post first appeared and the group title. This title, although gray, can be clicked to go to that particular group feed. If the user has the ability to start new threads in a group and one is in single feed mode, an icon with a plus-sign and a pencil appears next ot the group name, which when clicked allows a user to start a new thread in that group. Beneath the title of the post, is the username of the person who posted. Again, this is clickable and will take you to a page of all recent posts of that person. Beneath the username, is the content of the post. On the opposite side of the post box may appear links to Edit or X (delete) the post, as well as a link to comment on a post. The Edit and X delete links only appear if you are the poster or the owner of the group the post was made in. The Comment link let&#039;s you make a follow up post to that particular thread in that group. For example, for the &quot;I just learned an interesting thing!&quot; post above, the current user could start a new thread by clicking the plus-pencil icon or comment on this post by clicking the Comment link. If you are not the owner of a group then the Comment and Start a New Thread links only appear if you have the necessary privileges on that group.
+
+The image below shows what happens when one clicks on a group link, in this case, the Chris Blog link.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SingleGroupFeed.png|A Single Group Feed))
+}}
+
+On the opposite side of the screen there is a link My Group Feeds, which let&#039;s one go back to the previous screen. At the top of this screen is clickable title of the group, in this case, Chris Blog, this takes one to the Manage Groups activity where properties of this group could be examined. Next we see a toggle between Feed and Wiki. Currently, on group feed page, clicking Wiki would take one to the Main page of the wiki. Posts in the single group view are grouped by thread with the thread containing the most recent activity at the top. Notice next to each thread link there is a count of the number of posts to that thread. The content of the thread post is the content of the starting post to the thread, to see latter comments one has to click the thread link. There is now a Start New Thread button at the top of the single group feed as it is clear which group the thread will be started in. Clicking this button would reveal the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:StartNewThread.png|Starting a new thread from a group feed))
+}}
+
+Adding a Subject and Post to this form and clicking save would start a new thread. Posts can make use of [[Syntax|Yioop&#039;s Wiki Syntax]] to achieve effects like bolding text, etc. The icons above the text area can be used to quickly add this mark-up to selected text. Although the icons are relatively standard, hovering over an icon will display a tooltip which should aid in figuring out what it does. Beneath the text area is a dark gray area with instructions on how to add resources to a page such as images, videos, or other documents. For images and videos these will appear embedded in the text of the post when it is saved, for other media a link to the resource will appear when the source is saved. The size allowed for uploaded media is determined by your php instances php.ini configuration file&#039;s values for post_max_size and upload_max_filesize. Yioop uses the value of the constant MAX_VIDEO_CONVERT_SIZE set in a configs/local_config.php or from configs/config.php to determine if a video should be automatically converted to the two web friendly formats mp4 and webm. This conversion only happens if, in addition, [[http://ffmpeg.org/|FFMPEG]] has been installed and the path to it has been given as a constant FFMPEG in either a configs/local_config.php or in configs/config.php.
+
+Clicking the comment link of any existing thread reveals the following form to add a comment to that thread:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AddComment.png|Adding a comment to an existing thread))
+}}
+
+Below we see an example of the feed page we get after clicking on the My First Blog Post thread in the Chris Blog group:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:FeedThread.png|A Group Feed Thread))
+}}
+
+Since we are now within a single thread, there is no Start New Thread button at the top. Instead, we have a Comment button at the top and bottom of the page. The starting post of the thread is listed first and ending most recent post is listed last (paging buttons both on the group and single thread page, let one jump to the last post). The next image below is an example of the feed page one gets when one clicks on a username link, in this case, cpollett:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:UserFeed.png|User Feed))
+}}
+
+When a user starts a new thread or comments to an existing thread, several people will be notified via email provided they have their email address configured properly. For a new thread, the groups owner will be notified if they themselves weren&#039;t the ones starting the thread. If it was in fact the group&#039;s owner that starts a thread, then everyone who belongs to the group will be notified. For a comment to a thread, excluding the commenter, the group&#039;s owner, the person who started the thread, and anyone else who has commented on the thread would be notified via email. Note for a comment by the group&#039;s owner, it is still only the people participating in the thread who are notified.
+
+Single Group, Threads, and User feeds of groups which anyone can join (i.e., public groups) all have RSS feeds which could be used in a news aggregator or crawled by Yioop. To see what the link would be for the item you are interested in, first collapse the activity element if its not collapsed (i.e., click the [&lt;&lt;] link at the top of the page). Take the URL in the browser in the url bar, and add ? or &amp; followed by f=rss to it. It is okay to remove the YIOOP_TOKEN= variable from this URL. Doing this for the cpollett user feed, one gets the url:
+ http://www.yioop.com/user/4?f=rss
+whose RSS feed looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:UserRssFeed.png|User Rss Feed))
+}}
+
+Adding f=json and f=json&amp;callback=myFunction also, work if JSON or JSONP formats are preferred.
+As we mentioned above when we described the single group feed page, if we click on the Wiki link at the top we go to the Main wiki page of the group, where we could read that page. If the Main Wiki page (or for that if matter if we go to any wiki page that) does not exist, then we would get like the following:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:NonexistantPage.png|Screenshot of going to location of a non-existant wiki page))
+}}
+
+This page might be slightly different depending on whether the user has write access to the given group. The [[Syntax|Wiki Syntax Guide]] link in the above takes one to a page that describes how to write wiki pages. The Edit link referred to in the above looks slightly different and is in a slightly different location depending on whether we are viewing the page with the Activity element collapsed or not. If the Activity element is not collapsed then it appears one of three links within the current activity as:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:AdminHeading.png|Read Edit Page Headings on Admin view))
+}}
+
+On the other hand, if the Activity element is collapsed, then it appear on the navigation bar at the top of the screen as:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:GroupHeading.png|Read Edit Page Headings on Group view))
+}}
+
+Notice besides editing a page there is a link to read the page and a link Pages. The Pages link takes us to a screen where we can see all the pages that have been created for a group:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WikiPageList.png|List of Groups Wiki Pages))
+}}
+
+The search bar can be used to search within the titles of wiki pages of this group for a particular page. Suppose now we clicked on Test Page in the above, then we would go to that page initially in Read view:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WikiPage.png|Example Viewing a Wiki Page))
+}}
+
+If we have write access, and we click the Edit link for this page, we work see the following edit page form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditWikiPage.png|Editing a Wiki Page))
+}}
+
+This page is written using Wiki mark-up whose syntax which as we mentioned above can be
+found in the [[Syntax|Yioop Wiki Syntax Guide]]. So for example, the heading at the top of the page is written as
+&lt;nowiki&gt;
+ =Test Page=
+&lt;/nowiki&gt;
+in this mark-up. The buttons above the textarea can help you insert the mark-up you need without having to remember it. Also, as mentioned above the dark gray area below the textarea describes how to associate images, video, and other media to the document. Unlike with posts, a complete list of currently associated media can be found at the bottom of the document under the &#039;&#039;&#039;Page Resources&#039;&#039;&#039; heading. Links to Rename, Add a resource to the page, and Delete each resource can also be found here. Clicking on the icon next to a resource let&#039;s you look at the resource on a page by itself. This icon will be a thumbnail of the resource for images and videos. In the case of videos, the thumbnail is only generated if the FFMPEG software mentioned earlier is installed and the FFMPEG constant is defined. In this case, as with posts, if the video is less than MAX_VIDEO_CONVERT_SIZE, Yioop will automatically try to convert it to mp4 and webm so that it can be streamed by Yioop using HTTP pseudo-streaming.
+
+Clicking the &#039;&#039;&#039;Settings Link&#039;&#039;&#039; next to the wiki page name reveals the following additional form elements:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WikiPageSettings.png|Wiki Page Settings))
+}}
+
+The meaning of these various settings is described in [[Syntax#Page%20Settings,%20Page%20Type|Page Settings, Page Type]] section of the Yioop Wiki Syntax Guide.
+
+
+The &#039;&#039;&#039;Discuss link&#039;&#039;&#039; takes you to a thread in the current group where the contents of the wiki page should be discussed. Underneath the textarea above is a Save button. Every time one clicks the save button a new version of the page is saved, but the old one is not discarded. We can use the Edit Reason field to provide a reason for the changes between versions. When we read a page it is the most recent version that is displayed. However, by clicking the History link above we can see a history of prior version. For example:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:HistoryPage.png|An example History Page of a Wiki Page))
+}}
+
+The Revert links on this history page can be used to change the current wiki page to a prior version. The time link for each version can be clicked to view that prior version without reverting. The First and Second links next to a version can be used to set either the first field or second field at the top of the history page which is labelled Difference: . Clicking the Go button for the Difference form computes the change set between two selected versions of a wiki document. This might look like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:DiffPage.png|An example diff page of two versions of a Wiki Page))
+}}
+
+This completes the description of group feeds and wiki pages.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Keyword Advertising==
+
+Keyword advertising allows a user with the Business Role to pay to associate a query term or phrase with a text-based advertisement for a fixed number of days. By default, Yioop does not come with an advertisement platform turned on. To enable keyword advertising, one can select &#039;&#039;&#039;Keyword Advertisements&#039;&#039;&#039; from the dropdown in the &#039;&#039;&#039;Ad Server Configuration&#039;&#039;&#039; fieldset of the [[Documentation#Optional%20Server%20and%20Security%20Configurations|Server Settings]] activity. This turns on keyword advertising. A user can then choose to upgrade their account to do advertising as described in the [[Documentation#Manage%20Account|Manage Account]] section. If this is done, clicking on the &#039;&#039;&#039;Manage Advertisements&#039;&#039;&#039; activity link will display a form like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CreateAdStep1.png|Creating an Ad -- Step 1))
+}}
+
+We split the remainder of this section into three subsections: the Manage Advertisements activity, the mechanics of how ad bids are calculated, and how payment processing is done.
+
+===The Manage Advertisements Activity===
+Returning to the screenshot at the end of the last section, the &#039;&#039;&#039;Ad Title&#039;&#039;&#039;, &#039;&#039;&#039;Ad Body&#039;&#039;&#039;, &#039;&#039;&#039;Destination URL&#039;&#039;&#039; fields can be used to create a text-based advertisement. What this ad will look like appears in the &#039;&#039;&#039;Preview&#039;&#039;&#039; area.
+
+The &#039;&#039;&#039;Duration&#039;&#039;&#039; dropdown controls how many days the ad campaign will run for. The campaign starts on the date of purchase. The first day of a campaign starts from the time of purchase and last until midnight in the Yioop instance&#039;s timezone. Subsequent days start at midnight and last till the following midnight.
+
+&#039;&#039;&#039;Keywords&#039;&#039;&#039; should consist of a comma separated list of words or phrases. Each word or phrase has a minimum bid for each day based on demand for that keyword. If no one so far has purchased an ad for any of the keywords, then this minimum is $1/day/(word or phrase). Otherwise, it is calculated using the total of the bids so far. Keywords can include Yioop meta words such as media:news.
+
+The &#039;&#039;&#039;Calculate Bid&#039;&#039;&#039; button computes the minimum cost for the campaign you have chosen, and then presents a form to receive your credit card information.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:CreateAdStep2.png|Creating an Ad -- Step 2))
+}}
+
+On this form the static field &#039;&#039;&#039;Minimum Bid Required&#039;&#039;&#039; displays the minimum amount required to pay for the advertisement campaign in question. The &#039;&#039;&#039;Expensive word&#039;&#039;&#039; static field says for your campaign which term contributes the most to this minimum bid cost. The Budget fields allows you to enter an amount greater than or equal to the minimum bid that you are willing to pay your ad campaign. If there have been no other bids on your keywords then the minimum bid will show your ad 100% of the time any of your keywords are searched for on the Yioop instance. If, however, there have been other bids, your bid amount as a fraction of the total bid amount for that day for the search keyword is used to select a frequency with which your ad is displayed. Thus, it can make sense to bid more than the minimum required amount.
+
+The &#039;&#039;&#039;Card Number&#039;&#039;&#039; field should be filled in with a valid credit card, in the &#039;&#039;&#039;CVC&#039;&#039;&#039; field you should put the three or four digit card verification number for your card, finally,  the &#039;&#039;&#039;Expiration&#039;&#039;&#039; dropdown is used to set your cards expiration date. If you need to edit the keywords or other details of your ad before purchasing it, you can click the &#039;&#039;&#039;Edit Ad&#039;&#039;&#039; button; otherwise, clicking the &#039;&#039;&#039;Purchase&#039;&#039;&#039; button completes the purchase of your Ad campaign. After purchase, your ad will appear an advertisement list beneath the Purchase Ad listing form.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageAdvertisements.png|The Manage Advertisement Page))
+}}
+
+The &#039;&#039;&#039;Advertisement List&#039;&#039;&#039; is a list of all current and previous ads in descending order by when the campaign was created. This form appears slightly differently for an administrative user than a normal user. For the former, as in the above image, there is a &#039;&#039;Username&#039;&#039; column, and ads not belonging to the current user will be shown. For these ads, the administrator gets a link to suspend the ad. In the normal user mode, the table does not have a &#039;&#039;Username&#039;&#039; column and only the current user&#039;s ads are displayed. A normal user can deactivate and reactivate their own ads, but can&#039;t reactivate an ad that was suspended by an administrator. A user can use the &#039;&#039;&#039;Edit&#039;&#039;&#039; button next to an ad to change the text or links associated with an active ad. One can determine how many times the ad was served and how many times an ad was clicked so far during a campaign by looking at the &#039;&#039;&#039;Views/Clicks&#039;&#039;&#039; column.
+
+Once an ad is purchased, for the duration of the campaign, if someone searches on the ad keywords (in the case of the ad above, either the word &#039;&#039;lemonade&#039;&#039; or the phrase &#039;&#039;soft drink&#039;&#039;), it has an opportunity to be displayed at the top of the search results. This would typically look something like:
+
+((resource:Documentation:KeywordAdSearchResult.png|Resource Description for KeywordAdSearchResult.png))
+
+
+===Bid Mechanics===
+
+In this subsection, we describe how the minimum purchase price for an ad is determined, how ads are chosen for  display, and try to give some intuitions on the ad bidding process.
+
+The minimum purchase is price of an ad campaign is determined by adding together the minimum
+costs of the different keywords involved in that campaign. For example, if one had three keywords and the cost of each separately was $7, $10, and $5, then the minimum purchase price would be $22. In turn, the minimum purchase price of a keyword for an ad campaign, is the sum of the current costs of the ad for each day during the campaign. For example, suppose we were running an ad on the single keyword &#039;&#039;lemonade&#039;&#039; for one week, the minimum cost for the current day was $10, and for subsequent days was $9, $7, $9, $5, $2, $1. Then the minimum purchase price for that keyword for the seven days would be $(10 + 9 + 7 + 9 + 5 + 2 + 1) = $43. The minimum cost of a keyword on a particular day is half the sum of the purchase for that keyword for that day so far rounded up. For example, suppose for a particular day, ads on the word lemonade had been purchased for $1, $1, $1, $2, $3, and $4. The total dollar amount spent on lemonade for that day would then be $12. So the minimum next bid for the word lemonade for that day would be half that amount round up, in this case, $6.
+
+The Yioop keyword advertising system allows one to bid higher than the minimum purchase price for an ad campaign. As we will see below there might be strategic reasons for doing this. Let `alpha = mbox(bid amount)/mbox(minimum bid amount)`. Then the bid amount this corresponds to for a keyword for a particular day, is `alpha` times the minimum bid for that keyword for that day. For example, suppose the minimum purchase price for a seven day campaign on the keywords &#039;&#039;lemonade&#039;&#039; and &#039;&#039;soft drink&#039;&#039; was $24, but the campaign was purchased for $36. Then `alpha` would be 1.5.  If for lemonade the daily minimum bids were $2, $1, $1, $1, $1, $1, $1 and those for soft drink were $4, $2, $2, $2, $2, $2, $2, then this ad purchase would correspond to bids for these days of 1.5 times this minimum bids for these days. I.e., for lemonade, bids of $3, $1.5, $1.5, $1.5, $1.5, $1.5, $1.5, and for soft drink, bids of $6, $3, $3, $3, $3, $3, $3.
+
+Once an ad is purchased, it can be displayed when a user performs a search. Ads are only displayed for simple queries, that is, queries not involving the operators | or #. Given such a query, Yioop performs a look up to see if there are any ads for that day which exactly match the query phrase. For example, if the query was &quot;soft drink&quot; then Yioop would do a look up to see if there are any active ad campaigns with &quot;soft drink&quot; as one of their keywords. If there are, Yioop moves on to an ad selection phase, if there are no such ads, then Yioop looks to see if there are ads involving single terms in the query. In this case, there are two possible single terms &quot;soft&quot; and &quot;drink. On the query &quot;lemon soft drink&quot;, there would be three: &quot;lemon&quot;, &quot;soft&quot;, and &quot;drink&quot;. If there are ad campaigns involving these single terms, then Yioop selects the term for which the most money has been spent and proceeds to the ad selection phase using that term.
+
+In the ad selection phase, Yioop arranges the ad campaigns for the chosen keyword in the order in which the purchases were made. It uses a pseudo-random number generator (PRNG) to pick an integer less than the total bid on that keyword for the current day. It then computes sums of ad prices from initial sublists of campaigns until it finds the first partial sum greater than or equal to the integer. Finally, it chooses the ad campaign that corresponded to the last summand in this sublist. For example, suppose the query was &quot;soft drink&quot; and there were four purchased ads with the &quot;soft drink&quot; keyword for that day. Bid 1 was $1, Bid 2 was $1.50 (coming from a scaling of an overbid), Bid 3 was $2.50, and Bid 4 was $4. The total spend on this keyword for the current day would be $9. If the PRNG picked the number 3 from among the choices 0, 1, 2, 3, 4, 5, 6, 7, 8, then Yioop would start computing initial sums. The blank sum $0 is less than $4, so it would add Bid 1 to get the partial sum $1, then it adds Bid 2 to get the partial sum $2.50, and finally, it would add Bid 3&#039;s bid to get the partial sum $5. As $5 &amp;ge; $4, and the last bid added was Bid 2&#039;s, it would be Bid 2&#039;s ad that would be displayed for this particular search. As the PRNG chooses a different number reasonably uniformly from 0, 1, 2, 3, 4, 5, 6, 7, 8 each time the query &quot;soft drink&quot; is made, the frequency with which a given ad for that term is displayed will be proportional to the amount that that ad was purchased for.
+
+We now conclude this section with some observations about this bidding system. The first observation is that days further in the future will tend to have fewer bids for keywords on those days as there has been less time for people to bid on those days. Currently, the maximum campaign length is 180 days, but most campaign will probably be shorter. Hence, on a cost/day basis for a minimum bid for a keyword is like to be lower for a longer campaign. A second observation is that if your valuation of a keyword on a given day is more than twice anyone else&#039;s valuation, then if you bid your valuation first for that day, no one else will try to bid as half the total will be more than their valuation. So truthful bidding can be advantageous.
+
+Many keyword advertisement systems use some kind of auction system, so it is interesting to compare Yioop&#039;s system with an auction. One could imagine have an open, ascending price auction for a keyword to purchase all impressions/clicks that that ad generates from Yioop searches for a day. Suppose for the keyword lemonade, searches generate on average 100 impressions in a day. If two bidders both value an impression at $1, then both would value the lemonade keyword for one day at $100. The first person would bid $100, and the second person would not bid as then he would be paying more than a $1/impression. The first person wouldn&#039;t underbid as then the second would have the opportunity to take all 100 impressions. Now consider what would happen with Yioop&#039;s bidding system. If the first person bids $100 for lemonade for the day, then the second person would have a minimum bid of $50. If the second person bids $50, then they will receive about `50/(100 + 50) cdot 100 approx 33` impressions, so the cost/impression will be over a dollar. Higher bids would only make the cost/impression worse, so the second bidder would not bid. Hence, in this situation Yioop&#039;s bidding system has the same effect as an auction.
+
+Now consider a situation in which one has two bidders, both of whom value an impression at $1, but both of whom have a limited budget of $50. In the auction system, the first bidder would bid $50, and the second bidder, although he might want to bid higher, doesn&#039;t have the wherewithal to do so. So the first bidder gets all the clicks for 50 cents each, the auction house has lost potential revenue on the item, and the second bidder doesn&#039;t get there ad displayed at all. In the Yioop system, the second bidder could bid $50 as well, each bidder would get half of the 100 impressions, that is, 50 each, and they would each be paying $1/impression. So in this situation the Yioop system is advantageous to the seller and gives more bidders an opportunity to have their ads displayed at a fair price.
+
+
+
+===Payment Processing===
+
+Payment processing entails actually charging the credit card based on the data collected &#039;&#039;&#039;Purchase Ad Listing&#039;&#039;&#039; form after Purchase is clicked. The default Yioop download comes with a stub class in src/configs/CreditConfig.php which does not actually charge any credit card, but then accepts the ad. I.e., effectively all keyword ads are free, however, you can experiment with how the advertising platform works. A version of this file which uses [[https://www.stripe.com|stripe.com]] for payment processing can be purchased for $30 by contacting chris@pollett.org (a web form to perform this purchase should be up in the next week or two). One advantage to using stripe.com for handling payments is that your never store the credit data on your Yioop instances servers -- the data is only sent to the stripe.com servers.
+You should still make sure the page that collect the purchase form is on uses https rather than http.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Crawling and Customizing Results==
+===Performing and Managing Crawls===
+
+The Manage Crawl activity in Yioop looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageCrawl.png|Manage Crawl Form))
+}}
+
+This activity will actually list slightly different kinds of peak memory usages depending on whether the queue server&#039;s are run from a terminal or through the web interface. The screenshot above was done when a single queue server was being run from the terminal. The first form in this activity allows you to name and start a new web crawl. Next to the Start New Crawl button is an Options link, which allows one to set the parameters under which the crawl will execute. We will return to what the Options page looks like in a moment. When a crawl is executing, under the start crawl form appears statistics about the crawl as well as a Stop Crawl button. Crawling continues until this Stop Crawl button is pressed or until no new sites can be found. As a crawl occurs, a sequence of IndexShard&#039;s are written. These keep track of which words appear in which documents for groups of 50,000 or so documents. In addition an IndexDictionary of which words appear in which shard is written to a separate folder and subfolders. When the Stop button is clicked the &quot;tiers&quot; of data in this dictionary need to be logarithmically merged, this process can take a couple of minutes, so after clicking stop do not kill the queue server (if you were going to) until after it says waiting for messages again. Beneath this stop button line, is a link which allows you to change the crawl options of the currently active crawl. Changing the options on an active crawl may take some time to fully take effect as the currently processing queue of urls needs to flush. At the bottom of the page is a table listing previously run crawls. Next to each previously run crawl are three links. The first link lets you resume this crawl, if this is possible, and say Closed otherwise. Resume will cause Yioop to look for unprocessed fetcher data regarding that crawl, and try to load that into a fresh priority queue of to crawl urls. If it can do this, crawling would continue. The second link let&#039;s you set this crawl&#039;s result as the default index. In the above picture there were only two saved crawls, the second of which was set as the default index. When someone comes to your Yioop installation and does not adjust their settings, the default index is used to compute search results. The final link allows one to Delete the crawl. For both resuming a crawl and deleting a crawl, it might take a little while before you see the process being reflected in the display. This is because communication might need to be done with the various fetchers, and because the on screen display refreshes only every 20 seconds or so.
+
+{{id=&#039;prerequisites&#039;
+====Prerequisites for Crawling====
+}}
+
+Before you can start a new crawl, you need to run at least one QueueServer.php script and you need to run at least one fetcher.php script. These can be run either from the same Yioop installation or from separate machines or folder with Yioop installed. Each installation of Yioop that is going to participate in a crawl should be configured with the same name server and server key. Running these scripts can be done either via the command line or through a web interface. As described in the Requirements section you might need to do some additional initial set up if you want to take the web interface approach. On the other hand, the command-line approach only works if you are using only one queue server. You can still have more than one fetcher, but the crawl speed in this case probably won&#039;t go faster after ten to twelve fetchers. Also, in the command-line approach the queue server and name server should be the same instance of Yioop. In the remainder of this section we describe how to start the QueueServer.php and fetcher.php scripts via the command line; the GUI for Managing Machines and Servers section describes how to do it via a web interface. To begin open a command shell and cd into the executables subfolder of the Yioop folder. To start a queue server type:
+
+ php QueueServer.php terminal
+
+To start a fetcher type:
+
+ php Fetcher.php terminal
+
+The above lines are under the assumption that the path to php has been properly set in your PATH environment variable. If this is not the case, you would need to type the path to php followed by php then the rest of the line. If you want to stop these programs after starting them simply type CTRL-C. Assuming you have done the additional configuration mentioned above that are needed for the GUI approach managing these programs, it is also possible to run the queue server and fetcher programs as daemons. To do this one could type respectively:
+
+ php QueueServer.php start
+
+or
+
+ php Fetcher.php start
+
+When run as a daemon, messages from these programs are written into log files in the log subfolder of the WORK_DIRECTORY folder. To stop these daemons one types:
+
+ php QueueServer.php stop
+
+or
+
+ php Fetcher.php stop
+
+Once the queue server is running and at least one fetcher is running, the Start New Crawl button should work to commence a crawl. Again, it will up to a minute or so for information about a running crawl to show up in the Currently Processing fieldset. During a crawl, it is possible for a fetcher or the queue server to crash. This usually occurs due to lack of memory for one of these programs. It also can sometimes happen for a fetcher due to flakiness in multi-curl. If this occurs simply restart the fetcher in question and the crawl can continue. A queue server crash should be much rarer. If it occurs, all of the urls to crawl that reside in memory will be lost. To continue crawling, you would need to resume the crawl through the web interface. If there are no unprocessed schedules for the given crawl (which usually means you haven&#039;t been crawling very long), it is not possible to resume the crawl. We have now described what is necessary to perform a crawl we now return to how to set the options for how the crawl is conducted.
+
+====Common Crawl and Search Configurations====
+
+When testing Yioop, it is quite common just to have one instance of the fetcher and one instance of the queue server running, both on the same machine and same installation of Yioop. In this subsection we wish to briefly describe some other configurations which are possible and also some src/configs/Config.php configurations that can affect the crawl and search speed. The most obvious config.php setting which can affect the crawl speed is NUM_MULTI_CURL_PAGES. A fetcher when performing downloads, opens this many simultaneous connections, gets the pages corresponding to them, processes them, then proceeds to download the next batch of NUM_MULTI_CURL_PAGES pages. Yioop uses the fact that there are gaps in this loop where no downloading is being done to ensure robots.txt Crawl-delay directives are being honored (a Crawl-delayed host will only be scheduled to at most one fetcher at a time). The downside of this is that your internet connection might not be used to its fullest ability to download pages. Thus, it can make sense rather than increasing NUM_MULTI_CURL_PAGES, to run multiple copies of the Yioop fetcher on a machine. To do this one can either install the Yioop software multiple times or give an instance number when one starts a fetcher. For example:
+
+ php Fetcher.php start 5
+
+would start instance 5 of the fetcher program.
+
+Once a crawl is complete, one can see its contents in the folder WORK DIRECTORY/cache/IndexDataUNIX_TIMESTAMP. In the multi-queue server setting each queue server machine would have such a folder containing the data for the hosts that queue server crawled. Putting the WORK_DIRECTORY on a solid-state drive can, as you might expect, greatly speed-up how fast search results will be served. Unfortunately, if a given queue server is storing ten million or so pages, the corresponding IndexDataUNIX_TIMESTAMP folder might be around 200 GB. Two main sub-folders of IndexDataUNIX_TIMESTAMP largely determine the search performance of Yioop handling queries from a crawl. These are the dictionary subfolder and the posting_doc_shards subfolder, where the former has the greater influence. For the ten million page situation these might be 5GB and 30GB respectively. It is completely possible to copy these subfolders to a SSD and use symlinks to them under the original crawl directory to enhance Yioop&#039;s search performance.
+
+====Specifying Crawl Options and Modifying Options of the Active Crawl====
+
+As we pointed out above, next to the Start Crawl button is an Options link. Clicking on this link, let&#039;s you set various aspect of how the next crawl should be conducted. If there is a currently processing crawl, there will be an options link under its stop button. Both of these links lead to similar pages, however, for an active crawl fewer parameters can be changed. So we will only describe the first link. We do mention here though that under the active crawl options page it is possible to inject new seed urls into the crawl as it is progressing. In the case of clicking the Option link next to the start button, the user should be taken to an activity screen which looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WebCrawlOptions.png|Web Crawl Options Form))
+}}
+
+The Back link in the corner returns one to the previous activity.
+
+There are two kinds of crawls that can be performed by Yioop either a crawl of sites on the web or a crawl of data that has been previously stored in a supported archive format such as data that was crawled by Versions 0.66 and above of Yioop, data coming from a database or text archive via Yioop&#039;s importing methods described below, [[http://www.archive.org/web/researcher/ArcFileFormat.php|Internet Archive ARC file]], [[http://archive-access.sourceforge.net/warc/|ISO WARC Files]], [[http://en.wikipedia.org/wiki/Wikipedia:Database_download|MediaWiki xml dump]], [[http://rdf.dmoz.org/|Open Directory Project RDF file]]. In the next subsection, we describe new web crawls and then return to archive crawls subsection after that. Finally, we have a short section on some advanced crawl options which can only be set in config.php or local_config.php. You will probably not need these features but we mention them for completeness
+
+=====Web Crawl Options=====
+
+On the web crawl tab, the first form field, &quot;Get Crawl Options From&quot;, allows one to read in crawl options either from the default_crawl.ini file or from the crawl options used in a previous crawl. The rest of the form allows the user to change the existing crawl options. The second form field is labeled Crawl Order. This can be set to either Bread First or Page Importance. It specifies the order in which pages will be crawled. In breadth first crawling, roughly all the seeds sites are visited first, followed by sites linked directly from seed sites, followed by sites linked directly from sites linked directly from seed sites, etc. Page Importance is our modification of [ [[Documentation#APC2003|APC2003]]]. In this order, each seed sites starts with a certain quantity of money. When a site is crawled it distributes its money equally amongst sites it links to. When picking sites to crawl next, one chooses those that currently have the most money. Additional rules are added to handle things like the fact that some sites might have no outgoing links. Also, in our set-up we don&#039;t revisit already seen sites. To handle these situation we take a different tack from the original paper. This crawl order roughly approximates crawling according to page rank.
+
+The next checkbox is labelled Restrict Sites by Url. If it is checked then a textarea with label Allowed To Crawl Sites appears. If one checks Restricts Sites by Url then only pages on those sites and domains listed in the Allowed To Crawl Sites textarea can be crawled. We will say how to specify domains and sites in a moment, first let&#039;s discuss the last two textareas on the Options form. The Disallowed sites textarea allows you to specify sites that you do not want the crawler to crawl under any circumstance. There are many reasons you might not want a crawler to crawl a site. For instance, some sites might not have a good robots.txt file, but will ban you from interacting with their site if they get too much traffic from you.
+
+Just above the Seed Sites textarea are two links &quot;Add User Suggest Data&quot;. If on the Server Settings activity Account Registration is set to anything other than Disable Registration, it is possible for a search site user to suggest urls to crawl. This can be done by going to the [[Documentation#Search%20Tools%20Page|Search Tools Page]] and clicking on the Suggest a Url link. Suggested links are stored in WORK_DIRECTORY/data/suggest_url.txt. Clicking Add User Suggest Data adds any suggested urls in this file into the Seed Site textarea, then deletes the contents of this file. The suggested urls which are not already in the seed site list are added after comment lines (lines starting with #) which give the time at which the urls were added. Adding Suggest data can be done either for new crawls or to inject urls into currently running crawls.
+The Seed sites textarea allows you to specify a list of urls that the crawl should start from. The crawl will begin using these urls. This list can include &quot;.onion&quot; urls if you want to crawl [[http://en.wikipedia.org/wiki/Tor_network|TOR networks]].
+
+The format for sites, domains, and urls are the same for each of these textareas, except that the Seed site area can only take urls (or urls and title/descriptions) and in the Disallowed Sites/Sites with Quotas one can give a url followed by #. Otherwise, in this common format, there should be one site, url, or domain per line. You should not separate sites and domains with commas or other punctuation. White space is ignored. A domain can be specified as:
+ domain:.sjsu.edu
+Urls like:
+ http://www.sjsu.edu/
+ https://www.sjsu.edu/gape/
+ http://bob.cs.sjsu.edu/index.html
+would all fall under this domain. The word domain above is a slight misnomer as domain:sjsu.edu, without the leading period, also matches a site like http://mysjsu.edu/.  A site can be specified as scheme://domain/path. Currently, Yioop recognizes the three schemas: http, https, and gopher (an older web protocol). For example, https://www.somewhere.com/foo/ . Such a site includes https://www.somewhere.com/foo/anything_more . Yioop also recognizes * and $ within urls. So http://my.site.com/*/*/ would match http://my.site.com/subdir1/subdir2/rest and http://my.site.com/*/*/$ would require the last symbol in the url to be &#039;/&#039;. This kind of pattern matching can be useful in the to restrict the depth of a crawl to within a url to a certain fixed depth -- you can allow crawling a site, but disallow the downloading of pages with more than a certain number of `/&#039; in them.
+
+In the Disallowed Sites/Sites with Quotas, a number after a # sign indicates that at most that many pages should be downloaded from that site in any given hour. For example,
+ http://www.ucanbuyart.com/#100
+indicates that at most 100 pages are to be downloaded from http://www.ucanbuyart.com/ per hour.
+
+In the seed site area one can specify title and page descriptions for pages that Yioop would otherwise be forbidden to crawl by the robots.txt file. For example,
+ http://www.facebook.com/###!Facebook###!A%20famous%20social%20media%20site
+tells Yioop to generate a placeholder page for http://www.facebook.com/ with title &quot;Facebook&quot; and description &quot;A famous social media site&quot; rather than to attempt to download the page. The [[Documentation#Results%20Editor|Results Editor]] activity can only be used to affect pages which are in a Yioop index. This technique allows one to add arbitrary pages to the index.
+
+When configuring a new instance of Yioop the file default_crawl.ini is copied to WORK_DIRECTORY/crawl.ini and contains the initial settings for the Options form.
+
+{{id=&quot;archive&quot;
+=====Archive Crawl Options=====
+}}
+
+We now consider how to do crawls of previously obtained archives. From the initial crawl options screen, clicking on the Archive Crawl tab gives one the following form:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ArchiveCrawlOptions.png|Archive Crawl Options Form))
+}}
+
+The dropdown lists all previously done crawls that are available for recrawl.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ArchiveCrawlDropDown.png|Archive Crawl dropdown))
+}}
+
+These include both previously done Yioop crawls, previously down recrawls (prefixed with RECRAWL::), Yioop Crawl Mixes (prefixed with MIX::), and crawls of other file formats such as: arc, warc, database data, MediaWiki XML, and ODP RDF, which have been appropriately prepared in the PROFILE_DIR/cache folder (prefixed with ARCFILE::). In addition, Yioop also has a generic text file archive importer (also, prefixed with ARCFILE::).
+
+You might want to re-crawl an existing Yioop crawl if you want to add new meta-words, new cache page links, extract fields in a different manner, or if you are migrating a crawl from an older version of Yioop for which the index isn&#039;t readable by your newer version of Yioop. For similar reasons, you might want to recrawl a previously re-crawled crawl. When you archive crawl a crawl mix, Yioop does a search on the keyword site:any using the crawl mix in question. The results are then indexed into a new archive. This new archive might have considerably better query performance (in terms of speed) as compared to queries performed on the original crawl mix. How to make a crawl mix is described in the [[Documentation#Mixing%20Crawl%20Indexes|Crawl Mixes]] section. You might want to do an archive crawl of other file formats if you want Yioop to be able to provide search results of their content. Once you have selected the archive you want to crawl, you can add meta words as discussed in the Crawl Time Tab Page Rule portion of the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] section. Afterwards,go back to the Create Crawl screen to start your crawl. As with a Web Crawl, for an archive crawl you need both the queue server running and a least one fetcher running to perform a crawl.
+
+To re-crawl a previously created web archive that was made using several fetchers, each of the fetchers that was used in the creation process should be running. This is because the data used in the recrawl will come locally from the machine of that fetcher. For other kinds of archive crawls and mix crawls, which fetchers one uses, doesn&#039;t matter because archive crawl data comes through the name server. You might also notice that the number of pages in a web archive re-crawl is actually larger than the initial crawl. This can happen because during the initial crawl data was stored in the fetcher&#039;s archive bundle and a partial index of this data sent to appropriate queue servers but was not yet processed by these queue servers. So it was waiting in a schedules folder to be processed in the event the crawl was resumed.
+
+To get Yioop to detect arc, database data, MediaWiki, ODP RDF, or generic text archive files you need to create an PROFILE_DIR/cache/archives folder on the name server machine. Yioop checks subfolders of this for files with the name arc_description.ini. For example, to do a Wikimedia archive crawl, one could make a subfolder PROFILE_DIR/cache/archives/my_wiki_media_files and put in it a file arc_description.ini in the format to be discussed in a moment. In addition to the arc_description.ini, you would also put in this folder all the archive files (or links to them) that you would like to index. When indexing, Yioop will process each archive file in turn. Returning to the arc_description.ini file, arc_description.ini&#039;s contents are used to give a description of the archive crawl that will be displayed in the archive dropdown as well as to specify the kind of archives the folder contains and how to extract it. An example arc_description.ini for MediaWiki dumps might look like:
+
+ arc_type = &#039;MediaWikiArchiveBundle&#039;;
+ description = &#039;English Wikipedia 2012&#039;;
+
+In the Archive Crawl dropdown the description will appear with the prefix ARCFILE:: and you can then select it as the source to crawl. Currently, the supported arc_types are: ArcArchiveBundle, DatabaseBundle, MediaWikiArchiveBundle, OdpRdfArchiveBundle, TextArchiveBundle, and WarcArchiveBundle. For the ArcArchiveBundle, OdpRdfArchiveBundle, MediaWikiArchiveBundle, WarcArchiveBundle arc_types, generally a two line arc_description.ini file like above suffices. We now describe how to import from the other kind of formats in a little more detail. In general, the arc_description.ini will tell Yioop how to get string items (in a associative array with a minimal amount of additional information) from the archive in question. Processing on these string items can then be controlled using Page Rules, described in the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] section.
+
+An example arc_description.ini where the arc_type is DatabaseBundle might be:
+ arc_type = &#039;DatabaseBundle&#039;;
+ description = &#039;DB Records&#039;;
+ dbms = &quot;mysql&quot;;
+ db_host = &quot;localhost&quot;;
+ db_name = &quot;MYGREATDB&quot;;
+ db_user = &quot;someone&quot;;
+ db_password = &quot;secret&quot;;
+ encoding = &quot;UTF-8&quot;;
+ sql = &quot;SELECT MYCOL1, MYCOL2 FROM MYTABLE1 M1, MYTABLE2 M2 WHERE M1.FOO=M2.BAR&quot;;
+ field_value_separator = &#039;|&#039;;
+ column_separator = &#039;##&#039;;
+
+Here is a specific example that gets the rows out of the TRANSLATION table of Yioop where the database was stored in a Postgres DBMS. In the comments I indicate how to alter it for other DBMS&#039;s.
+
+ arc_type = &#039;DatabaseBundle&#039;;
+ description = &#039;DB Records&#039;;
+ ;sqlite3 specific
+ ;dbms =&quot;sqlite3&quot;;
+ ;mysql specific
+ ;dbms = &quot;mysql&quot;;
+ ;db_host = &quot;localhost&quot;;
+ ;db_user = &quot;root&quot;;
+ ;db_password = &quot;&quot;;
+ dbms = &quot;pdo&quot;;
+ ;below is for postgres; similar if want db2 or oracle
+ db_host = &quot;pgsql:host=localhost;port=5432;dbname=seek_quarry&quot;
+ db_name = &quot;seek_quarry&quot;;
+ db_user = &quot;cpollett&quot;;
+ db_password = &quot;&quot;;
+ encoding = &quot;UTF-8&quot;;
+ sql = &quot;SELECT * from TRANSLATION&quot;;
+ field_value_separator = &#039;|&#039;;
+ column_separator = &#039;##&#039;;
+
+Possible values for dbms are pdo, mysql, sqlite3. If pdo is chosen, then db_host should be a PHP DSN specifying which DBMS driver to use. db_name is the name of the database you would like to connect to, db_user is the database username, db_password is the password for that user, and encoding is the character set of rows that the database query will return.
+
+The sql variable is used to give a query whose result rows will be the items indexed by Yioop. Yioop indexes string &quot;pages&quot;, so to make these rows into a string each column result will be made into a string: field field_value_separator value. Here field is the name of the column, value is the value for that column in the given result row. Columns are concatenated together separated by the value of of column_separator. The resulting string is then sent to Yioop&#039;s TextProcessor page processor.
+
+We next give a few examples of arc_description.ini files where the arc_type is TextArchiveBundle. First, suppose we wanted to index access log file records that look like:
+ 127.0.0.1 - - [21/Dec/2012:09:03:01 -0800] &quot;POST /git/yioop2/ HTTP/1.1&quot; 200 - \
+     &quot;-&quot; &quot;Mozilla/5.0 (compatible; YioopBot; \
+     +http://localhost/git/yioop/bot.php)&quot;
+Here each record is delimited by a newline and the character encoding is UTF-8. The records are stored in files with the extension .log and these files are uncompressed. We then might use the following arc_description.ini file:
+ arc_type = &#039;TextArchiveBundle&#039;;
+ description = &#039;Log Files&#039;;
+ compression = &#039;plain&#039;;
+ file_extension = &#039;log&#039;;
+ end_delimiter = &quot;\n&quot;;
+ encoding = &quot;UTF-8&quot;;
+In addition to compression = &#039;plain&#039;, Yioop supports gzip and bzip2. The end_delimeter is a regular expression indicating how to know when a record ends. To process a TextArchiveBundle Yioop needs either an end_delimeter or a start_delimiter (or both) to be specified. As another example, for a mail.log file with entries of the form:
+ From pollett@mathcs.sjsu.edu Wed Aug  7 10:59:04 2002 -0700
+ Date: Wed, 7 Aug 2002 10:59:04 -0700 (PDT)
+ From: Chris Pollett &lt;pollett@mathcs.sjsu.edu&gt;
+ X-Sender: pollett@eniac.cs.sjsu.edu
+ To: John Doe &lt;johndoe@mail.com&gt;
+ Subject: Re: a message
+ In-Reply-To: &lt;5.1.0.14.0.20020723093456.00ac9c00@mail.com&gt;
+ Message-ID: &lt;Pine.GSO.4.05.10208071057420.9463-100000@eniac.cs.sjsu.edu&gt;
+ MIME-Version: 1.0
+ Content-Type: TEXT/PLAIN; charset=US-ASCII
+ Status: O
+ X-Status:
+ X-Keywords:
+ X-UID: 17
+
+ Hi John,
+
+ I got your mail.
+
+ Chris
+The following might be used:
+
+ arc_type = &#039;TextArchiveBundle&#039;;
+ description = &#039;Mail Logs&#039;;
+ compression = &#039;plain&#039;;
+ file_extension = &#039;log&#039;;
+ start_delimiter = &quot;\n\nFrom\s&quot;;
+ encoding = &quot;ASCII&quot;;
+
+Notice here we are splitting records using a start delimeter. Also, we have chosen ASCII as the character encoding. As a final example, we show how to import tar gzip files of Usenet records as found, in the [[http://archive.org/details/utzoo-wiseman-usenet-archive|UTzoo Usenet Archive 1981-1991]]. Further discussion on how to process this collection is given in the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] section.
+
+ arc_type = &#039;TextArchiveBundle&#039;;
+ description = &#039;Utzoo Usenet Archive&#039;;
+ compression = &#039;gzip&#039;;
+ file_extension = &#039;tgz&#039;;
+ start_delimiter = &quot;\0\0\0\0Path:&quot;;
+ end_delimiter = &quot;\n\0\0\0\0&quot;;
+ encoding = &quot;ASCII&quot;;
+
+Notice in the above we set the compression to be gzip. Then we have Yioop act on the raw tar file. In tar files, content objects are separated by long paddings of null&#039;s. Usenet posts begin with Path, so to keep things simple we grab records which begin with a sequence of null&#039;s the Path and end with another sequence of null&#039;s.
+
+As a final reminder for this section, remember that, in addition, to the arc_description.ini file, the subfolder should also contain instances of the files in question that you would like to archive crawl. So for arc files, these would be files of extension .arc.gz; for MediaWiki, files of extension .xml.bz2; and for ODP-RDF, files of extension .rdf.u8.gz .
+Crawl Options of config.php or local_config.php
+
+There are a couple of flags which can be set in the config.php or in a local_config.php file that affect web crawling which we now mention for completeness. As was mentioned before, when Yioop is crawling it makes use of Etag: and Expires: HTTP headers received during web page download to determine when a page can be recrawled. This assumes one has not completely turned off recrawling under the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Indexing and Search Options]] activity. To turn Etag and Expires checking off, one can add to a local_config.php file the line:
+
+define(&quot;USE_ETAG_EXPIRES&quot;, false);
+
+
+Yioop can be run using the [[https://github.com/facebook/hhvm/|Hip Hop Virtual Machine from FaceBook]]. This will tend to make Yioop run faster and use less memory than running it under the standard PHP interpreter. Hip Hop can be used on various Linux flavors and to some degree runs under OSX (the queue server and fetcher will run, but the web app doesn&#039;t). If you want to use the Hip Hop on Mac OSX, and if you install it via Homebrew, then you will need to set a force variable and set the path for Hip Hop in your local_config.php file with lines like:
+ define(&#039;FORCE_HHVM&#039;, true);
+ define(&#039;HHVM_PATH&#039;, &#039;/usr/local/bin&#039;);
+The above lines are only needed on OSX to run Hip Hop.
+
+[[Documentation#contents|Return to table of contents]]
+
+===Mixing Crawl Indexes===
+
+Once you have performed a few crawls with Yioop, you can use the Mix Crawls activity to create mixture of your crawls. This activity is available to users who have either Admin role or just the standard User role. This section describes how to create crawl mixes which are processed when a query comes in to Yioop. Once one has created such a crawl mix, an admin user can make a new index which consists of results of the crawl mix (&quot;materialize it&quot;) by doing an archive crawl of the crawl mix. The [[Documentation#archive|Archive Crawl Options]] subsection has more details on how to do this latter operation. The main Mix Crawls activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageMixes.png|The Manage Mixes form))
+}}
+
+The first form allows you to name and create a new crawl mixture. Clicking &quot;Create&quot; sends you to a second page where you can provide information about how the mixture should be built. Beneath the Create mix form is a table listing all the previously created crawl mixes. Above this listing, but below the Create form is a standard set of nav elements for selecting which mixes will be displayed in this table. A Crawl mix is &quot;owned&quot; by the user who creates that mix. The table only lists crawl mixes &quot;owned&quot; by the user. The first column has the name of the mix, the second column says how the mix is built out of component crawls, and the actions columns allows you to edit the mix, set it as the default index for Yioop search results, or delete the mix. You can also append &quot;m:name+of+mix&quot; or &quot;mix:name+of+mix&quot; to a query to use that quiz without having to set it as the index. When you create a new mix, and are logged in so Yioop knows the mix belongs to you, your mix will also show up on the Settings page. The &quot;Share&quot; column pops a link where you can share a crawl mix with a Yioop Group. This will post a message with a link to that group so that others can import your mix into their lists of mixes. Creating a new mix or editing an existing mix sends you to a second page:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditMix.png|The Edit Mixes form))
+}}
+
+Using the &quot;Back&quot; link on this page will take you to the prior screen. The first text field on the edit page lets you rename your mix if you so desire. Beneath this is an &quot;Add Groups&quot; button. A group is a weighted list of crawls. If only one group were present, then search results would come from any crawl listed for this group. A given result&#039;s score would be the weighted sum of the scores of the crawls in the group it appears in. Search results are displayed in descending order according to this total score. If more that one group is present then the number of results field for that group determines how many of the displayed results should come from that group. For the Crawl Mix displayed above, there are three groups: The first group is used to display the first result, the second group is used to display the second result, the last group is used to display any remaining search results.
+
+The UI for groups works as follows: The top row has three columns. To add new components to a group use the dropdown in the first column. The second column controls for how many results the particular crawl group should be used. Different groups results are presented in the order they appear in the crawl mix. The last group is always used to display any remaining results for a search. The delete group link in the third column can be used to delete a group. Beneath the first row of a group, there is one row for each crawl that belongs to the group. The first link for a crawl says how its scores should be weighted in the search results for that group. The second column is the name of the crawl. The third column is a space separated list of words to add to the query when obtaining results for that crawl. So for example, in the first group above, there are two indexes which will be unioned: Default Crawl with a weight of 1, and CanCrawl Test with a weight of 2. For the Default Crawl we inject two keywords media:text and Canada to the query we get from the user. media:text means we will get whatever results from this crawl that consisted of text rather than image pages. Keywords can be used to make a particular component of a crawl mix behave in a conditional many by using the &quot;if:&quot; meta word described in the search and user interface section. The last link in a crawl row allows you to delete a crawl from a crawl group. For changes on this page to take effect, the &quot;Save&quot; button beneath this dropdown must be clicked.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Classifying Web Pages===
+
+Sometimes searching for text that occurs within a page isn&#039;t enough to find what one is looking for. For example, the relevant set of documents may have many terms in common, with only a small subset showing up on any particular page, so that one would have to search for many disjoint terms in order to find all relevant pages. Or one may not know which terms are relevant, making it hard to formulate an appropriate query. Or the relevant documents may share many key terms with irrelevant documents, making it difficult to formulate a query that fetches one but not the other. Under these circumstances (among others), it would be useful to have meta words already associated with the relevant documents, so that one could just search for the meta word. The Classifiers activity provides a way to train classifiers that recognize classes of documents; these classifiers can then be used during a crawl to add appropriate meta words to pages determined to belong to one or more classes.
+
+Clicking on the Classifiers activity displays a text field where you can create a new classifier, and a table of existing classifiers, where each row corresponds to a classifier and provides some statistics and action links. A classifier is identified by its class label, which is also used to form the meta word that will be attached to documents. Each classifier can only be trained to recognize instances of a single target class, so the class label should be a short description of that class, containing only alphanumeric characters and underscores (e.g., &quot;spam&quot;, &quot;homepage&quot;, or &quot;menu&quot;). Typing a new class label into the text box and hitting the Create button initializes a new classifier, which will then show up in the table.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageClassifiers.png|The Manage Classifiers page))
+}}
+
+Once you have a fresh classifier, the natural thing to do is edit it by clicking on the Edit action link. If you made a mistake, however, or no longer want a classifier for some reason, then you can click on the Delete action link to delete it; this cannot be undone. The Finalize action link is used to prepare a classifier to classify new web pages, which cannot be done until you&#039;ve added some training examples. We&#039;ll discuss how to add new examples next, then return to the Finalize link.
+
+====Editing a Classifier====
+
+Clicking on the Edit action link takes you to a new page where you can change a classifier&#039;s class label, view some statistics, and provide examples of positive and negative instances of the target class. The first two options should be self-explanatory, but the last is somewhat involved. A classifier needs labeled training examples in order to learn to recognize instances of a particular class, and you help provide these by picking out example pages from previous crawls and telling the classification system whether they belong to the class or do not belong to the class. The Add Examples section of the Edit Classifier page lets you select an existing crawl to draw potential examples from, and optionally narrow down the examples to those that satisfy a query. Once you&#039;ve done this, clicking the Load button will send a request to the server to load some pages from the crawl and choose the next one to receive a label. You&#039;ll be presented with a record representing the selected document, similar to a search result, with several action links along the side that let you mark this document as either a positive or negative example of the target class, or skip this document and move on to the next one:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ClassifiersEdit.png|The Classifiers edit page))
+}}
+
+When you select any of the action buttons, your choice is sent back to the server, and a new example to label is sent back (so long as there are more examples in the selected index). The old example record is shifted down the page and its background color updated to reflect your decision&mdash;green for a positive example, red for a negative one, and gray for a skip; the statistics at the top of the page are updated accordingly. The new example record replaces the old one, and the process repeats. Each time a new label is sent to the server, it is added to the training set that will ultimately be used to prepare the classifier to classify new web pages during a crawl. Each time you label a set number of new examples (10 by default), the classifier will also estimate its current accuracy by splitting the current training set into training and testing portions, training a simple classifier on the training portion, and testing on the remainder (checking the classifier output against the known labels). The new estimated accuracy, calculated as the proportion of the test pages classified correctly, is displayed under the Statistics section. You can also manually request an updated accuracy estimate by clicking the Update action link next to the Accuracy field. Doing this will send a request to the server that will initiate the same process described previously, and after a delay, display the new estimate.
+
+All of this happens without reloading the page, so avoid using the web browser&#039;s Back button. If you do end up reloading the page somehow, then the current example record and the list of previously-labeled examples will be gone, but none of your progress toward building the training set will be lost.
+
+====Finalizing a Classifier====
+
+Editing a classifier adds new labeled examples to the training set, providing the classifier with a more complete picture of the kinds of documents it can expect to see in the future. In order to take advantage of an expanded training set, though, you need to finalize the classifier. This is broken out into a separate step because it involves optimizing a function over the entire training set, which can be slow for even a few hundred example documents. It wouldn&#039;t be practical to wait for the classifier to re-train each time you add a new example, so you have to explicitly tell the classifier that you&#039;re done adding examples for now by clicking on the Finalize action link either next to the Load button on the edit classifier page or next to the given classifier&#039;s name on the classifier management page.
+
+Clicking this link will kick off a separate process that trains the classifier in the background. When the page reloads, the Finalize link should have changed to text that reads &quot;Finalizing...&quot; (but if the training set is very small, training may complete almost immediately). After starting finalization, it&#039;s fine to walk away for a bit, reload the page, or carry out some unrelated task for the user account. You should not however, make further changes to the classifier&#039;s training set, or start a new crawl that makes use of the classifier. When the classifier finishes its training phase, the Finalizing message will be replaced by one that reads &quot;Finalized&quot; indicating that the classifier is ready for use.
+
+====Using a Classifier====
+
+Using a classifier is as simple as checking the &quot;Use to Classify&quot; or &quot;Use to Rank&quot; checkboxes next to the classifier&#039;s label on the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] activity, under the &quot;Classifiers and Rankers&quot; heading. When the next crawl starts, the classifier (and any other selected classifiers) will be applied to each fetched page. If &quot;Use to Rank&quot; is checked then the classifier score for that page will be recorded. If &quot;Use to Classify&quot; is checked and if a page is determined to belong to a target class, it will have several meta words added. As an example, if the target class is &quot;spam&quot;, and a page is determined to belong to the class with probability .79, then the page will have the following meta words added:
+
+*class:spam
+*class:spam:50plus
+*class:spam:60plus
+*class:spam:70plus
+*class:spam:70
+
+These meta words allow one to search for all pages classified as spam at any probability over the preset threshold of .50 (with class:spam), at any probability over a specific multiple of .1 (e.g., over .6 with class:spam:60plus), or within a specific range (e.g., .60&ndash;.69 with class:spam:60). Note that no meta words are added if the probability falls below the threshold, so no page will ever have the meta words class:spam:10plus, class:spam:20plus, class:spam:20, and so on.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Page Indexing and Search Options===
+
+Several properties about how web pages are indexed and how pages are looked up at search time can be controlled by clicking on Page Options. There are three tabs for this activity: Crawl Time, Search Time, and Test Options. We will discuss each of these in turn.
+
+====Crawl Time Tab====
+
+Clicking on Page Options leads to the default Crawl Time Tab:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:PageOptionsCrawl.png|The Page Options Crawl form))
+}}
+
+This tab controls some aspects about how a page is processed and indexed at crawl time. The form elements before Page Field Extraction Rules are relatively straightforward and we will discuss these briefly below. The Page Rules textarea allows you to specify additional commands for how you would like text to be extracted from a page document summary. The description of this language will take the remainder of this subsection.
+
+The Get Options From dropdown allows one to load in crawl time options that were used in a previous crawl. Beneath this, The Byte Range to Download dropdown controls how many bytes out of any given web page should be downloaded. Smaller numbers reduce the requirements on disk space needed for a crawl; bigger numbers would tend to improve the search results. If whole pages are being cached, these downloaded bytes are stored in archives with the fetcher. The Summarizer dropdown control what summarizer is used on a page during page processing. Yioop uses a summarizer to control what portions of a page will be put into the index and are available at search time for snippets. The two available summarizers are Basic, which picks the pages meta title, meta description, h1 tags, etc in a fixed order until the summary size is reached; and Centroid, which computes an &quot;average sentence&quot; for the document and adds phrases from the actual document according to nearness to this average. If Centroid summarizer is used Yioop also generates a word cloud for each document. Centroid tends to produces slightly better results than Basic but is slower. How to tweak the Centroid summarizer for a particular locale, is described in the [[Documentation#Localizing%20Yioop%20to%20a%20New%20Language|Localizing Yioop]] section. The Max Page Summary Length in Bytes controls how many of the total bytes can be used to make a page summary which is sent to the queue server. It is only words in this summary which can actually be looked up in search result. Care should be taken in making this value larger as it can increase the both the RAM memory requirements (you might have to change the memory_limit variable at the start of QueueServer.php to prevent crashing) while crawling and it can slow the crawl process down. The Cache whole crawled pages checkbox says whether to when crawling to keep both the whole web page downloaded as well as the summary extracted from the web page (checked) or just to keep the page summary (unchecked). The next dropdown, Allow Page Recrawl After, controls how many days that Yioop keeps track of all the URLs that it has downloaded from. For instance, if one sets this dropdown to 7, then after seven days Yioop will clear its Bloom Filter files used to store which urls have been downloaded, and it would be allowed to recrawl these urls again if they happened in links. It should be noted that all of the information from before the seven days will still be in the index, just that now Yioop will be able to recrawl pages that it had previously crawled. Besides letting Yioop get a fresher version of page it already has, this also has the benefit of speeding up longer crawls as Yioop doesn&#039;t need to check as many Bloom filter files. In particular, it might just use one and keep it in memory.
+
+The Page File Types to Crawl checkboxes allow you to decide which file extensions you want Yioop to download during a crawl. This check is done before any download is attempted, so Yioop at that point can only guess the [[http://en.wikipedia.org/wiki/MIME|MIME Type]], as it hasn&#039;t received this information from the server yet. An example of a url with a file extension is:
+    http://flickr.com/humans.txt
+which has the extension txt. So if txt is unchecked, then Yioop won&#039;t try to download this page even though Yioop can process plain text files. A url like:
+    http://flickr.com/
+has no file extension and will be assumed to be have a html extension. To crawl sites which have a file extension, but no one in the above list check the unknown checkbox in the upper left of this list.
+
+The Classifiers and Rankers checkboxes allow you to select the classifiers that will be used to classify or rank pages. Each classifier (see the [[Documentation#Classifying%20Web%20Pages|Classifiers]] section for details) is represented in the list by its class label and two checkboxes. Checking the box under Use to classify indicates that the associated classifier should be used (made active) during the next crawl for classifying, checking the &quot;Use to Rank&quot; indicates that the classifier should be be used (made active) and its score for the document should be stored so that it can be used as part of the search time score. Each active classifier is run on each page downloaded during a crawl. If &quot;Use to Crawl&quot; was checked and the page is determined to belong to the class that the classifier has been trained to recognize, then a meta word like &quot;class:label&quot;, where label is the class label, is added to the page summary. For faster access to pages that contain a single term and a label, for example, pages that contain &quot;rich&quot; and are labeled as &quot;non-spam&quot;, Yioop actually uses the first character of the label &quot;non-spam&quot; and embeds it as part of the term ID of &quot;rich&quot; on &quot;non-spam&quot; pages with the word &quot;rich&quot;. To ensure this speed-up can be used it is useful to make sure ones classifier labels begin with different first characters. If &quot;Use to Rank&quot; is checked then when a classifier is run on the page, the score from the classifier is recorded. When a search is done that might retrieve this page, this score is then used as one component of the overall score that this page receives for the query.
+
+The Indexing Plugins checkboxes allow you to select which plugins to use during the crawl. Yioop comes with three built-in plugins: AddressesPlugin, RecipePlugin, and WordFilterPlugin. One can also write or downlaod additional plugins. If the plugin can be configured, next to the checkbox will be a link to a configuration screen. Let&#039;s briefly look at each of these plugins in turn...
+
+Checking the AddressesPlugin enables Yioop during a crawl to try to calculate addresses for each page summary it creates. When Yioop processes a page it by default creates a summary of the page with a TITLE and a DESCRIPTION as well as a few other fields. With the addresses plugin activated, it will try to extract data to three additional fields: EMAILS, PHONE_NUMBERS, and ADDRESSES. If you want to test out how these behave, pick some web page, view source on the web page, copy the source, and then paste into the Test Options Tab on the page options page (the Test Options Tab is described later in this section).
+
+Clicking the RecipePlugin checkbox causes Yioop during a crawl to run the code in indexing_plugins/recipe_plugin.php. This code tries to detect pages which are food recipes and separately extracts these recipes and clusters them by ingredient. It then add search meta words ingredient: and recipe:all to allow one to search recipes by ingredient or only documents containing recipes.
+
+Checking the WordFilterPlugin causes Yioop to run code in indexing_plugins/wordfilter_plugin.php on each downloaded page.
+The [[http://www.yioop.com/?c=group&amp;a=wiki&amp;group_id=20&amp;arg=media&amp;page_id=26&amp;n=04%20Niche%20or%20Subject%20Specific%20Crawling%20With%20Yioop.mp4| Niche Crawling Video Tutorial]] has information about how to use this plugin to create subject-specific crawls of the web. This code checks if the downloaded page has one of the words listed in the textarea one finds on the plugin&#039;s configure page. If it does, then the plugin follows the actions listed for pages that contain that term. Below is an example WordFilterPlugin configure page:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:WordFilterConfigure.png|Word Filter Configure Page))
+}}
+
+Lines in the this configure file either specify a url or domain using a syntax like [url_or_domain] or specify a rule or a comment. Whitespace is ignored and everything after a semi-colon on a line is treated as a comment. The rules immediately following a url or domain line up till the next url or domain line are in effect if one crawling is crawling a prage with that url or domain. Each &#039;&#039;&#039;rule line&#039;&#039;&#039; in the textarea consists of a comma separated list of literals followed by a colon followed by a comma separated list of what to do if the literal condition is satisfied. A single literal in the list of literals is an optional + or - followed by a sequence of non-space characters. After the + or -, up until a ; symbol is called the term in the literal. If the literal sign is + or if no sign is present, then the literal holds for a document if it contains the term, if the literal sign is - then the literal holds for a document if it does not contain the term, if there is a decimal number between 0 and 1, say x, after the # up to a comma or the first white-space character, then this is modified so the literal holds only if x&#039;th fraction of the documents length comes from the literal&#039;s term. If rather than a decimal x were a positive natural number then the term would need to occur x times. If all the literal in the comma separated list hold, then the rule is said to hold, and the actions will apply. The line -term0:JUSTFOLLOW says that if the downloaded page does not contain the word &quot;term0&quot; then do not index the page, but do follow outgoing links from the page. The line term1:NOPROCESS says if the document has the word &quot;term1&quot; then do not index it or follow links from it. The last line +term2:NOFOLLOW,NOSNIPPET says if the page contains &quot;term2&quot; then do not follow any outgoing links. NOSNIPPET means that if the page is returned from search results, the link to the page should not have a snippet of text from that page beneath it. As an example of a more complicated rule, consider:
+
+ surfboard#2,bikini#0.02:NOINDEX, NOFOLLOW
+
+Here for the rule to hold the condition surfboard#2 requires that the term surfboard occurred at least twice in the document and the condition bikini#0.02 requires that 0.02 percent of the documents total length also come from copies of the word bikini. In addition, to the commands just mentioned, WordFilterPlugin supports standard robots.txt directives such as: NOINDEX, NOCACHE, NOARCHIVE, NOODP, NOYDIR, and NONE. More details about how indexing plugins work and how to write your own indexing plugin can be found in the [[Documentation#Modifying%20Yioop%20Code|Modifying Yioop]] section.
+
+====Page Field Extraction Language====
+
+We now return to the Page Field Extraction Rules textarea of the Page Options - Crawl Time tab. Commands in this area allow a user to control what data is extracted from a summary of a page. The textarea allows you to do things like modify the summary, title, and other fields extracted from a page summary; extract new meta words from a summary; and add links which will appear when a cache of a page is shown. Page Rules are especially useful for extracting data from generic text archives and database archives. How to import such archives is described in the Archive Crawls sub-section of
+[[Documentation#Performing%20and%20Managing%20Crawls|Performing and Managing Crawls]]. The input to the page rule processor is an asscociative array that results from Yioop doing initial processing on a page. To see what this array looks like one can take a web page and paste it into the form on the Test Options tab. There are two types of page rule statements that a user can define: command statements and assignment statements. In addition, a semicolon &#039;;&#039; can be used to indicate the rest of a line is a comment. Although the initial textarea for rules might appear small. Most modern browsers allow one to resize this area by dragging on the lower right hand corner of the area. This makes it relatively easy to see large sets of rules.
+
+A command statement takes a key field argument for the page associative array and does a function call to manipulate that page. Below is a list of currently supported commands followed by comments on what they do:
+
+    addMetaWords(field)     ;add the field and field value to the META_WORD
+                            ;array for the page
+    addKeywordLink(field)   ;split the field on a comma, view this as a search
+                            ;keywords =&gt; link text association, and add this to
+                            ;the KEYWORD_LINKS array.
+    setStack(field)         ;set which field value should be used as a stack
+    pushStack(field)        ;add the field value for field to the top of stack
+    popStack(field)         ;pop the top of the stack into the field value for
+                            ;field
+    setOutputFolder(dir)    ;if auxiliary output, rather than just to the
+                            ;a yioop index, is being done, then set the folder
+                            ;for this output to be dir
+    setOutputFormat(format) ;set the format of auxiliary output.
+                            ;Should be either CSV or SQL
+                            ;SQL mean that writeOutput will write an insert
+                            ;statement
+    setOutputTable(table)   ;if output is SQL then what table to use for the
+                            ;insert statements
+    toArray(field)          ;splits field value for field on a comma and
+                            ;assign field value to be the resulting array
+    toString(field)         ;if field value is an array then implode that
+                            ;array using comma and store the result in field
+                            ;value
+    unset(field)            ;unset that field value
+    writeOutput(field)      ;use the contents of field value viewed as an array
+                            ;to fill in the columns of a SQL insert statement
+                            ;or CSV row
+
+
+Page rule assignments can either be straight assignments with &#039;=&#039; or concatenation assignments with &#039;.=&#039;. Let $page indicate the associative array that Yioop supplies the page rule processor. There are four kinds of values that one can assign:
+    field = some_other_field ; sets $page[&#039;field&#039;] = $page[&#039;some_other_field&#039;]
+    field = &quot;some_string&quot; ; sets $page[&#039;field&#039;] to &quot;some string&quot;
+    field = /some_regex/replacement_where_dollar_vars_allowed/
+        ; computes the results of replacing matches to some_regex
+        ;  in $page[&#039;field&#039;] with replacement_where_dollar_vars_allowed
+    field = /some_regex/g ;sets $page[&#039;field&#039;] to the array of all matches
+        ; of some regex in $page[&#039;field&#039;]
+For each of the above assignments we could have used &quot;.=&quot; instead of &quot;=&quot;. We next give a simple example and followed by a couple more complicated examples of page rules and the context in which they were used:
+
+In the first example, we just want to extract meaningful titles for mail log records that were read in using a TextArchiveBundleIterator. Here after initial page processing a whole email would end up in the DESCRIPTION field of the $page associative array given tot the page rule processor. So we use the following two rules:
+ TITLE = DESCRIPTION
+ TITLE = /(.|\n|\Z)*?Subject:[\t ](.+?)\n(.|\n|\Z)*/$2/
+We initially set the TITLE to be the whole record, then use a regex to extract out the correct portion of the subject line. Between the first two slashes recognizes the whole record where the pattern inside the second pair of parentheses (.+?) matches the subject text. The $2 after the second parenthesis says replace the value of TITLE with just this portion.
+
+The next example was used to do a quick first pass processing of record from the [[http://archive.org/details/utzoo-wiseman-usenet-archive|UTzoo Archive of Usenet Posts from 1981-1991]]. What each block does is described in the comments below
+ ;
+ ; Set the UI_FLAGS variable. This variable in a summary controls
+ ; which of the header elements should appear on cache pages.
+ ; UI_FLAGS should be set to a string with a comma separated list
+ ; of the options one wants. In this case, we use: yioop_nav, says that
+ ; we do want to display header; version, says that we want to display
+ ; when a cache item was crawled by Yioop; and summaries, says to display
+ ; the toggle extracted summaries link and associated summary data.
+ ; Other possible UI_FLAGS are history, whether to display the history
+ ; dropdown to other cached versions of item; highlight, whether search
+ ; keywords should be highlighted in cached items
+ ;
+ UI_FLAGS = &quot;yioop_nav,version,summaries&quot;
+ ;
+ ; Use Post Subject line for title
+ ;
+ TITLE = DESCRIPTION
+ TITLE = /(.|\n)*?Subject:([^\n]+)\n(.|\n)*/$2/
+ ;
+ ; Add a link with a blank keyword search so cache pages have
+ ; link back to yioop
+ ;
+ link_yioop = &quot;,Yioop&quot;
+ addKeywordLink(link_yioop)
+ unset(link_yioop) ;using unset so don&#039;t have link_yioop in final summary
+ ;
+ ; Extract y-M and y-M-j dates as meta word u:date:y-M and u:date:y-M-j
+ ;
+ date = DESCRIPTION
+ date = /(.|\n)*?Date:([^\n]+)\n(.|\n)*/$2/
+ date = /.*,\s*(\d*)-(\w*)-(\d*)\s*.*/$3-$2-$1/
+ addMetaWord(date)
+ date = /(\d*)-(\w*)-.*/$1-$2/
+ addMetaWord(date)
+ ;
+ ; Add a link to articles containing u:date:y-M meta word. The link text
+ ; is Date:y-M
+ ;
+ link_date = &quot;u:date:&quot;
+ link_date .= date
+ link_date .= &quot;,Date:&quot;
+ link_date .= date
+ addKeywordLink(link_date)
+ ;
+ ; Add u:date:y meta-word
+ ;
+ date = /(\d*)-.*/$1/
+ addMetaWord(date)
+ ;
+ ; Get the first three words of subject ignoring re: separated by underscores
+ ;
+ subject = TITLE
+ subject = /(\s*(RE:|re:|rE:|Re:)\s*)?(.*)/$3/
+ subject_word1 = subject
+ subject_word1 = /\s*([^\s]*).*/$1/
+ subject_word2 = subject
+ subject_word2 = /\s*([^\s]*)\s*([^\s]*).*/$2/
+ subject_word3 = subject
+ subject_word3 = /\s*([^\s]*)\s*([^\s]*)\s*([^\s]*).*/$3/
+ subject = subject_word1
+ unset(subject_word1)
+ subject .= &quot;_&quot;
+ subject .= subject_word2
+ unset(subject_word2)
+ subject .= &quot;_&quot;
+ subject .= subject_word3
+ unset(subject_word3)
+ ;
+ ; Get the first newsgroup listed in the Newsgroup: line, add a meta-word
+ ; u:newsgroup:this-newgroup. Add a link to cache page for a search
+ ; on this meta word
+ ;
+ newsgroups = DESCRIPTION
+ newsgroups = /(.|\n)*?Newsgroups:([^\n]+)\n(.|\n)*/$2/
+ newsgroups = /\s*((\w|\.)+).*/$1/
+ addMetaWord(newsgroups)
+ link_news = &quot;u:newsgroups:&quot;
+ link_news .= newsgroups
+ link_news .= &quot;,Newsgroup: &quot;
+ link_news .= newsgroups
+ addKeywordLink(link_news)
+ unset(link_news)
+ ;
+ ; Makes a thread meta u:thread:newsgroup-three-words-from-subject.
+ ; Adds a link to cache page to search on this meta word
+ ;
+ thread = newsgroups
+ thread .= &quot;:&quot;
+ thread .= subject
+ addMetaWord(thread)
+ unset(newsgroups)
+ link_thread = &quot;u:thread:&quot;
+ link_thread .= thread
+ link_thread .= &quot;,Current Thread&quot;
+ addKeywordLink(link_thread)
+ unset(subject)
+ unset(thread)
+ unset(link_thread)
+As a last example of page rules, suppose we wanted to crawl the web and whenever we detected a page had an address we wanted to write that address as a SQL insert statement to a series of text files. We can do this using page rules and the AddressesPlugin. First, we would check the AddressesPlugin and then we might use page rules like:
+ summary = ADDRESSES
+ setStack(summary)
+ pushStack(DESCRIPTION)
+ pushStack(TITLE)
+ setOutputFolder(/Applications/MAMP/htdocs/crawls/data)
+ setOutputFormat(sql)
+ setOutputTable(SUMMARY);
+ writeOutput(summary)
+The first line says copy the contents of the ADDRESSES field of the page into a new summary field. The next line says use the summary field as the current stack. At this point the stack would be an array with all the addresses found on the given page. So you could use the command like popStack(first_address) to copy the first address in this array over to a new variable first_address. In the above case what we do instead is push the contents of the DESCRIPTION field onto the top of the stack. Then we push the contents of the TITLE field. The line
+ setOutputFolder(/Applications/MAMP/htdocs/crawls/data)
+sets /Applications/MAMP/htdocs/crawls/data as the folder that any auxiliary output from the page_processor should go to. setOutputFormat(sql) says we want to output sql, the other possibility is csv. The line setOutputTable(SUMMARY); says the table name to use for INSERT statements should be called SUMMARY. Finally, the line writeOutput(summary) would use the contents of the array entries of the summary field as the column values for an INSERT statement into the SUMMARY table. This writes a line to the file data.txt in /Applications/MAMP/htdocs/crawls/data. If data.txt exceeds 10MB, it is compressed into a file data.txt.0.gz and a new data.txt file is started.
+
+====Search Time Tab====
+
+The Page Options Search Time tab looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:PageOptionsSearch.png|The Page Options Search form))
+}}
+
+The Search Page Elements and Links control group is used to tell which element and links you would like to have presented on the search landing and search results pages. The Word Suggest checkbox controls whether a dropdown of word suggestions should be presented by Yioop when a user starts typing in the Search box. It also controls whether spelling correction and thesaurus suggestions will appear The Subsearch checkbox controls whether the links for Image, Video, and News search appear in the top bar of Yioop You can actually configure what these links are in the [[Documentation#Search%20Sources|Search Sources]] activity. The checkbox here is a global setting for displaying them or not. In addition, if this is unchecked then the hourly activity of downloading any RSS media sources for the News subsearch will be turned off. The Signin checkbox controls whether to display the link to the page for users to sign in to Yioop The Cache checkbox toggles whether a link to the cache of a search item should be displayed as part of each search result. The Similar checkbox toggles whether a link to similar search items should be displayed as part of each search result. The Inlinks checkbox toggles whether a link for inlinks to a search item should be displayed as part of each search result. Finally, the IP address checkbox toggles whether a link for pages with the same ip address should be displayed as part of each search result.
+
+The Search Ranking Factors group of controls: Title Weight, Description Weight, Link Weight field are used by Yioop to decide how to weigh each portion of a document when it returns query results to you.
+
+When Yioop ranks search results it search out in its postings list until it finds a certain number of qualifying documents. It then sorts these by their score, returning usually the top 10 results. In a multi-queue-server setting the query is simultaneously asked by the name server machine of each of the queue server machines and the results are aggregated. The Search Results Grouping controls allow you to affect this behavior. Minimum Results to Group controls the number of results the name server want to have before sorting of results is done. When the name server request documents from each queue server, it requests for alpha*(Minimum Results to Group)/(Number of Queue Servers) documents. Server Alpha controls the number alpha.
+
+The Save button of course saves any changes you make on this form.
+
+====Test Options Tab====
+
+The Page Options Test Options tab looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:PageOptionsTest.png|The Page Options Test form))
+}}
+
+In the Type dropdown one can select a [[http://en.wikipedia.org/wiki/Internet_media_type|MIME Type]] used to select the page processor Yioop uses to extract text from the data you type or paste into the textarea on this page. Test Options let&#039;s you see how Yioop would process a web page and add summary data to its index. After filling in the textarea with a page, clicking Test Process Page will show the $summary associative array Yioop would create from the page after the appropriate page processor is applied. Beneath it shows the $summary array that would result after user-defined page rules from the crawl time tab are applied. Yioop stores a serialized form of this array in a IndexArchiveBundle for a crawl. Beneath this array is an array of terms (or character n-grams) that were extracted from the page together with their positions in the document. Finally, a list of meta words that the document has are listed. Either extracted terms or meta-word could be used to look up this document in a Yioop index.
+
+===Results Editor===
+
+Sometimes after a large crawl one finds that there are some results that appear that one does not want in the crawl or that the summary for some result is lacking. The Result Editor activity allows one to fix these issues without having to do a completely new crawl. It has three main forms: An edited urls forms, a url editing form, and a filter websites form.
+
+If one has already edited the summary for a url, then the dropdown in the edited urls form will list this url. One can select it and click load to get it to display in the url editing form. The purpose of the url editing form is to allow a user to change the title and description for a url that appears on a search results page. By filling out the three fields of the url editing form, or by loading values into them through the previous form and changing them, and then clicking save, updates the appearance of the summary for that url. To return to using the default summary, one only fills out the url field, leaves the other two blank, and saves. This form does not affect whether the page is looked up for a given query, only its final appearance. It can only be used to edit the appearance of pages which appear in the index, not to add pages to the index. Also, the edit will affect the appearance of that page for all indexes managed by Yioop If you know there is a page that won&#039;t be crawled by Yioop, but would like it to appear in an index, please look at the crawl options section of [[Documentation#Performing%20and%20Managing%20Crawls|Manage Crawls]] documentation.
+
+To understand the filter websites form, recall the disallowed sites crawl option allows a user to specify they don&#039;t want Yioop to crawl a given web site. After a crawl is done though one might be asked to removed a website from the crawl results, or one might want to remove a website from the crawl results because it has questionable content. A large crawl can take days to replace, to make the job of doing such filtering faster while one is waiting for a replacement crawl where the site has been disallowed, one can use a search filter.
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ResultsEditor.png|The Results Editor form))
+}}
+
+Using the filter websites form one can specify a list of hosts which should be excluded from the search results. The sites listed in the Sites to Filter textarea are required to be hostnames. Using a filter, any web page with the same host name as one listed in the Sites to Filter will not appear in the search results. So for example, the filter settings in the example image above contain the line http://www.cs.sjsu.edu/, so given these settings, the web page http://www.cs.sjsu.edu/faculty/pollett/ would not appear in search results.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Search Sources===
+
+The Search Sources activity is used to manage the media sources available to Yioop, and also to control the subsearch links displayed on the top navigation bar. The Search Sources activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:SearchSources.png|The Search Sources form))
+}}
+
+The top form is used to add a media source to Yioop. Currently, the Media Kind can be either Video, RSS, or HTML. &#039;&#039;&#039;Video Media&#039;&#039;&#039; sources are used to help Yioop recognize links which are of videos on a web video site such as YouTube. This helps in both tagging such pages with the meta word media:video in a Yioop index and in being able to render a thumbnail of the video in the search results. When the media kind is set to video, this form has three fields: Name, which should be a short familiar name for the video site (for example, YouTube); URL, which should consist of a url pattern by which to recognize a video on that site; and Thumb, which consist of a url pattern to replace the original pattern by to find the thumbnail for that video. For example, the value of URL for YouTube is:
+ http://www.youtube.com/watch?v={}&amp;
+This will match any url which begins with http://www.youtube.com/watch?v= followed by some string followed by &amp; followed by another string. The {} indicates that from v= to the &amp; should be treated as the identifier for the video. The Thumb url in the case of YouTube is:
+ http://img.youtube.com/vi/{}/2.jpg
+If the identifier in the first video link was yv0zA9kN6L8, then using the above, when displaying a thumb for the video, Yioop would use the image source:
+ http://img.youtube.com/vi/{yv0zA9kN6L8}/2.jpg
+Some video sites have more complicated APIs for specifying thumbnails. In which case, you can still do media:video tagging but display a blank thumbnail rather than suggest a thumbnail link. To do this one uses the thumb url.
+ http://www.yioop.com/resources/blank.png?{}
+If one selects the media kind to be &#039;&#039;&#039;RSS&#039;&#039;&#039; (really simple syndication, a kind of news feed, you can also use Atom feeds as sources), then the media sources form has four fields: &#039;&#039;&#039;Name&#039;&#039;&#039;, again a short familiar name for the RSS feed; &#039;&#039;&#039;URL&#039;&#039;&#039;, the url of the RSS feed, &#039;&#039;&#039;Language&#039;&#039;&#039;, what language the RSS feed is; and Image XPath, an optional field which allows you to specify and XPath relative to a RSS item, an image url if it is in the item. This language element is used to control whether or not a news item will display given the current language settings of Yioop. If under Manage Machines the Media Updater on the Name Server is turned on, then these RSS feeds will be downloaded hourly. If under the Search Time screen of the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]] activity, the subsearch checkbox is checked, then there will be a link to News which appears on the top of the search page. Clicking on this link will display news items in order of recentness.
+
+An &#039;&#039;&#039;HTML Feed&#039;&#039;&#039; is a web page that has news articles like an RSS page that you want the Media Updater to scrape on an hourly basis. To specify where in the HTML page the news items appear you specify different XPath information. For example,
+&lt;pre&gt;
+ Name: Cape Breton Post
+ URL: http://www.capebretonpost.com/News/Local-1968
+ Channel: //div[contains(@class, &quot;channel&quot;)]
+ Item: //article
+ Title:	//a
+ Description: //div[contains(@class, &quot;dek&quot;)]
+ Link: //a
+&lt;/pre&gt;
+The Channel field is used to specify the tag that encloses all the news items. Relative to this as the root tag, //article says the path to an individual news item. Then relative to an individual news item, //a gets the title, etc. Link extracts the href attribute of that same //a .
+
+Returning again to Image Xpath, which is a field of both the RSS form and the HTML Feed form. Not all RSS feeds use the same tag to specify the image associated with a news item. The Image XPath allows you to specify relative to a news item (either RSS or HTML) where an image thumbnail exists. If a site does not use such thumbnail one can prefix the path with ^ to give the path relative to the root of the whole file to where a thumb nail for the news source exists. Yioop automatically removes escaping from RSS containing escaped HTML when computing this. For example, the following works for the feed:
+&lt;pre&gt;
+  http://feeds.wired.com/wired/index
+ //description/div[contains(@class,
+    &quot;rss_thumbnail&quot;)]/img/@src
+&lt;/pre&gt;
+
+Beneath this media sources form is a table listing all the currently added media sources, their urls, and a links that allows one to edit or delete sources.
+
+The second form on the page is the Add a Subsearch form. The form allows you to add a new specialized search link which may appear at the top the search page. If there are more that three of these subsearch are added or if one is seeing the page on a mobile platform, one instead gets a &quot;More&quot; link. This links to the tool.php page which then lists out all possible specialized search, some account links, and other useful Yioop tools. The Add a Subsearch form has three fields: Folder Name is a short familiar name for the subsearch, it will appear as part of the query string when the given subsearch is being performed. For example, if the folder names was news, then s=news will appear as part of the query string when a news subsearch is being done. Folder Name is also used to make the localization identifier used in translating the subsearch&#039;s name into different languages. This identifer will have the format db_subsearch_identifier. For example, db_subsearch_news. Index Source, the second form element, is used to specify a crawl or a crawl mix that the given subsearch should use in returning results. Results per Page, the last form element, controls the number of search results which should appear when using this kind of subsearch.
+
+Beneath this form is a table listing all the currently added subsearches and their properties. The actions column at the end of this table let&#039;s one either edit, localize or delete a given subsearch. Clicking localize takes one to the Manage Locale&#039;s page for the default locale and that particular subsearch localization identifier, so that you can fill in a value for it. Remembering the name of this identifier, one can then in Manage Locales navigate to other locales, and fill in translations for them as well, if desired.
+
+[[Documentation#contents|Return to table of contents]].
+
+===GUI for Managing Machines and Servers===
+
+Rather than use the command line as described in the [[Documentation#prerequisites|Prerequisites for Crawling]] section, it is possible to start/stop and view the log files of queue servers and fetcher through the Manage Machines activity. This activity also is used to turn on and off the Media Updater process/processes.
+These processes are responsible for updating news feeds, and if run in a distributed mode, converting videos to mp4 format, and sending out bulk e-mail notifications about group activities. In order for Manage Machines to work, the additional requirements for this activity mentioned in the [[Documentation#Requirements|Requirements]] section must have been met. The Manage Machines activity looks like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageMachines.png|The Manage Machines form))
+}}
+
+The top of the page has a form for adding new machines, and beneath this is a list of existing machines. On Add machine form, the &#039;&#039;&#039;Machine Name&#039;&#039;&#039; field lets you give this machine an easy to remember name. The &#039;&#039;&#039;Machine URL&#039;&#039;&#039; field should be filled in with the URL to the installed Yioop instance. The &#039;&#039;&#039;Mirror&#039;&#039;&#039; checkbox says whether you want the given Yioop installation to act as a mirror for another Yioop installation. Checking it will reveal a Parent Name textfield that allows you to choose which installation amongst the previously entered machines names (not urls) you want to mirror. The &#039;&#039;&#039;Has Queue Server&#039;&#039;&#039; checkbox is used to say whether the given Yioop installation will be running a queue server or not. Finally, the &#039;&#039;&#039;Number of Fetchers &#039;&#039;&#039; dropdown allows you to say how many fetcher instances you want to be able to manage for that machine.
+
+Beneath the Add machine form is the Machine Information listings. At the top of this is the &#039;&#039;&#039;Media Updater Mode&#039;&#039;&#039;. In the above this is set to Name Server.  This means that there will at most be a running Media Updater process on the name server. If you choose Distributed, there will be a Media Updater which can be turned on and off for each machine you add. Only if all the Media Updater&#039;s you have are on do updates to news, videos, etc happen properly, so the Name Server only set-up can be more convenient. On the other hand, the distributed set-up can handle updates for more news feeds, and the video upload conversion to mp4 only works in the distributed mode.
+
+After the Media Updater Mode, the remainder of the page shows the currently configured machines. This list always begins with the Name Server itself and a toggle to control whether or not the Media Updater process is running on the Name Server. There is also a link to the log file of the Media Updater process. Under the Name Server information is a dropdown that can be used to control the number of current machine statuses that are displayed for all other machines that have been added. It also might have next and previous arrow links to go through the currently available machines. To modify a machine that you have already added,
+
+Beneath this dropdown is a set of boxes for each machine you have added to Yioop. In the far corner of this box is a link to Delete that machine from the list of known machines, if desired. Besides this, each box lists the queue server, if any, and each of the fetchers you requested to be able to manage on that machine. Next to these there is a link to the log file for that server/fetcher and below this there is an On/Off switch for starting and stopping the server/fetcher. This switch is green if the server/fetcher is running and red otherwise. A similar On/Off switch is present to turn on and off mirroring on a machine that is acting as a mirror. It is possible for a switch to be yellow if the machine is crashed but where it is possible that the machine might be automatically restarted by Yioop without your intervention.
+
+==Building Sites with Yioop==
+
+===Building a Site using Yioop&#039;s Wiki System===
+
+As was mentioned in the [[Documentation#appearance|Appearance Activity]] section of the documentation, background color, icons, title, and SEO meta information for a Yioop instance call all be configured from the Configure Activity. Customizing string which appear on Yioop pages can be done by editing the strings in
+[[Documentation#Localizing%20Yioop%20to%20a%20New%20Language|Manage Locales]]. Adding advertisements such as banner and skyscraper ads or turning on user submitted keyword advertisements can be done using the form on the [[Documentation#Optional%20Server%20and%20Security%20Configurations|Server Settings]] activity. If you would like a site with a more custom landing page, then one can check &#039;&#039;&#039;Use Wiki Public Main Page as Landing Page&#039;&#039;&#039; under Toggle Advance
+Settings : Site Customizations. The Public Main page will then be the page you see when you first go to your site. You can then build out your site using the wiki system for the public group. Common headers and footers can be specified for pages on your site using each wiki page&#039;s Settings attributes. More advanced styling of pages can be done by specifying the auxiliary css data under Toggle Advance Settings. As Wiki pages can be set to be galleries, or slide presentations, and as Yioop supports including images, video, and embedding search bars and math equations on pages using its [[Syntax|Yioop&#039;s Wiki Syntax]], one can develop quite advanced sites using just this approach. The video tutorial [[https://yioop.com/?c=group&amp;a=wiki&amp;group_id=20&amp;arg=media&amp;page_id=26&amp;n=03%20Building%20Web%20Sites%20with%20Yioop.mp4|Building Websites Using Yioop]] explains how the Seekquarry.com site was built using Yioop Software in this way.
+
+===Building a Site using Yioop as Framework===
+
+For more advanced, dynamic websites than the wiki approach described above, the Yioop code base can still serve as the code base for new custom search web sites. The web-app portion of Yioop uses a [[https://en.wikipedia.org/wiki/Model-view-adapter|model-view-adapter (MVA) framework]]. This is a common, web-suitable variant on the more well-known Model View Controller design pattern. In this set-up, sub-classes of the Model class should handle file I/O and database function, sub-classes of Views should be responsible for rendering outputs, and sub-classes of the Controller class do calculations on data received from the web and from the models to give the views the data they finally need to render. In the remainder of this section we describe how this framework is implemented in Yioop and how to add code to the WORK_DIRECTORY/app folder to customize things for your site. In this discussion we will use YIOOP_DIR to refer to the Yioop folder, APP_DIR to refer to WORK_DIRECTORY/app and BASE_DIR to refer to YIOOP_DIR/src.
+
+To understand Yioop&#039;s MVA architecture, we begin by tracing how a typical request is processed by Yioop. A typical web app request is handled by the file YIOOP_DIR/index.php. It defines a constant seekquarry\yioop\configs\REDIRECTS_ON as true and then loads the file BASE_DIR/index.php whose bootstrap() method is then called. Since seekquarry\yioop\configs\REDIRECTS_ON is true, bootstrap() will call a function configureRewrites() to see if the incoming URL should be rewritten. To check for rewrite, configureRewrites() makes use of an associative array $route_maps consisting of incoming_route =&gt; routeHandlerFunctionName pairs.
+For example, the pair &#039;admin&#039; =&gt; &#039;routeController&#039; says that an incoming url of the form YIOOP_LOCATION/admin should be rewritten by calling the function routeController. Before performing a rewrite lookup, configureRewrites() checks if a static method Routes::getRoutes() exists, and if so, tacks on the associate array this method returns to $route_maps. So if you want to add your own rewrite you can define the getRoutes method in a Routes class in a file APP_DIR/Routes.php. Typically, when one defines a handler function for a given route, one also defines a helper function, that let&#039;s one create urls for links which match the given pattern. For example, function controllerUrl($name, $with_delim = false) can be used to create urls which could be handled routeController. This function should check if REDIRECTS_ON is true and output a url that works for Yioop if url rewriting is on and a different one if it is off.
+
+
+Once url rewriting has been performed, bootstrap() tries to determine which controller should be used for the incoming request. To do this bootstrap() has an array $available_controllers which lists the controllers available to the script. The names of the controllers in this array are lowercase. Based on whether the $_REQUEST[&#039;c&#039;] variable is in this array index.php either loads the class upperCaseFirstLetter($_REQUEST[&#039;c&#039;])Controller or loads whatever the default controller is. bootstrap() completes by instantiating this class and calling its processRequest() method. To add to the list of $available_controllers, a developer can create function localControllers in their BASE_DIR/configs/LocalConfig.php which returns an array of additional controller names. Yioop&#039;s autoloader first check the directory APP_DIR/controllers for the existance of a controller and if this fails looks in the folder BASE_DIR/contollers. This means that new, developer-defined controller class can be added to APP_DIR/controllers folder and the behavior of existing controllers can be altered by creating a new controller of the same name in APP_DIR/controllers. A controller file should have in it a file which extends the class Controller. Controller files should always have names of the form SomenameController.php and the class inside them should be named SomenameController. Notice it is Somename rather than SomeName. These general naming conventions are used for models, views, etc. Any Controller subclass has methods component($name), model($name), view($name), and plugin($name). These methods load, instantiate, and return a class with the given name. For example, $my_controller-&gt;model(&quot;crawl&quot;); checks to see if a CrawlModel has already been instantiated, if so, it returns it; if not, it tries to load it, first from the file APP_DIR/models/CrawlModel.php, and if that fails, from BASE_DIR/models/CrawlModel.php. Once loaded, it instantiates a CrawlModel, saves a reference to this object, and returns it.
+
+As we indicated above, if a class needs to be loaded, Yioop first looks in APP_DIR. For example, $my_controller-&gt;view(&quot;search&quot;) would first look for a file: APP_DIR/views/SearchView.php to include, if it cannot find such a file then it tries to include BASE_DIR/views/SearchView.php. So to change the behavior of an existing BASE_DIR file one just has a modified copy of the file in the appropriate place in your APP_DIR. This holds in general for other program files such as components, models, and plugins. It doesn&#039;t hold for resources such as images -- we&#039;ll discuss those in a moment. Notice because it looks in APP_DIR first, you can go ahead and create new controllers, models, views, etc which don&#039;t exists in BASE_DIR and get Yioop to load them.
+
+A Controller must implement the abstract method processRequest. Recall this is the method that bootstrap() will call. The processRequest method should make use of data gotten out of the loaded models as well as data from the web request to do some calculations. Typically, to determine the calculation performed, the controller cleans and looks at $_REQUEST[&#039;a&#039;], the request activity, and uses the method call($activity) to call a method that can handle the activity. When a controller is constructed it makes use of its static variable $component_activities to know which components have been associated with it and what activities from these components are allowed. The call() method checks if there is a Component responsible for the requested activity, if there is, it calls that Component&#039;s $activity method, otherwise, the method that handles $activity is assumed to come from the controller itself. The results of the calculations done in $activity would typically be put into an associative array $data. After the call() method completes, processRequest typically takes $data and calls the base Controller method displayView($view, $data). Here $view is the whichever loaded view object you would like to display.
+
+To complete the picture of how Yioop eventually produces a web page or other output, we now describe how subclasses of the View class work. Subclasses of View have a field $layout and two methods helper($name), and element($name). A subclass of View has at most one Layout and it is used for rendering the header and footer of the page. It is included and instantiated by setting $layout to be the name of the layout one wants to load. For example, $layout=&quot;web&quot;; would load either the file APP_DIR/views/layouts/WebLayout.php or BASE_DIR/views/layouts/WebLayout.php. This file is expected to have in it a class WebLayout extending Layout. The contructor of a Layout takes as argument a view which it sets to an instance variable. The way Layout&#039;s get drawn is as follows: When the controller calls displayView($view, $data), this method does some initialization and then calls the render($data) of the base View class. This in turn calls the render($data) method of whatever Layout was on the view. This render method then draws the header and then calls $this-&gt;view-&gt;renderView($data); to draw the view, and finally draws the footer.
+
+The methods helper($name) and element($name) of View load and intantiate, if necessary, and return the Helper or Element $name in a similar fashion to the model($name) method of Controller. Element&#039;s have render($data) methods and can be used to draw out portions of pages which may be common across Views. Helper&#039;s on the other hand are used typically to render UI elements. For example, OptionsHelper has a render($id, $name, $options, $selected) method and is used to draw select dropdowns.
+
+When rendering a View or Element one often has css, scripts, images, videos, objects, etc. In BASE_DIR, the targets of these tags would typically be stored in the css, scripts, or resources folders. The APP_DIR/css, APP_DIR/scripts, and APP_DIR/resources folder are a natural place for them in your customized site. One wrinkle, however, is that APP_DIR, unlike BASE_DIR, doesn&#039;t have to be under your web servers DOCUMENT_ROOT. So how does one refer in a link to these folders? To handle this one uses Yioop&#039;s ResourceController class which can be invoked by a link like:
+ &lt;img src=&quot;?c=resource&amp;a=get&amp;n=myicon.png&amp;f=resources&quot; /&gt;
+Here c=resource specifies the controller, a=get specifies the activity -- to get a file, n=myicon.png specifies we want the file myicon.png -- the value of n is cleaned to make sure it is a filename before being used, and f=resources specifies the folder -- f is allowed to be one of css, script, or resources. This would get the file APP_DIR/resources/myicon.png .
+
+This completes our description of the Yioop framework and how to build a new site using it. It should be pointed out that code in the APP_DIR can be localized using the same mechanism as in BASE_DIR. More details on this can be found in the section on [[Documentation#Localizing%20Yioop%20to%20a%20New%20Language|Localizing Yioop]].
+
+[[Documentation#contents|Return to table of contents]].
+
+===Embedding Yioop in an Existing Site===
+
+One use-case for Yioop is to serve search result for your existing site. There are three common ways to do this: (1) On your site have a web-form or links with your installation of Yioop as their target and let Yioop format the results. (2) Use the same kind of form or links, but request an OpenSearch RSS Response from Yioop and then you format the results and display the results within your site. (3) Your site makes functions calls of the Yioop Search API and gets either PHP arrays or a string back and then does what it wants with the results. For access method (1) and (2) it is possible to have Yioop on an different machine so that it doesn&#039;t consume your main web-site&#039;s machines resources. As we mentioned in the configuration section it is possible to disable each of these access paths from within the Admin portion of the web-site. This might be useful for instance if you are using access methods (2) or (3) and don&#039;t want users to be able to access the Yioop search results via its built in web form. We will now spend a moment to look at each of these access methods in more detail...
+
+====Accessing Yioop via a Web Form====
+
+A very minimal code snippet for such a form would be:
+ &lt;form method=&quot;get&quot; action=&#039;YIOOP_LOCATION&#039;&gt;
+ &lt;input type=&quot;hidden&quot; name=&quot;its&quot; value=&quot;TIMESTAMP_OF_CRAWL_YOU_WANT&quot; /&gt;
+ &lt;input type=&quot;hidden&quot; name=&quot;l&quot; value=&quot;LOCALE_TAG&quot; /&gt;
+ &lt;input type=&quot;text&quot;  name=&quot;q&quot; value=&quot;&quot; /&gt;
+ &lt;button type=&quot;submit&quot;&gt;Search&lt;/button&gt;
+ &lt;/form&gt;
+In the above form, you should change YIOOP_LOCATION to your instance of Yioop&#039;s web location, TIMESTAMP_OF_CRAWL_YOU_WANT should be the Unix timestamp that appears in the name of the IndexArchive folder that you want Yioop to serve results from, LOCALE_TAG should be the locale you want results displayed in, for example, en-US for American English. In addition, to embedding this form on some page on your site, you would probably want to change the resources/yioop.png image to something more representative of your site. You might also want to edit the file views/search_view.php to give a link back to your site from the search results.
+
+If you had a form such as above, clicking Search would take you to the URL:
+ YIOOP_LOCATION?its=TIMESTAMP_OF_CRAWL_YOU_WANT&amp;l=LOCALE_TAG&amp;q=QUERY
+where QUERY was what was typed in the search form. Yioop supports two other kinds of queries: Related sites queries and cache look-up queries. The related query format is:
+ YIOOP_LOCATION?its=TIMESTAMP_OF_CRAWL_YOU_WANT&amp;l=LOCALE_TAG&amp;a=related&amp;arg=URL
+where URL is the url that you are looking up related URLs for. To do a look up of the Yioop cache of a web page the url format is:
+ YIOOP_LOCATION?its=TIMESTAMP_OF_CRAWL_YOU_WANT&amp;l=LOCALE_TAG&amp;q=QUERY&amp;a=cache&amp;arg=URL
+Here the terms listed in QUERY will be styled in different colors in the web page that is returned; URL is the url of the web page you want to look up in the cache.
+
+===Accessing Yioop and getting and OpenSearch RSS, JSON, or JSONP Response===
+
+The same basic urls as above can return RSS or JSON results simply by appending to the end of the them &amp;f=rss or &amp;f=json. If you would like to embed json return in a callback Javascript function (JSONP), you can append &amp;f=json&amp;callback=myCallbackFunction . This of course only makes sense for usual and related url queries -- cache queries return web-pages not a list of search results. Here is an example of what a portion of an RSS result might look like:
+
+ &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
+ &lt;rss version=&quot;2.0&quot; xmlns:opensearch=&quot;http://a9.com/-/spec/opensearch/1.1/&quot;
+ xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;
+ &gt;
+    &lt;channel&gt;
+        &lt;title&gt;PHP Search Engine - Yioop : art&lt;/title&gt;
+        &lt;language&gt;en-US&lt;/language&gt;
+        &lt;link&gt;http://localhost/git/yioop/?f=rss&amp;q=art&amp;its=1317152828&lt;/link&gt;
+        &lt;description&gt;Search results for: art&lt;/description&gt;
+        &lt;opensearch:totalResults&gt;1105&lt;/opensearch:totalResults&gt;
+        &lt;opensearch:startIndex&gt;0&lt;/opensearch:startIndex&gt;
+        &lt;opensearch:itemsPerPage&gt;10&lt;/opensearch:itemsPerPage&gt;
+        &lt;atom:link rel=&quot;search&quot; type=&quot;application/opensearchdescription+xml&quot;
+            href=&quot;http://localhost/git/yioop/yioopbar.xml&quot;/&gt;
+        &lt;opensearch:Query role=&quot;request&quot; searchTerms=&quot;art&quot;/&gt;
+
+                &lt;item&gt;
+                &lt;title&gt; An Online Fine Art Gallery U Can Buy Art  -
+                Buy Fine Art Online&lt;/title&gt;
+
+                &lt;link&gt;http://www.ucanbuyart.com/&lt;/link&gt;
+                &lt;description&gt; UCanBuyArt.com is an online art gallery
+                and dealer designed... art gallery and dealer designed for art
+                sales of high quality and original... art sales of high quality
+                and original art from renowned artists. Art&lt;/description&gt;
+                &lt;/item&gt;
+                ...
+                ...
+     &lt;/channel&gt;
+ &lt;/rss&gt;
+
+Notice the opensearch: tags tell us the totalResults, startIndex and itemsPerPage. The opensearch:Query tag tells us what the search terms were.
+
+===Accessing Yioop via the Function API===
+
+The last way we will consider to get search results out of Yioop is via its function API. The Yioop Function API consists of the following three methods in src/controllers/SearchController.php :
+ function queryRequest($query, $results_per_page, $limit = 0)
+
+ function relatedRequest($url, $results_per_page, $limit = 0,
+     $crawl_time = 0)
+
+ function cacheRequest($url, $highlight=true, $terms = &quot;&quot;,
+     $crawl_time = 0)
+These methods handle basic queries, related queries, and cache of web page requests respectively. The arguments of the first two are reasonably self-explanatory. The $highlight and $terms arguments to cacheRequest are to specify whether or not you want syntax highlighting of any of the words in the returned cached web-page. If wanted then $terms should be a space separated list of terms.
+
+An example script showing what needs to be set-up before invoking these methods as well as how to extract results from what is returned can be found in the file examples/SearchApi.php . If you are building a project that uses this API, it might be useful to develop your project using the very convenient PHP package manager known as Composer. Please check out the [[Composer|Tutorial on Using Yioop with Composer]].
+
+[[Documentation#contents|Return to table of contents]].
+
+===Localizing Yioop to a New Language===
+
+The Manage Locales activity can be used to configure Yioop for use with different languages and for different regions. If you decide to customize your Yioop installation by adding files to WORK_DIRECTORY/app as described in the [[Documentation#Building%20a%20Site%20using%20Yioop%20as%20Framework|Building a Site using Yioop as a Framework]] section, then the localization tools described in this section can also be used to localize your custom site. Clicking the Manage Locales activity one sees a page like:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:ManageLocales.png|The Manage Locales form))
+}}
+
+The first form on this activity allows you to create a new locale -- an object representing a language and a region. The first field on this form should be filled in with a name for the locale in the language of the locale. So for French you would put Fran&ccedil;ais. The locale tag should be the IETF language tag. The &#039;&#039;&#039;Writing Mode&#039;&#039;&#039; element on the form is to specify how the language is written. There are four options: lr-tb -- from left-to-write from the top of the page to the bottom as in English, rl-tb from right-to-left from the top the page to the bottom as in Hebrew and Arabic, tb-rl from the top of the page to the bottom from right-to-left as in Classical Chinese, and finally, tb-lr from the top of the page to the bottom from left-to-right as in non-cyrillic Mongolian or American Sign Language. lr-tb and rl-tb support work better than the vertical language support. As of this writing, Internet Explorer and WebKit based browsers (Chrome/Safari) have some vertical language support and the Yioop stylesheets for vertical languages still need some tweaking. For information on the status in Firefox check out this [[https://bugzilla.mozilla.org/show_bug.cgi?id=writing-mode|writing mode bug]]. Finally, the &#039;&#039;&#039;Locale Enabled &#039;&#039;&#039; checkbox controls whether or not to present the locale on the Settings Page. This allows you to choose only the locales you want for your website without having to delete the locale data for other locales you don&#039;t want, but may want in the future as more translate strings become available.
+
+Beneath the Add Locale form is an alphabetical in the local-tah table listing some of the current locales. The Show Dropdown let&#039;s you control let&#039;s you control how many of these locales are displayed in one go. The Search link lets you bring up an advance search form to search for particular locales and also allows you to control the direction of the listing. The Locale List table first colume has a link with the name of the locale. Clicking on this link brings up a page where one can edit the strings for that locale. The next two columns of the Locale List table give the locale tag and writing direction of the locale, this is followed by the percent of strings translated. Clicking the Edit link in the column let&#039;s one edit the locale tag, and text direction of a locale. Finally, clicking the Delete link let&#039;s one delete a locale and all its strings.
+
+To translate string ids for a locale click on its name link. This should display the following forms and table of string id and their transated values:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:EditLocaleStrings.png|The Edit Locales form))
+}}
+
+In the above case, the link for English was clicked. The Back link in the corner can be used to written to the previous form. The drop down controls whether to display all localizable strings or just those missing translations. The Filter field can be used to restrict the list of string id&#039;s and translations presented to just those containing what is in this field. Beneath this dropdown, the Edit Locale page mainly consists of a two column table: the right column being string ids, the left column containing what should be their translation into the given locale. If no translation exists yet, the field will be displayed in red. String ids are extracted by Yioop automatically from controller, view, helper, layout, and element class files which are either in the Yioop Installation itself or in the installation WORK_DIRECTORY/app folder. Yioop looks for tl() function calls to extract ids from these files, for example, on seeing tl(&#039;search_view_query_results&#039;) Yioop would extract the id search_view_query_results; on seeing tl(&#039;search_view_calculated&#039;, $data[&#039;ELAPSED_TIME&#039;]) Yioop would extract the id, &#039;search_view_calculated&#039;. In the second case, the translation is expected the translation to have a %s in it for the value of $data[&#039;ELAPSED_TIME&#039;]. Note %s is used regardless of the the type, say int, float, string, etc., of $data[&#039;ELAPSED_TIME&#039;]. tl() can handle additional arguments, whenever an additional argument is supplied an additional %s would be expected somewhere in the translation string. If you make a set of translations, be sure to submit the form associated with this table by scrolling to the bottom of the page and clicking the Submit link. This saves your translations; otherwise, your work will be lost if you navigate away from this page. One aid to translating is if you hover your mouse over a field that needs translation, then its translation in the default locale (usually English) is displayed. If you want to find where in the source code a string id comes from the ids follow the rough convention file_name_approximate_english_translation. So you would expect to find admin_controller_login_successful in the file controllers/admin_controller.php . String ids with the prefix db_ (such as the names of activities) are stored in the database. So you cannot find these ids in the source code. The tooltip trick mentioned above does not work for database string ids.
+
+====Localizing Wiki Pages====
+When a user goes to a wiki page with a URL such as
+ YIOOP_LOCATION/group/id_of_a_group/Some_Page_Name
+or
+ YIOOP_LOCATION/group/id_of_a_group/Some_Page_Name
+or for the public group possibly with
+ YIOOP_LOCATION/p/Some_Page_Name
+the page that is displayed is in the locale that has been most recently set for the user. If no locale was set, then Yioop tries to determine the locale based on browser header info, and if this fails, falls back to the Default Locale set when Yioop was configure. When one edits a wiki page the locale that one is editing the page for is displayed under the page name such as en-US in the image below:
+
+{{class=&quot;docs&quot;
+((resource:Documentation:LocaleOnWikiPage.png|Locale on a wiki page))
+}}
+
+To edit the page for a different locale, choose the locale you want using the Settings page while logged in and then navigate to the wiki page you would like to edit (using the same name from the original language). Suppose you were editing the Dental_Floss page in en-US locale. To make the French page, you click Settings on the top bar of Yioop, go to your account settings, and choose French (fr-FR) as the language. Now one would navigate back to the wiki page you were on, the Dental_Floss page, which doesn&#039;t exist for French. You could click Edit now and make the French page at this location, but this would be sub-optimal as the French word for dental floss is dentrifice. So instead, on the fr-FR Dental_Floss edit page, you edit the page Settings to make this page a Page Alias for Dentrifice, and then create and edit the French Dentrifice article. If a user then starts on the English version of the page and switches locales to French they will end up on the Dentrifice page. You should also set up the page alias in the reverse direction as well, to handle when someone start on the French Dentrifice page and switches to the en-US Dentrifice.
+
+====Adding a stemmer, segmenter or supporting character n-gramming for your language====
+
+Depending on the language you are localizing to, it may make sense to write a stemmer for words that will be inserted into the index. A stemmer takes inflected or sometimes derived words and reduces them to their stem. For instance, jumps and jumping would be reduced to jump in English. As Yioop crawls it attempts to detect the language of a given web page it is processing. If a stemmer exists for this language it will call the Tokenizer class&#039;s stem($word) method on each word it extracts from the document before inserting information about it into the index. Similarly, if an end-user is entering a simple conjunctive search query and a stemmer exists for his language settings, then the query terms will be stemmed before being looked up in the index. Currently, Yioop comes with stemmers for English, French, German, Italian, and Russian. The English stemmer uses the Porter Stemming Algorithm [ [[Documentation#P1980|P1980]]], the other stemmers are based on the algorithms presented at snowball.tartoros.org. Stemmers should be written as a static method located in the file WORK_DIRECTORY/locale/en_US/resources/Tokenizer.php . The [[snowball.tartoros.org]] link points to a site that has source code for stemmers for many other languages (unfortunately, not written in PHP). It would not be hard to port these to PHP and then add modify the Tokenizer.php file of the appropriate locale folder. For instance, one could modify the file WORK_DIRECTORY/locale/pt/resources/Tokenizer.php to contain a class PtTokenizer with a static method stem($word) if one wanted to add a stemmer for Portuguese.
+
+The class inside Tokenizer.php can also be used by Yioop to do word segmentation. This is the process of splitting a string of words without spaces in some language into its component words. Yioop comes with an example segmenter for the zh-CN (Chinese) locale. It works by starting at the ned of the string and trying to greedily find the longest word that can be matched with the portion of the suffix of the string that has been processed yet (reverse maximal match). To do this it makes use of a word Bloom filter as part of how it detects if a string is a word or not. We describe how to make such filter using token_tool.php in a moment.
+
+In addition to supporting the ability to add stemmers and segmenters, Yioop also supports a default technique which can be used in lieu of a stemmer called character n-grams. When used this technique segments text into sequences of n characters which are then stored in Yioop as a term. For instance if n were 3 then the word &quot;thunder&quot; would be split into &quot;thu&quot;, &quot;hun&quot;, &quot;und&quot;, &quot;nde&quot;, and &quot;der&quot; and each of these would be asscociated with the document that contained the word thunder. N-grams are useful for languages like Chinese and Japanese in which words in the text are often not separated with spaces. It is also useful for languages like German which can have long compound words. The drawback of n-grams is that they tend to make the index larger. For Yioop built-in locales that do not have stemmer the file, the file WORK_DIRECTORY/locale/LOCALE-TAG/resources/Tokenizer.php has a line of the form
+ public static $char_gram_len = 5;
+This number is the length of string to use in doing char-gramming. If you add a language to Yioop and want to use char gramming merely add a tokenizer.php to the corresponding locale folder with such a line in it.
+
+{{id=&#039;token_tool&#039;
+====Using TokenTool.php to improve search performance and relevance for your language====
+}}
+
+configs/TokenTool.php is used to create suggest word dictionaries and word filter files for the Yioop search engine. To create either of these items, the user puts a source file in Yioop&#039;s WORK_DIRECTORY/prepare folder. Suggest word dictionaries are used to supply the content of the dropdown of search terms that appears as a user is entering a query in Yioop. They are also used to do spell correction suggestions after a search has been performed. To make a suggest dictionary one can use a command like:
+
+ php TokenTool.php dictionary filename locale endmarker
+
+Here &#039;&#039;filename&#039;&#039; should be in the current folder or PREP_DIR, locale is the locale this suggest (for example, en-US) file is being made for and where a file suggest_trie.txt.gz will be written, and endmarker is the end of word symbol to use in the trie. For example, $ works pretty well. The format of &#039;&#039;filename&#039;&#039; should be a sequence of line, each line containing a word or phrase followed by a space followed by a frequency count. i.e., the last thing on the line should be a number. Given a corpus of documents a frequency for a word would be the number of occurences of that word in the document.
+
+TokenTool.php can also be used to make filter files used by a word segmenter. To make a filter file TokenTool.php is run from the command line as:
+ php TokenTool.php segment-filter dictionary_file locale
+
+Here dictionary_file should be a text file with one word/line, locale is the IANA language tag of the locale to store the results for.
+====Obtaining data sets for TokenTool.php====
+
+Many word lists with frequencies are obtainable on the web for free with Creative Commons licenses. A good starting point is:
+ [[http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists|http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists]]
+A little script-fu can generally take such a list and output it with the line format of &quot;word/phrase space frequency&quot; needed by TokenTool.php and as the word/line format used for filter files.
+
+====Spell correction and romanized input with locale.js====
+
+Yioop supports the ability to suggest alternative queries after a search is performed. These queries are mainly restricted to fixing typos in the original query. In order to calculate these spelling corrections, Yioop takes the query and for each query term computes each possible single character change to that term. For each of these it looks up in the given locale&#039;s suggest_trie.txt.gz a frequency count of that variant, if it exists. If the best suggestion is some multiple better than the frequency count of the original query then Yioop suggests this alternative query. In order for this to work, Yioop needs to know what constitutes a single character in the original query. The file locale.js in the WORK_DIRECTORY/locale/LOCALE_TAG/resources folder can be used to specify this for the locale given by LOCALE_TAG. To do this, all you need to do is specify a Javascript variable alpha. For example, for French (fr-FR) this looks like:
+ var alpha = &quot;a&aring;&agrave;bc&ccedil;de&eacute;&ecirc;fghi&icirc;&iuml;jklmno&ocirc;pqrstu&ucirc;vwxyz&quot;;
+The letters do not have to be in any alphabetical order, but should be comprehensive of the non-punctuation symbols of the language in question.
+
+Another thing locale.js can be used for is to given mappings between roman letters and other scripts for use in the Yioop&#039;s autosuggest dropdown that appears as you type a query. As you type, scripts/suggest.js function onTypeTerm is called. This in turn will cause a particular locale&#039;s locale.js function transliterate(query) if it exists. This function should return a string with the result of the transliteration. An example of doing this is given for the Telugu locale in Yioop.
+
+====Thesaurus Results and Part of Speech Tagging====
+
+As mentioned in the [[Documentation#Search%20Basics|Search Basics]] topic, for some queries Yioop displays a list of related queries to one side of the search results. These are obtained from a &quot;computer thesaurus&quot;. In this subsection, we describe how to enable this facility for English and how you could add this functionality for other languages. If enabled, the thesaurus also can be used to modify search ranking as described in the [[Ranking#Final%20Reordering|Final Reordering]] of the Yioop Ranking Mechanisms document.
+
+In order to generate suggested related queries, Yioop first tags the original query terms according to part of speech. For the en-US locale, this is done by calling a method: tagTokenizePartOfSpeech($text) in WORK_DIRECTORY/locale/en_US/resources/Tokenizer.php. For en-US, a simple Brill tagger (see Ranking document for more info) is implemented to do this. After this method is called the terms in $text should have a suffix ~part-of-speech where ~part-of-speeech where part-of-speech is one of NN for noun, VB for verb, AJ for adjective, AV for adverb, or some other value (which would be ignored by Yioop). For example, the noun dog might become dog~NN after tagging. To localize to another language this method in the corresponding tokenizer.php file would need to be implemented.
+
+The second method needed for Thesaurus results is scoredThesaurusMatches($term, $word_type, $whole_query) which should also be in tokenizer.php for the desired locale. Here $term is a term (without a part-of-speech tag), $word_type is the part of speech (one of the ones listed above), and $whole_query is the original query. The output of this method should be an array of (score =&gt; array of thesaurus terms) associations. The score representing one word sense of term. In the case, of English, this method is implemented using [[http://wordnet.princeton.edu/|WordNet]]. So for thesaurus results to work for English, WordNet needs to be installed and in either the config.php file or local_config.php you need to define the constant WORDNET_EXEC to the path to the WordNet executable on your file system. On a Linux or OSX system, this might be something like: /usr/local/bin/wn .
+
+====Using Stop Words to improve Centroid Summarization====
+
+While crawling, Yioop makes use of a summarizer to extract the important portions of the web page both for indexing and for search result snippet purposes. There are three summarizers that come with Yioop a Basic summarizer, which uses an ad hoc approach to finding the most important parts of the document; a Graph-base summarizer, which convert the sentences into vertices, connecting them with weighted edges, and tries to a page-rank like computation, and a centroid summarizer which tries to compute an &quot;average sentence&quot; for the document and uses this to pick representative sentences based on nearness to this average. The summarizer that is used can be set under the Crawl Time tab of [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options]]. This centroid summarizer works better if certain common words (stop words) from the documents language are removed. When using the centroid summarizer, Yioop check to see if tokenizer.php for the current locale contains a method stopwordsRemover($page). If it does it calls it, this method takes a string of words are returns a string with all the stop words removed. This method exists for en-US, but, if desired, could also be implemented for other locales to improve centroid summarization.
+
+[[Documentation#contents|Return to table of contents]].
+
+==Advanced Topics==
+===Modifying Yioop Code===
+One advantage of an open-source project is that you have complete access to the source code. Thus, Yioop can be modified to fit in with your existing project. You can also freely add new features onto Yioop. In this section, we look a little bit at some of the common ways you might try to modify Yioop as well as ways to examine the output of a crawl in a more technical manner. If you decide to modify the source code it is recommended that you look at the [[Documentation#Summary%20of%20Files%20and%20Folders|Summary of Files and Folders]] above again, as well as look at the [[http://www.seekquarry.com/yioop-docs/|online Yioop code documentation]].
+
+====Handling new File Types====
+One relatively easy enhancement to Yioop is to enhance the way it processes an existing file type or to get it to process new file types. Yioop was written from scratch without dependencies on existing projects. So the PHP processors for Microsoft file formats and for PDF are only approximate. These processors can be found in src/library/processors. To write your own processor, you should extend either the TextProcessor or ImageProcessor class. You then need to write in your subclass a static method process($page, $url). Here $page is a string representation of a downloaded document of the file type you are going to handle and $url is the a canonical url from which this page is downloaded. This method should return an array of the format:
+ $summary[&#039;TITLE&#039;] = a title for the document
+ $summary[&#039;DESCRIPTION&#039;] = a text summary extracted from the document
+ $summary[&#039;LINKS&#039;] = an array of links (canonical not relative) extracted
+     from the document.
+A good reference implementation of a TextProcessor subclass can be found in HtmlProcessor.php. If you are trying to support a new file type, then to get Yioop to use your processor you need to add lines to your classes constructor specififying the self::$indexed_file_types and self::$mime_processor static fields. As an example, in the RssProcessor class; constructor these lines are:
+ self::$indexed_file_types[] = &quot;rss&quot;;
+ self::$mime_processor[&quot;application/rss+xml&quot;] = &quot;RssProcessor&quot;;
+ self::$mime_processor[&quot;application/atom+xml&quot;] = &quot;RssProcessor&quot;;
+self::$indexed_file_types says that their exists a processor for a given file extension, self::$mime_processor says what processor should be used to handle a given mime type. Both these fields are static and inherited from the base class. They are used to get effectively global array of all handled file types and which processors should be used for which extensions.
+If you create a new processor, it is cool, only relies on code you wrote, and you want to contribute it back to the Yioop, please feel free to e-mail it to chris@pollett.org .
+
+====Writing an Indexing Plugin====
+An indexing plugin provides a way that an advanced end-user can extend the indexing capabilities of Yioop. Bundled with Yioop are three example indexing plugins. These are found in the library/indexing_plugins folder. We will discuss the code for the recipe and word filter plugin here. The code for the address plugin, used to extract snail mail address from web pages follows the same kind of structure. If you decide to write your own plugin or want to install a third-party plugin you can put it in the folder: WORK_DIRECTORY/app/library/indexing_plugins. The recipe indexing plugin can serve as a guide for writing your own plugin if you don&#039;t need your plugin to have a configure screen. The recipe plugin is used to detect food recipes which occur on pages during a crawl. It creates &quot;micro-documents&quot; associated with found recipes. These are stored in the index during the crawl under the meta-word &quot;recipe:all&quot;. After the crawl is over, the recipe plugin&#039;s postProcessing method is called. It looks up all the documents associated with the word &quot;recipe:all&quot;. It extracts ingredients from these and does clustering of recipes based on ingredient. It finally injects new meta-words of the form &quot;ingredient:some_food_ingredient&quot;, which can be used to retrieve recipes most closely associated with a given ingredient. As it is written, recipe plugin assumes that all the recipes can be read into memory in one go, but one could easily imagine reading through the list of recipes in batches of the amount that could fit in memory in one go.
+
+The recipe plugin illustrates the kinds of things that can be written using indexing plugins. To make your own plugin, you would need to write a subclass of the class IndexingPlugin with a file name of the form MypluginnamePlugin.php. Then you would need to put this file in the folder WORK_DIRECTORY/app/library/indexing_plugins. RecipePlugin subclasses IndexingPlugin and implements the following four methods: pageProcessing($page, $url), postProcessing($index_name), getProcessors(), getAdditionalMetaWords() so they don&#039;t have their return NULL default behavior. We explain what each of these is for in a moment. During a web crawl, after a fetcher has downloaded a batch of web pages, it uses a page&#039;s mimetype to determine a page processor class to extract summary data from that page. The page processors that Yioop implements can be found in the folder lib/processors. They have file names of the form someprocessorname_processor.php. As a crawl proceeds, your plugin will typically be called to do further processing of a page only in addition to some of these processors. The static method getProcessors() should return an array of the form [&quot;someprocessorname1&quot;, &quot;someprocessorname2&quot;, ...], listing the processors that your plugin will do additional processing of documents for. A page processor has a method handle($page, $url) called by Yioop with a string $page of a downloaded document and a string $url of where it was downloaded from. This method first calls the process($page, $url) method of the processor to do initial summary extraction and then calls method pageProcessing($page, $url) of each indexing_plugin associated with the given processor. A pageProcessing($page, $url) method is expected to return an array of subdoc arrays found on the given page. Each subdoc array should haves a CrawlConstants::TITLE and a CrawlConstants::DESCRIPTION. The handle method of a processor will add to each subdoc the fields: CrawlConstants::LANG, CrawlConstants::LINKS, CrawlConstants::PAGE, CrawlConstants::SUBDOCTYPE. The SUBDOCTYPE is the name of the plugin. The resulting &quot;micro-document&quot; is inserted by Yioop into the index under the word nameofplugin:all . After the crawl is over, Yioop will call the postProcessing($index_name) method of each indexing plugin that was in use. Here $index_name is the timestamp of the crawl. Your plugin can do whatever post processing it wants in this method. For example, the recipe plugin does searches of the index and uses the results of these searches to inject new meta-words into the index. In order for Yioop to be aware of the meta-words you are adding, you need to implement the method getAdditionalMetaWords(). Also, the web snippet you might want in the search results for things like recipes might be longer or shorter than a typical result snippet. The getAdditionalMetaWords() method also tells Yioop this information. For example, for the recipe plugin, getAdditionalMetaWords() returns the associative array:
+ [&quot;recipe:&quot; =&gt; HtmlProcessor::MAX_DESCRIPTION_LEN,
+      &quot;ingredient:&quot; =&gt; HtmlProcessor::MAX_DESCRIPTION_LEN]
+The WordFilterPlugin illustrates how one can write an indexing plugin with a configure screen. It overrides the base class&#039; pageSummaryProcessing(&amp;$summary) and getProcessors() methods as well as implements the methods saveConfiguration($configuration), loadConfiguration(), setConfiguration($configuration), configureHandler(&amp;$data), and configureView(&amp;$data). The purpose of getProcessors() was already mentioned under recipe plugin description above. pageSummaryProcessing(&amp;$summary) is called by a page processor after a page has been processed and a summary generated. WordFilterPlugin uses this callback to check if the title or the description in this summary have any of the words the filter is filtering for and if so takes the appropriate action. loadConfiguration, saveConfiguration($configuration), and setConfiguration are three methods to handle persistence for any plugin data that the user can change. The first two operate on the name server, the last might operate on a queue server or a fetcher. loadConfiguration is be called by configureHandler(&amp;$data) to read in any current configuration, unserialize it and modify it according to any data sent by the user. saveConfiguration($configuration) would then be called by configureHandler(&amp;$data) to serialize and write any $configuration data that needs to be stored by the plugin. For WordFilterPlugin, a list of filter terms and actions are what is saved by saveConfiguration($configuration) and loaded by loadConfiguration. When a crawl is started or when a fetcher contacts the name server, plugin configuration data is sent by the name server. The method setConfiguration($configuration) is used to initialize the local copy of a fetcher&#039;s or queue server&#039;s process with the configuration settings from the name server. For WordFilterPlugin, the filter terms and actions are stored in a field variable by this function.
+
+As has already been hinted at by the configuration discussion above, configureHandler(&amp;$data) plays the role of a controller for an index plugin. It is in fact called by the AdminController activity pageOptions if the configure link for a plugin has been clicked. In addition, to managing the load and save configuration process, it also sets up any data needed by configureView(&amp;$data). For WordFilterPlugin, this involves setting a variable $data[&quot;filter_words&quot;] so that configureView(&amp;$data) has access to a list of filter words and actions to draw. Finally, the last method of the WordFilterPlugin we describe, configureView(&amp;$data), outputs using $data the HTML that will be seen in the configure screen. This HTML will appear in a div tag on the final page. It is initially styled so that it is not displayed. Clicking on the configure link will cause the div tag data to be displayed in a light box in the center of the screen. For WordFilterPlugin, this methods draws a title and textarea form with the currently filtered terms in it. It makes use of Yioop&#039;s tl() functions so that the text of the title can be localized to different languages. This form has hidden field c=admin, a=pageOptions option-type=crawl_time, so that hte AdminController will know to call pageOption and pageOption will know in turn to let plugin&#039;s configureHandler methods to get a chance to handle this data.
+
+[[Documentation#contents|Return to table of contents]].
+
+===Yioop Command-line Tools===
+In addition to [[Documentation#token_tool|TokenTool.php]] which we describe in the section on localization, and to [[Documentation#configs|ExportPublicHelpDb.php]] which we describe in the section on the Yioop folder structure, Yioop comes with several useful command-line tools and utilities. We next describe these in roughly their order of likely utility:
+
+* [[Documentation#configure_tool|src/configs/ConfigureTool.php]]: Used to configure Yioop from the command-line
+* [[Documentation#arc_tool|src/executables/ArcTool.php]]: Used to examine the contents of WebArchiveBundle&#039;s and IndexArchiveBundles&#039;s
+* [[Documentation#query_tool|src/executables/QueryTool.php]]: Used to query an index from the command-line
+* [[Documentation#code_tool|src/executables/CodeTool.php]]: Used to help code Yioop and to help make clean patches for Yioop.
+* [[Documentation#classifier_tool|src/executables/ClassifierTool.php]]: Used to make Yioop a Yioop classifier from the command line rather than using the GUI interface.
+
+{{id=&#039;configure_tool&#039;
+====Configuring Yioop from the Command-line====
+}}
+
+In a multiple queue server and fetcher setting, one might have web access only to the name server machine -- all the other machines might be on virtual private servers to which one has only command-line access. Hence, it is useful to be able to set up a work directory and configure Yioop through the command-line. To do this one can use the script configs/ConfigureTool.php. One can run it from the command-line within the configs folder, with a line like:
+ php ConfigureTool.php
+When launched, this program will display a menu like:
+ Yioop CONFIGURATION TOOL
+ +++++++++++++++++++++++++
+
+ Checking Yioop configuration...
+ ===============================
+ Check Passed.
+ Using configs/LocalConfig.php so changing work directory above may not work.
+ ===============================
+
+ Available Options:
+ ==================
+ (1) Create/Set Work Directory
+ (2) Change root password
+ (3) Set Default Locale
+ (4) Debug Display Set-up
+ (5) Search Access Set-up
+ (6) Search Page Elements and Links
+ (7) Name Server Set-up
+ (8) Crawl Robot Set-up
+ (9) Exit program
+
+ Please choose an option:
+Except for the Change root password option, these correspond to the different fieldsets on the Configure activity. The command-line forms one gets from selecting one of these choices let one set the same values as were described earlier in the [[Documentation#Installation%20and%20Configuration|Installation]] section. The change root password option lets one set the account password for root. I.e., the main admin user. On a non-nameserver machine, it is probably simpler to go with a sqlite database, rather than hit on a global mysql database from each machine. Such a barebones local database set-up would typically only have one user, root
+
+Another thing to consider when configuring a collection of Yioop machines in such a setting, is, by default, under Search Access Set-up, subsearch is unchecked. This means the RSS feeds won&#039;t be downloaded hourly on such machines. If one unchecks this, they can be.
+
+{{id=&#039;arc_tool&#039;
+====Examining the contents of WebArchiveBundle&#039;s and IndexArchiveBundles&#039;s====
+}}
+
+The command-line script src/executables/ArcTool.php can be used to examine and manipulate the contents of a WebArchiveBundle or an IndexArchiveBundle. Below is a summary of the different command-line uses of arc_tool.php:
+
+;&#039;&#039;&#039;php ArcTool.php count bundle_name&#039;&#039;&#039;
+ or
+&#039;&#039;&#039;php ArcTool.php count bundle_name save&#039;&#039;&#039; : returns the counts of docs and links for each shard in bundle  as well as an overall total. The second command saves the just computed count into the index description (can be used to fix the index count if it gets screwed up).
+; &#039;&#039;&#039;php ArcTool.php dict bundle_name word&#039;&#039;&#039; : returns index dictionary records for word stored in index archive bundle.
+; &#039;&#039;&#039;php ArcTool.php info bundle_name&#039;&#039;&#039; : return info about documents stored in archive.
+; &#039;&#039;&#039;php ArcTool.php inject timestamp file&#039;&#039;&#039; : injects the urls in file as a schedule into crawl of given timestamp. This can be used to make a closed index unclosed and to allow for continued crawling.
+; &#039;&#039;&#039;php ArcTool.php list&#039;&#039;&#039; : returns a list of all the archives in the Yioop! crawl directory, including non-Yioop! archives in the /archives sub-folder.
+; &#039;&#039;&#039;php ArcTool.php mergetiers bundle_name max_tier&#039;&#039;&#039; : merges tiers of word dictionary into one tier up to max_tier
+; &#039;&#039;&#039;php ArcTool.php posting bundle_name generation offset&#039;&#039;&#039;
+ or
+&#039;&#039;&#039;php ArcTool.php posting bundle_name generation offset num&#039;&#039;&#039; : returns info about the posting (num many postings) in bundle_name at the given generation and offset
+; &#039;&#039;&#039;php ArcTool.php rebuild bundle_name&#039;&#039;&#039; : Re-extracts words from summaries files in bundle_name into index shards then builds a new dictionary
+; &#039;&#039;&#039;php ArcTool.php reindex bundle_name&#039;&#039;&#039; : Reindex the word dictionary in bundle_name using existing index shards
+; &#039;&#039;&#039;php ArcTool.php shard bundle_name generation&#039;&#039;&#039; : Prints information about the number of words and frequencies of words within the generation&#039;th index shard in the bundle
+; &#039;&#039;&#039;php ArcTool.php show bundle_name start num&#039;&#039;&#039; : outputs items start through num from bundle_name or name of non-Yioop archive crawl folder
+
+The bundle name can be a full path name, a relative path from the current directory, or it can be just the bundle directory&#039;s file name in which case WORK_DIRECTORY/cache will be assumed to be the bundle&#039;s location. The following are some examples of using arc tool. Recall a backslash in Unix/OSX terminal is the line continuation character, so we can image lines where it is indicated below as being all on one line. They are not all from the same session:
+ |chris-polletts-macbook-pro:executables:108&gt;php ArcTool.php list
+ Found Yioop Archives:
+ =====================
+ 0-Archive1334468745
+ 0-Archive1336527560
+ IndexData1334468745
+ IndexData1336527560
+
+ Found Non-Yioop Archives:
+ =========================
+ english-wikipedia2012
+
+ ...
+
+ |chris-polletts-macbook-pro:executables:158&gt;php ArcTool.php info \
+    /Applications/XAMPP/xamppfiles/htdocs/crawls/cache/IndexData1293767731
+
+ Bundle Name: IndexData1293767731
+ Bundle Type: IndexArchiveBundle
+ Description: test
+ Number of generations: 1
+ Number of stored links and documents: 267260
+ Number of stored documents: 16491
+ Crawl order was: Page Importance
+ Seed sites:
+    http://www.ucanbuyart.com/
+    http://www.ucanbuyart.com/fine_art_galleries.html
+    http://www.ucanbuyart.com/indexucba.html
+ Sites allowed to crawl:
+    domain:ucanbuyart.com
+    domain:ucanbuyart.net
+ Sites not allowed to be crawled:
+    domain:arxiv.org
+    domain:ask.com
+ Meta Words:
+    http://www.ucanbuyart.com/(.+)/(.+)/(.+)/(.+)/
+
+ |chris-polletts-macbook-pro:executables:202&gt;php ArcTool.php show \
+     /Applications/XAMPP/xamppfiles/htdocs/crawls/cache/Archive1293767731 0 3
+
+ BEGIN ITEM, LENGTH:21098
+ [URL]
+ http://www.ucanbuyart.com/robots.txt
+ [HTTP RESPONSE CODE]
+ 404
+ [MIMETYPE]
+ text/html
+ [CHARACTER ENCODING]
+ ASCII
+ [PAGE DATA]
+ &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
+   &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
+
+ &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot;&gt;
+
+ &lt;head&gt;
+     &lt;base href=&quot;http://www.ucanbuyart.com/&quot; /&gt;
+    &lt;/pre&gt;
+ ...
+
+ |chris-polletts-macbook-pro:bin:117&gt;php arc_tool.php reindex IndexData1317414152
+
+ Shard 0
+ [Sat, 01 Oct 2011 11:05:17 -0700] Adding shard data to dictionary files...
+ [Sat, 01 Oct 2011 11:05:28 -0700] Merging tiers of dictionary
+
+ Final Merge Tiers
+
+ Reindex complete!!
+
+The mergetiers command is like a partial reindex. It assumes all the shard words have been added to the dictionary, but that the dictionary still has more than one tier (tiers are the result of incremental log-merges which are made during the crawling process). The mergetiers command merges these tiers into one large tier which is then usable by Yioop for query processing.
+
+{{id=&#039;query_tool&#039;
+====Querying an Index from the command-line====
+}}
+
+The command-line script src/executables/QueryTool.php can be used to query indices in the Yioop WORK_DIRECTORY/cache. This tool can be used on an index regardless of whether or not Apache is running. It can be used for long running queries that might timeout when run within a browser to put their results into memcache or filecache. The command-line arguments for the query tool are:
+ php QueryTool.php query num_results start_num lang_tag
+The default num_results is 10, start_num is 0, and lang_tag is en-US. The following shows how one could do a query on &quot;Chris Pollett&quot;:
+
+ |chris-polletts-macbook-pro:executables:141&gt;php QueryTool.php &quot;Chris Pollett&quot;
+
+ ============
+ TITLE: ECCC - Pointers to
+ URL: http://eccc.hpi-web.de/static/pointers/personal_www_home_pages_of_complexity_theorists/
+ IPs: 141.89.225.3
+ DESCRIPTION: Homepage of the Electronic Colloquium on Computational Complexity located
+ at the Hasso Plattner Institute of Potsdam, Germany Personal WWW pages of
+ complexity people 2011 2010 2009 2011...1994 POINTE
+ Rank: 3.9551158411
+ Relevance: 0.492443777769
+ Proximity: 1
+ Score: 4.14
+ ============
+
+ ============
+ TITLE: ECCC - Pointers to
+ URL: http://www.eccc.uni-trier.de/static/pointers/personal_www_home_pages_of_complexity_theorists/
+ IPs: 141.89.225.3
+ DESCRIPTION: Homepage of the Electronic Colloquium on Computational Complexity located
+ at the Hasso Plattner Institute of Potsdam, Germany Personal WWW pages of
+ complexity people 2011 2010 2009 2011...1994 POINTE
+ Rank: 3.886318974
+ Relevance: 0.397622570289
+ Proximity: 1
+ Score: 4.03
+ ============
+
+ .....
+
+The index the results are returned from is the default index; however, all of the Yioop meta words should work so you can do queries like &quot;my_query i:timestamp_of_index_want&quot;. Query results depend on the kind of language stemmer/char-gramming being used, so French results might be better if one specifies fr-FR then if one relies on the default en-US. QueryTool can also be used to explain what index iterators Yioop will use to execute a query. To see this information one can type a command like:
+ php QueryTool.php query plan
+or
+ php QueryTool.php query explain
+for example,
+ php QueryTool.php &#039;chris pollett&#039; explain
+
+{{id=&#039;code_tool&#039;
+====A Tool for Coding and Making Patches for Yioop====
+}}
+
+&#039;&#039;&#039;src/executables/CodeTool.php&#039;&#039;&#039; can perform several useful tasks to help developers program for the Yioop environment. Below is a brief summary of its functionality:
+
+;&#039;&#039;&#039;php CodeTool.php clean path&#039;&#039;&#039; : Replaces all tabs with four spaces and trims all whitespace off ends of lines in the folder or file path.
+;&#039;&#039;&#039;php CodeTool.php copyright path&#039;&#039;&#039; : Adjusts all lines in the files in the folder at path (or if path is a file just that) of the form 2009 - \d\d\d\d to the form 2009 - this_year where this_year is the current year.
+;&#039;&#039;&#039;php CodeTool.php longlines path&#039;&#039;&#039; : Prints out all lines in files in the folder or file path which are longer than 80 characters.
+;&#039;&#039;&#039;php CodeTool.php replace path pattern replace_string&#039;&#039;&#039;
+ or
+&#039;&#039;&#039;php CodeTool.php replace path pattern replace_string effect&#039;&#039;&#039; : Prints all lines matching the regular expression pattern followed by the result of replacing pattern with replace_string in the folder or file path. Does not change files.
+;&#039;&#039;&#039;php CodeTool.php replace path pattern replace_string interactive&#039;&#039;&#039; : Prints each line matching the regular expression pattern followed by the result of replacing pattern with replace_string in the folder or file path. Then it asks if you want to update the line. Lines you choose for updating will be modified in the files.
+;&#039;&#039;&#039;php CodeTool.php replace path pattern replace_string change&#039;&#039;&#039; : Each line matching the regular expression pattern is update by replacing pattern with replace_string in the folder or file path. This format doe not echo anything, it does a global replace without interaction.
+;&#039;&#039;&#039;php CodeTool.php search path pattern&#039;&#039;&#039; :Prints all lines matching the regular expression pattern in the folder or file path.
+
+{{id=&#039;classifier_tool&#039;
+====A Command-line Tool for making Yioop Classifiers====
+}}
+
+&#039;&#039;&#039;src/executables/ClassifierTool.php&#039;&#039;&#039; is used to automate the building and testing of classifiers, providing an alternative to the web interface when a labeled training set is available.
+
+&#039;&#039;&#039;ClassifierTool.php&#039;&#039;&#039; takes an activity to perform, the name of a dataset to use, and a label for the constructed classifier. The activity is the name of one of the &#039;un*&#039; functions implemented by this class, without the common &#039;run&#039; prefix (e.g., &#039;TrainAndTest&#039; for the method runTrainAndTest). The dataset is specified as the common prefix of two indexes that have the suffixes &quot;Pos&quot; and &quot;Neg&quot;, respectively. So if the prefix were &quot;DATASET&quot;, then this tool would look for the two existing indexes &quot;DATASET Pos&quot; and &quot;DATASET Neg&quot; from which to draw positive and negative examples. Each document in these indexes should be a positive or negative example of the target class, according to whether it&#039;s in the &quot;Pos&quot; or &quot;Neg&quot; index. Finally, the label is just the label to be used for the constructed classifier.
+
+Beyond these options (set with the -a, -d, and -l flags), a number of other options may be set to alter parameters used by an activity or a classifier. These options are set using the -S, -I, -F, and -B flags, which correspond to string, integer, float, and boolean parameters respectively. These flags may be used repeatedly, and each expects an argument of the form NAME=VALUE, where NAME is the name of a parameter, and VALUE is a value parsed according to the flag. The NAME should match one of the keys of the options member of this class, where a period (&#039;.&#039;) may be used to specify nesting. For example:
+ -I debug=1         # set the debug level to 1
+ -B cls.use_nb=0    # tell the classifier to use Naive Bayes
+To build and evaluate a classifier for the label &#039;spam&#039;, trained using the two indexes &quot;DATASET Neg&quot; and &quot;DATASET Pos&quot;, and a maximum of the top 25 most informative features:
+ php ClassifierTool.php -a TrainAndTest -d &#039;DATASET&#039; -l &#039;spam&#039; -I cls.chi2.max=25
+The above assume we are in the folder of ClassifierTool.php.
+
+==References==
+
+;{{id=&#039;APC2003&#039; &#039;&#039;&#039;[APC2003]&#039;&#039;&#039;}} : Serge Abiteboul and Mihai Preda and Gregory Cobena. [[http://leo.saclay.inria.fr/publifiles/gemo/GemoReport-290.pdf|Adaptive on-line page importance computation]]. In: Proceedings of the 12th international conference on World Wide Web. pp.280-290. 2003.
+;{{id=&#039;B1970&#039; &#039;&#039;&#039;[B1970]&#039;&#039;&#039;}} : Bloom, Burton H. [[http://www.lsi.upc.edu/~diaz/p422-bloom.pdf|Space/time trade-offs in hash coding with allowable errors]]. Communications of the ACM Volume 13 Issue 7. pp. 422&ndash;426. 1970.
+;{{id=&#039;BSV2004&#039; &#039;&#039;&#039;[BSV2004]&#039;&#039;&#039;}} : Paolo Boldi and Massimo Santini and Sebastiano Vigna. [[http://vigna.di.unimi.it/ftp/papers/ParadoxicalPageRank.pdf|Do Your Worst to Make the Best: Paradoxical Effects in PageRank Incremental Computations]]. Algorithms and Models for the Web-Graph. pp. 168&ndash;180. 2004.
+;{{id=&#039;BP1998&#039; &#039;&#039;&#039;[BP1998]&#039;&#039;&#039;}} : Brin, S. and Page, L. [[http://infolab.stanford.edu/~backrub/google.html|The Anatomy of a Large-Scale Hypertextual Web Search Engine]]. In: Seventh International World-Wide Web Conference (WWW 1998). April 14-18, 1998. Brisbane, Australia. 1998.
+;{{id=&#039;BCC2010&#039; &#039;&#039;&#039;[BCC2010]&#039;&#039;&#039;}} : S. B&uuml;ttcher, C. L. A. Clarke, and G. V. Cormack. [[http://mitpress.mit.edu/books/information-retrieval|Information Retrieval: Implementing and Evaluating Search Engines]]. MIT Press. 2010.
+;{{id=&#039;DG2004&#039; &#039;&#039;&#039;[DG2004]&#039;&#039;&#039;}} : Jeffrey Dean and Sanjay Ghemawat. [[http://research.google.com/archive/mapreduce-osdi04.pdf|MapReduce: Simplified Data Processing on Large Clusters]]. OSDI&#039;04: Sixth Symposium on Operating System Design and Implementation. 2004
+;{{id=&#039;GGL2003&#039; &#039;&#039;&#039;[GGL2003]&#039;&#039;&#039;}} : Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung. [[http://research.google.com/archive/gfs-sosp2003.pdf|The Google File System]]. 19th ACM Symposium on Operating Systems Principles. 2003.
+;{{id=&#039;GLM2007&#039; &#039;&#039;&#039;[GLM2007]&#039;&#039;&#039;}} : A. Genkin, D. Lewis, and D. Madigan. [[http://www.stat.columbia.edu/~madigan/PAPERS/techno.pdf|Large-scale bayesian logistic regression for text categorization]]. Technometrics. Volume 49. Issue 3. pp. 291--304, 2007.
+;{{id=&#039;H2002&#039; &#039;&#039;&#039;[H2002]&#039;&#039;&#039;}} : T. Haveliwala. [[http://infolab.stanford.edu/~taherh/papers/topic-sensitive-pagerank.pdf|Topic-Sensitive PageRank]]. Proceedings of the Eleventh International World Wide Web Conference (Honolulu, Hawaii). 2002.
+;{{id=&#039;KSV2010&#039; &#039;&#039;&#039;[KSV2010]&#039;&#039;&#039;}} : Howard Karloff, Siddharth Suri, and Sergei Vassilvitskii. [[http://theory.stanford.edu/~sergei/papers/soda10-mrc.pdf|A Model of Computation for MapReduce]]. Proceedings of the ACM Symposium on Discrete Algorithms. 2010. pp. 938-948.
+;{{id=&#039;KC2004&#039; &#039;&#039;&#039;[KC2004]&#039;&#039;&#039;}} : Rohit Khare and Doug Cutting. [[http://www.master.netseven.it/files/262-Nutch.pdf|Nutch: A flexible and scalable open-source web search engine]]. CommerceNet Labs Technical Report 04. 2004.
+;{{id=&#039;LDH2010&#039; &#039;&#039;&#039;[LDH2010]&#039;&#039;&#039;}} : Jimmy Lin and Chris Dyer. [[http://www.umiacs.umd.edu/~jimmylin/MapReduce-book-final.pdf|Data-Intensive Text Processing with MapReduce]]. Synthesis Lectures on Human Language Technologies. Morgan and Claypool Publishers. 2010.
+;{{id=&#039;LM2006&#039; &#039;&#039;&#039;[LM2006]&#039;&#039;&#039;}} : Amy N. Langville and Carl D. Meyer. [[http://press.princeton.edu/titles/8216.html|Google&#039;s PageRank and Beyond]]. Princton University Press. 2006.
+;{{id=&#039;MRS2008&#039; &#039;&#039;&#039;[MRS2008]&#039;&#039;&#039;}} : C. D. Manning, P. Raghavan and H. Sch&uuml;tze. [[http://nlp.stanford.edu/IR-book/information-retrieval-book.html|Introduction to Information Retrieval]]. Cambridge University Press. 2008.
+;{{id=&#039;MKSR2004&#039; &#039;&#039;&#039;[MKSR2004]&#039;&#039;&#039;}} : G. Mohr, M. Kimpton, M. Stack, and I.Ranitovic. [[http://iwaw.europarchive.org/04/Mohr.pdf|Introduction to Heritrix, an archival quality web crawler]]. 4th International Web Archiving Workshop. 2004.
+;{{id=&#039;PTSHVC2011&#039; &#039;&#039;&#039;[PTSHVC2011]&#039;&#039;&#039;}} : Manish Patil, Sharma V. Thankachan, Rahul Shah, Wing-Kai Hon, Jeffrey Scott Vitter, Sabrina Chandrasekaran. [[http://www.ittc.ku.edu/~jsv/Papers/PTS11.InvertedIndexSIGIR.pdf|Inverted indexes for phrases and strings]]. Proceedings of the 34nth Annual International ACM SIGIR Conference on Research and Development in Information Retrieval. pp 555--564. 2011.
+;{{id=&#039;P1997a&#039; &#039;&#039;&#039;[P1997a]&#039;&#039;&#039;}} : J. Peek. [[http://www.usenix.org/publications/library/proceedings/ana97/summaries/monier.html|Summary of the talk: The AltaVista Web Search Engine]] by Louis Monier. USENIX Annual Technical Conference Anaheim. California. ;login: Volume 22. Number 2. April 1997.
+;{{id=&#039;P1997b&#039; &#039;&#039;&#039;[P1997b]&#039;&#039;&#039;}} : J. Peek. [[http://www.usenix.org/publications/library/proceedings/ana97/summaries/brewer.html|Summary of the talk: The Inktomi Search Engine by Louis Monier]]. USENIX Annual Technical Conference. Anaheim, California. ;login: Volume 22. Number 2. April 1997.
+;{{id=&#039;P1994&#039; &#039;&#039;&#039;[P1994]&#039;&#039;&#039;}} : B. Pinkerton. [[http://web.archive.org/web/20010904075500/http://archive.ncsa.uiuc.edu/SDG/IT94/Proceedings/Searching/pinkerton/WebCrawler.html|Finding what people want: Experiences with the WebCrawler]]. In Proceedings of the First World Wide Web Conference, Geneva, Switzerland. 1994.
+;{{id=&#039;P1980&#039; &#039;&#039;&#039;[P1980]&#039;&#039;&#039;}} : M.F. Porter. [[http://tartarus.org/~martin/PorterStemmer/def.txt|An algorithm for suffix stripping]]. Program. Volume 14 Issue 3. 1980. pp 130&minus;137. On the same website, there are [[http://snowball.tartarus.org/|stemmers for many other languages]].
+;{{id=&#039;PDGQ2006&#039; &#039;&#039;&#039;[PDGQ2006]&#039;&#039;&#039;}} : Rob Pike, Sean Dorward, Robert Griesemer, Sean Quinlan. [[http://research.google.com/archive/sawzall-sciprog.pdf|Interpreting the Data: Parallel Analysis with Sawzall]]. Scientific Programming Journal. Special Issue on Grids and Worldwide Computing Programming Models and Infrastructure.Volume 13. Issue 4. 2006. pp.227-298.
+;{{id=&#039;W2009&#039; &#039;&#039;&#039;[W2009]&#039;&#039;&#039;}} : Tom White. [[http://www.amazon.com/gp/product/1449389732/ref=pd_lpo_k2_dp_sr_1?pf_rd_p=486539851&amp;pf_rd_s=lpo-top-stripe-1&amp;pf_rd_t=201&amp;pf_rd_i=0596521979&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=0N5VCGFDA7V7MJXH69G6|Hadoop: The Definitive Guide]]. O&#039;Reilly. 2009.
+;{{id=&#039;ZCTSR2004&#039; &#039;&#039;&#039;[ZCTSR2004]&#039;&#039;&#039;}} : Hugo Zaragoza, Nick Craswell, Michael Taylor, Suchi Saria, and Stephen Robertson. [[http://trec.nist.gov/pubs/trec13/papers/microsoft-cambridge.web.hard.pdf|Microsoft Cambridge at TREC-13: Web and HARD tracks]]. In Proceedings of 3th Annual Text Retrieval Conference. 2004.
+
+[[Documentation#contents|Return to table of contents]].
+EOD;
+$public_pages["en-US"]["Download_Sent"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Download Sent Page
+
+author=Chris Pollett
+
+robots=NOINDEX, NOFOLLOW
+
+description=
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS{{center|
+==Download Email Sent !==
+
+You should receive your email to download Yioop software shortly.
+
+Before checking your email, please take this opportunity to use the button below to make a $10 contribution to support the Yioop project and its continued development at Seekquarry.com .
+}}
+
+{{center|
+[[https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=3B94XKR9GTPNG|((resource:Downloads:btn_donateCC_LG.gif|PayPal - The safer, easier way to pay online!))]]
+
+}}
+EOD;
+$public_pages["en-US"]["Downloads"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=
+
+title=Open Source Search Engine Software - Seekquarry :: Downloads
+
+author=Chris Pollett
+
+robots=
+
+description=
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS=Downloads=
+==Yioop Releases==
+
+The two most recent versions of Yioop are:
+
+*[[https://seekquarry.com/download/3.0.4|Version 3.0.4]]
+*[[https://seekquarry.com/download/2.10|Version 2.10]]
+
+==Support Services / Support Yioop==
+
+Too busy to set up or upgrade a Yioop search engine yourself? Or are you interested in paying for a new feature? Please write chris@pollett.org for a quote. We charge a flat rate for a single machine install; however, we do need access to the machine where you&#039;d like stuff installed. New feature prices depend on the scope of the feature and whether you allow the feature to be incorporated back into and licensed under the current Yioop GPLv3 license.
+
+Seekquarry, LLC is a company owned by Chris Pollett, the principal developer of Yioop. If you like Yioop and would like to show support for this project, please consider making a contribution.
+
+{{center|
+[[https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=3B94XKR9GTPNG|((resource:btn_donateCC_LG.gif|PayPal - The safer, easier way to pay online!))]]
+
+}}
+
+==Installation==
+
+The [[Install|Install Guides]] explain how to get Yioop to work in some common settings. The documentation page has information about the [[Documentation#Requirements|requirements]] of and [[Documentation#Installation%20and%20Configuration|installation]] procedure for Yioop.
+
+==Upgrading==
+
+Before upgrading, make sure to back up your data. Then download the latest version of Yioop and unzip it to the location you would like. Set the Search Engine Work Directory by the same method and to the same value as your old Yioop Installation. See the Installation section above for links to instructions on this, if you have forgotten how you did this. Knowing the old Work Directory location, should allow Yioop to complete the upgrade process.
+
+==Git Repository / Contributing Code==
+
+The Yioop git repository allows anonymous read-only access. If you would like to contribute to Yioop, just do a clone of the most recent code, make your changes, do a pull, and make a patch. For example, to clone the repository, assuming you have the git version control software installed, just type:
+
+
+&#039;&#039;&#039;git clone https://seekquarry.com/git/yioop.git&#039;&#039;&#039;
+
+The [[Coding|Yioop Coding Guidelines]] explain the form your code should be in when making a patch as well as how to create patches. You can create/update an issue in the [[http://www.seekquarry.com/mantis/|Yioop issue tracker]] describing what your patch solves and upload your patch. To contribute localizations, you can use the GUI interface in your own copy of Yioop to enter in your localizations. Next locate in the locale folder of your Yioop work directory the locale tag of the language you added translations for. Within this folder is a configure.ini file, just make an issue in the issue tracker and upload this file there.
+
+EOD;
+$public_pages["en-US"]["Install"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Yioop Install Guides
+
+author=Chris Pollett
+
+robots=
+
+description=
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS=Installation Guides=
+
+==Demo Install Video==
+A half hour demo of installing Yioop is available at yioop.com: [[http://www.yioop.com/?c=group&amp;a=wiki&amp;group_id=20&amp;arg=media&amp;page_id=26&amp;n=01%20Installing%20Yioop%20Demo.mp4|Yioop Install Demo]]. On the Yioop.com website the [[http://www.yioop.com/?c=group&amp;group_id=20&amp;arg=read&amp;a=wiki&amp;page_name=Main|Yioop Tutorials Wiki]] has video tutorials for several of Yioop&#039;s features. This wiki also illustrates the ability of Yioop software to do video streaming.
+
+==XAMPP on Windows==
+
+#Download [[http://www.apachefriends.org/en/xampp-windows.html|Xampp]]. These directions were tested on Xampp 5.6.11.
+#Install Xampp.
+#Open Control Panel. Go to System =&gt; Advanced system settings =&gt; Advanced. Click on Environment Variables. Look under System Variables and select Path. Click Edit. Tack onto the end of Variable Values:
+ ;C:\xampp\php;
+Click OK a bunch times to get rid of windows. Close the Control Panel window. Reopen it and go to the same place to make sure the path variable really was changed. I then restarted the machine to really make sure these settings took effect.
+#Use the Xampp control panel to start at least Apache.
+#Download [[Downloads|Yioop]].  Unzip it into
+ C:\xampp\htdocs
+Rename the downloaded folder yioop (so you now have a folder C:\xampp\htdocs\yioop). Point your browser at:
+ http://localhost/yioop/
+#You should see the Yioop landing page. Login with username root and empty password.
+#Now go to Yioop =&gt; Configure and alter the following settings:
+ Search Engine Work Directory: (don&#039;t change)
+ Default Language: (choose the language you want, or for now leave as English)
+ Debug Display: (don&#039;t change)
+ Search Access: (don&#039;t change)
+ Crawl Robot Name: TestBot
+ Robot Description: This bot is for test purposes. It respects robots.txt
+#Crawl Robot Name is what will appear together with a url to a bot.php page in the web server log files of sites you crawl. The bot.php page will display what you write in robot description. This should give contact information in case your robot misbehaves. Obviously, you should customize the above to what you want to say.
+#Go to Manage Machines and add a single machine under Add Machine:
+ Machine Name: Local
+ Machine Url: http://localhost/yioop/
+ Is Mirror: (uncheck)
+ Has Queue Server: (check)
+ Number of Fetchers 1
+ Submit
+#In Manage Machines, click ON on the queue server and on your fetcher. For your queue server and your fetcher, click on the log file link and make sure that after at most two minutes you are seeing new log entries.
+#Now go to Manage Crawls. Click on Options. Set the options you would like for your crawl. Click Save.
+#Type the name of the crawl and start crawl. Let it crawl for a while, until you see the Total URLs Seen &gt; 1.
+#Click stop crawl and wait for the crawl to appear in the previous crawls list. Set it as the default crawl. Then you can search using this index.
+
+
+==XAMPP on Mac OSX==
+
+#Download [[http://www.apachefriends.org/en/xampp-windows.html|Xampp]]. These directions were tested on Xampp 5.6.11.
+#Install Xampp.
+#After the install if the Xampp manager-osx.app is running quit it.
+#In a texteditor open the file:
+ /Applications/XAMPP/xamppfiles/etc/httpd.conf
+Locate the lines:
+ &lt;IfModule unixd_module&gt;
+ #
+ # If you wish httpd to run as a different user or group, you must run
+ # httpd as root initially and it will switch.
+ #
+ # User/Group: The name (or #number) of the user/group to run httpd as.
+ # It is usually good practice to create a dedicated user and group for
+ # running httpd, as with most system services.
+ #
+ User daemon
+ Group daemon
+ &lt;/IfModule&gt;
+Change User daemon to User your_mac_username and Group daemon to Group staff
+After the change, for me, those two lines became
+ User cpollett
+ Group staff
+These changes are not strictly necessary, but can eliminate headaches if you ever start running any of the Yioop applications at the terminal prompt under your user account. I am assuming if you are using Xampp, it is not for a production server.
+#Download [[Downloads|Yioop]].  Unzip it into
+ /Applications/XAMPP/xamppfiles/htdocs
+#Rename the downloaded folder yioop (so you now have a folder /Applications/XAMPP/xamppfiles/htdocs/yioop).
+#In a texteditor open the file:
+ /Applications/XAMPP/xamppfiles/htdocs/yioop/src/library/CrawlDaemon.php
+edit the line:
+ $php = &quot;php&quot;;
+change it to:
+ $php = &quot;/Applications/XAMPP/xamppfiles/bin/php&quot;;
+#Open the Terminal.app under Applications =&gt; Utilities and type the lines:
+ sudo chown -R your_mac_username /Applications/XAMPP/xamppfiles
+ sudo chown -R root /Applications/XAMPP/xamppfiles/manager-osx.app
+Here your_mac_username should be the same username you typed above.
+#Start Apache by double clicking on Xampp&#039;s manager-osx.app, choosing the Manage Servers tab, selecting Apache Web Server, and clicking start.
+#Point your browser at:
+ http://localhost/yioop/
+#You should see the Yioop landing page. Login with username root and empty password.
+#Now go to Yioop =&gt; Configure and alter the following settings:
+ Search Engine Work Directory: (don&#039;t change)
+ Default Language: (choose the language you want, or for now leave as English)
+ Debug Display: (don&#039;t change)
+ Search Access: (don&#039;t change)
+ Crawl Robot Name: TestBot
+ Robot Description: This bot is for test purposes. It respects robots.txt
+#Crawl Robot Name is what will appear together with a url to a bot.php page in the web server log files of sites you crawl. The bot.php page will display what you write in robot description. This should give contact information in case your robot misbehaves. Obviously, you should customize the above to what you want to say.
+#Go to Manage Machines and add a single machine under Add Machine:
+ Machine Name: Local
+ Machine Url: http://localhost/yioop/
+ Is Mirror: (uncheck)
+ Has Queue Server: (check)
+ Number of Fetchers 1
+ Submit
+#In Manage Machines, click ON on the queue server and on your fetcher. For your queue server and your fetcher, click on the log file link and make sure that after at most two minutes you are seeing new log entries.
+#Now go to Manage Crawls. Click on Options. Set the options you would like for your crawl. Click Save.
+#Type the name of the crawl and start crawl. Let it crawl for a while, until you see the Total URLs Seen &gt; 1.
+#Click stop crawl and wait for the crawl to appear in the previous crawls list. Set it as the default crawl. Then you can search using this index.
+
+==Wamp==
+
+#Download [[http://www.wampserver.com/en/|WampServer]]. These instructions were tested on the 64 bit version of WampServer 2.5 that came with PHP 5.5.
+#Download [[Downloads|Yioop]] Unzip it into
+ C:\wamp\www
+#Rename the downloaded folder yioop (so you should now have a folder C:\wamp\www\yioop).
+#Make sure php curl is enabled. To do this use the Wamp dock tool and navigate to wamp =&gt; php =&gt; extension. Turn on curl. This makes sure that curl is enabled in one of the php.ini files that WAMP uses...
+#Unfortunately, Wamp has two php.ini files. The one we just edited by doing this is in
+ C:\wamp\bin\apache\Apache2.4.9\bin
+You need to also edit the php.ini in
+ C:\wamp\bin\php\php5.5.12
+Depending on your version of Wamp the PHP version number may be different. Open this file in
+an editor and make sure the line:
+ extension=php_curl.dll
+doesn&#039;t have a semicolon in front of it.
+#Next go to control panel =&gt; system =&gt; advanced system settings =&gt; advanced =&gt; environment variables =&gt; system variables =&gt;path. Click edit and add to the path variable:
+ ;C:\wamp\bin\php\php5.5.12;
+Exit control panel, then re-enter to double check that path really was added to the end. #Restart your PC. Start Apache in Wampserver.
+#Go to http://localhost/yioop/ in a browser. You should see the default landing page for Yioop. Click Sign In and use the login: root and no password.
+#Now go to Yioop =&gt; Configure and alter the following settings:
+ Search Engine Work Directory: (don&#039;t change)
+ Default Language: (choose the language you want, or for now leave as English)
+ Debug Display: (don&#039;t change)
+ Search Access: (don&#039;t change)
+ Crawl Robot Name: TestBot
+ Robot Description: This bot is for test purposes. It respects robots.txt
+The crawl robot name is what will appear together with a url to a bot.php page in web server log files of sites you crawl. The bot.php page will display what you write in robot description. This should give contact information in case your robot misbehaves. Obviously, you should customize the above to what you want to say.
+#Go to Manage Machines. Add a single machine under Add Machine using the settings:
+ Machine Name: Local
+ Machine Url: http://localhost/yioop/
+ Is Mirror: (uncheck)
+ Has Queue Server: (check)
+ Number of Fetchers 1
+ Submit
+#Under Machine Information turn the Queue Server and Fetcher On.
+#Go to Manage Crawls. Click on the options to set up where you want to crawl. Type in a name for the crawl and click start crawl.
+#Let it crawl for a while, until you see the Total URLs Seen &gt; 1. Then click Stop Crawl and wait for the crawl to appear in the previous crawls list. Set it as the default crawl. You should be able to search using this index.
+
+==Mac OSX / Mac OSX Server==
+
+The instructions given here are for OSX Mountain Lion (10.8), OSX Mavericks (10.9) and OSX Yosemite (10.10), Apple changes the positions with which files can be found slightly between versions, so you might have to do a little exploration to find things for earlier OSX versions.
+
+#Turn on Apache with PHP enabled.
+#Not OSX Server: Traditionally, on (pre-Mountain Lion) OSX, one could go to Control Panel =&gt; Sharing, and turn on Web Sharing to get the web server running. This option was removed in Mountain Lion, however, from the command line (Terminal), one can type:
+ sudo apachectl start
+to start the Web server, and similarly,
+ sudo apachectl stop
+to stop it. Alternatively, to make it so the WebServer starts each time the machine is turned on one can type:
+ sudo defaults write /System/Library/LaunchDaemons/org.apache.httpdDisabled -bool false
+#By default, document root is /Library/WebServer/Documents. The configuration files for Apache in this setting are located in /etc/apache2. If you want to tweak document root or other Apache settings, look in the folder /etc/apache2/other and edit appropriate files such as httpd-vhosts.conf or httpd-ssl.conf . Before turning on Web Sharing / the web server, you need to edit the file /etc/apache2/httpd.conf. Replace
+ #LoadModule php5_module libexec/apache2/libphp5.so
+with
+ LoadModule php5_module libexec/apache2/libphp5.so
+you should also make sure that the rewrite_module is also being loaded.
+OSX Server: Pre-mountain Lion, OSX Server used /etc/apache2 to store its configuration files. Since Mountain Lion these files are in /Library/Server/Web/Config/apache2 . Within this folder, the sites folder holds Apache directives for specific virtual hosts. Make sure the &lt;Directory&gt; tag where you intend to install Yioop has AllowOverride set to All.
+#OSX Server comes with Server.app which will actively fight any direct tweaking to configuration files. From Server.app to get the web server running click on Websites. Make sure &quot;Enable PHP web applications&quot; is checked and Websites is On. The default web site is
+ /Library/Server/Web/Data/Sites/Default ,
+you probably want to click on + under websites and specify document root to be as you like.
+#For the remainder of this guide, we assume document root for the web server is: /Library/WebServer/Documents. [[Downloads|Download Yioop]], unpack it into /Library/WebServer/Documents, and rename the Yioop folder to yioop.
+#Chown this folder to the Webserver user:
+ chown -R _www yioop
+#You probably want to make sure Spotlight (Mac&#039;s built-in file and folder indexer) doesn&#039;t index this folder -- especially during a crawl -- or your system might really slow down. To prevent this, open Control Panel, choose Spotlight, select the Privacy tab, and add the above folder to the list of folder Spotlight shouldn&#039;t index. If you are storing crawls on an external drive, you might want to make sure that drive gets automounted without a login. This is useful in the event of a power failure that exceeds your backup power supply time. To do this you can write the preference:
+ sudo defaults write /Library/Preferences/SystemConfiguration/autodiskmount \
+     AutomountDisksWithoutUserLogin -bool true
+#This will mean the hard drive becomes available when the power comes back. To make your Mac restart when the power is back, under System Preferences =&gt; Energy Saver there is a check box next to &quot;Start up automatically after a power failure&quot;. Check it.
+#In a browser, go to the page http://localhost/yioop/ . You should see the default Yioop landing page. Sign-in using the login: root and no password. Now go to Yioop =&gt; Configure and alter the following settings:
+ Search Engine Work Directory: (don&#039;t change)
+ Default Language: (choose the language you want, or for now leave as English)
+ Debug Display: (don&#039;t change)
+ Search Access: (don&#039;t change)
+ Crawl Robot Name: TestBot
+ Robot Description: This bot is for test purposes. It respects robots.txt
+#Crawl Robot Name is what will appear together with a url to a bot.php page in web server log files of sites you crawl. The bot.php page will display what you write in robot description. This should give contact information in case your robot misbehaves. Obviously, you should customize the above to what you want to say.
+#Go to Manage Machines. Add a single machine under Add Machine using the settings:
+ Machine Name: Local
+ Machine Url: http://localhost/yioop/
+ Is Mirror: (uncheck)
+ Has Queue Server: (check)
+ Number of Fetchers 1
+ Submit
+#Under Machine Information turn the Queue Server and Fetcher On.
+#Go to Manage Crawls. Click on the options to set up where you want to crawl. Type in a name for the crawl and click start crawl.
+#Let it crawl for a while, until you see the Total URLs Seen &gt; 1.
+#Then click Stop Crawl and wait for the crawl to appear in the previous crawls list. Set it as the default crawl. You should be able to search using this index.
+
+==Ubuntu Linux / Debian (with Suhosin Hardening Patch)==
+
+The instructions described here have been tested on Ubuntu 12.04 LTS and Ubuntu 14.04 LTS.
+
+#Get PHP and Apache set-up by running the following commands as needed (you might have already done some):
+ sudo apt-get install curl
+ sudo apt-get install apache2
+ sudo apt-get install php5
+ sudo apt-get install php5-cli
+ sudo apt-get install php5-sqlite
+ sudo apt-get install php5-curl
+ sudo apt-get install php5-gd
+ sudo a2enmod rewrite
+#After this sequence, the files /etc/apache2/mods-enabled/php5.conf and /etc/apache2/mods-enabled/php5.load should exist and link to the corresponding files in /etc/apache2/mods-available. The last line above enables url rewriting in Apache and should create the file /etc/apache2/mods-enabled/rewrite.load. The configuration files for PHP are /etc/php5/apache2/php.ini (for the apache module) and /etc/php5/cli/php.ini (for the command-line interpreter). You want to make changes to both configurations. To get a feel for the changes you can make in a texteditor: ed, vi, nano, gedit, etc., modify the line:
+ post_max_size = 8M
+to
+ post_max_size = 32M
+This change is not strictly necessary, but will improve performance.
+#Debian&#039;s (not Ubuntu&#039;s) PHP version has the Suhosin hardening patch enabled by default. On Yioop before Version 0.941, this caused problems because Yioop made mt_srand calls which were ignored. To fix this you should add to the end of both php.ini files list above (alternatively, you could add to /etc/php5/apache2/conf.d/suhosin.ini and /etc/php5/cli/conf.d/suhosin.ini):
+ suhosin.srand.ignore = Off
+ suhosin.mt_srand.ignore = Off
+This modification is not needed for Version 0.941 and higher. Suhosin hardening also entails a second place where HTTP post requests are limited. You should also set suhosin.post.max_value_length to the same value you set for post_max_size.
+#Looking in the folders /etc/php5/apache2/conf.d and /etc/php5/cli/conf.d you can see which extensions are being loaded by php. Look for files curl.ini, gd.ini, sqlite.ini to know these extensions will be loaded.
+#The DocumentRoot for web sites (virtual hosts) served by an Ubuntu Linux machine is typically specified by files in /etc/apache2/sites-enabled. In this example, it was given in a file 000-default and specified to be /var/www/. We are going to install yioop into /var/www/yioop. The Yioop folder has an .htaccess with additional configuration directives for Apache. For these to work, you either need to add before
+the &lt;/VirtualHost&gt; tag in 000-default, lines like:
+ &lt;Directory /var/www/yioop &gt;
+     Options Indexes FollowSymLinks
+     AllowOverride all
+ &lt;/Directory&gt;
+or you need to take the lines from the .htaccess file and add them to a directory tag like the above.
+#Restart the web server after making your changes:
+ sudo apachectl stop
+ sudo apachectl start
+#[[Downloads|Download Yioop]], unpack it into /var/www and use mv to rename the Yioop folder to yioop.
+#In a browser, go to the page http://localhost/yioop/ . You should see the default search landing page for Yioop. Click sign in and use the login: root and no password.
+#Now go to Yioop =&gt; Configure and alter the following settings:
+ Search Engine Work Directory: (don&#039;t change)
+ Default Language: (choose the language you want, or for now leave as English)
+ Debug Display: (don&#039;t change)
+ Search Access: (don&#039;t change)
+ Crawl Robot Name: TestBot
+ Robot Description: This bot is for test purposes. It respects robots.txt
+The crawl robot name is what will appear together with a url to a bot.php page in web server log files of sites you crawl. The bot.php page will display what you write in robot description. This should give contact information in case your robot misbehaves. Obviously, you should customize the above to what you want to say.
+#Go to Manage Machines. Add a single machine under Add Machine using the settings:
+ Machine Name: Local
+ Machine Url: http://localhost/yioop/
+ Is Mirror: (uncheck)
+ Has Queue Server: (check)
+ Number of Fetchers 1
+ Submit
+#Under Machine Information turn the Queue Server and Fetcher On.
+#Go to Manage Crawls. Click on the options to set up where you want to crawl. Type in a name for the crawl and click start crawl.
+#Let it crawl for a while, until you see the Total URLs Seen &gt; 1.
+#Then click Stop Crawl and wait for the crawl to appear in the previous crawls list. Set it as the default crawl. You should be able to search using this index.
+
+==Centos Linux==
+
+These instructions were tested running a [[http://virtualboxes.org/images/centos/|Centos 7 image]] in [[https://www.virtualbox.org/|VirtualBox]]. To get started, log in, launch a terminal window, and su root.
+#CentOS makes use of Secure Linux (SELinux), which greatly restricts the ability of apache to do stuff. To keep things simple turn off SELinux, by edit the file /etc/sysconfig/selinux and setting SELINUX=disabled. Restart the machine.
+#The image we were using doesn&#039;t have Apache installed. At the site suggested for downloading CentOS VMs, some but not all of the images had the nano editor installed. These can be installed with the commands:
+ yum install httpd
+ yum install nano
+#If you didn&#039;t su root, then you will need to put sudo before all commands in this guide, and you will have to make sure the user you are running under is in the list of sudoers.
+#Apache&#039;s configuration files are in the /etc/httpd directory. To get rid of the default web landing page, we switch into the conf.d subfolder and disable welcome.conf. To do this, first type the commands:
+ cd /etc/httpd/conf.d
+ nano welcome.conf
+Then using the editor put #&#039;s at the start of each line and save the result. You also want
+to edit /etc/httpd/conf/httpd.conf to set AllowOverride All in between
+the &lt;Directory &quot;/var/www/html&quot;&gt; tags
+#Next we install git, php, and the various php extensions we need:
+ yum install git
+ yum install php
+ yum install php-mbstring
+ yum install php-sqlite3
+ yum install gd
+ yum install php-gd
+#The default Apache DocumentRoot under Centos is /var/www/html. We will install Yioop in a folder /var/www/html/yioop. This can be accessed by pointing a browser at http://127.0.0.1/yioop/ . To download Yioop to /var/www/html/yioop and to create a work directory, we run the commands:
+ cd /var/www/html
+ git clone http://seekquarry.com/git/yioop.git yioop
+ chown -R apache yioop
+#Restart/start the web server:
+ service httpd stop
+ service httpd start
+#Go to http://localhost/yioop/. You should see the default Yioop landing page.
+Then enter root for the username and blank for the password to login.
+#Now go to Yioop =&gt; Configure and input the following settings:
+ Search Engine Work Directory: (don&#039;t change)
+ Default Language: (choose the language you want, or for now leave as English)
+ Debug Display: (don&#039;t change)
+ Search Access: (don&#039;t change)
+ Crawl Robot Name: TestBot
+ Robot Description: This bot is for test purposes. It respects robots.txt
+ If you having problems with it please feel free to ban it.
+Crawl robot name is what will appear together with a url to a bot.php page in web server log files of sites you crawl. The bot.php page will display what you write in robot description. This should give contact information in case your robot misbehaves. Obviously, you should customize the above to what you want to say.
+#Go to Manage Machines. Add a single machine under Add Machine using the settings:
+ Machine Name: Local
+ Machine Url: http://localhost/yioop/
+ Is Mirror: (uncheck)
+ Has Queue Server: (check)
+ Number of Fetchers 1
+ Submit
+#Under Machine Information turn the Queue Server and Fetcher On.
+#Go to Manage Crawls. Click on the options to set up where you want to crawl. Type in a name for the crawl and click start crawl.
+#Let it crawl for a while, until you see the Total URLs Seen &gt; 1.
+#Then click Stop Crawl and wait for the crawl to appear in the previous crawls list. Set it as the default crawl. You should be able to search using this index.
+
+==CPanel==
+
+Generally, it is not practical to do your crawling in a cPanel hosted website. However, cPanel works perfectly fine for hosting the results of a crawl you did elsewhere. Here we briefly described how to do this. In capacity planning your installation, as a rule of thumb, you should expect your index to be of comparable size (number of bytes) to the sum of the sizes of the pages you downloaded.
+#Download Yioop to your local machine.
+#In cPanel go to File Manager and navigate to the place you want on your server to serve Yioop from. Click upload and choose your zip file so as to upload it to that location.
+#Select the uploaded file and click extract to extract the zip file to a folder. Reload the page. Rename the extracted folder, if necessary.
+#For the rest of these instructions, let&#039;s assume it was mysite where the testing is being done. If at this point one browsed to:
+ http://mysite.my/yioop/
+you should see the landing page of your Yioop instance. You can sign in to this instance using the username root and a blank password.
+#Go to Manage account and give yourself a better login and password.
+#Go to Configure. Look at Component Check and make sure it says Checks Passed. Otherwise,
+you might have to ask your site provider to upgrade things.
+#cPanel machines tend to be underpowered so you might want to crawl elsewhere using one of
+the other install guides then upload the crawl results to your cPanel site.
+#After performing a crawl, go to Manage Crawls on the machine where you preformed the crawl. Look under Previous Crawls and locate the crawl you want to upload. Note its timestamp.
+#Go to THIS_MACHINES_WORK_DIRECTORY/cache . Locate the folder IndexDatatimestamp. where timestamp is the timestamp of the crawl you want. ZIP this folder.
+#In FileManager, under cPanel on the machine you want to host your crawl, navigate to
+    yioop_data/cache.
+#Upload the ZIP and extract it.
+#Go to Manage Crawls on this instance of Yioop, locate this crawl under Previous Crawls, and set it as the default crawl. You should now be able to search and get results from the crawl.
+
+You will probably want to uncheck Cache in the Page Options &gt;Search Time activity as in this hosted setting it is somewhat hard to get the cache page feature (where it let&#039;s users see complete caches of web-page by clicking a link) of Yioop to work.
+
+==HipHop (hhvm)==
+
+[[https://github.com/facebook/hhvm/wiki|hhvm]] is Facebook&#039;s open-source virtual machine for executing PHP. It can offer a significant speed-up in performance over running the traditional PHP interpreter before PHP 7. We will be discussing installing hhvm, not the earlier HipHop compiler.  For the remainder of this section, we describe how to get a Yioop instance up and running under Ubuntu 14.04 LTS using hhvm with apache and fast-cgi.
+#To begin, get hhvm from GitHub. To do this execute the following commands so that apt-get knows about the hhvm repository:
+ sudo apt-get install software-properties-common
+ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
+ sudo add-apt-repository &#039;deb http://dl.hhvm.com/ubuntu trusty main&#039;
+then update the package index:
+ sudo apt-get update
+and install hhvm using apt-get:
+ sudo apt-get install hhvm
+#We will run hhvm using fast-cgi. To set this up type:
+ sudo /usr/share/hhvm/install_fastcgi.sh
+# If your document root is not in the default location you should edit:
+ /etc/apache2/mods-enabled/hhvm_proxy_fcgi.conf
+so that the ProxyPass line points to your document root. In our case, we switched it
+to /var/www/yioop
+# Enable the mod_rewrites module for Apache so the URL rewriting works:
+ sudo a2enmod rewrite
+# Under the /etc/apache2/sites-enabled, locate the .conf file for the site where you intend
+to run Yioop from. For example, this might be the file 000-default.conf. Edit this file
+so that you either have a either a &lt;Directory&gt; tag for Yioop&#039;s folder path with the contents of Yioop&#039;s .htaccess file, or where the &lt;Directory&gt; tag responsible for Yioop&#039;s folder path has AllowOverride all, so that the .htaccess file in Yioop&#039;s .htaccess file can properly do redirects.
+#The official hhvm site recommends the following two line which might already have been executed
+by the above script:
+ sudo /etc/init.d/hhvm restart
+ sudo /etc/init.d/apache2 restart
+For the purposes of figuring out when error issues it is often convenient to look at the error.log file by running:
+ tail -n 500 /var/log/hhvm/error.log
+This is the location specified by the configuration file. The two configuration files for hhvm, php.ini and server.ini, can be found in /etc/hhvm allow you to control this location. If the directory /var/log/hhvm does not exist, you should create it:
+ sudo mkdir /var/log/hhvm
+#[[Downloads|Download Yioop]], unpack it into /var/www . If you didn&#039;t install apache2 then you might need to do mkdir to make this folder. Next use mv to rename the Yioop folder to yioop.
+#In a browser, go to the page http://localhost/ . You should see the default Yioop landing page.
+You can sign in to Yioop by clicking Sign In, then using root as the username and a blank password.
+#Now go to Yioop =&gt; Configure and alter the following settings:
+ Search Engine Work Directory: (don&#039;t change)
+ Default Language: (choose the language you want, or for now leave as English)
+ Debug Display: (don&#039;t change)
+ Search Access: (don&#039;t change)
+ Crawl Robot Name: TestBot
+ Robot Description: This bot is for test purposes. It respects robots.txt
+ If you having problems with it please feel free to ban it.
+The crawl robot name is what will appear together with a url to a bot.php page in web server log files of sites you crawl. The bot.php page will display what you write in robot description. This should give contact information in case your robot misbehaves. Obviously, you should customize the above to what you want to say.
+#Go to Manage Machines. Add a single machine under Add Machine using the settings:
+ Machine Name: Local
+ Machine Url: http://localhost/
+ Is Mirror: (uncheck)
+ Has Queue Server: (check)
+ Number of Fetchers 1
+ Submit
+#Under Machine Information turn the Queue Server and Fetcher On. For this to work, the User that the web_server runs under has to have write permissions on it own home directory as hhvm will try to write stuff there. For example, on Ubuntu apache is run under user www-data whose home directory is /var/www.
+#Go to Manage Crawls. Click on the options to set up where you want to crawl. Type in a name for the crawl and click start crawl.
+#Let it crawl for a while, until you see the Total URLs Seen &gt; 1.
+#Then click Stop Crawl and wait for the crawl to appear in the previous crawls list. Set it as the default crawl. You should be able to search using this index.
+#If you prefer to run the fetcher&#039;s and queue_server&#039;s from the command line make sure to use hhvm rather than php. I.e.,
+ cd /var/www/yioop/bin
+ hhvm -f fetcher.php terminal
+
+==Systems with Multiple Queue Servers==
+
+This section assumes you have already successfully installed and performed crawls with Yioop in the single queue_server setting and have succeeded to use the Manage Machines to start and stop a queue_server and fetcher. If not, you should consult one of the installation guides above or the general [[Documentation|Yioop Documentation]].
+
+Before we begin, what are the advantages in using more than one queue_server?
+
+#If the queue_servers are running on different processors then they can each be indexing part of the crawl
+data independently and so this can speed up indexing.
+#After the crawl is done, the index will typically exist on multiple machines and each needs to search
+a smaller amount of data before sending it to the name server for final merging. So queries can be faster.
+
+For the purposes of this note we will consider the case of two queue servers,
+the same idea works for more. To keep things especially simple, we have both of these queue servers  on the same laptop. Advantages (1) and (2) will likely not apply in this case, but we are describing  this for testing purposes -- you can take the same idea and have the queue servers on different machines after going through this tutorial.
+
+#Download and install yioop as you would in the single queue_server case. But do this twice. For example, on your machine, under document root you might have two subfolders
+ git/yioop1
+and
+ git/yioop2
+each with a complete copy of yioop. We will use the copy git/yioop1 as an instance of Yioop with both a name_server and a queue_server; the git/yioop2 will be an instance with just a queue_server.
+#You should leave the work directories of these two instances at their default values.
+So work directories of these two instances should be different! For each crawl in the multiple queue server setting, each instance will have a copy of those documents it is responsible for. So if we did a crawl with timestamp 10, each instance would have a WORK_DIR/cache/IndexData10 folder and these folders would be disjoint from any other instance.
+#On the Configure page for each instance, make sure under the Search Access fieldset Web, RSS, and API are checked.
+#Next click on Server Settings. Make sure the name server and server key are the same for both instances. I.e., In the Name Server Set-up fieldset, one might set:
+ Server Key:123
+ Name Server URL:http://localhost/git/yioop1/
+The Crawl Robot Name should also be the same for the two instances, say:
+ TestBotFeelFreeToBan
+but we want the Robot Instance to be different, say 1 and 2.
+#Go to the Manage Machine element for git/yioop1, which is the name server. Only the name server needs to manage machines, so we won&#039;t do this for git/yioop2 (or for any other queue servers if we had them).
+#Add machines for each Yioop instance we want to manage with the name server. In this particular case, fill out and submit the Add Machine form twice, the first time with:
+ Machine Name:Local1
+ Machine Url:http://localhost/git/yioop1/
+ Is Mirror: unchecked
+ Has Queue Server: checked
+ Num Fetchers: 1
+the second time with:
+ Machine Name:Local2
+ Machine Url:http://localhost/git/yioop2/
+ Is Mirror: unchecked
+ Has Queue Server: checked
+ Num Fetchers: 1
+#The Machine Name should be different for each Yioop instance, but can otherwise be whatever you want. Is Mirror controls whether this is a replica of some other node -- I&#039;ll save that for a different install guide at some point. If we wanted to run more fetchers we could have chosen a bigger number for Num Fetchers (fetchers are the processes that download web pages).
+#After the above steps, there should be two machines listed under Machine Information. Click the On button on the queue server and the fetcher of both of them. They should turn green. If you click the log link you should start seeing new messages (it refreshes once every 30 seconds) after at most a minute or so.
+#At this point you are ready to crawl in the multiple queue server setting. You can use Manage Crawl to set-up, start and stop a crawl exactly as in the single queue_server setting.
+#Perform a crawl and set it as the default index. You can then turn off all the queue servers and fetchers in Manage Machines, if you like.
+#If you type a query into the search bar of the name server (git/yioop1), you should be getting merged results from both queue servers. To check if this is working... Under configure on the name server (git/yioop1) make sure Query Info is checked and that Use Memcache and Use FileCache are not checked -- the latter two are for testing, we can check them later when we know things are working. When you perform a query now, at the bottom of the page you should see a horizontal rule followed by Query Statistics followed by all the queries performed in calculating results. One of these should be PHRASE QUERY. Underneath it you should see Lookup Offset Times and beneath this Machine Subtimes: ID_0 and ID_1. If these appear you know its working.
+
+When a query is typed into the name server it tacks no:network onto it and asks it of all the queue servers. It then merges the results. So if you type &quot;hello&quot; as the search, i.e., if you go to the url
+ http://localhost/git/yioop1/?q=hello
+the git/yioop1 script will make in parallel the curl requests
+ http://localhost/git/yioop1/?q=hello&amp;ne ... alse&amp;raw=1
+    (raw=1 means no grouping)
+ http://localhost/git/yioop2/?q=hello&amp;ne ... alse&amp;raw=1
+get the results back, and merges them. Finally, it returns to the user the result. The network=false tells http://localhost/git/yioop1/ to actually do the query lookup rather than make a network request.
+EOD;
+$public_pages["en-US"]["Main"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Open Source Search Engine Software - Seekquarry
+
+author=Chris Pollett
+
+robots=
+
+description=SeekQuarry provides open source search technologies
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS=Open Source Search Engine Software!=
+
+SeekQuarry is the parent site for [[https://www.yioop.com/|Yioop]]. Yioop is a [[http://gplv3.fsf.org/|GPLv3]], open source, PHP search engine.
+
+==What can Yioop do?==
+
+Yioop software provides many of the same features of larger search portals:
+
+*&#039;&#039;&#039;Search Results.&#039;&#039;&#039; Yioop comes with a crawler which can be used to crawl the open web or a selection of URLs of your choice. It also can index popular archive formats like Wikipedia XML-dumps, arc, warc, Open Directory Project-RDF, as well as dumps of emails or databases. Once you have created Yioop indexes of your desired data sources, Yioop can serve as a search engine for your data. It supports &quot;crawl mixes&quot; of different data sources. Yioop also provides tools to classify and sculpt your data before being used in search results.
+*&#039;&#039;&#039;News Service.&#039;&#039;&#039; News is best when it is still fresh. Yioop has a media updater process that can be used to re-index RSS and Atom feeds on an hourly basis. This more timely information can then be incorporated into Yioop search results.
+*&#039;&#039;&#039;Social Groups, Blogs, and Wikis.&#039;&#039;&#039; Yioop can be configured to allow users to create discussion groups, blogs, and wikis. If Yioop is configured to allow multiple users, then users can share mixes of crawls they create. Blogs and discussion group can be made public or private and posts can be made to expire if desired. Public ones have public RSS feeds and the better amongst these can be chosen for incorporation in what Yioop&#039;s news service indexes. Each group also comes with its own wiki. Images and video can be uploaded to both feeds and wiki pages and Yioop can be configured to automatically convert video to web viewable formats.
+*&#039;&#039;&#039;Web Sites.&#039;&#039;&#039; Yioop&#039;s wiki mechanism can be used to build websites. It also has a [[http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93adapter|Model View Adapter]] framework which can be easily extended to build customized search portal websites. Yioop can also be integrated into existing sites to provide search functionality either through an API, Open Search RSS, or JSON services. Yioop comes with stemmers, summarizers and other natural language processing tools that you can use as a package in your project via [[http://seekquarry.com/p/Composer|Composer]].
+
+==Requirements==
+
+The software and hardware requirements for Yioop are relatively low. At a minimum, you only need a web server such as Apache and PHP 5.4 or better. A test set-up consisting of three 2011 Mac Mini&#039;s each with 8GB RAM, a single name server, and five fetchers can crawl about 100 million pages in a month.
+
+EOD;
+$public_pages["en-US"]["Pricing"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Pricing for Yioop Software Services
+
+author=Chris Pollett
+
+robots=
+
+description=A summary of different pricing options for Yioop.
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS=Pricing=
+EOD;
+$public_pages["en-US"]["Ranking"] = <<< 'EOD'
+page_type=standard
+
+page_border=solid-border
+
+toc=true
+
+title=Open Source Search Engine Software - Seekquarry :: Ranking
+
+author=Chris Pollett
+
+robots=
+
+description=
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS{{id=&#039;contents&#039;
+=Yioop Search Engine Ranking Mechanisms=
+}}
+==Introduction==
+
+A typical query to Yioop is a collection of terms without the use of the OR operator, &#039;|&#039;, or the use of the exact match operator, double quotes. On such a query, called a &#039;&#039;&#039;conjunctive query&#039;&#039;&#039;, Yioop tries to return documents which contain all of the query terms. If the sequence of words is particular common, Yioop will try to return results which have that string with the same word order. Yioop further tries to return these documents in descending order of score. Most users only look at the first ten of the results returned. This article tries to explain the different factors which influence whether a page that has all the terms will make it into the top ten. To keep things simple we will assume that the query is being performed on a single Yioop index rather than a crawl mix of several indexes. We will also ignore how news feed items get incorporated into results.
+
+At its heart, Yioop relies on three main scores for a document: Doc Rank (DR), Relevance (Rel), and Proximity (Prox). Proximity scores are only used if the query has two or more terms. We will describe later how these three scores are calculated. For now one can think that the Doc Rank roughly indicates how important the document as a whole is, Relevance measures how important the search terms are to the document, and Proximity measures how close the search terms appear to each other on the document. In addition to these three basic scores, a user might select when they perform a crawl that a classifier be used for ranking purposes. After our initial discussion, we will say how we incorporate classifier scores.
+
+On a given query, Yioop does not scan its whole posting lists to find every document that satisfies the query. Instead, it scans until it finds a fixed number of documents, say n, satisfying the query or until a timeout is exceeded. In the case of a timeout, n is just the number of documents found by the timeout. It then computes the three scores for each of these n documents. For a document d from these n documents, it determines the rank of d with respect to the Doc Rank score, the rank of d with respect to the Relevance score, and the rank of d with respect to the Proximity score. It finally computes a score for each of these n documents using these three rankings and &#039;&#039;&#039;reciprocal rank fusion (RRF)&#039;&#039;&#039;:
+
+{{center|
+`mbox(RRF)(d) := 200(frac{1}{59 + mbox(Rank)_(mbox(DR))(d)} + frac{1}{59 + mbox(Rank)_(mbox(Rel))(d)} + frac{1}{59 +  mbox(Rank)_(mbox(Prox))(d)})`
+}}
+
+This formula essentially comes from Cormack et al. [ [[Ranking#CCB2009|CCB2009]] ]. They do not use the factor 200 and use 60 rather than 59. `mbox(RRF)(d)` is known to do a decent job of combining scores, although there are some recent techniques such as LambdaRank [ [[Ranking#VLZ2012|VLZ2012]] ], which do significantly better at the expense of being harder to compute. To return results, Yioop computes the top ten of these n documents with respect to `mbox(RRF)(d)` and returns these documents.
+
+It is relatively straightforward to extend the RRF(d) formula to handle scores coming from classifiers: One just adds additional reciprocal terms for each classifier score. For example, if `CL_1,...,CL_n` were the scores from the classifiers being used for ranking, then the formula would become:
+
+`mbox(RRF)(d) := frac{600}{n+3}(frac{1}{59 + mbox(Rank)_(mbox(DR))(d)} + frac{1}{59 + mbox(Rank)_(mbox(Rel))(d)} +`
+`\qquad\qquad\qquad frac{1}{59 + mbox(Rank)_(mbox(Prox))(d)} + sum_{i=1}^nfrac{1}{59 + mbox(Rank)_(mbox(CL)_i)(d)}).`
+
+To get a feeling for how the `mbox(RRF)(d)` formula works, let&#039;s return to the non-classifiers case and consider some particular example situations: If a document ranked 1 with respect to each score, then `mbox(RRF)(d) = 200(3/(59+1)) = 10`.  If a document ranked n for each score, then `mbox(RRF)(d) = 200(3/(59+n)) = 600/(59 + n)`. As `n -&gt; infty`, this goes to `0`. A value `n = 200` is often used with
+Yioop. For this `n`, `600/(59 + n) approx 2.32`. If a document ranked 1 on one of the three scores, but ranked `n` on the other two, `mbox(RRF)(d) = 200/60 + 400/(59 +n) approx 3.33 + 400/(59 + n)`. The last term again goes to 0 as `n` gets larger, giving a maximum score of `3.33`. For the `n=200` case, one gets a score of `4.88`. So because the three component scores are converted to ranks, and then reciprocal rank fusion is used, one cannot solely use a good score on one of the three components to get a good score overall.
+
+An underlying assumption used by Yioop is that the first `n` matching documents in Yioop&#039;s posting lists contain the 10 most important documents with respect to our scoring function. For this assumption to be valid our posting list must be roughly sorted according to score. For Yioop though, the first `n` documents will in fact most likely be the first `n` documents that Yioop indexed. This does not contradict the assumption
+provided we are indexing documents according to the importance of our documents. To do this Yioop tries to index according to Doc Rank and assumes the affects of relevance and proximity are not too drastic. That is, they might be able to move the 100th document into the top 10, but not say the 1000th document into the top 10.
+
+To see how it is possible to roughly index according to document importance, we next examine how data is acquired during a Yioop web crawl (the process for an archive crawl is somewhat different). This is not only important for determining the Doc Rank of a page, but the text extraction that occurs after the page is downloaded also affects the Relevance and Proximity scores. Once we are done describing these crawl/indexing time factors affecting scores, we will then consider search time factors which affect the scoring of documents and the actually formulas for Doc Rank, Relevance and Proximity.
+
+[[Ranking#contents|Return to table of contents]].
+
+==Crawl Time Ranking Factors==
+===Crawl Processes===
+
+To understand how crawl and indexing time factors affect search ranking, let&#039;s begin by first fixing in our minds how a crawl works in Yioop. A Yioop crawl has three types of processes that play a role in this:
+
+#A Name server, which acts as an overall coordinator for the crawl, and which is responsible for starting and stopping the crawl.
+#One or more Queue Servers, each of which maintain a priority queue of what to download next.
+#One or more Fetchers, which actually download pages, and do initial page processing.
+
+A crawl is started through the Yioop Web app on the Name Server. For each url in the list of starting urls (Seed Sites), its hostname is computed, a hash of the hostname is computed, and based on this hash, that url is sent to a given queue server -- all urls with the same hostname will be handled by the same queue server. Fetchers periodically check the Name Server to see if there is an active crawl, and if so, what its timestamp is. If there is an active crawl, a Fetcher would then pick a Queue Server and request a schedule of urls to download. By default, this can be as many as DOWNLOAD_SIZE_INTERVAL (defaults to 5000) urls.
+
+===Fetchers and their Effect on Search Ranking===
+
+Let&#039;s examine the fetcher&#039;s role in determining what terms get indexed, and hence, what documents can be retrieved using those terms. After receiving a batch of pages, the fetcher downloads pages in batches of a hundred pages at a time. When the fetcher requests a URL for download it sends a range request header asking for the first PAGE_RANGE_REQUEST (defaults to 50000) many bytes. Only the data in these byte has any chance of becoming terms which are indexed. The reason for choosing a fixed, relatively small size is so that one can index a large number of documents even with a relatively small amount of disk space. Some servers do not know how many bytes they will send before sending, they might operate in &quot;chunked&quot; mode, so after receiving the page, the fetcher discards any data after the first PAGE_RANGE_REQUEST many bytes -- this data won&#039;t be indexed. Constants that we mention such as PAGE_RANGE_REQUEST can be found in configs/config.php. This particular constant can actually be set from the admin panel under the Page Options - Crawl Time. For each page in the batch of a hundred urls downloaded, the fetcher proceeds through a sequence of processing steps to:
+
+#Determine page mimetype and choose a page processor.
+#Use the page processor to extract a summary for the document.
+#Apply any indexing plugins for the page processor to generate auxiliary summaries and/or modify the extracted summary.
+#Run classifiers on the summary and add any class labels and rank scores
+#Calculate a hash from the downloaded page minus tags and non-word characters to be used for deduplication.
+#Prune the number links extracted from the document down to MAX_LINKS_PER_PAGE (defaults to 50).
+#Apply any user-defined page rules to the summary extracted.
+#Store full-cache of page to disk, add the location of full cache to summary. Full cache pages are stored in folders in WORK_DIRECTORY/cache/FETCHER_PREFIX-ArchiveCRAWL_TIMESTAMP. These folder contain gzipped text files, web archives, each made up of the concatenation of up to NUM_DOCS_PER_GENERATION many cache pages. The class representing this whole structure is called a WebArchiveBundle (lib/web_archive_bundle.php). The class for a single file is called a WebArchive (lib/web_archive.php).
+#Keep summaries in fetcher memory until they are shipped off to the appropriate queue server in a process we&#039;ll describe later.
+
+After these steps, the fetcher checks the name server to see if any crawl parameters have changed or if the crawl has stopped before proceeding to download the next batch of a hundred urls. It proceeds in this fashion until it has downloaded and processed four to five hundred urls. It then builds a &quot;mini-inverted index&quot; of the documents it has downloaded and sends the inverted index, the summaries, any discovered urls, and any robots.txt data it has downloaded back to the queue server. It also sends back information on which hosts that the queue server is responsible for that are generating more than DOWNLOAD_ERROR_THRESHOLD (10) HTTP errors in a given schedule. These hosts will automatically be crawl-delayed by the queue server. Sending all of this data, allows the fetcher to clear some of its memory and continue processing its batch of 5000 urls until it has downloaded all of them. At this point, the fetcher picks another queue server and requests a schedule of urls to download from it and so on.
+
+Page rules, which can greatly effect the summary extracted for a page, are described in more detail in the [[Documentation#Page%20Indexing%20and%20Search%20Options|Page Options Section]] of the Yioop documentation. Before describing how the &quot;mini-inverted index&quot; processing step is done, let&#039;s examine Steps 1,2, and 6 above in a little more detail as they are very important in determining what actually is indexed. Based usually on the the HTTP headers, a [[http://en.wikipedia.org/wiki/Internet_media_type|mimetype]] for each page is found. The mimetype determines which summary extraction processor, in Yioop terminology, a page processor, is applied to the page. As an example of the key role that the page processor plays in what eventually ends up in a Yioop index, we list what the HTML page processor extracts from a page and how it does this extraction:
+
+;&#039;&#039;&#039;Language&#039;&#039;&#039;:
+Document language is used to determine how to make terms from the words in a document. For example, if the language is English, Yioop uses the English stemmer on a document. So the word &quot;jumping&quot; in the document will get indexed as &quot;jump&quot;. On the other hand, if the language was determined to be Italian then a different stemmer would be used and &quot;jumping&quot; would remain &quot;jumping&quot;. The HTML processor determines the language by first looking for a lang attribute on the &lt;html&gt; tag in the document. If none is found it checks if the frequency of characters is close enough to English to guess the document is English. If this fails it leaves the value blank.
+;&#039;&#039;&#039;Title&#039;&#039;&#039;:
+When search results are displayed, the extracted document title is used as the link text. Words in the title also are given a higher value when Yioop calculates its relevance statistic. The HTML processor uses the contents of the &lt;title&gt; tag as its default title. If this tag is not present or is empty, Yioop then concatenates the contents of the &lt;h1&gt; to &lt;h6&gt; tags in the document. The HTML processor keeps only the first hundred (HtmlProcessor::MAX_TITLE_LEN) characters of the title.
+;&#039;&#039;&#039;Description&#039;&#039;&#039;:
+The description is used when search results are displayed to generate the snippets beneath the result link. Besides title, it has the remainder on the page words that are used to identify a document. The HTML processor can obtain a description using one of two algorithms that can be set in page options. When using the basic summarizer, it first takes the value of the content attribute of any &lt;meta&gt; tag whose name attribute is some case invariant of &quot;description&quot;. To this it concatenates the non-tag contents of the first four &lt;p&gt; and &lt;div&gt; tags, followed by the content of &lt;td&gt;, &lt;li&gt;, &lt;dt&gt;, &lt;dd&gt;, and &lt;a&gt; tags until it reaches a maximum of HtmlProcessor::MAX_DESCRIPTION_LEN (2000) characters. These items are added from the one with the most characters to the one with the least. The HTML processor can also obtain a description using a centroid summarizer. Here it removes all tags from the documents and splits the document into sentences. Ignoring common words (stop words), an average sentence vector is calculated. The components of this vector are terms and the value for a component represents the likelihood that a sentence in this document has that term. Then the distance between each sentence and this centroid is calculated and the closest sentences are added to the summary one by one until HtmlProcessor::MAX_DESCRIPTION_LEN (2000) characters has been reached.
+;&#039;&#039;&#039;Links&#039;&#039;&#039;:
+Links are used by Yioop to obtain new pages to download. They are also treated by Yioop as &quot;mini-documents&quot;. The url of such a mini-document is the target website of the link, the link text is used as a description. As we will see during searching, these mini-documents get combined with the summary of the site linked to.The HTML processor extracts links from &lt;a&gt;, &lt;frame&gt;, &lt;iframe&gt;, and &lt;img&gt; tags. It extracts up to 300 links per document. When it extracts links it canonicalizes relative links. If a &lt;base&gt; tag was present, it uses it as part of the canonicalization process. Link text is extracted from &lt;a&gt; tag contents and from alt attributes of &lt;img&gt;&#039;s. In addition, rel attributes are examined for robot directives such as nofollow.
+;&#039;&#039;&#039;Robot Metas&#039;&#039;&#039;:
+This is used to keep track of any robot directives that occurred in meta tags in the document. These directives are things such a NOFOLLOW, NOINDEX, NOARCHIVE, and NOSNIPPET. These can affect what links are extracted from the page, whether the page is indexed, whether cached versions of the page will be displayable from the Yioop interface, and whether snippets can appear beneath the link on a search result page. The HTML processor does a case insensitive match on &lt;meta&gt; tags that contain the string &quot;robot&quot; (so it will treat such tags that contain robot and robots the same). It then extracts the directives from the content attribute of such a tag.
+
+The page processors for other mimetypes extract similar fields but look at different components of their respective document types.
+
+After the page processor is done with a page, pages which aren&#039;t robot.txt pages which also aren&#039;t sitemap pages, then pass through a pruneLinks method. This culls the up to 300 links that might have been extracted down to 50. To do this, for each link, the link text is gzipped and the length of the resulting string is determined. The 50 unique links of longest length are then kept. The idea is that we want to keep links whose text carry the most information. Gzipping is a crude way to eliminate text with lots of redundancies. The length then measures how much useful text is left. Having more useful text means that the link is more likely to be helpful to find the document.
+
+Now that we have finished discussing Steps 1,2, and 6, let&#039;s describe what happens when building a mini-inverted index. For the four to five hundred summaries that we have at the start of mini-inverted index step, we make associative arrays of the form:
+ term_id_1 =&gt; ...
+ term_id_2 =&gt; ...
+ ...
+ term_id_i =&gt;
+         ((summary_map_1, (positions in summary 1 that term i appeared) ),
+          (summary_map_2, (positions in summary 2 that term i appeared) ),
+           ...)
+ ...
+Term IDs are 20 byte strings. Terms might represent a single word or might represent phrases. The first 8 bytes of a term ID is the first 8 bytes of the md5 hash of the first word in the word or phrase. The next byte is used to indicate whether the term is a word or a phrase. If it is a word the remaining bytes are used to encode what kind of page the word occurs of (media:text, media:image, ... safe:true, safe:false, and some classifier labels if relevant). If it is a phrase, the remaining bytes encode various length hashes of the remaining words in the phrase. Summary map numbers are offsets into a table which can be used to look up a summary. These numbers are in increasing order of when the page was put into the mini-inverted index. To calculate a position of a term, the summary is viewed as a single string consisting of words extracted from the url concatenated with the summary title concatenated with the summary description. One counts the number of words from the start of this string. Phrases start at the position of their first word. Let&#039;s consider the case where we only have words and no phrases and we are ignoring the meta word info such as media: and safe:. Then suppose we had two summaries:
+ Summary 1:
+ URL: http://test.yioop.com/
+ Title: Fox Story
+ Description: The quick brown fox jumped over the lazy dog.
+
+ Summary 2: http://test.yioop2.com/
+ Title: Troll Story
+ Description: Once there was a lazy troll, P&amp;A, who lived on my
+     discussion board.
+The mini-inverted index might look like:
+ (
+     [test] =&gt; ( (1, (0)), (2, (0)) )
+     [yioop] =&gt;  ( (1, (1)) )
+     [yioop2] =&gt;  ( (2, (1)) )
+     [fox] =&gt; ( (1, (2, 7)) )
+     [stori] =&gt; ( (1, (3)), (2, (3)) )
+     [the] =&gt; ( (1, (4, 10)) )
+     [quick] =&gt; ( (1, (5)) )
+     [brown] =&gt; ( (1, (6)) )
+     [jump] =&gt; ( (1, (8)) )
+     [over] =&gt; ( (1, (9)) )
+     [lazi] =&gt; ( (1, (11)), (2, (8)) )
+     [dog] =&gt; ( (1, (12)) )
+     [troll] =&gt; ( (2, (2, 9)) )
+     [onc] =&gt; ( (2, (4)) )
+     [there] =&gt; ( (2, (5)) )
+     [wa] =&gt; ( (2, (6)) )
+     [a] =&gt; ( (2, (7))) )
+     [p_and_a] =&gt; ( (2, (10)) )
+     [who] =&gt; ( (2, (11)) )
+     [live] =&gt; ( (2, (12)) )
+     [on] =&gt; ( (2, (13)) )
+     [my] =&gt; ( (2, (14)) )
+     [discuss] =&gt; ( (2, (15)) )
+     [board] =&gt; ( (2, (16)) )
+ )
+The list associated with a term is called a &#039;&#039;&#039;posting list&#039;&#039;&#039; and an entry in this list is called a &#039;&#039;&#039;posting&#039;&#039;&#039;. Notice terms are stemmed when put into the mini-inverted index. Also, observe acronyms, abbreviations, emails, and urls, such as P&amp;A, will be manipulated before being put into the index. For some languages such as Japanese where spaces might not be placed between words, char-gramming is done instead. If two character char-gramming is used, the string: 源氏物語 (Tale of Genji) becomes 源氏 氏物 物語. A user query 源氏物 will, before look-up, be converted to the conjunctive query 源氏 氏物 and so would match a document containing 源氏物語.
+
+The effect of the meta word portion of a term ID in the single word term case is to split the space of documents containing a word like &quot;dog&quot; into disjoint subsets. This can be used to speed up queries like &quot;dog media:image&quot;, &quot;dog media:video&quot;. The media tag for a page can only be one of media:text, media:image, media:video; it can&#039;t be more than one. A query of just &quot;dog&quot; will actually be calculated as a disjoint union of the fixed, finitely many single word term ID which begin with the same 8 bytes hash as &quot;dog&quot;. A query of &quot;dog media:image&quot; will do a look up all term IDs with the same &quot;dog&quot; hash and &quot;media:image&quot; hash portion of the term ID. These term IDs will correspond to disjoint sets of documents which are process in order of doc offset.
+
+In the worst case to do a conjunctive query takes time proportional to the shortest posting list. To try to get a better guarantee on the runtime of queries, Yioop ties to use Term IDs for phrases are used to speed up queries in the case of multi-word queries. On a query like &quot;earthquake soccer&quot;, Yioop uses these term IDs to see how many documents have this exact phrase. If this is greater than a threshold (10), Yioop just does an exact phrase look up using these term IDs. If the number of query words is greater than three, Yioop always uses this mechanism to do look up. If the threshold is not met, Yioop checks if the threshold is met by all, but the last word, or by all but the first word. If so, it does the simpler conjunctive queries of the phrase plus the single word.
+
+Yioop does not store phrase term IDs for every phrase it has ever found on some document in its index. Instead, it follows the basic approach of [ [[Ranking#PTSHVC2011|PTSHVC2011]] ]. The main difference is that it stores data directly in its inverted index rather than their two ID approach. To get the idea of this approach, consider the stemmed document:
+ jack be nimbl jack be quick jack jump the candlestick
+The words that immediately follows each occurrence of &quot;jack be&quot; (nimbl, quick) in this document are not all the same. Phrases with this property are called &#039;&#039;&#039;maximal&#039;&#039;&#039;. The whole document &quot;jack be nimbl jack be quick jack jump the candlestick&quot; is also maximal and there is no prefix of it larger than &quot;jack be&quot; which is maximal. We would call this string &#039;&#039;&#039;conditionally maximal&#039;&#039;&#039; for &quot;jack be&quot;. When processing a document, Yioop builds a [[http://en.wikipedia.org/wiki/Suffix_tree|suffix tree]] for it in linear time using Ukkonen&#039;s algorithm [ [[Ranking#U1995|U1995]] ]. It uses this tree to quickly build a list of maximal phrases of up to 12 words and any prefixes for which they are conditionally maximal. Only such maximal phrases will be given term IDs and stored in the index. The term ID for such a phrase begins with the 8 byte hash of the prefix for which it is maximal. This is followed by hashes of various lengths for the remaining terms. The format used is specified in the documentation of utility.php&#039;s crawlHashPath function. To do an exact lookup of a phrase like &quot;jack be nimbl&quot;, it suffices to look up phrase term IDs which have their first 8 bytes either the hash of &quot;jack&quot;, &quot;jack be&quot;, or &quot;jack be nimbl&quot;. Yioop only uses phrase term IDs for lookup of documents not for calculations like proximity where it uses the actual words that make up the phrase to get a score.
+
+It should be recalled that links are treated as their own little documents and so will be treated as separate documents when making the mini-inverted index. The url of a link is what it points to not the page it is on. So the hostname of the machine that it points to might not be a hostname handled by the queue server from which the schedule was downloaded. In reality, the fetcher actually partitions link documents according to queue server that will handle that link, and builds separate mini-inverted indexes for each queue server. After building mini-inverted indexes, it sends to the queue server the schedule was downloaded from, inverted index data, summary data, host error data, robots.txt data, and discovered links data that was destined for it. It keeps in memory all the other inverted index data destined for other machines. It will send this data to the appropriate queue servers later -- the next time it downloads and processes data for these servers. To make sure this scales, the fetcher checks its memory usage, if it is getting low, it might send some of this data for other queue servers early.
+
+===Queue Servers and their Effect on Search Ranking===
+
+It is back on a queue server that the building blocks for the Doc Rank, Relevance and Proximity scores are assembled. To see how this happens we continue to follow the flow of the data through the web crawl process.
+
+To communicate with a queue server, a fetcher posts data to the web app of the queue server. The web app writes mini-inverted index and summary data into a file in the WORK_DIRECTORY/schedules/IndexDataCRAWL_TIMESTAMP folder. Similarly, robots.txt data from a batch of 400-500 pages is written to WORK_DIRECTORY/schedules/RobotDataCRAWL_TIMESTAMP, and &quot;to crawl&quot; urls are written to WORK_DIRECTORY/schedules/ScheduleDataCRAWL_TIMESTAMP. The Queue Server periodically checks these folders for new files to process. It is often the case that files can be written to these folders faster than the Queue Server can process them.
+
+A queue server consists of two separate sub-processes:
+
+;&#039;&#039;&#039;An Indexer &#039;&#039;&#039;:
+The indexer is responsible for reading Index Data files and building a Yioop index.
+;&#039;&#039;&#039;A Scheduler&#039;&#039;&#039; :
+The scheduler maintains a priority queue of what urls to download next. It is responsible for reading SchedulateData files to update its priority queue and it is responsible for making sure urls that urls forbidden by RobotData files do not enter the queue.
+
+When the Indexer processes a schedule IndexData file, it saves the data in an IndexArchiveBundle (lib/index_archive_bundle). These objects are serialized to folders with names of the form: WORK_DIRECTORY/cache/IndexDataCRAWL_TIMESTAMP . IndexArchiveBundle&#039;s have the following components:
+
+;&#039;&#039;&#039;summaries&#039;&#039;&#039;:
+This is a WebArchiveBundle folder containing the summaries of pages read from fetcher-sent IndexData files.
+;&#039;&#039;&#039;posting_doc_shards&#039;&#039;&#039;:
+This contains a sequence of inverted index files, shardNUM, called IndexShard&#039;s. shardX holds the postings lists for the Xth block of NUM_DOCS_PER_GENERATION many summaries. NUM_DOCS_PER_GENERATION default to 40000 if the queue server is on a machine with at least 2Gb of memory. shardX also has postings for the link documents that were acquired while acquiring these summaries.
+;&#039;&#039;&#039;generation.txt&#039;&#039;&#039;:
+Contains a serialized PHP object which says what is the active shard -- the X such that shardX will receive newly acquired posting list data.
+;&#039;&#039;&#039;dictionary&#039;&#039;&#039;:
+The dictionary contains a sequence of subfolders used to hold for each term in a Yioop index the offsets and length in each IndexShard where the posting list for that term are stored.
+
+Of these components posting_doc_shards are the most important with regard to page scoring. When a schedules/IndexData file is read, the mini-inverted index in it is appended to the active IndexShard. To do this append, all the summary map offsets, need to adjusted so they now point to locations at the end of the summary of the IndexShard to which data is being appended. These offsets thus provide information about when a document was indexed during the crawl process. The maximum number of links per document is usually 50 for normal documents and 300 for [[http://www.sitemaps.org/|sitemaps]]. Empirically, it has been observed that a typical index shard has offsets for around 24 times as many links summary map entries as document summary map entries. So roughly, if a newly added summary or link, d, has index DOC_INDEX(d) in the active shard, and the active shard is the GENERATION(d) shard, the newly added object will have
+
+&lt;blockquote&gt;
+\begin{eqnarray}
+\mbox{RANK}(d) &amp;=&amp; (\mbox{DOC_INDEX}(d) + 1) + (\mbox{AVG_LINKS_PER_PAGE} + 1) \times\\
+&amp;&amp;\mbox{NUM_DOCS_PER_GENERATION} \times \mbox{GENERATION}(d))\\
+&amp;=&amp; (\mbox{DOC_INDEX}(d) + 1) + 25 \times \\
+&amp;&amp;\mbox{NUM_DOCS_PER_GENERATION} \times \mbox{GENERATION}(d))
+\end{eqnarray}
+&lt;/blockquote&gt;
+
+To make this a score out of `10`, we can use logarithms:
+
+{{center|
+`mbox(DR)(d) = 10 - log_(10)(mbox(RANK)(d)).`
+}}
+
+Here `mbox(DR)(d)` is the Doc Rank for one link or summary item stored in a Yioop index. However, as we will see, this does not give us the complete value of Doc Rank for an item when computed at query time. There also some things to note about this formula:
+
+#Unlike PageRank [ [[Ranking#BP1998|BP1998]] ], it is not some kind of logarithm of a probability, it is the logarithm of a rank. A log probability would preserve information about relative importance of two pages. I.e., it could say something about how far apart things like the number 1 page was compared to the number 2 page. Doc Rank as measured so far does not do that.
+#The Doc Rank is a positive number and less than 10 provided the index of the given queue server has fewer than 10 billion items. Since to index 10 billion items using Yioop, you would probably want multiple queue servers, Doc Rank&#039;s likely remain positive for larger indexes.
+#If we imagined that Yioop indexed the web as a balanced tree starting from some seed node where RANK(i) labels the node i of the tree enumerated level-wise, then log25(RANK(d))=log10(RANK(d))log10(25) would be an estimate of the depth of a node in this tree. So Doc Rank can be viewed as an estimate of how far we are away from the root, with 10 being at the root.
+#Doc Rank is computed by different queue servers independent of each other for the same index. So it is possible for two summaries to have the same Doc Rank in the same index, provided they are stored on different queue servers.
+#For Doc Ranks to be comparable with each other for the same index on different queue servers, it is assumed that queue servers are indexing at roughly the same speed.
+
+Besides Doc Rank, Index shards are important for determining relevance and proximity scores as well. An index shard stores the number of summaries seen, the number of links seen, the sum of the lengths of all summaries, the sum of the length of all links. From these statistics, we can derive average summary lengths, and average link lengths. From a posting, the number of occurences of a term in a document can be calculated. These will all be useful statistics for when we compute relevance. As we will see, when we compute relevance, we use the average values obtained for the particular shard the summary occurs in as a proxy for their value throughout all shards. The fact that a posting contains a position list of the location of a term within a document will be use when we calculate proximity scores.
+
+We next turn to the role of a queue server&#039;s Scheduler process in the computation of a page&#039;s Doc Rank. One easy way, which is supported by Yioop, for a Scheduler to determine what to crawl next is to use a simple queue. This would yield roughly a breadth-first traversal of the web starting from the seed sites. Since high quality pages are often a small number of hops from any page on the web, there is some evidence [ [[Ranking#NW2001|NW2001]] ] that this lazy strategy is not too bad for crawling according to document importance. However, there are better strategies. When Page Importance is chosen in the Crawl Order dropdown for a Yioop crawl, the Scheduler on each queue server works harder to make schedules so that the next pages to crawl are always the most important pages not yet seen.
+
+One well-known algorithm for doing this kind of scheduling is called OPIC (Online Page Importance Computation) [ [[Ranking#APC2003|APC2003]] ]. The idea of OPIC is that at the start of a crawl one divides up an initial dollar of cash equally among the starting seed sites. One then picks a site with highest cash value to crawl next. If this site had `alpha` cash value, then when we crawl it and extract links, we divide up the cash and give it equally to each link. So if there were `n` links, each link would receive from the site `alpha/n` cash. Some of these sites might already have been in the queue in which case we add to their cash total. For URLs not in the queue, we add them to the queue with initial value `alpha/n`. Each site has two scores: Its current cash on hand, and the total earnings the site has ever received. When a page is crawled, its cash on hand is reset to `0`. We always choose as the next page to crawl from amongst the pages with the most cash (there might be ties). OPIC can be used to get an estimate of the importance of a page, by taking its total earnings and dividing it by the total earnings received by all pages in the course of a crawl.
+
+In the experiments conducted by the original paper, OPIC was shown to crawl in a better approximation to page rank order than breadth-first search. Bidoki and Yazdani [ [[Ranking#BY2008|BY2008]] ] have more recently proposed a new page importance measure DistanceRank, they also confirm that OPIC does better than breadth-first, but show the computationally more expensive Partial PageRank and Partial DistanceRank perform even better. Yioop uses a modified version of OPIC to choose which page to crawl next.
+
+To save a fair bit of crawling overhead, Yioop does not keep for each site crawled historical totals of all earnings a page has received. The cash-based approach is only used for scheduling. Here are some of the issues addressed in the OPIC-based algorithm employed by Yioop:
+
+#A Scheduler must ensure robots.txt files are crawled before any other page on the host. To do this, robots.txt files are inserted into the queue before any page from that site. Until the robots.txt file for a page is crawled, the robots.txt file receives cash whenever a page on that host receives cash.
+#A fraction `alpha` of the cash that a robots.txt file receives is divided amongst any sitemap links on that page. Not all of the cash is given. This is to prevent sitemaps from &quot;swamping&quot; the queue. Currently, `alpha` is set 0.25. Nevertheless, together with the last bullet point, the fact that we do share some cash, means cash totals no longer sum to one.
+#Cash might go missing for several reasons: (a) An image page, any other page, might be downloaded with no outgoing links. (b) A page might receive cash and later the Scheduler receives robots.txt information saying it cannot be crawled. (c) Round-off errors due to floating point precision. For these reasons, the Scheduler periodically renormalizes the total amount of cash..
+#A robots.txt file or a slow host might cause the Scheduler to crawl-delay all the pages on the host. These pages might receive sufficient cash to be scheduled earlier, but won&#039;t be, because there must be a minimum time gap between requests to that host.
+#When a schedule is made with a crawl-delayed host, URLs from that host cannot be scheduled until the fetcher that was processing them completes its schedule. If a Scheduler receives a &quot;to crawl&quot; url from a crawl-delayed host, and there are already MAX_WAITING_HOSTS many crawl-delayed hosts in the queue, then Yioop discards the url.
+#The Scheduler has a maximum, in-memory queue size based on NUM_URLS_QUEUE_RAM (320,000 urls in a 2Gb memory configuration). It will wait on reading new &quot;to crawl&quot; schedule files from fetchers if reading in the file would mean going over this count. For a typical, web crawl this means the &quot;to crawl&quot; files build up much like a breadth-first queue on disk.
+#To make a schedule, the Scheduler starts processing the queue from highest priority to lowest. The up to 5000 urls in the schedule are split into slots of 100, where each slot of 100 will be required by the fetcher to take a MINIMUM_FETCH_LOOP_TIME (5 seconds). Urls are inserted into the schedule at the earliest available position. If a URL is crawl-delayed it is inserted at the earliest position in the slot sufficient far from any previous url for that host to ensure that the crawl-delay condition is met.
+#If a Scheduler&#039;s queue is full, yet after going through all of the url&#039;s in the queue it cannot find any to write to a schedule, it goes into a reset mode. It dumps its current urls back to schedule files, starts with a fresh queue (but preserving robots.txt info) and starts reading in schedule files. This can happen if too many urls of crawl-delayed sites start clogging a queue.
+
+The actual giving of a page&#039;s cash to its urls is done in the Fetcher. We discuss it in the section on the queue server because it directly affects the order of queue processing. Cash in Yioop&#039;s algorithm is done in a different manner than in the OPIC paper. It is further handled differently for sitemap pages versus all other web pages. For a sitemap page with `n` links, let
+{{center|
+`\gamma = sum_(j=1)^n 1/j^2`.
+}}
+Let `C` denote the cash that the sitemap has to distribute. Then the `i`th link on the sitemap page receives cash
+{{center|
+`C_i = C/(gamma cdot i^2)`.
+}}
+One can verify that `sum_(i=1)^n C_i = C`. This weighting tends to favor links early in the sitemap and prevent crawling of sitemap links from clustering together too much. For a non-sitemap page, we split the cash by making use of the notion of a company level domain (cld). This is a slight simplification of the notion of a pay level domain (pld) defined in [ [[Ranking#LLWL2009|LLWL2009]]]. For a host of the form, something.2chars.2chars or blah.something.2chars.2chars, the company level domain is something.2chars.2chars. For example, for www.yahoo.co.uk, the company level domain is yahoo.co.uk. For any other url, stuff.2ndlevel.tld, the company level domain is 2ndlevel.tld. For example, for www.yahoo.com, the company level domain is yahoo.com. To distribute cash to links on a page, we first compute the company level domain for the hostname of the url of the page, then for each link we compute its company level domain. Let `n` denote the number of links on the page and let `s` denote the number of links with the same company level domain. If the cld of a link is the same as that the page, and the page had cash `C`, then the link will receive cash:
+{{center|
+`frac{C}{2n}`
+}}
+Notice this is half what it would get under usual OPIC. On the other hand, links to a different cld will receive cash:
+{{center|
+`frac{C - s times C/(2n)}{n-s}`
+}}
+The idea is to avoid link farms with a lot of internal links. As long as there is at least one link to a different cld, the payout of a page to its links will sum to C. If no links go out of the CLD, then cash will be lost. In the case where someone is deliberately doing a crawl of only one site, then this lost cash will get replaced during normalization, and the above scheme essentially reduces to usual OPIC.
+
+We conclude this section by mentioning that the Scheduler only affects when a URL is written to a schedule which will then be used by a fetcher. It is entirely possible that two fetchers get consecutive schedules from the same Scheduler, and return data to the Indexers not in the order in which they were scheduled. In which case, they would be indexed out of order and their Doc Ranks would not be in the order of when they were scheduled. The scheduling and indexing process is only approximately correct, we rely on query time manipulations to try to improve the accuracy.
+
+[[Ranking#contents|Return to table of contents]].
+
+==Search Time Ranking Factors==
+===Looking up Initial Links===
+
+We are at last in a position to describe how Yioop calculates the three scores Doc Rank, Relevance, and Proximity at query time. When a query comes into Yioop it goes through the following stages before an actual look up is performed against an index.
+
+#Control words are calculated. Control words are terms like m: or i: terms which can be used to select a mix or index to use. They are also commands like raw: which says what level of grouping to use, or no: commands which say not to use a standard processing technique. For example, no:guess (affects whether the next processing step is done), no:network, etc. For the remainder, we will assume the query does not contain control words.
+#An attempt is made to guess the semantics of the query. This matches keywords in the query and rewrites them to other query terms. For example, a query term which is in the form of a domain name, will be rewritten to the form of a meta word, site:domain. So the query will return only pages from the domain. Currently, this processing is in a nascent stage. As another example, if you do a search only on &quot;D&quot;, it will rewrite the search to be &quot;letter D&quot;.
+#Stemming or character `n`-gramming is done on the query and acronyms and abbreviations are rewritten. This is the same kind of operation that we did after generating summaries to extract terms.
+
+After going through the above steps, Yioop builds an iterator object from the resulting terms to iterate over summaries and link entries that contain all of the terms. As described in the section [[Ranking#Fetchers%20and%20their%20Effect%20on%20Search%20Ranking|Fetchers and their Effect on Search Ranking]], some or all of these terms might be whole phrases to reduce the need for computing expensive conjunctive queries. In the single queue server setting one iterator would be built for each term and these iterators would be added to an intersect iterator that would return documents on which all the terms appear. This intersect iterator has a timer associated with it to prevent it from running too long in the case of a conjunctive query of terms with long posting lists with small intersection. These iterators are then fed into a grouping iterator, which groups links and summaries that refer to the same document url. Recall that after downloading pages on the fetcher, we calculated a hash from the downloaded page minus tags. Documents with the same hash are also grouped together by the group iterator. The value `n=200` posting list entries that Yioop scans out on a query referred to in the introduction is actually the number of results the group iterator requests before grouping. This number can be controlled from the Yioop admin pages under Page Options &gt; Search Time &gt; Minimum Results to Group. The number `200` was chosen because on a single machine it was found to give decent results without the queries taking too long.
+
+In the multiple queue server setting, when the query comes in to
+the name server, a network iterator is built. This iterator poses the
+query to each queue server being administered by the
+name server. If `n=200`, the name server
+multiplies this value by the value
+Page Options &gt; Search Time &gt; Server Alpha, which we&#039;ll denote `alpha`. This defaults
+to 1.6, so the total is 320. It then divides this by the number
+of queue servers. So if there were 4 queue servers, one would have
+80. It then requests the first 80 results for the query from each
+queue server. The queue servers don&#039;t do grouping, but just
+send the results of their intersect iterators to the name server, which
+does the grouping.
+
+In both the networked and non-networked case, after the grouping phase Doc Rank, Relevance, and Proximity scores for each of the grouped results will have been determined. We then combine these three scores into a single score using the reciprocal rank fusion technique described in the introduction. Results are then sorted in descending order of score and output. What we have left to describe is how the scores are calculated in the various iterators mentioned above.
+
+To fix an example to describe this process, suppose we have a group
+`G&#039;` of items `i_j&#039;`, either pages or links that all refer to the same url.
+A page in this group means that at some point we downloaded the url and
+extracted a summary. It is possible for there to be multiple pages in a group
+because we might re-crawl a page. If we have another group `G&#039; &#039;` of items
+`i_k&#039; &#039;` of this kind such that the hash of the most recent page matches
+that of `G&#039;`, then the two groups are merged. While we are grouping, we are
+computing a temporary overall score for a group. The temporary score is used to
+determine which page&#039;s (or link&#039;s if no pages are present) summaries in a group
+should  be used as the source of url, title, and snippets. Let `G` be the
+group one gets performing this process after all groups with the same hash
+as `G&#039;` have been merged. We now describe how the individual items in `G`
+have their score computed, and finally, how these scores are combined.
+
+The Doc Rank of an item `d`, `mbox(DR)(d)`, is calculated according to the formula mentioned in the [[Ranking#Queue%20Servers%20and%20their%20Effect%20on%20Search%20Ranking|queue servers]] subsection:
+\begin{eqnarray}
+\mbox{RANK}(d) &amp;=&amp; (\mbox{DOC_INDEX}(d) + 1) + (\mbox{AVG_LINKS_PER_PAGE} + 1) \times\\
+&amp;&amp;\mbox{NUM_DOCS_PER_GENERATION} \times \mbox{GENERATION}(d))\\
+&amp;=&amp; (\mbox{DOC_INDEX}(d) + 1) + 25 \times \\
+&amp;&amp;\mbox{NUM_DOCS_PER_GENERATION} \times \mbox{GENERATION}(d))\\
+\mbox{DR}(d) &amp;=&amp; 10 - \log_{10}(\mbox{RANK}(d))
+\end{eqnarray}
+To compute the relevance of an item, we use a variant of BM25F [ [[Ranking#ZCTSR2004|ZCTSR2004]]].
+Suppose a query `q` is a set of terms `t`. View an item `d`  as a bag of
+terms, let `f_(t,d)` denote the frequency of the term `t` in `d`,
+let `N_t` denote the number of items containing `t` in the whole index
+(not just the group), let `l_d` denote the length of `d`, where length is
+the number of terms including repeats it contains, and
+let `l_{avg}` denote the average length of an item in the index. The basic
+BM25 formula is:
+\begin{eqnarray}
+\mbox{Score}_{\mbox{BM25}}(q, d) &amp;=&amp; \sum_{t \in q} \mbox{IDF}(t)
+\cdot \mbox{TF}_{\mbox{BM25}}(t,d), \mbox{ where }\\
+\mbox{IDF}(t) &amp;=&amp; \log(\frac{N}{N_t})\mbox{, and}\\
+\mbox{TF}_{\mbox{BM25}}(t,d) &amp;=&amp;
+\frac{f_{t,d}\cdot(k_1 +1)}{f_{t,d} + k_1\cdot ((1-b) + b\cdot(l_d / l_{avg}) )}
+\end{eqnarray}
+`mbox(IDF)(t)`, the inverse document frequency of `t`, in the above can be
+thought as measure of how much signal is provided by knowing that the term `t`
+appears in the document. For example, its value is zero if `t` is in every
+document; whereas, the more rare the term is the larger than value of
+`mbox(IDF)(t)`.
+`mbox(TF)_(mbox(BM25))` represents a normalized term frequency for `t`.
+Here `k_1 = 1.2` and `b=0.75` are tuned parameters which are set to values
+commonly used in the literature. `mbox(TF)_(mbox(BM25))` is normalized to
+prevent bias toward longer documents. Also, if one spams a document, filling
+it with many copies of the term `t`, we approach the limiting situation
+`lim_(f_(t,d) -&gt; infty) mbox(TF)_(mbox(BM25))(t,d) = k_1 +1`, which as one
+can see prevents the document score from being made arbitrarily larger.
+
+Yioop computes a variant of BM25F not BM25. This formula also
+needs to have values for things like `l_(avg)`, `N`, `N_t`. To keep the
+computation simple at the loss of some accuracy when Yioop needs these values
+it uses information from the statistics in the particular index shard of `d` as
+a stand-in. BM25F is essentially the same as BM25 except that it separates
+a document into components, computes the BM25 score of the document with
+respect to each component and then takes a weighted sum of these scores.
+In the case of Yioop, if the item is a page the two components
+are an ad hoc title and a description. Recall when making our position
+lists for a term in a documents that we concatenated url keywords,
+followed by title, followed by summary. So the first terms in the result
+will tend to be from title. We take the first AD_HOC_TITLE_LEN many terms
+from a document to be in the ad hoc title. We calculate an ad hoc title
+BM25 score for a term from a query being in the ad hoc title of an item.
+We multiply this by 2 and then compute a BM25 score of the term being in
+the rest of the summary. We add the two results. I.e.,
+{{center|
+`mbox(Rel)(q, d) = 2 times mbox(Score)_(mbox(BM25-Title))(q, d) + mbox(Score)_(mbox(BM25-Description))(q, d)`
+}}
+This score would be the relevance  for a single page item `d` with respect
+to `q`. For link items we don&#039;t
+separate into title and description, but can weight the BM25 score different
+than for a page (currently, though, the link weight is set to 1 by default).
+These three weights: title weight, description weight, and link weight can
+be set in Page Options &gt; Search Time &gt; Search Rank Factors .
+
+To compute the proximity score of an item `d` with respect to
+a query `q` with more than one term, we use the notion of a &#039;&#039;&#039;span&#039;&#039;&#039;.
+A span is an interval `[u_i, v_i]` of positions within `d` which contain
+all the terms (including repeats) in `q` such that no smaller interval contains
+all the terms (including repeats) . Given `d` we can calculate a proximity
+score as a sum of the inverse of the sizes of the spans:
+{{center|
+`mbox(Prox)(d) = sum(frac(1)(v_i - u_i + 1))`.
+}}
+This formula comes from Clark et al. [ [[Ranking#CCT2000|CCT2000]]] except that they use covers, rather than spans, where covers ignore repeats. For a page item, Yioop calculates separate proximity scores with respect to its ad hoc title and the rest of a summary. It then adds them with the same weight as was done for the BM25F relevance score. Similarly, link item proximities also have a weight factor multiplied against them.
+
+Now that we have described how to compute Doc Rank, Relevance, and Proximity
+for each item in a group, we now describe how to get these three values
+for the whole group. First, for proximity we take the max over all
+the proximity scores in a group. The idea is that since we are going
+out typically 200 results before grouping, each group has a relatively
+small number of items in it. Of these there will typically be at most
+one or two page items, and the rest will be link items. We aren&#039;t
+doing document length normalization for proximity scores and it might
+not make sense to do so for links data where the whole link text is relatively
+short. Thus, the maximum score in the group is likely to be that of a
+page item, and clicking the link it will be these spans the user will see.
+Let `[u]` denote all the items that would be grouped
+with url `u` in the grouping process, let `q` be a query.
+Let `Res(q)` denote results in the index satisfying query `q`, that is,
+having all the terms in the query. Then the
+proximity of `[u]` with respect to `q` is:
+\begin{eqnarray}
+\mbox{Prox}(q, [u]) &amp;=&amp; \mbox{max}_{i \in [u], i \in Res(q)}(\mbox{Prox}(q,i)).
+\end{eqnarray}
+For Doc Rank and Relevance, we split a group into subgroups based on
+the host name of where a link came from. So links from
+http://www.yahoo.com/something1 and http://www.yahoo.com/something2
+to a url `u` would have the same hostname http://www.yahoo.com/. A link from
+http://www.google.com/something1 would have hostname http://www.google.com/.
+We will also use a weighting `wt(i)` which has value `2` if `i` is
+a page item and the url of i is a hostname, and 1 otherwise.
+Let `mbox(Host)(i)` denote the set of hostnames for a page item `i`, and
+let `mbox(Host)(i)` denote the hostnames of the page `i` came from in the case
+of a link item. Let
+{{center|
+`H([u]) = { h \quad | h = mbox(Host)(i) \mbox ( for some ) i in [u]}`.
+}}
+Let `[u]_h` be the items in `[u]` with hostname `h`.
+Let `([u]_h)_j` denote the `j`th element of `[u]_h` listed out in order of
+Doc Rank except that the first page item found is listed as `i_0`.
+It seems reasonable if a particular host tells us the site `u` is great
+multiple times, the likelihood that we would have our minds swayed diminishes
+with each repeating. This motivates our formulas for Doc Rank and Relevance
+which we give now:
+\begin{eqnarray}
+\mbox{Rel}(q, [u]) &amp;=&amp; \sum_{h \in H([u])}
+\sum_{j=0}^{|[u]_h|}\frac{1}{2^j}wt(([u]_h)_j) \cdot \mbox{Rel}(q, ([u]_h)_j).\\
+\mbox{DR}(q, [u]) &amp;=&amp; \sum_{h \in H([u])}
+\sum_{j=0}^{|[u]_h|}\frac{1}{2^j}wt(([u]_h)_j) \cdot \mbox{DR}(q, ([u]_h)_j).
+\end{eqnarray}
+Now that we have described how Doc Rank, Relevance, and Proximity
+are calculated for groups, we have almost completed our description of the Yioop
+scoring mechanism in the conjunctive query case. After performing
+pre-processing steps on the query, Yioop retrieves the first `n`
+results from its index. Here `n` defaults to 200. It then groups the
+results and uses the formulas above to calculate the three scores
+for Doc Rank, Relevance, and Proximity. It then uses reciprocal rank
+fusion to combine these three scores into a single score, sorts the
+results by this score and returns to the user the top 10 of these
+results.
+
+===Final Reordering===
+The top 10 results produced in the last section are what is presented
+in a basic configuration of Yioop. It is possible to configure Yioop
+to make use of a thesaurus to reorder these 10 results before final
+presentation. When this is done, these 10 results are retrieved as
+described above. Yioop then does part of speech tagging on the original
+query. This is done with a simplified
+[[https://en.wikipedia.org/wiki/Brill_tagger|Brill tagger]] [ [[Ranking#B1992|B1992]] ].
+Using the tagged version of the query, it looks up each term for its part of
+speech in a thesaurus for the current language. This is currently only
+implemented for English and the thesaurus used is
+[[http://wordnet.princeton.edu/|WordNet]]. Possible synonyms for a term in
+Wordnet often have example sentences. If so, cosine or intersection rank
+scores of these sentences versus the original query are computed and the
+highest scoring synonym is selected. If there are no example sentences, then
+the first is selected. To calculate a cosine score we view the original query
+and the sentence as binary vectors where the coordinates of the vectors are
+labeled by terms. So, for example, the &quot;the&quot; coordinate of the original
+query would be 1 if the original query contained the word &quot;the&quot;. The dot
+product of these two vectors divided by their lengths, then gives the cosine
+of the angle between them, the cosine score. This scoring is done for each
+term. Then for each term in the original query, the query is modified by
+swapping it for its synonym. The number of documents for the modified query
+as a whole phrase is looked up in the index dictionary for the current index.
+The three phrases which occur most often in the dictionary are then
+selected. For each of the top 10 documents for the query, the sum of the
+cosine similarities of these three phrases with a documents summary is
+computed to get a thesaurus score. The ten documents are then sorted
+by this score and displayed.
+
+[[Ranking#contents|Return to table of contents]].
+
+==References==
+; {{id=&quot;APC2003&quot; &#039;&#039;&#039;[APC2003]&#039;&#039;&#039;}}: Serge Abiteboul and Mihai Preda and Gregory Cobena. [[http://leo.saclay.inria.fr/publifiles/gemo/GemoReport-290.pdf|Adaptive on-line page importance computation]]. In: Proceedings of the 12th international conference on World Wide Web. pp. 280-290. 2003.
+; {{id=&quot;BY2008&quot; &#039;&#039;&#039;[BY2008]&#039;&#039;&#039;}}: A. M. Z. Bidoki and Nasser Yazdani. [[http://goanna.cs.rmit.edu.au/~aht/tiger/DistanceRank.pdf|DistanceRank: An intelligent ranking algorithm for web pages]]. Information Processing and Management. Vol. 44. Iss. 2. pp. 877--892. March, 2008.
+; {{id=&quot;B1992&quot; &#039;&#039;&#039;[B1992]&#039;&#039;&#039;}}: Eric Brill. 1992. [[http://anthology.aclweb.org//A/A92/A92-1021.pdf|A simple rule-based part of speech tagger]]. In Proceedings of the third conference on Applied natural language processing (ANLC &#039;92). Association for Computational Linguistics. Stroudsburg, PA, USA. pp. 152--155.
+; {{id=&quot;BP1998&quot; &#039;&#039;&#039;[BP1998]&#039;&#039;&#039;}}: Brin, S. and Page, L. [[http://infolab.stanford.edu/~backrub/google.html|The Anatomy of a Large-Scale Hypertextual Web Search Engine]]. In: Seventh International World-Wide Web Conference (WWW 1998). April 14-18, 1998. Brisbane, Australia. 1998.
+; {{id=&quot;CCT2000&quot; &#039;&#039;&#039;[CCT2000]&#039;&#039;&#039;}}: Charles L. A. Clarke and Gordon V. Cormack and Elizabeth A. Tudhope. [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.12.1615&amp;rep=rep1&amp;type=pdf|Relevance Ranking for One to Three Term Queries]]. In: Information Processing Management. Vol. 36. Iss. 2. pp.291--311. 2000.
+; {{id=&quot;CCB2009&quot; &#039;&#039;&#039;[CCB2009]&#039;&#039;&#039;}}: Gordon V. Cormack and Charles L. A. Clarke and Stefan B&uuml;ttcher. [[http://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf|Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods]]. In: Proceedings of the 32nd Annual International ACM SIGIR Conference on Research and Development in Information Retrieval. pp.758--759. 2009.
+; {{id=&quot;LLWL2009&quot; &#039;&#039;&#039;[LLWL2009]&#039;&#039;&#039;}}: H.-T. Lee, D. Leonard, X. Wang, D. Loguinov. [[http://irl.cs.tamu.edu/people/hsin-tsang/papers/tweb2009.pdf|IRLbot: Scaling to 6 Billion Pages and Beyond]]. ACM Transactions on the Web. Vol. 3. No. 3. June 2009.
+; {{id=&quot;NW2001&quot; &#039;&#039;&#039;[NW2001]&#039;&#039;&#039;}}: Marc Najork and Janet L. Wiener. [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.102.9301&amp;rep=rep1&amp;type=pdf|Breadth-First Search Crawling Yields High-Quality Pages]]. Proceedings of the 10th international conference on World Wide Web. pp 114--118. 2001.
+; {{id=&quot;PTSHVC2011&quot; &#039;&#039;&#039;[PTSHVC2011]&#039;&#039;&#039;}}: Manish Patil, Sharma V. Thankachan, Rahul Shah, Wing-Kai Hon, Jeffrey Scott Vitter, Sabrina Chandrasekaran. [[http://www.ittc.ku.edu/~jsv/Papers/PTS11.InvertedIndexSIGIR.pdf|Inverted indexes for phrases and strings]]. Proceedings of the 34nth Annual International ACM SIGIR Conference on Research and Development in Information Retrieval. pp 555--564. 2011.
+; {{id=&quot;U1995&quot; &#039;&#039;&#039;[U1995]&#039;&#039;&#039;}}: Ukkonen, E. [[http://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf|On-line construction of suffix trees]]. Algorithmica. Vol. 14. Iss 3. pp. 249--260. 1995.
+; {{id=&quot;VLZ2012&quot; &#039;&#039;&#039;[VLZ2012]&#039;&#039;&#039;}}: Maksims Volkovs, Hugo Larochelle, and Richard S. Zemel. [[http://www.cs.toronto.edu/~zemel/documents/cikm2012_paper.pdf|Learning to rank by aggregating expert preferences]]. 21st ACM International Conference on Information and Knowledge Management. pp. 843-851. 2012.
+; {{id=&quot;ZCTSR2004&quot; &#039;&#039;&#039;[ZCTSR2004]&#039;&#039;&#039;}}: Hugo Zaragoza, Nick Craswell, Michael Taylor, Suchi Saria, and Stephen Robertson. [[http://trec.nist.gov/pubs/trec13/papers/microsoft-cambridge.web.hard.pdf|Microsoft Cambridge at TREC-13: Web and HARD tracks]]. In Proceedings of 3th Annual Text Retrieval Conference. 2004.
+
+[[Ranking#contents|Return to table of contents]].
+EOD;
+$public_pages["en-US"]["Resources"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Resources
+
+author=Chris Pollett
+
+robots=
+
+description=
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS=Resources=
+
+==User Resources==
+* [[Discussion|Discussion Boards]]
+* [[Install|Install Guides]]
+* [[Composer|Using Composer With Yioop]]
+* [[Ranking|Yioop Ranking Mechanisms]]
+* [[http://www.yioop.com/group/20/Main|Video Tutorials]]
+* [[Syntax|Yioop&#039;s Wiki Syntax]]
+
+
+==Developer Resources==
+* [[Coding|Coding Guidelines]]
+* [[http://www.seekquarry.com/mantis/|Issue Tracking]]
+* [[http://www.seekquarry.com/yioop-docs/|PHPDocumentor docs for Yioop source code]]
+* [[http://www.seekquarry.com/viewgit/|View Git of Yioop repository]]
+
+EOD;
+$public_pages["en-US"]["Syntax"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Yioop Wiki Syntax
+
+author=Chris Pollett
+
+robots=
+
+description=Describes the markup used by Yioop
+
+page_header=main_header
+
+page_footer=main_footer
+
+END_HEAD_VARS=Yioop Wiki Syntax=
+
+Wiki syntax is a lightweight way to markup a text document so that
+it can be formatted and drawn nicely by Yioop.
+This page briefly describes the wiki syntax supported by Yioop.
+
+==Headings==
+In wiki syntax headings of documents and sections are written as follows:
+
+&lt;nowiki&gt;
+=Level1=
+==Level2==
+===Level3===
+====Level4====
+=====Level5=====
+======Level6======
+&lt;/nowiki&gt;
+
+and would look like:
+
+=Level1=
+==Level2==
+===Level3===
+====Level4====
+=====Level5=====
+======Level6======
+
+==Paragraphs==
+In Yioop two new lines indicates a new paragraph. You can control
+the indent of a paragraph by putting colons followed by a space in front of it:
+
+&lt;nowiki&gt;
+: some indent
+
+:: a little more
+
+::: even more
+
+:::: that&#039;s sorta crazy
+&lt;/nowiki&gt;
+
+which looks like:
+
+: some indent
+
+:: a little more
+
+::: even more
+
+:::: that&#039;s sorta crazy
+
+==Horizontal Rule==
+Sometimes it is convenient to separate paragraphs or sections with a horizontal
+rule. This can be done by placing four hyphens on a line by themselves:
+&lt;nowiki&gt;
+----
+&lt;/nowiki&gt;
+This results in a line that looks like:
+----
+
+==Text Formatting Within Paragraphs==
+Within a paragraph it is often convenient to make some text bold, italics,
+underlined, etc. Below is a quick summary of how to do this:
+===Wiki Markup===
+{|
+|&lt;nowiki&gt;&#039;&#039;italic&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;italic&#039;&#039;
+|-
+|&lt;nowiki&gt;&#039;&#039;&#039;bold&#039;&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;&#039;bold&#039;&#039;&#039;
+|-
+|&lt;nowiki&gt;&#039;&#039;&#039;&#039;&#039;bold and italic&#039;&#039;&#039;&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;&#039;&#039;&#039;bold and italic&#039;&#039;&#039;&#039;&#039;
+|}
+
+===HTML Tags===
+Yioop also supports several html tags such as:
+{|
+|&lt;nowiki&gt;&lt;del&gt;delete&lt;/del&gt;&lt;/nowiki&gt;|&lt;del&gt;delete&lt;/del&gt;
+|-
+|&lt;nowiki&gt;&lt;ins&gt;insert&lt;/ins&gt;&lt;/nowiki&gt;|&lt;ins&gt;insert&lt;/ins&gt;
+|-
+|&lt;nowiki&gt;&lt;s&gt;strike through&lt;/s&gt; or
+&lt;strike&gt;strike through&lt;/strike&gt; &lt;/nowiki&gt;|&lt;s&gt;strike through&lt;/s&gt;
+|-
+|&lt;nowiki&gt;&lt;sup&gt;superscript&lt;/sup&gt; and
+&lt;sub&gt;subscript&lt;/sub&gt;&lt;/nowiki&gt;|&lt;sup&gt;superscript&lt;/sup&gt; and
+&lt;sub&gt;subscript&lt;/sub&gt;
+|-
+|&lt;nowiki&gt;&lt;tt&gt;typewriter&lt;/tt&gt;&lt;/nowiki&gt;|&lt;tt&gt;typewriter&lt;/tt&gt;
+|-
+|&lt;nowiki&gt;&lt;u&gt;underline&lt;/u&gt;&lt;/nowiki&gt;|&lt;u&gt;underline&lt;/u&gt;
+|}
+
+===Spacing within Paragraphs===
+The HTML entity
+&lt;nowiki&gt;&amp;nbsp;&lt;/nowiki&gt;
+can be used to create a non-breaking space. The tag
+&lt;nowiki&gt;&lt;br&gt;&lt;/nowiki&gt;
+can be used to produce a line break.
+
+==Preformatted Text and Unformatted Text==
+You can force text to be formatted as you typed it rather
+than using the layout mechanism of the browser using the
+&lt;nowiki&gt;&lt;pre&gt;preformatted text tag.&lt;/pre&gt;&lt;/nowiki&gt;
+Alternatively, a sequence of lines all beginning with a
+space character will also be treated as preformatted.
+
+Wiki markup within pre tags is still parsed by Yioop.
+If you would like to add text that is not parsed, enclosed
+it in `&lt;`nowiki&gt; `&lt;`/nowiki&gt; tags.
+
+==Styling Text Paragraphs==
+Yioop wiki syntax offers a number of templates for
+control the styles, and alignment of text for
+a paragraph or group of paragraphs:&lt;br /&gt;
+`{{`left| some text`}}`,&lt;br /&gt; `{{`right| some text`}}`,&lt;br /&gt;
+and&lt;br /&gt;
+`{{`center| some text`}}`&lt;br /&gt; can be used to left-justify,
+right-justify, and center a block of text. For example,
+the last command, would produce:
+{{center|
+some text
+}}
+If you know cascading style sheets (CSS), you can set
+a class or id selector for a block of text using:&lt;br /&gt;
+`{{`class=&quot;my-class-selector&quot; some text`}}`&lt;br /&gt;and&lt;br /&gt;
+`{{`id=&quot;my-id-selector&quot; some text`}}`.&lt;br /&gt;
+You can also apply inline styles to a block of text
+using the syntax:&lt;br /&gt;
+`{{`style=&quot;inline styles&quot; some text`}}`.&lt;br /&gt;
+For example, `{{`style=&quot;color:red&quot; some text`}}` looks
+like {{style=&quot;color:red&quot; some text}}.
+
+==Lists==
+The Yioop Wiki Syntax supported of ways of listing items:
+bulleted/unordered list, numbered/ordered lists, and
+definition lists. Below are some examples:
+
+===Unordered Lists===
+&lt;nowiki&gt;
+* Item1
+** SubItem1
+** SubItem2
+*** SubSubItem1
+* Item 2
+* Item 3
+&lt;/nowiki&gt;
+would be drawn as:
+* Item1
+** SubItem1
+** SubItem2
+*** SubSubItem1
+* Item 2
+* Item 3
+
+===Ordered Lists===
+&lt;nowiki&gt;
+# Item1
+## SubItem1
+## SubItem2
+### SubSubItem1
+# Item 2
+# Item 3
+&lt;/nowiki&gt;
+# Item1
+## SubItem1
+## SubItem2
+### SubSubItem1
+# Item 2
+# Item 3
+
+===Mixed Lists===
+&lt;nowiki&gt;
+# Item1
+#* SubItem1
+#* SubItem2
+#*# SubSubItem1
+# Item 2
+# Item 3
+&lt;/nowiki&gt;
+# Item1
+#* SubItem1
+#* SubItem2
+#*# SubSubItem1
+# Item 2
+# Item 3
+
+===Definition Lists===
+&lt;nowiki&gt;
+;Term 1: Definition of Term 1
+;Term 2: Definition of Term 2
+&lt;/nowiki&gt;
+;Term 1: Definition of Term 1
+;Term 2: Definition of Term 2
+
+==Tables==
+A table begins with {`|`  and ends with `|`}. Cells are separated with | and
+rows are separated with |- as can be seen in the following
+example:
+&lt;nowiki&gt;
+{|
+|a||b
+|-
+|c||d
+|}
+&lt;/nowiki&gt;
+{|
+|a||b
+|-
+|c||d
+|}
+Headings for columns and rows can be made by using an exclamation point, !,
+rather than a vertical bar |. For example,
+&lt;nowiki&gt;
+{|
+!a!!b
+|-
+|c|d
+|}
+&lt;/nowiki&gt;
+{|
+!a!!b
+|-
+|c|d
+|}
+Captions can be added using the + symbol:
+&lt;nowiki&gt;
+{|
+|+ My Caption
+!a!!b
+|-
+|c|d
+|}
+&lt;/nowiki&gt;
+{|
+|+ My Caption
+!a!!b
+|-
+|c|d
+|}
+Finally, you can put a CSS class or style attributes (or both) on the first line
+of the table to further control how it looks:
+&lt;nowiki&gt;
+{| class=&quot;wikitable&quot;
+|+ My Caption
+!a!!b
+|-
+|c|d
+|}
+&lt;/nowiki&gt;
+{| class=&quot;wikitable&quot;
+|+ My Caption
+!a!!b
+|-
+|c|d
+|}
+Within a cell attributes like align, valign, styles, and class can be used. For
+example,
+&lt;nowiki&gt;
+{|
+| style=&quot;text-align:right;&quot;| a| b
+|-
+| lalala | lalala
+|}
+&lt;/nowiki&gt;
+{|
+| style=&quot;text-align:right;&quot;| a| b
+|-
+| lalala | lalala
+|}
+
+==Math==
+
+Math can be included into a wiki document by either using the math tag:
+&lt;nowiki&gt;
+&lt;math&gt;
+\sum_{i=1}^{n} i = frac{(n+1)(n)}{2}
+&lt;/math&gt;
+&lt;/nowiki&gt;
+
+&lt;math&gt;
+\sum_{i=1}^{n} i = frac{(n+1)(n)}{2}
+&lt;/math&gt;
+
+==Adding Resources to a Page==
+
+Yioop wiki syntax supports adding search bars, audio, images, and video to a
+page. The magnifying class edit tool icon can be used to add a search bar via
+the GUI. This can also be added by hand with the syntax:
+&lt;nowiki&gt;
+{{search:default|size:small|placeholder:Search Placeholder Text}}
+&lt;/nowiki&gt;
+This syntax is split into three parts each separated by a vertical bar |. The
+first part search:default means results from searches should come from the
+default search index. You can replace default with the timestamp of a specific
+index or mix if you do not want to use the default. The second group size:small
+indicates the size of the search bar to be drawn. Choices of size are small,
+medium, and large. Finally, placeholder:Search Placeholder Text indicates the
+grayed out background text in the search input before typing is done should
+read: Search Placeholder Text. Here is what the above code outputs:
+
+{{search:default|size:small|placeholder:Search Placeholder Text}}
+
+Image, video and other media resources can be associated with a page by dragging
+and dropping them in the edit textarea or by clicking on the link click to select
+link in the gray box below the textarea. This would add wiki code such as
+
+&lt;pre&gt;
+( (resource:myphoto.jpg|Resource Description))
+&lt;/pre&gt;
+
+to the page. Only saving the page will save this code and upload the resource to
+the server. In the above myphoto.jpg is the resource that will be inserted and
+Resource Description is the alternative text to use in case the viewing browser
+cannot display jpg files. A list of media that have already been associated with
+a page appears under the Page Resource heading below the textarea. This
+table allows the user to rename and delete resources as well as insert the
+same resource at multiple locations within the same document. To add a resource
+from a different wiki page belonging to the same group to the current wiki
+page one can use a syntax like:
+
+&lt;pre&gt;
+( (resource:Documentation:ConfigureScreenForm1.png|The work directory form))
+&lt;/pre&gt;
+
+Here Documentation would be the page and ConfigureScreenForm1.png the resource.
+
+==Page Settings, Page Type==
+
+In edit mode for a wiki page, next to the page name, is a link [Settings].
+Clicking this link expands a form which can be used to control global settings
+for a wiki page.  This form contains a drop down for the page type, another
+drop down for the type of border for the page in non-logged in mode,
+a checkbox for whether a table of contents should be auto-generated from level 2
+and level three headings and then text
+fields or areas for the page title, author, meta robots, and page description.
+Beneath this one can specify another wiki page to be used as a header for this
+page and also specify another wiki page to be used as a footer for this page.
+
+The contents of the page title is displayed in the browser title when the
+wiki page is accessed with the  Activity Panel collapsed or when not logged in.
+Similarly, in the collapsed or not logged in mode, if one looks as the HTML
+page source for the page,  in the head of document, &lt;meta&gt; tags for author,
+robots, and description are set according to these fields. These fields can
+be useful for search engine optimization. The robots meta tag can be
+used to control how search engine robots index the page. Wikipedia has more information on
+[[https://en.wikipedia.org/wiki/Meta_element|Meta Elements]].
+
+The &#039;&#039;&#039;Standard&#039;&#039;&#039; page type treats the page as a usual wiki page.
+
+&#039;&#039;&#039;Page Alias&#039;&#039;&#039; type redirects the current page to another page name. This can
+be used to handle things like different names for the same topic or to do localization
+of pages. For example, if you switch the locale from English to French and
+you were on the wiki page dental_floss when you switch to French the article
+dental_floss might redirect to the page dentrifice.
+
+&#039;&#039;&#039;Media List&#039;&#039;&#039; type means that the page, when read, should display just the
+resources in the page as a list of thumbnails and links. These links for the
+resources go to a separate pages used to display these resources.
+This kind of page is useful for a gallery of
+images or a collection of audio or video files.
+
+&#039;&#039;&#039;Presentation&#039;&#039;&#039; type is for a wiki page whose purpose is a slide presentation. In this mode,
+....
+on a line by itself is used to separate one slide. If presentation type is a selected a new
+slide icon appears in the wiki edit bar allowining one to easily add new slides.
+When the Activity panel is not collapsed and you are reading a presentation, it just
+displays as a single page with all slides visible. Collapsing the Activity panel presents
+the slides as a typical slide presentation using the
+[[www.w3.org/Talks/Tools/Slidy2/Overview.html|Slidy]] javascript.
+EOD;
+$public_pages["en-US"]["advertise"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=none
+
+toc=true
+
+title=Advertise using Yioop
+
+author=Chris Pollett
+
+robots=
+
+description=A Description of Advertising Available at Yioop
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS==What Ad Services We Offer==
+EOD;
+$public_pages["en-US"]["bot"] = <<< 'EOD'
+title=Bot
+
+description=Describes the web crawler used with this
+web site
+END_HEAD_VARS
+==My Web Crawler==
+
+Please Describe Your Robot
+EOD;
+$public_pages["en-US"]["captcha_time_out"] = <<< 'EOD'
+title=Captcha/Recover Time Out
+END_HEAD_VARS
+==Account Timeout==
+
+A large number of captcha refreshes or recover password requests
+have been made from this IP address. Please wait until
+%s to try again.
+EOD;
+$public_pages["en-US"]["coding"] = <<< 'EOD'
+page_type=page_alias
+
+page_alias=coding
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS
+EOD;
+$public_pages["en-US"]["documentation"] = <<< 'EOD'
+page_type=page_alias
+
+page_alias=Documentation
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS
+EOD;
+$public_pages["en-US"]["downloads"] = <<< 'EOD'
+page_type=page_alias
+
+page_alias=Downloads
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS
+EOD;
+$public_pages["en-US"]["install"] = <<< 'EOD'
+page_type=page_alias
+
+page_alias=Install
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS
+EOD;
+$public_pages["en-US"]["main_footer"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS{{class=&quot;footer&quot;
+(c) 2015 Seekquarry, LLC - [[http://www.seekquarry.com/|Open Source Search Engine Software]]. [[About|About Seekquarry]].
+}}
+EOD;
+$public_pages["en-US"]["main_header"] = <<< 'EOD'
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS
+{{class=&quot;logo&quot; [[http://www.seekquarry.com|((resource:SeekQuarry.png|SeekQuarry))]]}}
+
+{{class=&quot;nav inline medium-font&quot;
+* [[Demos]]
+* [[Downloads]]
+* [[Documentation|Docs]]
+* [[https://yioop.com/group/212|Help]]
+* [[Resources]]
+* {{search:default|size:small|placeholder:Search}}
+
+}}
+EOD;
+$public_pages["en-US"]["privacy"] = <<< 'EOD'
+title=Privacy Policy
+
+description=Describes what information this site collects and retains about
+users and how it uses that information
+END_HEAD_VARS
+==We are concerned with your privacy==
+EOD;
+$public_pages["en-US"]["ranking"] = <<< 'EOD'
+page_type=page_alias
+
+page_alias=Ranking
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS
+EOD;
+$public_pages["en-US"]["register_time_out"] = <<< 'EOD'
+title=Create/Recover Account
+
+END_HEAD_VARS
+
+==Account Timeout==
+
+A number of incorrect captcha responses or recover password requests
+have been made from this IP address. Please wait until
+%s to access this site.
+EOD;
+$public_pages["en-US"]["resources"] = <<< 'EOD'
+page_type=page_alias
+
+page_alias=Resources
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS
+EOD;
+$public_pages["en-US"]["suggest_day_exceeded"] = <<< 'EOD'
+
+EOD;
+$public_pages["en-US"]["terms"] = <<< 'EOD'
+=Terms of Service=
+
+Please write the terms for the services provided by this website.
+EOD;
+//
+// Default Help Wiki Pages
+//
+/**
+ * Help wiki pages
+ * @var array
+ */$help_pages = [];
+$help_pages["en-US"]["Account_Registration"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Account Registration
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe Account Registration field-set is used to control how user&#039;s can obtain accounts on a Yioop installation.
+
+The dropdown at the start of this fieldset allows you to select one of four
+possibilities:
+* &#039;&#039;&#039;Disable Registration&#039;&#039;&#039;, users cannot register themselves, only the root
+account can add users.
+When Disable Registration is selected, the Suggest A Url form and link on
+the tool.php page is disabled as well, for all other registration type this
+link is enabled.
+* &#039;&#039;&#039;No Activation&#039;&#039;&#039;, user accounts are immediately activated once a user
+signs up.
+* &#039;&#039;&#039;Email Activation&#039;&#039;&#039;, after registering, users must click on a link which
+comes in a separate email to activate their accounts.
+If Email Activation is chosen, then the reset of this field-set can be used
+to specify the email address that the email comes to the user. The checkbox Use
+PHP mail() function controls whether to use the mail function in PHP to send
+the mail, this only works if mail can be sent from the local machine.
+Alternatively, if this is not checked like in the image above, one can
+configure an outgoing SMTP server to send the email through.
+* &#039;&#039;&#039;Admin Activation&#039;&#039;&#039;, after registering, an admin account must activate
+the user before the user is allowed to use their account.
+EOD;
+$help_pages["en-US"]["Ad_Server"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+title=Ad Server
+
+END_HEAD_VARS* The Ad Server field-set is used to control whether, where,
+and what external advertisements should be displayed by this Yioop instance.
+EOD;
+$help_pages["en-US"]["Add_Locale"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+toc=true
+
+title=Add Locale
+
+description=Help article describing how to add a Locale.
+
+END_HEAD_VARS==Adding a Locale==
+
+The Manage Locales activity can be used to configure Yioop for use with
+different languages and for different regions.
+
+* The first form on this activity allows you to create a new &amp;quot;Locale&amp;quot;
+-- an object representing a language and a region.
+* The first field on this form should be filled in with a name for the locale in
+the language of the locale.
+* So for French you would put :Fran&amp;ccedil;ais. The locale tag should be the
+IETF language tag.
+EOD;
+$help_pages["en-US"]["Adding_Examples_to_a_Classifier"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSTo train a classifier one needs to add positive and negative examples of the concept that is to be learned. One way to add positive (negative) examples is to select an existing crawl and then marking that all (respectively, none) are in the class using the drop down below.
+
+&lt;br /&gt;
+
+Another way to give examples is to pick an existing crawl, leave the dropdown set to label by hand. Then type some keywords to search for in the crawl you picked using the &#039;&#039;&#039;Keyword&#039;&#039;&#039; textfield and click &#039;&#039;&#039;Load&#039;&#039;&#039;. This will bring up a list of search results together with links &#039;&#039;&#039;In Class&#039;&#039;&#039;, &#039;&#039;&#039;Not in Class&#039;&#039;&#039;, and &#039;&#039;&#039;Skip&#039;&#039;&#039;. These can then be used to add positive or negative examples.
+
+&lt;br /&gt;
+
+When you are done adding example, click &#039;&#039;&#039;Finalize&#039;&#039;&#039; to have Yioop actually build the classifier based on your training.
+
+EOD;
+$help_pages["en-US"]["Allowed_to_Crawl_Sites"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Allowed to Crawl Sites&#039;&#039;&#039; is a list of urls (one-per-line) and domains that the crawler is allowed to crawl. Only pages that are on sub-sites of the urls listed here will be crawled.
+
+&lt;br /&gt;
+
+This textarea is only used in determining by can be crawled if &#039;&#039;&#039;Restrict Sites By Url&#039;&#039;&#039; is checked.
+
+&lt;br /&gt;
+
+A line like:
+&lt;pre&gt;
+  http://www.somewhere.com/foo/
+&lt;/pre&gt;
+would allow the url
+&lt;pre&gt;
+  http://www.somewhere.com/foo/goo.jpg
+&lt;/pre&gt;
+to be crawled.
+
+&lt;br /&gt;
+
+A line like:
+&lt;pre&gt;
+ domain:foo.com
+&lt;/pre&gt;
+would allow the url
+&lt;pre&gt;
+  http://a.b.c.foo.com/blah/
+&lt;/pre&gt;
+to be crawled.
+EOD;
+$help_pages["en-US"]["Arc_and_Re-crawls"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Crawl or Arc Folder to Re-index&#039;&#039;&#039; dropdown allows one to select a previous Yioop crawl or an archive to do another crawl of. Possible archives that can be index include Arc files,  Warc Files, Email, Database dump, Open Directory RDF dumps, Media Wiki dumps etc. Re-crawling an old crawl might be useful if you would like to do further processing of the records in the index. Besides containing previous crawls, the dropdown list is populated by looking at the WORK_DIRECTORY/archives folder for sub-folders containing an arc_description.ini file.
+
+&lt;br /&gt;
+
+{{right|[[https://www.seekquarry.com/?c=static&amp;p=Documentation#Archive%20Crawl%20Options| Learn More.]]}}
+
+EOD;
+$help_pages["en-US"]["Authentication_Type"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+title=Authentication Type
+
+END_HEAD_VARSThe Authentication Type field-set is used to control the protocol
+used to log people into Yioop.
+
+* Below is a list of Authentication types supported.
+** &#039;&#039;&#039;Normal Authentication&#039;&#039;&#039;, passwords are checked against stored as
+salted hashes of the password; or
+** &#039;&#039;&#039;ZKP (zero knowledge protocol) authentication&#039;&#039;&#039;, the server picks
+challenges at random and send these to the browser the person is logging in
+from, the browser computes based on the password an appropriate response
+according to the Fiat Shamir protocol.cThe password is never sent over the
+internet and is not stored on the server. These are the main advantages of
+ZKP, its drawback is that it is slower than Normal Authentication as to prove
+who you are with a low probability of error requires several browser-server
+exchanges.
+
+* You should choose which authentication scheme you want before you create many
+users as if you switch everyone will need to get a new password.
+EOD;
+$help_pages["en-US"]["Browse_Groups"] = <<< EOD
+page_type=standard
+page_border=solid-border
+toc=true
+title=Browse Groups
+END_HEAD_VARS==Creating or Joining a group==
+You can create or Join a Group all in one place using this Text field.
+Simply enter the Group Name You want to create or Join. If the Group Name
+already exists, you will simply join the group. If the group name doesn&#039;t
+exist, you will be presented with more options to customize and create your
+new Group.
+==Browse Existing Groups==
+You can use the [Browse] hyper link to browse the existing Groups.
+You will then be presented with a web form to narrow your search followed by
+a list of all visible groups to you beneath.
+{{right|[[https://www.seekquarry.com/?c=static&amp;p=Documentation#Managing%20Users,%20Roles,%20and%20Groups| Learn More..]]}}
+EOD;
+$help_pages["en-US"]["Captcha_Type"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Captcha Type
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe Captcha Type field set controls what kind of
+[[https://en.wikipedia.org/wiki/CAPTCHA|captcha]] will be used during account
+registration, password recovery, and if a user wants to suggest a url.
+
+* The choices for captcha are:
+** &#039;&#039;&#039;Text Captcha&#039;&#039;&#039;, the user has to select from a series of dropdown answers
+to questions of the form: &#039;&#039;Which in the following list is the most/largest/etc?
+or Which is the following list is the least/smallest/etc?; &#039;&#039;
+** &#039;&#039;&#039;Graphic Captcha&#039;&#039;&#039;, the user needs to enter a sequence of characters from
+a distorted image;
+** &#039;&#039;&#039;Hash captcha&#039;&#039;&#039;, the user&#039;s browser (the user doesn&#039;t need to do anything)
+needs to extend a random string with additional characters to get a string
+whose hash begins with a certain lead set of characters.
+
+Of these, Hash Captcha is probably the least intrusive but requires
+Javascript and might run slowly on older browsers. A text captcha might be used
+to test domain expertise of the people who are registering for an account.
+Finally, the graphic captcha is probably the one people are most familiar with.
+EOD;
+$help_pages["en-US"]["Changing_the_Classifier_Label"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe label of a classifier determines what meta-words will be added to pages that have that concept.
+
+&lt;br /&gt;
+
+If the label is foo, and the foo classifier is used in a crawl, then pages which have the foo property
+will have the meta-word class:foo added to the list of words that are indexed.
+EOD;
+$help_pages["en-US"]["Crawl_Mixes"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSA &#039;&#039;&#039;Crawl Mix&#039;&#039;&#039; allows one to combine several crawl indexes into one to greater customize search results. This page allows one to either create a new crawl mix or find and edit an existing one. The list of crawl mixes is user dependent -- each user can create their own mixes of crawls that exist on the Yioop system.
+
+&lt;br /&gt;
+
+Clicking &#039;&#039;&#039;Share&#039;&#039;&#039;  on a crawl mix allows a user to post their crawl mix to a group&#039;s feed. User&#039;s of that group can then import this crawl mix into their own list of mixes by clicking on it.
+
+&lt;br /&gt;
+
+Clicking &#039;&#039;&#039;Set as Index&#039;&#039;&#039;  on a crawl mix means that by default the given crawl mix will be used to serve search results for this site.
+EOD;
+$help_pages["en-US"]["Crawl_Order"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Crawl Order&#039;&#039;&#039; controls how the crawl determines what to crawl next.
+
+&lt;br /&gt;
+
+&#039;&#039;&#039;Breadth-first Search&#039;&#039;&#039; means that Yioop first crawls the seeds sites, followed by those
+sites directly linked to the seed site, followed by those directly linked to sites directly linked
+to seed sites, etc.
+
+&lt;br /&gt;
+
+&#039;&#039;&#039;Page Importance&#039;&#039;&#039; gives each seed site an initial amount of cash. Yioop then crawls the seed sites. A given crawled page has its cash splits  amongst the sites that it link to based on the link quality and whether it has been crawled yet. The sites with the most cash are crawled next and this process is continued.
+EOD;
+$help_pages["en-US"]["Create_Group"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+title=Create Group
+
+END_HEAD_VARS&#039;&#039;You will get to this form when the Group Name is available to
+create a new Group. &#039;&#039;
+----
+
+&#039;&#039;&#039;Name&#039;&#039;&#039; Field is used to specify the name of the new Group.
+&lt;br /&gt;
+&#039;&#039;&#039;Register&#039;&#039;&#039; dropdown says how other users are allowed to join the group:
+* &lt;u&gt;No One&lt;/u&gt; means no other user can join the group (you can still invite
+other users).
+* &lt;u&gt;By Request&lt;/u&gt; means that other users can request the group owner to join
+the group.
+* &lt;u&gt;Anyone&lt;/u&gt; means all users are allowed to join the group.
+&lt;br /&gt;
+The &#039;&#039;&#039;Access&#039;&#039;&#039; dropdown controls how users who belong/subscribe to a group
+other than the owner can access that group.
+* &lt;u&gt;No Read&lt;/u&gt; means that a non-owner member of the group cannot read or
+write the group news feed and cannot read the group wiki.
+* &lt;u&gt;Read&lt;/u&gt; means that a non-owner member of the group can read the group
+news feed and the groups wiki page.
+* &lt;u&gt;Read&lt;/u&gt; Comment means that a non-owner member of the group can read the
+group feed and wikis and can comment on any existing threads, but cannot start
+new ones.
+* &lt;u&gt;Read Write&lt;/u&gt;, means that a non-owner member of the group can start new
+threads and comment on existing ones in the group feed and can edit and create
+wiki pages for the group&#039;s wiki.
+&#039;&#039;&#039;Voting&#039;&#039;&#039;
+* Specify the kind of voting allowed in the new group. + Voting allows users to
+vote up, -- Voting allows users to vote down. +/- allows Voting up and down.
+&#039;&#039;&#039;Post Life time&#039;&#039;&#039; - Specifies How long the posts should be kept.
+EOD;
+$help_pages["en-US"]["Database_Setup"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+title=Database Setup
+
+END_HEAD_VARSThe database is used to store information about what users are
+allowed to use the admin panel and what activities and roles these users have.
+* The Database Set-up field-set is used to specify what database management
+system should be used, how it should be connected to, and what user name and
+password should be used for the connection.
+
+* Supported Databases
+** PDO (PHP&#039;s generic DBMS interface).
+** Sqlite3 Database.
+** Mysql Database.
+
+* Unlike many database systems, if an sqlite3 database is being used then the
+connection is always a file on the current filesystem and there is no notion of
+login and password, so in this case only the name of the database is asked for.
+For sqlite, the database is stored in WORK_DIRECTORY/data.
+
+* For single user settings with a limited number of news feeds, sqlite is
+probably the most convenient database system to use with Yioop. If you think you
+are going to make use of Yioop&#039;s social functionality and have many users,
+feeds, and crawl mixes, using a system like Mysql or Postgres might be more
+appropriate.
+EOD;
+$help_pages["en-US"]["Disallowed_and_Sites_With_Quotas"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Disallowed to Crawl Sites&#039;&#039;&#039; are urls or domains (listed one-per-line) that Yioop should not crawl.
+
+&lt;br /&gt;
+
+A line like:
+&lt;pre&gt;
+  http://www.somewhere.com/foo/
+&lt;/pre&gt;
+would disallow the url
+&lt;pre&gt;
+  http://www.somewhere.com/foo/goo.jpg
+&lt;/pre&gt;
+to be crawled.
+
+&lt;br /&gt;
+
+A line like:
+&lt;pre&gt;
+ domain:foo.com
+&lt;/pre&gt;
+would disallow the url
+&lt;pre&gt;
+  http://a.b.c.foo.com/blah/
+&lt;/pre&gt;
+to be crawled.
+&lt;br /&gt;
+
+&#039;&#039;&#039;Sites with Quotes&#039;&#039;&#039; are urls or domains that Yioop should at most crawl some fixed number of urls from in an hour. These are listed in the same text area as Disallowed to Crawl Sites. To indicate the quota one lists after the url a fragment #some_number. For example,
+&lt;pre&gt;
+  http://www.yelp.com/#100
+&lt;/pre&gt;
+would restrict crawling of urls from Yelp to 100/hour.
+EOD;
+$help_pages["en-US"]["Discover_Groups"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+toc=true
+
+title=Discover Groups
+
+END_HEAD_VARS&#039;&#039;&#039;Name&#039;&#039;&#039; Field is used to specify the name of the Group to
+search for.
+&#039;&#039;&#039;Owner&#039;&#039;&#039; Field lets you search a Group using it&#039;s Owner name.
+&lt;br /&gt;
+&#039;&#039;&#039;Register&#039;&#039;&#039; dropdown says how other users are allowed to join the group:
+* &lt;u&gt;No One&lt;/u&gt; means no other user can join the group (you can still invite
+other users).
+* &lt;u&gt;By Request&lt;/u&gt; means that other users can request the group owner to join
+the group.
+* &lt;u&gt;Anyone&lt;/u&gt; means all users are allowed to join the group.
+&lt;br /&gt;
+&#039;&#039;It should be noted that the root account can always join any group.
+The root account can also always take over ownership of any group.&#039;&#039;
+&lt;br /&gt;
+The &#039;&#039;&#039;Access&#039;&#039;&#039; dropdown controls how users who belong/subscribe to a group
+other than the owner can access that group.
+* &lt;u&gt;No Read&lt;/u&gt; means that a non-owner member of the group cannot read or
+write the group news feed and cannot read the group wiki.
+* &lt;u&gt;Read&lt;/u&gt; means that a non-owner member of the group can read the group
+news feed and the groups wiki page.
+* &lt;u&gt;Read&lt;/u&gt; Comment means that a non-owner member of the group can read the
+group feed and wikis and can comment on any existing threads, but cannot start
+new ones.
+* &lt;u&gt;Read Write&lt;/u&gt;, means that a non-owner member of the group can start new
+threads and comment on existing ones in the group feed and can edit and create
+wiki pages for the group&#039;s wiki.
+&lt;br /&gt;
+The access to a group can be changed by the owner after a group is created.
+* &lt;u&gt;No Read&lt;/u&gt; and &lt;u&gt;Read&lt;/u&gt; are often suitable if a group&#039;s owner wants to
+perform some kind of moderation.
+* &lt;u&gt;Read&lt;/u&gt; and &lt;u&gt;Read Comment&lt;/u&gt; groups are often suitable if someone wants
+to use a Yioop Group as a blog.
+* &lt;u&gt;Read&lt;/u&gt; Write makes sense for a more traditional bulletin board.
+EOD;
+$help_pages["en-US"]["Editing_Locales"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe &#039;&#039;&#039;Edit Locale&#039;&#039;&#039; form can be used to specify how various message strings in Yioop are translated in different languages.
+
+The table below has two columns: a column of string identifiers and a column of translations. A string identifier refers to a location in the code marked as needing to be translated, the corresponding translation in that row is how it should be translated for the current locale. Identifiers typically specify the code file in which the identifier occurs. For example, the identifier
+ serversettings_element_name_server
+would appear in the file views/elements/server_settings.php . To see where this identifier occurs one could open that file and search for this string.
+
+If no translation exists yet for an identifier the translation value for that row will appear in red. Hovering the mouse over this red field will show the translation of this field in the default locale (usually English).
+
+The &#039;&#039;&#039;Show dropdown&#039;&#039;&#039; allows one to show either all identifiers or just those missing translations. The filter field let&#039;s one to see only identifiers that contain the filter as a substring.
+EOD;
+$help_pages["en-US"]["Editing_a_Crawl_Mix"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSA crawl mix is built out of a list of &#039;&#039;&#039;search result fragments&#039;&#039;&#039;.
+
+&lt;br /&gt;
+
+A fragment has a &#039;&#039;&#039;Results Shown&#039;&#039;&#039; dropdown which specifies up to how many results that given fragment is responsible for. If one that had three fragments, the first with this value set to 1 the next with it set to 5 and the last set to whatever. Then on a query the Yioop will try to get the first result from the first fragment, up to the next five results from the next fragment, and all remaining results from the last fragment. If a given fragment doesn&#039;t produce results the search engine skips to the  next fragment.
+
+&lt;br /&gt;
+
+The &#039;&#039;&#039;Add Crawls&#039;&#039;&#039; dropdown can be used to add a crawl to the given fragment. Several crawl indexes can be added to a given fragment. When search results are computed for the fragment, the search is performed on all of these indexes and a score for each result is determined. The &#039;&#039;&#039;Weight&#039;&#039;&#039; dropdown can then be set to specify how important a given indexes score of a result should be in the total score of a search result. The top totals scores are then returned by the fragment. If when performing the search on a given index you would like additional terms to be added to the query these can be specified in the &#039;&#039;&#039;Keywords&#039;&#039;&#039; field.
+
+
+EOD;
+$help_pages["en-US"]["Filtering_Search_Results"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS==Filter Websites From Results Form==
+The textarea in this form is used to list hosts one per line which are to be removed from any search result page in which they might appear. Lines in the textarea must be hostnames not general urls. Listing a host name like:
+&lt;pre&gt;
+ http://www.cs.sjsu.edu/
+&lt;/pre&gt;
+would prevent any urls from this site from appearing in search results. I.e., so for example, the URL
+&lt;pre&gt;
+ http://www.cs.sjsu.edu/faculty/pollett/
+&lt;/pre&gt;
+would be prevented from appearing in search results.
+EOD;
+$help_pages["en-US"]["Indexing_Plugins"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Indexing Plugins&#039;&#039;&#039; are additional indexing processors that a document can be made to go through during the indexing process. Users who know how to code can create their own plugins using the plugin API. Plugins can be used to extract new &quot;micro-documents&quot; from a given document, do clustering, or can be used to control the indexing or non-indexing of web pages based on their content.
+
+&lt;br /&gt;
+
+The table below allows a user to select and configure which plugins should be used in the current crawl.
+
+&lt;br /&gt;
+
+
+{{right|[[http://www.seekquarry.com/?c=static&amp;p=Documentation#Page%20Indexing%20and%20Search%20Options|Learn More..]]}}
+EOD;
+$help_pages["en-US"]["Kinds_of_Summarizers"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSYioop uses a &#039;&#039;&#039;summarizer&#039;&#039;&#039; to extract from a downloaded, or otherwise acquired document, text that it will add to its index. This text is also used for search result snippet generation. Only terms which appear in this summary can be used to look up a document.
+
+&lt;br /&gt;
+
+The &lt;b&gt;Basic&lt;/b&gt; summarizer tries to pick text from an ad hoc list of presumed important places in a web document until it has gotten the desired amount of text for a summary. For example, it might try to get text from title tags, h1 tags, etc before try to get it from paragraph tags.
+
+&lt;br /&gt;
+
+The &lt;b&gt;Centroid&lt;/b&gt; summarizer splits a document into &quot;sentence&quot; units. It then computes an &quot;average&quot; sentence for the document. It then adds to the summary sentences in order of how close they are to this average until the desired amount of text has been acquired.
+EOD;
+$help_pages["en-US"]["Locale_List"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Locale List
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSBeneath the Add Locale form is a table listing some of the current
+locales.
+
+
+* The Show Dropdown let&#039;s you control how many of these locales are displayed in
+one go.
+* The Search link lets you bring up an advance search form to search for
+particular locales and also allows you to control the direction of the listing.
+
+The Locale List table
+* The first column in the table  has a link with the name of the locale.
+Clicking on this link brings up a page where one can edit the strings for that
+locale.
+* The next three columns of the Locale List table give the locale tag,
+whether user&#039;s can use that locale in Settings, and the writing
+direction of the locale, this is followed by the percent of strings translated.
+* The Edit link in the column let&amp;#039;s you edit the locale tag, enabled status, and
+text direction of a locale.
+* Finally, clicking the Delete link let&amp;#039;s one delete a locale and all
+its strings.
+EOD;
+$help_pages["en-US"]["Locale_Writing_Mode"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+title=Locale Writing Mode
+
+END_HEAD_VARSThe last field on the form is to specify how the language is
+written. There are four options:
+# lr-tb -- from left-to-write from the top of the page to the bottom as in
+English.
+#  rl-tb from right-to-left from the top the page to the bottom as in Hebrew
+and Arabic.
+#  tb-rl from the top of the page to the bottom from right-to-left as in
+Classical Chinese.
+#  tb-lr from the top of the page to the bottom from left-to-right as in
+non-cyrillic Mongolian or American Sign Language.
+
+&#039;&#039;lr-tb and rl-tb support work better than the vertical language support. As of
+this writing, Internet Explorer and WebKit based browsers (Chrome/Safari) have
+some vertical language support and the Yioop stylesheets for vertical languages
+still need some tweaking. For information on the status in Firefox check out
+this writing mode bug.&#039;&#039;
+EOD;
+$help_pages["en-US"]["Machine_Information"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Machine Information&#039;&#039;&#039; shows the currently known about machines.
+
+&lt;br /&gt;
+
+This list always begins with the &#039;&#039;&#039;Name Server&#039;&#039;&#039; itself and a toggle to control whether or not the Media Updater process is running on the Name Server. This allows you to control whether or not Yioop attempts to update its RSS (or Atom) search sources on an hourly basis. Yioop also uses the Media updater to convert videos that have been uploaded into mp4 and webm if ffmpeg is installed.
+
+&lt;br /&gt;
+
+There is also a link to the log file of the Media Updater process. Under the Name Server information is a dropdown that can be used to control the number of current machine statuses that are displayed for all other machines that have been added. It also might have next and previous arrow links to go through the currently available machines.
+
+&lt;br /&gt;
+
+{{right|[[https://www.seekquarry.com/?c=static&amp;p=Documentation#GUI%20for%20Managing%20Machines%20and%20Servers| Learn More.]]}}
+EOD;
+$help_pages["en-US"]["Manage_Advertisements"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThis page is used for the creation of advertisements
+EOD;
+$help_pages["en-US"]["Manage_Machines"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Add Machine&#039;&#039;&#039; allows you to add a new machine to be controlled by this Yioop instance.
+
+&lt;br /&gt;
+
+The &#039;&#039;&#039;Machine Name&#039;&#039;&#039; field lets you give this machine an easy to remember name. The Machine URL field should be filled in with the URL to the installed Yioop instance.
+
+&lt;br /&gt;
+
+The &#039;&#039;&#039;Mirror&#039;&#039;&#039; check-box says whether you want the given Yioop installation to act as a mirror for another Yioop installation. Checking it will reveal a drop-down menu that allows you to choose which installation amongst the previously entered machines you want to mirror.
+
+&lt;br /&gt;
+
+The &#039;&#039;&#039;Has Queue Server&#039;&#039;&#039; check-box is used to say whether the given Yioop installation will be running a queue server or not.
+
+&lt;br /&gt;
+
+Finally, the &#039;&#039;&#039;Number of Fetchers&#039;&#039;&#039; drop down allows you to say how many fetcher instances you want to be able to manage for that machine.
+
+&lt;br /&gt;
+
+{{right|[[https://www.seekquarry.com/?c=static&amp;p=Documentation#GUI%20for%20Managing%20Machines%20and%20Servers|Learn More..]]}}
+EOD;
+$help_pages["en-US"]["Media_Sources"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Media Sources&#039;&#039;&#039; are used to specify how Yioop should handle video and news sites.
+
+&lt;br /&gt;
+
+A &#039;&#039;&#039;Video source&#039;&#039;&#039; is used to specify where to find the thumb nail of a video given the url of the video on a website. This is used by Yioop when displaying search results containing the video link to show the thumb nail. For example, if the Url value is
+ http://www.youtube.com/watch?v={}
+and the Thumb value is
+ http://i1.ytimg.com/vi/{}/default.jpg,
+this tells Yioop that if a search result contains something like
+&lt;pre&gt;
+ https://www.youtube.com/watch?v=dQw4w9WgXcQ
+&lt;/pre&gt;
+this says find the thumb at
+&lt;pre&gt;
+ http://i1.ytimg.com/vi/dQw4w9WgXcQ/default.jpg
+&lt;/pre&gt;
+
+An &#039;&#039;&#039;RSS media source&#039;&#039;&#039; can be used to add an RSS or Atom feed (it auto-detects which kind) to the list of feeds which are downloaded hourly when Yioop&#039;s Media Updater is turned on. Besides the name you need to specify the URL of the feed in question.
+
+&lt;br /&gt;
+
+An &#039;&#039;&#039;HTML media source&#039;&#039;&#039; is a web page that has news articles like an RSS page that you want the Media Updater to scrape on an hourly basis. To specify where in the HTML page the news items appear you specify different XPath information. For example,
+&lt;pre&gt;
+ Name: Cape Breton Post
+ URL: http://www.capebretonpost.com/News/Local-1968
+ Channel: //div[contains(@class, &quot;channel&quot;)]
+ Item: //article
+ Title:	//a
+ Description: //div[contains(@class, &quot;dek&quot;)]
+ Link: //a
+&lt;/pre&gt;
+The Channel field is used to specify the tag that encloses all the news items. Relative to this as the root tag, //article says the path to an individual news item. Then relative to an individual news item, //a gets the title, etc. Link extracts the href attribute of that same //a .
+
+&lt;br /&gt;
+
+Not all RSS feeds use the same tag to specify the image associated with a news item. The Image XPath allows you to specify relative to a news item (either RSS or HTML) where an image thumbnail exists. If a site does not use such thumbnail one can prefix the path with ^ to give the path relative to the root of the whole file to where a thumb nail for the news source exists. Yioop automatically removes escaping from RSS containing escaped HTML when computing this. For example, the following works for the feed:
+&lt;pre&gt;
+  http://feeds.wired.com/wired/index
+ //description/div[contains(@class,
+    &quot;rss_thumbnail&quot;)]/img/@src
+&lt;/pre&gt;
+EOD;
+$help_pages["en-US"]["Name_Server_Setup"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSYioop can be run in a single machine or multi-machine setting. In a multi-machine setting, copies of Yioop software would be on different machines. One machine called the &#039;&#039;&#039;Name Server&#039;&#039;&#039; would be responsible for coordinating who crawls what between these machines. This fieldset allows the user to specify the url of the Name Server as well as a string (which should be the same amongst all machines using that name server) that will be used to verify that this machine is allowed to talk to the Name Server. In a single machine setting these settings can be left at their default values.
+
+&lt;br /&gt;
+
+When someone enters a query into a Yioop set-up, they typically enter the query on the name server. The &#039;&#039;&#039;Use Filecache&#039;&#039;&#039; checkbox controls whether the query results are cached in a file so that they don&#039;t have to be recalculated when someone enters the same query again. The file cache is purged periodically so that it doesn&#039;t get too large.
+EOD;
+$help_pages["en-US"]["Page_Byte_Ranges"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Byte Range to Download&#039;&#039;&#039; determines the maximum number of bytes that Yioop will download for a given page when crawling. Setting a maximum is important so that Yioop does not get stuck downloading very large files.
+
+&lt;br /&gt;
+
+When Yioop shows the cached version of a URL it shows only what it downloaded.
+EOD;
+$help_pages["en-US"]["Page_Classifiers"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSClassifiers are used to say whether a page has or does not have a property. The &#039;&#039;&#039;Manage Classifiers&#039;&#039;&#039; activity let&#039;s you create and manage the classifiers for this Yioop system. Creating a classifier will take you to a page that let&#039;s you train the classifier against existing data such as a crawl indexed. Once you have a classifier you can use it to add meta words for that concept to pages in future crawls by selecting in on the Page Options activity. You can also use classifiers to score documents for ranking purposes in search results, again this can be done under the Page Options Activity.
+EOD;
+$help_pages["en-US"]["Page_Grouping_Options"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe &#039;&#039;&#039;Search Results Grouping&#039;&#039;&#039; controls allow you to control on a search query how many qualifying documents from an index to compute before trying to sort and rank them to find the top k results (here k is usually 10).  In a multi-queue-server setting the query is simultaneously asked by the name server machine of each of the queue server machines and the results are aggregated.
+
+&lt;br /&gt;
+
+&#039;&#039;&#039;Minimum Results to Group&#039;&#039;&#039; controls the number of results the name server want to have before sorting of results is done. When the name server request documents from each queue server, it requests for
+&lt;br /&gt;
+&amp;alpha; &amp;times; (Minimum Results to Group)/(Number of Queue Servers) documents.
+
+&lt;br /&gt;
+&#039;&#039;&#039;Server Alpha&#039;&#039;&#039; controls the number alpha.
+EOD;
+$help_pages["en-US"]["Page_Ranking_Factors"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSIn computing the relevance of a word/term to a page the fields on this form allow one to set the relative weight given to the word depending on whether it appears in the title, a link, or if it appears anywhere
+else (description).
+EOD;
+$help_pages["en-US"]["Page_Rules"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Page Field Extraction Rules &#039;&#039;&#039; are statements from a Yioop-specific indexing language which can be applied to the words in a summary page before it is stored in an index. Details on this language can be found in the [[http://www.seekquarry.com/?c=static&amp;p=Documentation#Page%20Indexing%20and%20Search%20Options|Page Indexing and Search Options]] section of the Yioop Documentation.
+
+&lt;br /&gt;
+
+The textarea below this heading can be used to list out which extraction rules should be used for the current crawl.
+EOD;
+$help_pages["en-US"]["Proxy_Server"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=Proxy server
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS* Yioop can make use of a proxy server to do web
+crawling.
+EOD;
+$help_pages["en-US"]["Proxy_server"] = <<< EOD
+page_type=standard
+
+page_border=solid-border
+
+title=Proxy server
+
+END_HEAD_VARS* The Proxy Server field-set is used to control which proxies to use while crawling. By default Yioop does not use any proxies while crawling. A Tor Proxy can serve as a gateway to the Tor Network. Yioop can use this proxy to download .onion URLs on the [[https://en.wikipedia.org/wiki/Tor_%28anonymity_network%29|Tor network]].
+
+* Obviously, this proxy needs to be running though for Yioop to make use of it. Beneath the Tor Proxy input field is a checkbox labelled &#039;&#039;&#039;Crawl via Proxies&#039;&#039;&#039;. Checking this box, will reveal a text-area labelled Proxy Servers. You can enter the &#039;&#039;&#039;&#039;&#039;address:port or address:port:proxytype&#039;&#039;&#039;&#039;&#039; of proxy servers you would like to crawl through. If proxy servers are used, Yioop will make any requests to download pages to a randomly chosen server on the list which will proxy the request to the site which has the page to download. To some degree this can make the download site think the request is coming from a different ip (and potentially location) than it actually is. In practice, servers can often use HTTP headers to guess that a proxy is being used.
+EOD;
+$help_pages["en-US"]["Search_Results_Editor"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe &#039;&#039;&#039;Edit Result Page&#039;&#039;&#039; form can be used to change the title and snippet text associated with a given url if it appears in search results. The Edited Urls dropdown let&#039;s one see which URLs have been previously edited and allows one to load and re-edit these if desired. Edited words in the title and description of an edited URL are not indexed. Only the words from the page as originally appearing in the index are used for this. This form only controls the title and snippet text of the URL when it appears in a search engine result page.
+EOD;
+$help_pages["en-US"]["Search_Results_Page_Elements"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThese checkboxes control whether various links and drop downs on the search result and landing
+pages appear or not.
+
+; &#039;&#039;&#039;Word Suggest&#039;&#039;&#039;: Controls whether the suggested query drop down appear as a query is entered in the search bar and whether thesaurus results appear on search result pages.
+; &#039;&#039;&#039;Subsearch&#039;&#039;&#039; : Controls whether the links to subsearches such as Image, Video, and News search appear at the top of all search pages
+; &#039;&#039;&#039;Signin&#039;&#039;&#039; : Controls whether the &#039;&#039;&#039;Sign In&#039;&#039;&#039; link appears at the top of the Yioop landing and search result pages.
+; &#039;&#039;&#039;Cache&#039;&#039;&#039;, &#039;&#039;&#039;Similar&#039;&#039;&#039;, &#039;&#039;&#039;Inlinks&#039;&#039;&#039;, &#039;&#039;&#039;IP Address&#039;&#039;&#039;: Control whether the corresponding links appear after each search result item.
+
+
+
+EOD;
+$help_pages["en-US"]["Seed_Sites_and_URL_Suggestions"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Seed Sites&#039;&#039;&#039; are a list of urls that Yioop should start a crawl from.
+
+&lt;br /&gt;
+
+If under Server Settings : Account Registration user&#039;s are allowed to register for Yioop accounts at some
+level other than completely disabled, then the Tools: Suggest a Url form will be enabled. URLs suggested through this form can be added to the seed sites by clicking the &#039;&#039;&#039;Add User Suggest data&#039;&#039;&#039; link. These URLS will appear at the end of the seeds sites and will appear with a timestamp of when they added before them. Adding this data to the seed sites clears the list of suggested sites from where it is temporarily stored before being added.
+
+&lt;br /&gt;
+
+Some site&#039;s robot.txt forbid crawl of the site. If you would like to create a placeholder page for such a site so that a link to that site might still appear in the index, but so that the site itself is not crawled by the crawler, you can use a syntax like:
+
+&lt;nowiki&gt;
+http://www.facebool.com/###!
+Facebook###!
+A%20famous%20social%20media%20site
+&lt;/nowiki&gt;
+
+This should all be on one line. Here ###! is used a separator and the format is url##!title###!description.
+EOD;
+$help_pages["en-US"]["Start_Crawl"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSEnter a name for your crawl and click start to begin a new crawl. Previously completed crawls appear in the table below.
+
+&lt;br /&gt;
+
+Before you start your crawl be sure to start the queue servers and fetchers to be used for the crawl under &#039;&#039;&#039;Manage Machines&#039;&#039;&#039;.
+
+&lt;br /&gt;
+
+The &#039;&#039;&#039;Options&#039;&#039;&#039; link let&#039;s you specify what web sites you want to crawl or if you want to do an archive previous crawls or different kinds of data sets.
+EOD;
+$help_pages["en-US"]["Subsearches"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARS&#039;&#039;&#039;Subsearches&#039;&#039;&#039; are specialized search hosted on a Yioop site other than the default index. For example, a site might have a usual web search and also offer News and Images subsearches. This form let&#039;s you set up such a subsearch.
+
+&lt;br /&gt;
+
+A list of links to all the current subsearches on a Yioop site appears at the
+ site_url?a=more
+page. Links to some of the subsearches may appear at the top left hand side of of the default landing page provided the Pages Options : Search Time : Subsearch checkbox is checked.
+
+&lt;br /&gt;
+
+The &#039;&#039;&#039;Folder Name&#039;&#039;&#039; of a subsearch is the name that appears as part of the query string when doing a search restricted to that subsearch. After creating a subsearch, the table below will have a &#039;&#039;&#039;Localize&#039;&#039;&#039; link next to its name. This lets you give names for your subsearch on the More page mentioned above with respect to different languages.
+
+EOD;
+$help_pages["en-US"]["Summary_Length"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThis determines the maximum number of bytes that can appear in a summary generated for a document that Yioop has crawled. To have any effect this value should be smaller that the byte range downloaded. yo
+EOD;
+$help_pages["en-US"]["Test_Indexing_a_Page"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe &#039;&#039;&#039;Test Page&#039;&#039;&#039; form is used to test how Yioop would process a given web page. To test a web page one copies and pastes the source of the web page (obtainable by doing View Source in a browser) into the textarea. Then one selects the mimetype of the page (usually, text/html) and submits the form to see the processing results.
+EOD;
+$help_pages["en-US"]["Using_a_Classifier_or_Ranker"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSA &lt;b&gt;binary classifier&lt;/b&gt; is used to say whether or not a page has a property (for example, being a spam page or not). Classifiers can be created using the Manage Classifiers activity.
+
+&lt;br/&gt;
+
+The classifiers that have been created in this Yioop instance are listed in the table below and can be used for future crawls. Given a classifier named foo, selecting the &#039;&#039;&#039;Use to Classify&#039;&#039;&#039; check box for it tells Yioop to insert some subset of the following labels as meta-words when it indexes a page:
+&lt;pre&gt;
+ class:foo
+ class:foo:10plus
+ class:foo:20plus
+ class:foo:30plus
+ class:foo:40plus
+ ...
+ class:foo:50
+ ...
+&lt;/pre&gt;
+When a document is scored against a classifier foo, it gets a score between 0 and 1 and if the score is greater than 0.5 the meta-word class:foo is added. A meta-word class:foo:XXplus indicates the document achieved at least a score of XX with respect to the classifier, and a meta-word class:foo:XX indicates it had a score between 0.XX and 0.XX + 0.9.
+
+&lt;br /&gt;
+
+The &#039;&#039;&#039;Use to Rank&#039;&#039;&#039; checkbox indicates that Yioop should take the score between 0 and 1 and use this as one of the scores when ranking search results.
+EOD;
+$help_pages["en-US"]["Work_Directory"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+page_header=
+
+page_footer=
+
+END_HEAD_VARSThe &#039;&#039;&#039;Work Directory&#039;&#039;&#039; is a folder used to store all the customizations of this instance of Yioop.
+This field should be a complete file system path to a folder that exists.
+It should use forward slashes. For example:
+
+ /some_folder/some_subfolder/yioop_data
+(more appropriate for Mac or Linux) or
+ c:/some_folder/some_subfolder/yioop_data
+(more appropriate on a Windows system).
+
+If you decide to upgrade Yioop at some later date you only have to replace the code folder
+of Yioop and set the Work Directory path to the value of your pre-upgrade version. For this
+reason the Work Directory should not be a subfolder of the Yioop code folder.
+EOD;
+
diff --git a/controllers/MainController.php b/controllers/MainController.php
new file mode 100755
index 0000000..719cd6b
--- /dev/null
+++ b/controllers/MainController.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2014  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @package seek_quarry
+ * @subpackage controller
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\controllers;
+
+use seekquarry\yioop\configs as C;
+/**
+ * This is the default controller used by the seek_quarry site. It will
+ * set up the main view, which has mainly links to static pages describing the
+ * Yioop search engine.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage controller
+ */
+class MainController extends Controller
+{
+    /**
+     * Says which activities (roughly methods invoke from the web)
+     * this controller will respond to
+     * @var array
+     */
+    var $activities = array("download");
+
+    /**
+     *  This is the main entry point for handling people arriving to the
+     * SeekQuarry site.
+     */
+    function processRequest()
+    {
+        $data = array();
+        $view = "main";
+        if(isset($_SESSION['USER_ID'])) {
+            $user = $_SESSION['USER_ID'];
+        } else {
+            $user = $_SERVER['REMOTE_ADDR'];
+        }
+        if(isset($_REQUEST['a'])) {
+            if(in_array($_REQUEST['a'], $this->activities)) {
+                $activity = $_REQUEST['a'];
+                if($activity == "signout") {
+                    unset($_SESSION['USER_ID']);
+                    $user = $_SERVER['REMOTE_ADDR'];
+                    $activity = "main";
+                    $data['SCRIPT'] = "doMessage('<h1 class=\"red\" >".
+                        tl('search_controller_logout_successful')."</h1>')";
+                }
+            } else {
+                $activity = "download";
+            }
+        } else {
+            $activity = "download";
+        }
+        $data['VIEW'] = $view;
+        $data = array_merge($data, $this->$activity());
+        $data['YIOOP_TOKEN'] = $this->generateCSRFToken($user);
+        $this->displayView($data['VIEW'], $data);
+    }
+
+    /**
+     * This activity handles downloads of Yioop from the seekquarry site.
+     * It collects user information and sends an email with the download
+     * link.
+     *
+     * @return array $data has which field variables from drawing download forms
+     */
+     function download()
+     {
+        $data['VIEW'] = "download";
+        $data['page'] = tl('main_controller_download');
+        $data['SCRIPT'] = "";
+        $downloads = [C\CURRENT_YIOOP_VERSION, C\PREVIOUS_YIOOP_VERSION];
+        $data['version'] = C\CURRENT_YIOOP_VERSION;
+        if(isset($_REQUEST['version']) &&
+            in_array($_REQUEST['version'], $downloads)) {
+            $data['version'] = $_REQUEST['version'];
+        }
+        if(isset($_REQUEST['arg'])) {
+            switch($_REQUEST['arg'])
+            {
+                case "step1":
+                    $require_fields = ["full_name", "e_mail"];
+                    foreach($require_fields as $field) {
+                        if(!isset($_REQUEST[$field])) {
+                            $data['SCRIPT'] .=
+                                "doMessage('<h1 class=\"red\" >".
+                                tl('main_controller_missing_fields').
+                                "</h1>')";
+                            break 2;
+                        }
+                    }
+                    $all_fields = ["full_name", "e_mail", "business",
+                        "interest"];
+                    $hash_name = "";
+                    foreach($all_fields as $field) {
+                        $request[$field] = (isset($_REQUEST[$field])) ?
+                            $this->clean($_REQUEST[$field], "string") : "";
+                        $request[$field] = substr($request[$field], 0, 256);
+                        $hash_name .= $request[$field];
+                    }
+                    $request["version"] = $data['version'];
+                    $hash_name .= $request["version"];
+                    $time = time();
+                    $hash_name = md5($hash_name);
+                    $email_dir = C\WORK_DIRECTORY."/data/emails";
+                    if(!file_exists($email_dir)) {
+                        mkdir($email_dir);
+                    }
+                    $save_data = serialize($request);
+                    file_put_contents($email_dir."/$hash_name|$time.txt",
+                        $save_data);
+                    $pre_name = $email_dir."/$hash_name|".substr($time, 0, 4);
+                    $save_time = substr($time, 4, 1);
+                    for($i = 0; $i < 10; $i++) {
+                        if($save_time != "$i") {
+                            @array_map('unlink', glob($pre_name."$i*.txt"));
+                        }
+                    }
+                    $headers = C\FROM_EMAIL_HEADER . "\r\n";
+                    $link = C\BASE_URL."?c=main&a=download&name=".
+                        "$hash_name|$time&version={$data['version']}&arg=step2";
+                    $title = tl('main_controller_yioop_download');
+                    $body = tl('main_controller_click_download')."\n".$link;
+                    mail($request['e_mail'], $title, $body, $headers);
+                    $url = C\BASE_URL."?c=static&p=Download_Sent";
+                    header("Location: ".$url);
+                    exit();
+                break;
+                case "step2":
+                    $email_dir = C\WORK_DIRECTORY."/data/emails";
+                    if(!isset($_REQUEST['name'])) {
+                        $data['VIEW'] = "main";
+                        $data['page'] = "home";
+                        $data['SCRIPT'] .=
+                            "doMessage('<h1 class=\"red\" >".
+                            tl('main_controller_url_error').
+                            "</h1>')";
+                        break;
+                    }
+                    $name = $email_dir."/".
+                        $this->clean($_REQUEST['name'], "string").".txt";
+                    if(!file_exists($name)) {
+                        $data['SCRIPT'] .=
+                            "doMessage('<h1 class=\"red\" >".
+                            tl('main_controller_expired_url').
+                            "</h1>')";
+                        $data['VIEW'] = "download";
+                        $data['version'] = C\CURRENT_YIOOP_VERSION;
+                        break;
+                    }
+                    $request = array_values(unserialize(
+                        file_get_contents($name)));
+                    if(isset($_SERVER["REMOTE_ADDR"])) {
+                        $request[] = $_SERVER["REMOTE_ADDR"];
+                    }
+                    $data_string = implode("\n", $request);
+                    $time = time();
+                    $day = date("d", $time);
+                    $emails = [];
+                    $email_filename = "$email_dir/$day.txt";
+                    if(file_exists($email_filename)) {
+                        $emails = unserialize(
+                            file_get_contents($email_filename));
+                    }
+                    $emails[$request[1]] = $data_string;
+                    file_put_contents($email_filename, serialize($emails));
+                    @unlink($name);
+                    $yesterday = date("d", $time - 86400);
+                    $old_email_filename = "$email_dir/$yesterday.txt";
+                    if(file_exists($old_email_filename)) {
+                        $yester_mail = array_values(unserialize(
+                            file_get_contents($old_email_filename)));
+                        $yester_string = implode("\n======\n\n",
+                            $yester_mail);
+                        $headers = C\FROM_EMAIL_HEADER . "\r\n";
+                        foreach(C\maintainers() as $maintainer) {
+                            mail($maintainer, "Leads ".date('Y-M-d', time()),
+                                $yester_string, $headers);
+                        }
+                        $new_email_filename = "$email_dir/old_$yesterday.txt";
+                        rename($old_email_filename, $new_email_filename);
+                    }
+                    if($data['version'] == C\CURRENT_YIOOP_VERSION) {
+                        $url = C\CURRENT_VERSION_URL;
+                    } else {
+                        $url = C\PREVIOUS_VERSION_URL;
+                    }
+                    header("Location: ".$url);
+                    exit();
+                break;
+            }
+        }
+        return $data;
+     }
+}
diff --git a/locale/ar/resources/Tokenizer.php b/locale/ar/resources/Tokenizer.php
new file mode 100755
index 0000000..b7999c5
--- /dev/null
+++ b/locale/ar/resources/Tokenizer.php
@@ -0,0 +1,197 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\ar\resources;
+
+/**
+ * Arabic specific tokenization code. In particular, it has a stemmer,
+ * The stemmer is my stab at porting Ljiljana Dolamic (University of Neuchatel,
+ * www.unine.ch/info/clef/) C stemming algorithm:
+ * http://members.unine.ch/jacques.savoy/clef
+ * That algorithm maps all stems to ASCII. Instead, I tried to leave everything
+ * using Arabic characters.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\ar
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = [];
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = [
+            "ا", "أ", "،", "عشر", "عدد", "عدة","عشرة",
+            "عدم", "عام", "عاما", "عن", "عند", "عندما",
+            "على", "عليه", "عليها", "زيارة", "سنة", "سنوات",
+            "تم", "ضد", "بعد", "بعض", "اعادة", "اعلنت",
+            "بسبب", "حتى", "اذا", "احد", "اثر", "برس",
+            "باسم", "غدا", "شخصا", "صباح", "اطار",
+            "اربعة", "اخرى", "بان", "اجل", "غير",
+            "بشكل", "حاليا", "بن", "به", "ثم", "اف",
+            "ان", "او", "اي", "بها", "صفر", "حيث",
+            "اكد", "الا", "اما", "امس", "السابق",
+            "التى", "التي", "اكثر", "ايار", "ايضا",
+            "ثلاثة", "الذاتي", "الاخيرة", "الثاني",
+            "الثانية", "الذى", "الذي", "الان", "امام",
+            "ايام", "خلال", "حوالى", "الذين", "الاول",
+            "الاولى", "بين", "ذلك", "دون", "حول", "حين",
+            "الف", "الى", "انه", "اول", "ضمن", "انها",
+            "جميع", "الماضي", "الوقت", "المقبل", "اليوم",
+            "ـ", "ف", "و", "و6", "قد", "لا", "ما", "مع",
+            "مساء", "هذا", "واحد", "واضاف", "واضافت",
+            "فان", "قبل", "قال", "كان", "لدى", "نحو",
+            "هذه", "وان", "واكد", "كانت", "واوضح",
+            "مايو", "فى", "في", "كل", "لم", "لن", "له",
+            "من", "هو", "هي", "قوة", "كما", "لها", "منذ",
+            "وقد", "ولا", "نفسه", "لقاء", "مقابل", "هناك",
+            "وقال", "وكان", "نهاية", "وقالت", "وكانت",
+            "للامم", "فيه", "كلم", "لكن", "وفي", "وقف",
+            "ولم", "ومن", "وهو", "وهي", "يوم", "فيها",
+            "منها", "مليار", "لوكالة", "يكون", "يمكن",
+            "مليون"
+        ];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/u', '',
+            $page);
+        return $page;
+    }
+    /**
+     * Computes the stem of an Arabic word
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $word
+     */
+    public static function stem($word)
+    {
+        if (in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+        $word = mb_strtolower($word);
+        $word = self::removeModifiersAndArchaic($word);
+        $word = self::removeSuffix($word);
+        $word = self::removePrefix($word);
+        return $word;
+    }
+    /**
+     * Removes common letter modifiers as well as some archaic characters
+     * @param string $word
+     * @return string the $word after letter modifiers removed
+     */
+    private static function removeModifiersAndArchaic($word)
+    {
+        $modifiers = ["\u0621", "\u0640", "\u064B", "\u064C", "\u064D",
+            "\u064E", "\u064F", "\u0650", "\u0651", "\u0652", "\u0653",
+            "\u0654", "\u0655", "\u0656", "\u0674", "\u0677", "\u0679"];
+        foreach($modifiers as $modifier) {
+            $m = json_decode('"'.$modifier.'"');
+            $word = preg_replace("/".$m."/u", "", $word);
+        }
+        return $word;
+    }
+    /**
+     * Removes Arabic suffixes to get root
+     *
+     * @param string $word word to remove suffixes from
+     * @return string the $word after suffix removal
+     */
+    private static function removeSuffix($word)
+    {
+        $length = mb_strlen($word);
+        if ($length > 5) {
+            $last_two = mb_substr($word, -2);
+            if(in_array($last_two,["ون", "آه", "أه", "آت", "أت", "آن",
+                "أن", "ىة", "ىه", "ىن", "ةئ", "ئن", "ئه"])) {
+                $word = mb_substr($word, 0, -2);
+                return $word;
+            }
+        }
+        if ($length > 4) {
+            $last_one = mb_substr($word, -1);
+            if(in_array($last_one, ["ى", "ۃ", "ه", "ئ"])) {
+                $word = mb_substr($word, 0, -1);
+                return $word;
+            }
+        }
+        return $word;
+    }
+    /**
+     * Removes Arabic prefixes to get root
+     * @param string $word word to remove prefixes from
+     *
+     * @return string the $word after prefix removal
+     */
+    private static function removePrefix($word)
+    {
+        $length = mb_strlen($word);
+        if ($length > 6) {
+            $start_three = mb_substr($word, 0, 3);
+            if(in_array($start_three, ["ڡآل", "ۀآل", "بآل", "وآل",
+                "ڡأل", "ۀأل", "بأل", "وأل"])) {
+                $word = mb_substr($word, 3);
+                return $word;
+            }
+        }
+        if ($length > 5) {
+            $start_two = mb_substr($word, 0, 2);
+            if(in_array($start_two, ["آل", "أل"])) {
+                $word = mb_substr($word, 2);
+                return $word;
+            }
+        }
+        if ($length > 4) {
+            $start_one = mb_substr($word, 0, 1);
+            if(in_array($start_one, ["و", "ى", "ٸ"])) {
+                $word = mb_substr($word, 1);
+                return $word;
+            }
+        }
+        return $word;
+    }
+}
diff --git a/locale/bn/resources/Tokenizer.php b/locale/bn/resources/Tokenizer.php
new file mode 100755
index 0000000..69beb75
--- /dev/null
+++ b/locale/bn/resources/Tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Snigdha Rao Parvatneni
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\bn\resources;
+
+/**
+ * Bengali specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\bn
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/de/resources/Tokenizer.php b/locale/de/resources/Tokenizer.php
new file mode 100755
index 0000000..7d167e2
--- /dev/null
+++ b/locale/de/resources/Tokenizer.php
@@ -0,0 +1,411 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\de\resources;
+
+use seekquarry\yioop\library as L;
+
+/**
+ * German specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * This class has a collection of methods for German locale specific
+ * tokenization. In particular, it has a stemmer, a stop word remover (for
+ * use mainly in word cloud creation). The stemmer is my stab at re-implementing
+ * the stemmer algorithm given at
+ * http://snowball.tartarus.org/algorithms/german/stemmer.html
+ * Here given a word, its stem is that part of the word that
+ * is common to all its inflected variants. For example,
+ * tall is common to tall, taller, tallest. A stemmer takes
+ * a word and tries to produce its stem.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\de
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list =["titanic"];
+    /**
+     * German vowels
+     * @var string
+     */
+    private static $vowel = 'aeiouyäöü';
+    /**
+     * Things that might have an s following them
+     * @var string
+     */
+    private static $s_ending = 'bdfghklmnrt';
+    /**
+     * Things that might have an st following them
+     * @var string
+     */
+    private static $st_ending = 'bdfghklmnt';
+    /**
+     * $r1 is the region after the first non-vowel following a vowel, or the end
+     * of the word if there is no such non-vowel.
+     * @var string
+     */
+    private static $r1;
+    /**
+     * Position in $word to stem of $r1
+     * @var int
+     */
+    private static $r1_index;
+    /**
+     * $r2 is the region after the first non-vowel following a vowel in $r1, or
+     * the end of the word if there is no such non-vowel
+     * @var string
+     */
+    private static $r2;
+    /**
+     * Position in $word to stem of $r2
+     * @var int
+     */
+    private static $r2_index;
+    /**
+     * Storage used in computing the stem
+     * @var string
+     */
+    private static $buffer;
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = ['aber', 'alle', 'allem', 'allen', 'aller', 'alles',
+            'als', 'as', 'also', 'am', 'an', 'ander', 'andere', 'anderem',
+            'anderen', 'anderer', 'anderes', 'anderm', 'andern', 'anderr',
+            'anders', 'auch', 'auf', 'aus', 'bei', 'bin', 'bis', 'bist',
+            'da', 'damit', 'dann', 'der', 'den', 'des', 'dem', 'die', 'das',
+            'daß', 'derselbe', 'derselben', 'denselben', 'desselben',
+            'demselben', 'dieselbe', 'dieselben', 'dasselbe', 'dazu', 'dein',
+            'deine', 'deinem', 'deinen', 'deiner', 'deines', 'denn', 'derer',
+            'dessen', 'dich', 'dir', 'du', 'dies', 'diese', 'diesem', 'diesen',
+            'dieser', 'dieses', 'doch', 'dort', 'durch', 'ein', 'eine', 'einem',
+            'einen', 'einer', 'eines', 'einig', 'einige', 'einigem', 'einigen',
+            'einiger', 'einiges', 'einmal', 'er', 'ihn', 'ihm', 'es', 'etwas',
+            'euer', 'eure', 'eurem', 'euren', 'eurer', 'eures', 'für', 'gegen',
+            'gewesen', 'hab', 'habe', 'haben', 'hat', 'hatte', 'hatten', 'hier',
+            'hin', 'hinter', 'http', 'https', 'ich', 'mich', 'mir', 'ihr',
+            'ihre', 'ihrem',
+            'ihren', 'ihrer', 'ihres', 'euch', 'im', 'in', 'indem', 'ins',
+            'ist', 'jede', 'jedem', 'jeden', 'jeder', 'jedes', 'jene', 'jenem',
+            'jenen', 'jener', 'jenes', 'jetzt', 'kann', 'kein', 'keine',
+            'keinem', 'keinen', 'keiner', 'keines', 'können', 'könnte',
+            'machen', 'man', 'manche', 'manchem', 'manchen', 'mancher',
+            'manches', 'mein', 'meine', 'meinem', 'meinen', 'meiner', 'meines',
+            'mit', 'muss', 'musste', 'nach', 'nicht', 'nichts', 'noch', 'nun',
+            'nur', 'ob', 'oder', 'ohne', 'sehr', 'sein', 'seine', 'seinem',
+            'seinen', 'seiner', 'seines', 'selbst', 'sich', 'sie', 'ihnen',
+            'sind', 'so', 'solche', 'solchem', 'solchen', 'solcher', 'solches',
+            'soll', 'sollte', 'sondern', 'sonst', 'über', 'um', 'und', 'uns',
+            'unse', 'unsem', 'unsen', 'unser', 'unses', 'unter', 'viel', 'vom',
+            'von', 'vor', 'während', 'war', 'waren', 'warst', 'was', 'weg',
+            'weil', 'weiter', 'welche', 'welchem', 'welchen', 'welcher',
+            'welches', 'wenn', 'werde', 'werden', 'wie', 'wieder', 'will',
+            'wir', 'wird', 'wirst', 'wo', 'wollen',
+            'wollte', 'würde', 'würden', 'zu', 'zum',
+            'zur', 'zwar', 'zwischen'
+            ];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/u', '',
+            strtolower($page));
+        return $page;
+    }
+    /**
+     * Computes the stem of a German word
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $words
+     */
+    public static function stem($word)
+    {
+        if (in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+        self::$buffer = strtolower($word);
+        self::prelude();
+        self::markRegions();
+        self::backwardSuffix();
+        self::postlude();
+        return self::$buffer;
+    }
+    /**
+     * Upper u and y between vowels so won't be treated as a vowel for the
+     * purpose of this algorithm. Maps ß to ss.
+     */
+    private static function prelude()
+    {
+        $vowel = static::$vowel;
+        $word = self::$buffer;
+        //map non-vowel u and y to capitals
+        $word = preg_replace("/([$vowel])u([$vowel])/u", '$1U$2',
+            $word);
+        $word = preg_replace("/([$vowel])y([$vowel])/u", '$1Y$2',
+            $word);
+        $word = preg_replace("/ß/u", 'ss', $word);
+        self::$buffer = $word;
+    }
+    /**
+     * Computes locations of rv - RV is the region after the third letter,
+     * otherwise the region after the first vowel
+     * not at the beginning of the word, or the end of the word if
+     * these positions cannot be found. , r1 is the region after the first
+     * non-vowel following a vowel, or the end of the word if there is no such
+     * non-vowel and R2 is the region after the first non-vowel following a
+     * vowel in R1, or the end of the word if there is no such non-vowel.
+     *
+     */
+    private static function markRegions()
+    {
+        $word = self::$buffer;
+        $vowel = static::$vowel;
+        preg_match("/[$vowel][^$vowel]/u", $word, $matches,
+            PREG_OFFSET_CAPTURE);
+        self::$r1 = "";
+        $len = mb_strlen($word);
+        self::$r1_index = isset($matches[0][1]) ? $matches[0][1] + 2 : $len;
+        if (self::$r1_index != $len) {
+            self::$r1 = mb_substr($word, self::$r1_index);
+        }
+        if (self::$r1_index != $len) {
+            preg_match("/[$vowel][^$vowel]/u", self::$r1, $matches,
+                PREG_OFFSET_CAPTURE);
+            self::$r2_index = isset($matches[0][1]) ? $matches[0][1] + 2 : $len;
+            if (self::$r2_index != $len) {
+                self::$r2 = mb_substr(self::$r1, self::$r2_index);
+                self::$r2_index += self::$r1_index;
+            }
+        }
+        if (self::$r1_index != $len && self::$r1_index < 3) {
+            $tmp = mb_substr($word, 0, 2, "UTF-8");
+            self::$r1_index = 3;
+            if (strlen($tmp) == 3) {
+                self::$r1_index = 4;
+            }
+        }
+    }
+    /**
+     * Used to strip suffixes off word
+     */
+    private static function backwardSuffix()
+    {
+        /*
+        Step 1:
+        Search for the longest among the following suffixes,
+        (a) em   ern   er
+        (b) e   en   es
+        (c) s (preceded by a valid s-ending)
+        */
+        $word = self::$buffer;
+        $a1_index = L\preg_search('/(ern|er|em)$/u', $word);
+        $b1_index = L\preg_search('/(en|es|e)$/u', $word);
+        $s_ending = self::$s_ending;
+        $c1_index = L\preg_search("/([$s_ending]s)$/u", $word);
+        if ($c1_index != -1) { $c1_index++; }
+        $infty =  strlen($word) + 1;
+        $index1 = $infty;
+        $option_used1 = '';
+        if ($a1_index != -1 && $a1_index < $index1) {
+            $option_used1 = 'a';
+            $index1 = $a1_index;
+        }
+        if ($b1_index != -1 && $b1_index < $index1) {
+            $option_used1 = 'b';
+            $index1 = $b1_index;
+        }
+        if ($c1_index != -1 && $c1_index < $index1) {
+            $option_used1 = 'c';
+            $index1 = $c1_index;
+        }
+        /*
+            and delete if in R1. (Of course the letter of the valid s-ending is
+            not necessarily in R1.) If an ending of group (b) is deleted, and
+            the ending is preceded by niss, delete the final s. (For example,
+            äckern -> äck, ackers -> acker, armes -> arm,
+            bedürfnissen -> bedürfnis)
+        */
+        if ($index1 != $infty && self::$r1_index != -1) {
+            if ($index1 >= self::$r1_index) {
+                $word = substr($word, 0, $index1);
+                if ($option_used1 == 'b') {
+                    if (L\preg_search('/niss$/u', $word) != -1) {
+                        $word = mb_substr($word, 0, mb_strlen($word) - 1);
+                    }
+                }
+            }
+        }
+        /*
+        Step 2:
+        Search for the longest among the following suffixes,
+        (a) en   er   est
+        (b) st (preceded by a valid st-ending, itself preceded by at least 3
+        letters)
+        */
+
+        $a2_index = L\preg_search('/(en|er|est)$/u', $word);
+        $st_ending = self::$st_ending;
+        $b2_index = -1;
+        $pattern = "/(.{3}[$st_ending]st)$/u";
+        if (preg_match($pattern, $word, $matches, PREG_OFFSET_CAPTURE)) {
+            $b2_index = $matches[0][1];
+        }
+        if ($b2_index != -1) {
+            $b2_index += strlen($matches[0][0]) - 2;
+        }
+        $index2 = $infty;
+        $option_used2 = '';
+        if ($a2_index != -1 && $a2_index < $index2) {
+            $option_used2 = 'a';
+            $index2 = $a2_index;
+        }
+        if ($b2_index != -1 && $b2_index < $index2) {
+            $option_used2 = 'b';
+            $index2 = $b2_index;
+        }
+
+        /*
+        and delete if in R1.
+        (For example, derbsten -> derbst by step 1, and derbst -> derb by
+        step 2, since b is a valid st-ending, and is preceded by just 3 letters)
+        */
+        if ($index2 != $infty && self::$r1_index != -1) {
+            if ($index2 >= self::$r1_index) {
+                $word = substr($word, 0, $index2);
+            }
+        }
+        /*
+        Step 3: d-suffixes (*)
+        Search for the longest among the following suffixes, and perform
+        the action indicated.
+        end   ung
+            delete if in R2
+            if preceded by ig, delete if in R2 and not preceded by e
+        ig   ik   isch
+            delete if in R2 and not preceded by e
+        lich   heit
+            delete if in R2
+            if preceded by er or en, delete if in R1
+        keit
+            delete if in R2
+            if preceded by lich or ig, delete if in R2
+        */
+        $a3_index = L\preg_search('/(end|ung)$/', $word);
+        $b3_index = L\preg_search('/[^e](ig|ik|isch)$/', $word);
+        $c3_index = L\preg_search('/(lich|heit)$/', $word);
+        $d3_index = L\preg_search('/(keit)$/', $word);
+        if ($b3_index != -1) {
+            $b3_index++;
+        }
+        $index3 = $infty;
+        $option_used3 = '';
+        if ($a3_index != -1 && $a3_index < $index3) {
+            $option_used3 = 'a';
+            $index3 = $a3_index;
+        }
+        if ($b3_index != -1 && $b3_index < $index3) {
+            $option_used3 = 'b';
+            $index3 = $b3_index;
+
+        }
+        if ($c3_index != -1 && $c3_index < $index3) {
+            $option_used3 = 'c';
+            $index3 = $c3_index;
+        }
+        if ($d3_index != -1 && $d3_index < $index3) {
+            $option_used3 = 'd';
+            $index3 = $d3_index;
+        }
+        if ($index3 != $infty && self::$r2_index != -1) {
+            if ($index3 >= self::$r2_index) {
+                $word = substr($word, 0, $index3);
+                $option_index = -1;
+                $option_subsrt = '';
+                if ($option_used3 == 'a') {
+                    $option_index = L\preg_search('/[^e](ig)$/u', $word);
+                    if ($option_index != -1) {
+                        $option_index++;
+                        if ($option_index >= self::$r2_index) {
+                            $word = substr($word, 0, $option_index);
+                        }
+                    }
+                } else if ($option_used3 == 'c') {
+                    $option_index = L\preg_search('/(er|en)$/u', $word);
+                    if ($option_index != -1) {
+                        if ($option_index >= self::$r1_index) {
+                            $word = substr($word, 0, $option_index);
+                        }
+                    }
+                } else if ($option_used3 == 'd') {
+                    $option_index = L\preg_search('/(lich|ig)$/u', $word);
+                    if ($option_index != -1) {
+                        if ($option_index >= self::$r2_index) {
+                            $word = substr($word, 0, $option_index);
+                        }
+                    }
+                }
+            }
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Convert captitalized U and Y back to lower-case get rid of any dots
+     * above vowels
+     */
+    private static function postlude()
+    {
+        $vowel = static::$vowel;
+        $word = self::$buffer;
+        $word = preg_replace('/U/u', 'u', $word);
+        $word = preg_replace('/Y/u', 'y', $word);
+        $word = preg_replace('/ä/u', 'a', $word);
+        $word = preg_replace('/ö/u', 'o', $word);
+        $word = preg_replace('/ü/u', 'u', $word);
+        self::$buffer = $word;
+    }
+}
diff --git a/locale/en_US/configure.ini b/locale/en_US/configure.ini
new file mode 100755
index 0000000..9ac8bf0
--- /dev/null
+++ b/locale/en_US/configure.ini
@@ -0,0 +1,4503 @@
+; ***** BEGIN LICENSE BLOCK *****
+;  SeekQuarry/Yioop Open Source Pure PHP Search Engine, Crawler, and Indexer
+;  Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+;
+;  This program is free software: you can redistribute it and/or modify
+;  it under the terms of the GNU General Public License as published by
+;  the Free Software Foundation, either version 3 of the License, or
+;  (at your option) any later version.
+;
+;  This program is distributed in the hope that it will be useful,
+;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;  GNU General Public License for more details.
+;
+;  You should have received a copy of the GNU General Public License
+;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;  ***** END LICENSE BLOCK *****
+;
+; configure.ini
+;
+; en_US configuration file
+;
+[general]
+;
+; Strings to translate on various pages
+;
+[strings]
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers
+;
+; AdminController.php line: 114
+admin_controller_need_cookies = "Cookies needed to login!!"
+;
+; AdminController.php line: 164
+admin_controller_account_not_active = "Account not active. Maybe request password reset?"
+;
+; AdminController.php line: 170
+admin_controller_login_successful = "Login Successful!!"
+;
+; AdminController.php line: 189
+admin_controller_no_back_button = "No Back Button During Login!"
+;
+; AdminController.php line: 203
+admin_controller_login_failed = "Username or Password Incorrect!"
+;
+; AdminController.php line: 209
+admin_controller_login_to_config = "Login to continue configuration (default: u=root, p=)"
+;
+; AdminController.php line: 213
+admin_controller_status_updates_stopped = "Status updates have stopped."
+;
+; AdminController.php line: 367
+admin_controller_account_access = "Account Access"
+;
+; AdminController.php line: 368
+admin_controller_social = "Social"
+;
+; AdminController.php line: 369
+admin_controller_crawl_settings = "Crawls"
+;
+; AdminController.php line: 370
+admin_controller_system_settings = "System Settings"
+;
+; AdminController.php line: 371
+admin_controller_advertisement = "Advertisements"
+;
+; AdminController.php line: 545
+admin_controller_equal = "Equals"
+;
+; AdminController.php line: 546
+admin_controller_not_equal = "Not equals"
+;
+; AdminController.php line: 547
+admin_controller_contains = "Contains"
+;
+; AdminController.php line: 548
+admin_controller_begins_with = "Begins with"
+;
+; AdminController.php line: 549
+admin_controller_ends_with = "Ends with"
+;
+; AdminController.php line: 552
+admin_controller_equal = "Equals"
+;
+; AdminController.php line: 553
+admin_controller_not_equal = "Not equals"
+;
+; AdminController.php line: 556
+admin_controller_no_sort = "No sort"
+;
+; AdminController.php line: 557
+admin_controller_sort_ascending = "Ascending"
+;
+; AdminController.php line: 558
+admin_controller_sort_descending = "Descending"
+;
+; MachineController.php line: 193
+machine_controller_nolines = "No Lines Match Filter!"
+;
+; RegisterController.php line: 249
+register_controller_need_cookies = "Cookies need to be enabled to register or log in to a Seekquarry!"
+;
+; RegisterController.php line: 315
+register_controller_account_created = "Account created successfully!!"
+;
+; RegisterController.php line: 333
+register_controller_registration_email_sent = "Registration email sent!"
+;
+; RegisterController.php line: 335
+register_controller_admin_activation_request = "Seekquarry User Has Requested Activation"
+;
+; RegisterController.php line: 336
+register_controller_admin_email_salutation = "Dear %s %s,"
+;
+; RegisterController.php line: 338
+register_controller_email_body = "This email was given in a Seekquarry account creation request. If you are interested in a Seekquarry account please use the address below to complete the registration process."
+;
+; RegisterController.php line: 372
+register_controller_account_request_made = "Account registration request has been sent!"
+;
+; RegisterController.php line: 376
+register_controller_admin_activation_request = "Seekquarry User Has Requested Activation"
+;
+; RegisterController.php line: 377
+register_controller_admin_activation_message = "User %s %s with username %s has requested activation of their account."
+;
+; RegisterController.php line: 419
+register_controller_email_verification_error = "Email verification error!!"
+;
+; RegisterController.php line: 425
+register_controller_already_activated = "Account has already been activated!"
+;
+; RegisterController.php line: 432
+register_controller_account_activated = "Account successfully activated!!"
+;
+; RegisterController.php line: 435
+register_controller_email_verification_error = "Email verification error!!"
+;
+; RegisterController.php line: 483
+register_controller_account_recover_fail = "Unable to recover account!"
+;
+; RegisterController.php line: 492
+register_controller_account_recover_fail = "Unable to recover account!"
+;
+; RegisterController.php line: 496
+register_controller_account_recover_email = "Recover Account Email Sent!!"
+;
+; RegisterController.php line: 500
+register_controller_recover_request = "Seekquarry Account Recovery Request"
+;
+; RegisterController.php line: 501
+register_controller_admin_email_salutation = "Dear %s %s,"
+;
+; RegisterController.php line: 503
+register_controller_recover_body = "A request was made to recover your Seekquarry password. If this is correct, please paste the link below into a browser and complete the form presented."
+;
+; RegisterController.php line: 537
+register_controller_account_recover_fail = "Unable to recover account!"
+;
+; RegisterController.php line: 549
+register_controller_account_recover_fail = "Unable to recover account!"
+;
+; RegisterController.php line: 562
+register_controller_account_recover_fail = "Unable to recover account!"
+;
+; RegisterController.php line: 569
+register_controller_recovered_already = "Recover email already used!"
+;
+; RegisterController.php line: 573
+register_controller_recovery_expired = "Recover email has expired!"
+;
+; RegisterController.php line: 579
+register_controller_password_changed = "Password changed!"
+;
+; RegisterController.php line: 587
+register_controller_passwords_dont_match = "Passwords don&#039;t match!"
+;
+; RegisterController.php line: 601
+register_controller_recovered_already = "Recover email already used!"
+;
+; RegisterController.php line: 605
+register_controller_recovery_expired = "Recover email has expired!"
+;
+; RegisterController.php line: 732
+register_controller_invalid_url = "Format of URL is invalid!"
+;
+; RegisterController.php line: 736
+register_controller_error_fields = "Starred fields need to be filled in correctly!"
+;
+; RegisterController.php line: 749
+register_controller_failed_hashcode = "Hash Code Did Not Match!"
+;
+; RegisterController.php line: 759
+register_controller_failed_human = "Got human check questions wrong!"
+;
+; RegisterController.php line: 786
+register_controller_failed_graphical_human = "Captcha Mis-entered!"
+;
+; RegisterController.php line: 800
+register_controller_suggest_full = "Suggest URL buffer is full! Please try again later!"
+;
+; RegisterController.php line: 804
+register_controller_url_submitted = "Suggested URL saved!"
+;
+; RegisterController.php line: 1006
+register_controller_need_cookies = "Cookies need to be enabled to register or log in to a Seekquarry!"
+;
+; RegisterController.php line: 1012
+register_controller_failed_human = "Got human check questions wrong!"
+;
+; RegisterController.php line: 1027
+register_controller_failed_graphical_human = "Captcha Mis-entered!"
+;
+; RegisterController.php line: 1038
+register_controller_failed_hashcode = "Hash Code Did Not Match!"
+;
+; RegisterController.php line: 1066
+register_controller_error_fields = "Starred fields need to be filled in correctly!"
+;
+; RegisterController.php line: 1069
+register_controller_check_email = "Check Email Address!"
+;
+; RegisterController.php line: 1076
+register_controller_user_already_exists = "Account not created - Username already in use!!"
+;
+; SearchController.php line: 280
+search_controller_web = "Web"
+;
+; SearchController.php line: 341
+search_controller_logout_successful = "Logout Successful!!"
+;
+; SearchController.php line: 549
+search_controller_mix_info = "Using Crawl Mix: %s"
+;
+; SearchController.php line: 555
+search_controller_crawl_info = "Index: %s -- Size: %s pages/%s urls"
+;
+; SearchController.php line: 591
+search_controller_search = "Search"
+;
+; SearchController.php line: 695
+search_controller_no_index_set = "No Search Index Set For Use!"
+;
+; SearchController.php line: 698
+search_controller_no_index_set = "No Search Index Set For Use!"
+;
+; SearchController.php line: 800
+search_controller_get_keyword_ads = "Advertise for %s"
+;
+; SearchController.php line: 803
+search_controller_ad_keyword_description = "Do keyword advertising on Yioop!"
+;
+; SearchController.php line: 1382
+search_controller_download_fetcher = "Download Fetcher: %s"
+;
+; SearchController.php line: 1391
+search_controller_no_archive_page = "The website in question has requested this page not be archived."
+;
+; SearchController.php line: 1441
+search_controller_site_cache = "Yioop Cache"
+;
+; SearchController.php line: 1446
+search_controller_original_page = "This image appeared on the page:"
+;
+; SearchController.php line: 1463
+search_controller_extracted_title = "Extracted Title"
+;
+; SearchController.php line: 1465
+search_controller_extracted_description = "Extracted Description"
+;
+; SearchController.php line: 1467
+search_controller_extracted_links = "Extracted Links"
+;
+; SearchController.php line: 1472
+search_controller_extracted_allow_paths = "Extracted Allowed To Crawl Paths"
+;
+; SearchController.php line: 1478
+search_controller_extracted_disallow_paths = "Extracted Disallowed To Crawl Paths"
+;
+; SearchController.php line: 1484
+search_controller_crawl_delay = "SeekquarryBot Crawl Delay"
+;
+; SearchController.php line: 1548
+search_controller_cache_comment = "Seekquarry Cache Page... This page has been modified to add a robots directive,  make links absolute, add extracted summaries, and to highlight query terms."
+;
+; SearchController.php line: 1559
+search_controller_site_cache = "Yioop Cache"
+;
+; SearchController.php line: 1594
+search_controller_cached_version = "This cached version of %s was obtained by the Seekquarry crawler on %s."
+;
+; SearchController.php line: 1689
+search_controller_download_fetcher = "Download Fetcher: %s"
+;
+; SearchController.php line: 1707
+search_controller_header_summaries = "Toggle Extracted Headers and Summaries"
+;
+; SearchController.php line: 1821
+search_controller_history = "Toggle History"
+;
+; SearchController.php line: 1991
+search_controller_all_cached = "All Cached Versions - Change Year and/or Months to see Links"
+;
+; SearchController.php line: 2022
+search_controller_year = "Year:"
+;
+; SearchController.php line: 2023
+search_controller_month = "Month:"
+;
+; SettingsController.php line: 115
+settings_controller_crawl_mix = "crawl mix"
+;
+; SettingsController.php line: 130
+settings_controller_settings_saved = "Settings Saved!"
+;
+; StaticController.php line: 68
+static_controller_logout_successful = "Logout Successful"
+;
+; StaticController.php line: 146
+static_controller_complete_title = "%s"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers/components
+;
+; AccountaccessComponent.php line: 155
+accountaccess_component_no_posts_yet = "No Posts Yet"
+;
+; AccountaccessComponent.php line: 171
+accountaccess_component_passwords_too_long = "Password is too long!"
+;
+; AccountaccessComponent.php line: 181
+accountaccess_component_passwords_dont_match = "Typed passwords do not match."
+;
+; AccountaccessComponent.php line: 188
+accountaccess_component_invalid_password = "Invalid Password!"
+;
+; AccountaccessComponent.php line: 230
+accountaccess_component_unknown_imagetype = "Unknown Image File Type!"
+;
+; AccountaccessComponent.php line: 235
+accountaccess_component_icon_too_big = "Icon File Too Big!"
+;
+; AccountaccessComponent.php line: 244
+accountaccess_component_no_user_folder = "User Folder Could Not be Created!"
+;
+; AccountaccessComponent.php line: 253
+accountaccess_component_user_updated = "User Updated"
+;
+; AccountaccessComponent.php line: 294
+accountaccess_component_active_status = "Active"
+;
+; AccountaccessComponent.php line: 295
+accountaccess_component_inactive_status = "Inactive"
+;
+; AccountaccessComponent.php line: 297
+accountaccess_component_suspended_status = "Suspended"
+;
+; AccountaccessComponent.php line: 300
+accountaccess_component_request_join = "Pending"
+;
+; AccountaccessComponent.php line: 301
+accountaccess_component_invited = "Invited"
+;
+; AccountaccessComponent.php line: 302
+accountaccess_component_active_status = "Active"
+;
+; AccountaccessComponent.php line: 304
+accountaccess_component_suspended_status = "Suspended"
+;
+; AccountaccessComponent.php line: 352
+accountaccess_component_passwords_too_long = "Password is too long!"
+;
+; AccountaccessComponent.php line: 357
+accountaccess_component_passwords_dont_match = "Typed passwords do not match."
+;
+; AccountaccessComponent.php line: 361
+accountaccess_component_invalid_username = "Invalid Username!"
+;
+; AccountaccessComponent.php line: 365
+accountaccess_component_user_exists = "User Already Exists!"
+;
+; AccountaccessComponent.php line: 394
+accountaccess_component_user_added = "User Added"
+;
+; AccountaccessComponent.php line: 403
+accountaccess_component_user_doesnt_exist = "Can&#039;t edit -- that sername doesn&#039;t exist!"
+;
+; AccountaccessComponent.php line: 410
+accountaccess_component_cant_edit_public_user = "Cannot Edit Public User!"
+;
+; AccountaccessComponent.php line: 452
+accountaccess_component_passwords_dont_match = "Typed passwords do not match."
+;
+; AccountaccessComponent.php line: 458
+accountaccess_component_user_updated = "User Updated"
+;
+; AccountaccessComponent.php line: 464
+accountaccess_component_user_filter_group = "Filtering by Group!"
+;
+; AccountaccessComponent.php line: 468
+accountaccess_component_user_filter_role = "Filtering by Role!"
+;
+; AccountaccessComponent.php line: 479
+accountaccess_component_username_doesnt_exists = "Username Does Not Exist"
+;
+; AccountaccessComponent.php line: 484
+accountaccess_component_cant_delete_builtin = "Cannot Delete Built-in User!"
+;
+; AccountaccessComponent.php line: 489
+accountaccess_component_user_deleted = "User Deleted"
+;
+; AccountaccessComponent.php line: 498
+accountaccess_component_username_doesnt_exists = "Username Does Not Exist"
+;
+; AccountaccessComponent.php line: 503
+accountaccess_component_rolename_doesnt_exists = "Role Name Does not Exist"
+;
+; AccountaccessComponent.php line: 509
+accountaccess_component_rolename_already_added = "Role Name Already Added!"
+;
+; AccountaccessComponent.php line: 515
+accountaccess_component_rolename_added = "Role Name Added"
+;
+; AccountaccessComponent.php line: 525
+accountaccess_component_username_doesnt_exists = "Username Does Not Exist"
+;
+; AccountaccessComponent.php line: 530
+accountaccess_component_groupname_doesnt_exists = "Group Name does not exists"
+;
+; AccountaccessComponent.php line: 536
+accountaccess_component_groupname_already_added = "Group Name Already Added!"
+;
+; AccountaccessComponent.php line: 544
+accountaccess_component_groupname_added = "Group Name Added"
+;
+; AccountaccessComponent.php line: 554
+accountaccess_component_username_doesnt_exists = "Username Does Not Exist"
+;
+; AccountaccessComponent.php line: 559
+accountaccess_component_rolename_doesnt_exists = "Role Name Does not Exist"
+;
+; AccountaccessComponent.php line: 568
+accountaccess_component_rolename_deleted = "Role Name Deleted"
+;
+; AccountaccessComponent.php line: 578
+accountaccess_component_username_doesnt_exists = "Username Does Not Exist"
+;
+; AccountaccessComponent.php line: 583
+accountaccess_component_groupname_doesnt_exists = "Group Name does not exists"
+;
+; AccountaccessComponent.php line: 592
+accountaccess_component_group_deleted = "Group Deleted"
+;
+; AccountaccessComponent.php line: 609
+accountaccess_component_username_doesnt_exists = "Username Does Not Exist"
+;
+; AccountaccessComponent.php line: 615
+accountaccess_component_userstatus_updated = "User Status Updated"
+;
+; AccountaccessComponent.php line: 778
+accountaccess_component_select_activityname = "Select Activity"
+;
+; AccountaccessComponent.php line: 803
+accountaccess_component_rolename_doesnt_exists = "Role Name Does not Exist"
+;
+; AccountaccessComponent.php line: 819
+accountaccess_component_activity_added = "Activity Added"
+;
+; AccountaccessComponent.php line: 828
+accountaccess_component_rolename_exists = "Role Name Exists"
+;
+; AccountaccessComponent.php line: 834
+accountaccess_component_rolename_added = "Role Name Added"
+;
+; AccountaccessComponent.php line: 838
+accountaccess_component_rolename_blank = "Role Name Blank!"
+;
+; AccountaccessComponent.php line: 847
+accountaccess_component_rolename_doesnt_exists = "Role Name Does not Exist"
+;
+; AccountaccessComponent.php line: 865
+accountaccess_component_activity_deleted = "Activity Deleted"
+;
+; AccountaccessComponent.php line: 873
+accountaccess_component_rolename_doesnt_exists = "Role Name Does not Exist"
+;
+; AccountaccessComponent.php line: 878
+accountaccess_component_rolename_deleted = "Role Name Deleted"
+;
+; AccountaccessComponent.php line: 910
+accountaccess_component_role_updated = "Role updated!"
+;
+; AdvertisementComponent.php line: 55
+advertisement_component_num_days = "Number of Days"
+;
+; AdvertisementComponent.php line: 56
+advertisement_component_one_day = "1 day"
+;
+; AdvertisementComponent.php line: 57
+advertisement_component_seven_days = "7 days"
+;
+; AdvertisementComponent.php line: 58
+advertisement_component_thirty_days = "30 days"
+;
+; AdvertisementComponent.php line: 59
+advertisement_component_ninety_days = "90 days"
+;
+; AdvertisementComponent.php line: 60
+advertisement_component_one_eighty_days = "180 days"
+;
+; AdvertisementComponent.php line: 69
+advertisement_component_month = "Month"
+;
+; AdvertisementComponent.php line: 76
+advertisement_component_year = "Year"
+;
+; AdvertisementComponent.php line: 100
+advertisement_component_fields_cannot_be_empty = "Name, Description, Destination URL cannot be empty"
+;
+; AdvertisementComponent.php line: 105
+advertisement_component_duration_cannot_be_empty = "Ad Duration Cannot Be Empty!"
+;
+; AdvertisementComponent.php line: 110
+advertisement_component_enter_keywords = "Please enter keywords"
+;
+; AdvertisementComponent.php line: 157
+advertisement_component_enter_keywords = "Please enter keywords"
+;
+; AdvertisementComponent.php line: 163
+advertisement_component_bid_too_low = "Bid too low! Calculate and bid  again!"
+;
+; AdvertisementComponent.php line: 171
+advertisement_component_processing_error = "Payment Processing Error"
+;
+; AdvertisementComponent.php line: 178
+advertisement_component_ad_created = "Advertisement created"
+;
+; AdvertisementComponent.php line: 206
+advertisement_component_status_changed = "Ad status changed!"
+;
+; AdvertisementComponent.php line: 252
+advertisement_component_ad_updated = "Advertisement Updated"
+;
+; CrawlComponent.php line: 92
+crawl_component_starting_new_crawl = "Starting New Crawl!"
+;
+; CrawlComponent.php line: 107
+crawl_component_stop_crawl = "Stopping crawl. . .This will take a moment to refresh."
+;
+; CrawlComponent.php line: 135
+crawl_component_resume_crawl = "Resuming crawl. . .This will take a moment to refresh."
+;
+; CrawlComponent.php line: 143
+crawl_component_delete_crawl_success = "Deleting Crawl. . .This will take a moment to refresh."
+;
+; CrawlComponent.php line: 147
+crawl_component_delete_crawl_fail = "Delete Crawl Failed!!"
+;
+; CrawlComponent.php line: 156
+crawl_component_set_index = "Setting Crawl To Use as Index"
+;
+; CrawlComponent.php line: 188
+crawl_component_no_description = "No Description for Crawl"
+;
+; CrawlComponent.php line: 336
+crawl_component_use_below = "Use options below"
+;
+; CrawlComponent.php line: 337
+crawl_component_use_defaults = "Use Seekquarry defaults"
+;
+; CrawlComponent.php line: 340
+crawl_component_use_below = "Use options below"
+;
+; CrawlComponent.php line: 344
+crawl_component_previous_crawl = "Previous Crawl:"
+;
+; CrawlComponent.php line: 415
+crawl_component_added_urls = "Urls injected on %s."
+;
+; CrawlComponent.php line: 429
+crawl_component_add_suggest = "User suggested URLS added!"
+;
+; CrawlComponent.php line: 433
+crawl_component_no_new_suggests = "No new urls in suggest data"
+;
+; CrawlComponent.php line: 479
+crawl_component_breadth_first = "Breadth First"
+;
+; CrawlComponent.php line: 481
+crawl_component_page_importance = "Page Importance"
+;
+; CrawlComponent.php line: 545
+crawl_component_added_urls = "Urls injected on %s."
+;
+; CrawlComponent.php line: 555
+crawl_component_urls_injected = "Urls Injected!"
+;
+; CrawlComponent.php line: 565
+crawl_component_update_seed_info = "Updating Seed Site Info!"
+;
+; CrawlComponent.php line: 619
+crawl_component_new_classifier = "New classifier created."
+;
+; CrawlComponent.php line: 623
+crawl_component_classifier_exists = "A classifier with that name already exists."
+;
+; CrawlComponent.php line: 646
+crawl_component_classifier_deleted = "Classifier deleted."
+;
+; CrawlComponent.php line: 650
+crawl_component_no_classifier = "No classifier with that name."
+;
+; CrawlComponent.php line: 661
+crawl_component_no_classifier = "No classifier with that name."
+;
+; CrawlComponent.php line: 679
+crawl_component_finalizing_classifier = "Finalizing classifier."
+;
+; CrawlComponent.php line: 705
+crawl_component_finalizing_classifier = "Finalizing classifier."
+;
+; CrawlComponent.php line: 751
+crawl_component_classifier_exists = "A classifier with that name already exists."
+;
+; CrawlComponent.php line: 760
+crawl_component_load_failed = "Failed to load documents"
+;
+; CrawlComponent.php line: 762
+crawl_component_loading = "Loading"
+;
+; CrawlComponent.php line: 764
+crawl_component_added_examples = "Added {1} {2} examples"
+;
+; CrawlComponent.php line: 766
+crawl_component_label_update_failed = "Failed to update labels."
+;
+; CrawlComponent.php line: 768
+crawl_component_updating = "Updating"
+;
+; CrawlComponent.php line: 770
+crawl_component_acc_update_failed = "Failed to update accuracy"
+;
+; CrawlComponent.php line: 772
+crawl_component_na = "N/A"
+;
+; CrawlComponent.php line: 774
+crawl_component_no_docs = "No documents"
+;
+; CrawlComponent.php line: 776
+crawl_component_num_docs = "{1}{2} documents"
+;
+; CrawlComponent.php line: 778
+crawl_component_in_class = "In Class"
+;
+; CrawlComponent.php line: 780
+crawl_component_not_in_class = "Not In Class"
+;
+; CrawlComponent.php line: 782
+crawl_component_skip = "Skip"
+;
+; CrawlComponent.php line: 784
+crawl_component_prediction = "Prediction: {1}"
+;
+; CrawlComponent.php line: 786
+crawl_component_scores = "{1}%% confidence, {2}%% disagreement"
+;
+; CrawlComponent.php line: 823
+crawl_component_use_below = "Use options below"
+;
+; CrawlComponent.php line: 824
+crawl_component_use_defaults = "Use Seekquarry defaults"
+;
+; CrawlComponent.php line: 826
+crawl_component_use_below = "Use options below"
+;
+; CrawlComponent.php line: 834
+crawl_component_recrawl_never = "Never"
+;
+; CrawlComponent.php line: 835
+crawl_component_recrawl_1day = "1 days"
+;
+; CrawlComponent.php line: 836
+crawl_component_recrawl_2day = "2 days"
+;
+; CrawlComponent.php line: 837
+crawl_component_recrawl_3day = "3 days"
+;
+; CrawlComponent.php line: 838
+crawl_component_recrawl_7day = "7 days"
+;
+; CrawlComponent.php line: 839
+crawl_component_recrawl_14day = "14 days"
+;
+; CrawlComponent.php line: 847
+crawl_component_basic = "Basic"
+;
+; CrawlComponent.php line: 848
+crawl_component_centroid = "Centroid"
+;
+; CrawlComponent.php line: 849
+crawl_component_graph_based = "Graph-Based"
+;
+; CrawlComponent.php line: 1137
+crawl_component_page_options_updated = "Page Options Updated!"
+;
+; CrawlComponent.php line: 1165
+crawl_component_page_options_running_tests = "Running Tests!"
+;
+; CrawlComponent.php line: 1346
+crawl_component_results_editor_update = "Filter Pages Updated!"
+;
+; CrawlComponent.php line: 1361
+crawl_component_edited_pages = "Select a Previously Edited URL"
+;
+; CrawlComponent.php line: 1374
+crawl_component_results_editor_need_url = "Result Page Update needs to Specify the URL!"
+;
+; CrawlComponent.php line: 1380
+crawl_component_results_editor_page_updated = "Result Page Updated!"
+;
+; CrawlComponent.php line: 1393
+crawl_component_results_editor_page_loaded = "Page Loaded!"
+;
+; CrawlComponent.php line: 1424
+crawl_component_media_kind = "Media Kind"
+;
+; CrawlComponent.php line: 1425
+crawl_component_video = "Video"
+;
+; CrawlComponent.php line: 1426
+crawl_component_rss_feed = "RSS"
+;
+; CrawlComponent.php line: 1427
+crawl_component_html_feed = "Html Feed"
+;
+; CrawlComponent.php line: 1441
+crawl_component_sources_indexes = "Index/Mix to Use"
+;
+; CrawlComponent.php line: 1496
+crawl_component_no_source_type = "Type of Source Not Set!"
+;
+; CrawlComponent.php line: 1510
+crawl_component_missing_type = "Must set media type!"
+;
+; CrawlComponent.php line: 1524
+crawl_component_invalid_url = "Invalid URL!"
+;
+; CrawlComponent.php line: 1531
+crawl_component_missing_fields = "All Fields Need to be Filled!"
+;
+; CrawlComponent.php line: 1548
+crawl_component_media_source_added = "Media Source Added!"
+;
+; CrawlComponent.php line: 1561
+crawl_component_missing_fields = "All Fields Need to be Filled!"
+;
+; CrawlComponent.php line: 1569
+crawl_component_subsearch_added = "Subsearch Added!"
+;
+; CrawlComponent.php line: 1575
+crawl_component_no_delete_source = "Source Was Not Deleted!"
+;
+; CrawlComponent.php line: 1581
+crawl_component_media_source_deleted = "Media Source Deleted!"
+;
+; CrawlComponent.php line: 1588
+crawl_component_no_delete_source = "Source Was Not Deleted!"
+;
+; CrawlComponent.php line: 1595
+crawl_component_subsearch_deleted = "Subsearch Deleted!"
+;
+; CrawlComponent.php line: 1630
+crawl_component_subsearch_updated = "Subsearch Updated!"
+;
+; CrawlComponent.php line: 1705
+crawl_component_media_source_updated = "Media Source Updated!"
+;
+; SocialComponent.php line: 92
+social_component_request_join = "Request Join"
+;
+; SocialComponent.php line: 93
+social_component_invited = "Invited"
+;
+; SocialComponent.php line: 94
+social_component_active_status = "Active"
+;
+; SocialComponent.php line: 95
+social_component_suspended_status = "Suspended"
+;
+; SocialComponent.php line: 98
+social_component_no_join = "No One"
+;
+; SocialComponent.php line: 99
+social_component_by_request = "By Request"
+;
+; SocialComponent.php line: 101
+social_component_public_request = "Public Request"
+;
+; SocialComponent.php line: 102
+social_component_public_join = "Anyone"
+;
+; SocialComponent.php line: 105
+social_component_private = "No Read"
+;
+; SocialComponent.php line: 106
+social_component_read = "Read"
+;
+; SocialComponent.php line: 107
+social_component_read_comment = "Read Comment"
+;
+; SocialComponent.php line: 108
+social_component_read_write = "Read Write"
+;
+; SocialComponent.php line: 109
+social_component_read_wiki = "Read Write Wiki"
+;
+; SocialComponent.php line: 112
+social_component_no_voting = "No Voting"
+;
+; SocialComponent.php line: 113
+social_component_up_voting = "+ Voting"
+;
+; SocialComponent.php line: 114
+social_component_up_down_voting = "+/- Voting"
+;
+; SocialComponent.php line: 117
+social_component_forever = "Never Expires"
+;
+; SocialComponent.php line: 118
+social_component_one_hour = "One Hour"
+;
+; SocialComponent.php line: 119
+social_component_one_day = "One Day"
+;
+; SocialComponent.php line: 120
+social_component_one_month = "One Month"
+;
+; SocialComponent.php line: 192
+accountaccess_component_user_activated = "User activated!"
+;
+; SocialComponent.php line: 197
+accountaccess_component_no_user_activated = "User was not activated!"
+;
+; SocialComponent.php line: 216
+social_component_joined = "Group Joined!"
+;
+; SocialComponent.php line: 220
+social_component_groupname_unavailable = "Group name unavailable!"
+;
+; SocialComponent.php line: 226
+social_component_name_available = "Group name available!"
+;
+; SocialComponent.php line: 243
+social_component_user_banned = "User banned!"
+;
+; SocialComponent.php line: 248
+social_component_no_user_banned = "User was not banned!"
+;
+; SocialComponent.php line: 269
+social_component_owner_changed = "Owner Changed!"
+;
+; SocialComponent.php line: 274
+social_component_not_in_group = "User not in group!"
+;
+; SocialComponent.php line: 280
+social_component_not_a_user = "Username does not exist!"
+;
+; SocialComponent.php line: 296
+social_component_groupname_exists = "Group Name Exists"
+;
+; SocialComponent.php line: 320
+social_component_groupname_added = "Group Name Added"
+;
+; SocialComponent.php line: 329
+social_component_groupname_doesnt_exists = "Group Name does not exists"
+;
+; SocialComponent.php line: 336
+social_component_group_deleted = "Group Deleted"
+;
+; SocialComponent.php line: 339
+social_component_no_delete_group = "Cannot Delete Group"
+;
+; SocialComponent.php line: 352
+social_component_user_deleted = "User Deleted"
+;
+; SocialComponent.php line: 357
+social_component_no_delete_user_group = "Cannot Delete User from Group."
+;
+; SocialComponent.php line: 406
+social_component_users_invited = "Users Invited!"
+;
+; SocialComponent.php line: 411
+social_component_no_users_invited = "No Users Invited!!"
+;
+; SocialComponent.php line: 427
+social_component_joined = "Group Joined!"
+;
+; SocialComponent.php line: 430
+social_component_no_unsubscribe = "Could not Unsubscribe!"
+;
+; SocialComponent.php line: 471
+social_component_user_reinstated = "User reinstated!"
+;
+; SocialComponent.php line: 476
+social_component_no_user_reinstated = "User was not reinstated!"
+;
+; SocialComponent.php line: 483
+social_component_request_join = "Request Join"
+;
+; SocialComponent.php line: 485
+social_component_invited = "Invited"
+;
+; SocialComponent.php line: 487
+social_component_banned_status = "Banned"
+;
+; SocialComponent.php line: 504
+social_component_unsubscribe = "Successfully Unsubscribed!"
+;
+; SocialComponent.php line: 508
+social_component_no_unsubscribe = "Could not Unsubscribe!"
+;
+; SocialComponent.php line: 556
+social_component_group_joined = "Group joined!"
+;
+; SocialComponent.php line: 558
+social_component_group_request_join = "Join Group Request Made!"
+;
+; SocialComponent.php line: 573
+social_component_activate_group = "Seekquarry Group %s Activation Request"
+;
+; SocialComponent.php line: 580
+social_component_activate_body = "The user %s has requested to join group %s."
+;
+; SocialComponent.php line: 584
+social_component_notify_closing = "Best regards,"
+;
+; SocialComponent.php line: 585
+social_component_notify_signature = "Seekquarry Software"
+;
+; SocialComponent.php line: 656
+social_component_no_permission = "Insufficient Access!"
+;
+; SocialComponent.php line: 669
+social_component_group_updated = "Group updated!"
+;
+; SocialComponent.php line: 677
+social_component_unknown_access = "Attempt to change access to unknown value!"
+;
+; SocialComponent.php line: 685
+social_component_group_filter_users = "Filtering Users!"
+;
+; SocialComponent.php line: 776
+social_component_comment_error = "Error in comment data!"
+;
+; SocialComponent.php line: 780
+social_component_no_comment = "Cannot post blank comment!"
+;
+; SocialComponent.php line: 792
+social_component_no_post_access = "Cannot post to that group!"
+;
+; SocialComponent.php line: 798
+social_component_no_post_access = "Cannot post to that group!"
+;
+; SocialComponent.php line: 802
+social_component_join_group = "%s joined %s!"
+;
+; SocialComponent.php line: 805
+social_component_join_group_detail = "On %s, you joined the group  %s."
+;
+; SocialComponent.php line: 820
+social_component_upload_error = "Upload Error!"
+;
+; SocialComponent.php line: 833
+social_component_thread_notification = "New Post to Thread: %s"
+;
+; SocialComponent.php line: 835
+social_component_notify_body = "We thought you would be interested in a new post to the thread:"
+;
+; SocialComponent.php line: 838
+social_component_notify_closing = "Best regards,"
+;
+; SocialComponent.php line: 839
+social_component_notify_signature = "Seekquarry Software"
+;
+; SocialComponent.php line: 841
+social_component_notify_salutation = "Dear %s,"
+;
+; SocialComponent.php line: 848
+social_component_comment_added = "Comment Added!"
+;
+; SocialComponent.php line: 859
+social_component_groupname_cant_add = "Cannot add selected group!"
+;
+; SocialComponent.php line: 865
+social_component_delete_error = "Error Deleting Item"
+;
+; SocialComponent.php line: 885
+social_component_item_deleted = "Item Deleted!"
+;
+; SocialComponent.php line: 888
+social_component_no_item_deleted = "No Item Deleted!"
+;
+; SocialComponent.php line: 896
+social_component_vote_error = "Voting Error!"
+;
+; SocialComponent.php line: 905
+social_component_no_vote_access = "No vote access to that post! "
+;
+; SocialComponent.php line: 910
+social_component_no_post_access = "Cannot post to that group!"
+;
+; SocialComponent.php line: 914
+social_component_already_voted = "Already Voted!"
+;
+; SocialComponent.php line: 918
+social_component_vote_recorded = "Vote Recorded!"
+;
+; SocialComponent.php line: 924
+social_component_comment_error = "Error in comment data!"
+;
+; SocialComponent.php line: 929
+social_component_need_title_description = "Need both title and description!"
+;
+; SocialComponent.php line: 940
+social_component_no_post_access = "Cannot post to that group!"
+;
+; SocialComponent.php line: 948
+social_component_upload_error = "Upload Error!"
+;
+; SocialComponent.php line: 961
+social_component_new_thread_mail = "New Thread in Group %s"
+;
+; SocialComponent.php line: 965
+social_component_new_thread_body = "As the owner of %s we thought you would like to know of the following thread recently created in your group:"
+;
+; SocialComponent.php line: 969
+social_component_notify_closing = "Best regards,"
+;
+; SocialComponent.php line: 970
+social_component_notify_signature = "Seekquarry Software"
+;
+; SocialComponent.php line: 975
+social_component_notify_salutation = "Dear %s,"
+;
+; SocialComponent.php line: 983
+social_component_thread_created = "Thread Created!"
+;
+; SocialComponent.php line: 991
+social_component_comment_error = "Error in comment data!"
+;
+; SocialComponent.php line: 995
+social_component_need_title_description = "Need both title and description!"
+;
+; SocialComponent.php line: 1001
+social_component_post_edited_elsewhere = "Post was just edited elsewhere (another tab?)"
+;
+; SocialComponent.php line: 1009
+social_component_no_update_access = "Cannot Update Post!"
+;
+; SocialComponent.php line: 1022
+social_component_no_update_access = "Cannot Update Post!"
+;
+; SocialComponent.php line: 1031
+social_component_upload_error = "Upload Error!"
+;
+; SocialComponent.php line: 1034
+social_component_post_updated = "Post Updated!"
+;
+; SocialComponent.php line: 1041
+social_component_vote_error = "Voting Error!"
+;
+; SocialComponent.php line: 1050
+social_component_no_vote_access = "No vote access to that post! "
+;
+; SocialComponent.php line: 1055
+social_component_no_post_access = "Cannot post to that group!"
+;
+; SocialComponent.php line: 1059
+social_component_already_voted = "Already Voted!"
+;
+; SocialComponent.php line: 1063
+social_component_vote_recorded = "Vote Recorded!"
+;
+; SocialComponent.php line: 1094
+social_component_join_group = "%s joined %s!"
+;
+; SocialComponent.php line: 1097
+social_component_join_group_detail = "On %s, you joined the group  %s."
+;
+; SocialComponent.php line: 1373
+accountaccess_component_no_posts_yet = "No Posts Yet"
+;
+; SocialComponent.php line: 1416
+social_component_search = "Search"
+;
+; SocialComponent.php line: 1503
+social_component_no_group_access = "Not a member or can&#039;t read that group. Switching to public group!"
+;
+; SocialComponent.php line: 1506
+social_component_no_group_access = "Not a member or can&#039;t read that group. Switching to public group!"
+;
+; SocialComponent.php line: 1530
+social_component_standard_page = "Standard"
+;
+; SocialComponent.php line: 1531
+social_component_page_alias = "Page Alias"
+;
+; SocialComponent.php line: 1532
+social_component_media_list = "Media List"
+;
+; SocialComponent.php line: 1533
+social_component_presentation = "Presentation"
+;
+; SocialComponent.php line: 1536
+social_component_solid = "Solid"
+;
+; SocialComponent.php line: 1537
+social_component_dashed = "Dashed"
+;
+; SocialComponent.php line: 1538
+social_component_none = "None"
+;
+; SocialComponent.php line: 1577
+social_component_missing_fields = "Missing Fields!"
+;
+; SocialComponent.php line: 1583
+social_component_wiki_edited_elsewhere = "Wiki Page Has Been Edited Since Your Version. Loading Changed Version!"
+;
+; SocialComponent.php line: 1633
+social_component_page_created = "%s Wiki Page Created!"
+;
+; SocialComponent.php line: 1634
+social_component_page_discuss_here = "Discuss the page in this thread!"
+;
+; SocialComponent.php line: 1639
+social_component_page_saved = "Page Saved!"
+;
+; SocialComponent.php line: 1651
+social_component_resource_deleted = "Resource Deleted!"
+;
+; SocialComponent.php line: 1656
+social_component_resource_not_deleted = "Resource Not Deleted! "
+;
+; SocialComponent.php line: 1673
+social_component_resource_renamed = "Resource Renamed!"
+;
+; SocialComponent.php line: 1678
+social_component_resource_not_renamed = "Resource not Renamed!"
+;
+; SocialComponent.php line: 1688
+social_component_resource_save_first = "Need to Save Page Before Using Resources!"
+;
+; SocialComponent.php line: 1700
+social_component_page_created = "%s Wiki Page Created!"
+;
+; SocialComponent.php line: 1702
+social_component_page_discuss_here = "Discuss the page in this thread!"
+;
+; SocialComponent.php line: 1706
+social_component_resource_uploaded = "Resource Uploaded!"
+;
+; SocialComponent.php line: 1711
+social_component_upload_error = "Upload Error!"
+;
+; SocialComponent.php line: 1758
+social_component_back = "Back"
+;
+; SocialComponent.php line: 1759
+social_component_history_page = "Historical Version of %s from %s."
+;
+; SocialComponent.php line: 1794
+social_component_back = "Back"
+;
+; SocialComponent.php line: 1795
+social_component_diff_page = "%s line differences between %s and %s."
+;
+; SocialComponent.php line: 1809
+social_component_wiki_edited_elsewhere = "Wiki Page Has Been Edited Since Your Version. Loading Changed Version!"
+;
+; SocialComponent.php line: 1817
+social_component_page_revert_to = "Revert to %s."
+;
+; SocialComponent.php line: 1821
+social_component_page_reverted = "Page Reverted!"
+;
+; SocialComponent.php line: 1825
+social_component_revert_error = "Error Reverting Page!"
+;
+; SocialComponent.php line: 1896
+social_component_main = "Main"
+;
+; SocialComponent.php line: 2142
+wiki_js_small = "Small"
+;
+; SocialComponent.php line: 2143
+wiki_js_medium = "Medium"
+;
+; SocialComponent.php line: 2144
+wiki_js_large = "Large"
+;
+; SocialComponent.php line: 2145
+wiki_js_search_size = "Size"
+;
+; SocialComponent.php line: 2146
+wiki_js_prompt_heading = "Header row:"
+;
+; SocialComponent.php line: 2147
+wiki_js_example = "Example"
+;
+; SocialComponent.php line: 2148
+wiki_js_table_title = "Table Title"
+;
+; SocialComponent.php line: 2149
+wiki_js_submit = "Submit"
+;
+; SocialComponent.php line: 2150
+wiki_js_cancel = "Cancel"
+;
+; SocialComponent.php line: 2151
+wiki_js_bold = "Bold text"
+;
+; SocialComponent.php line: 2152
+wiki_js_italic = "Italic text"
+;
+; SocialComponent.php line: 2153
+wiki_js_underline = "Underlined text"
+;
+; SocialComponent.php line: 2154
+wiki_js_strike = "Striked text"
+;
+; SocialComponent.php line: 2155
+wiki_js_heading = "Heading"
+;
+; SocialComponent.php line: 2156
+wiki_js_heading1 = "Level 1 Heading"
+;
+; SocialComponent.php line: 2157
+wiki_js_heading2 = "Level 2 Heading"
+;
+; SocialComponent.php line: 2158
+wiki_js_heading3 = "Level 3 Heading"
+;
+; SocialComponent.php line: 2159
+wiki_js_heading4 = "Level 4 Heading"
+;
+; SocialComponent.php line: 2160
+wiki_js_bullet = "Unordered list item"
+;
+; SocialComponent.php line: 2161
+wiki_js_enum = "Ordered list item"
+;
+; SocialComponent.php line: 2162
+wiki_js_nowiki = "Insert non-formatted text here"
+;
+; SocialComponent.php line: 2163
+wiki_js_add_search = "Add Search Bar Form"
+;
+; SocialComponent.php line: 2164
+wiki_js_search_size = "Size"
+;
+; SocialComponent.php line: 2165
+wiki_js_add_wiki_table = "Add Wiki Table"
+;
+; SocialComponent.php line: 2166
+wiki_js_for_table_cols = "Column Count:"
+;
+; SocialComponent.php line: 2167
+wiki_js_for_table_rows = "Row Count:"
+;
+; SocialComponent.php line: 2168
+wiki_js_add_hyperlink = "Add Hyperlink"
+;
+; SocialComponent.php line: 2169
+wiki_js_link_text = "Text:"
+;
+; SocialComponent.php line: 2170
+wiki_js_link_url = "URL:"
+;
+; SocialComponent.php line: 2171
+wiki_js_placeholder = "Search Placeholder Text"
+;
+; SocialComponent.php line: 2172
+wiki_js_centeraligned = "This text is centered."
+;
+; SocialComponent.php line: 2173
+wiki_js_rightaligned = "This text is right-aligned."
+;
+; SocialComponent.php line: 2174
+wiki_js_leftaligned = "This text is left-aligned."
+;
+; SocialComponent.php line: 2176
+wiki_js_definitionlist_item = "Item"
+;
+; SocialComponent.php line: 2178
+wiki_js_definitionlist_definition = "Definition"
+;
+; SocialComponent.php line: 2180
+wiki_js_slide_sample_title = "Title"
+;
+; SocialComponent.php line: 2182
+wiki_js_slide_sample_bullet = "Slide Item"
+;
+; SocialComponent.php line: 2184
+wiki_js_slide_resource_description = "Resource Description for "
+;
+; SocialComponent.php line: 2222
+social_component_select_crawl = "Select Crawl"
+;
+; SocialComponent.php line: 2223
+social_component_default_crawl = "Default Crawl"
+;
+; SocialComponent.php line: 2225
+social_component_select_crawl = "Select Crawl"
+;
+; SocialComponent.php line: 2227
+social_component_default_crawl = "Default Crawl"
+;
+; SocialComponent.php line: 2257
+social_component_mix_created = "Crawl Mix Created!"
+;
+; SocialComponent.php line: 2260
+social_component_invalid_name = "Mix Name in Use or Invalid!"
+;
+; SocialComponent.php line: 2268
+social_component_mix_invalid_timestamp = "Invalid Timestamp!"
+;
+; SocialComponent.php line: 2272
+social_component_mix_deleted = "Crawl Mix Deleted!"
+;
+; SocialComponent.php line: 2291
+social_component_mix_doesnt_exists = "Mix to Delete Does not Exist!"
+;
+; SocialComponent.php line: 2299
+social_component_mix_imported = "Mix Successfully Imported!"
+;
+; SocialComponent.php line: 2313
+social_component_set_index = "Setting Crawl To Use as Index"
+;
+; SocialComponent.php line: 2322
+social_component_comment_error = "Error in comment data!"
+;
+; SocialComponent.php line: 2328
+social_component_invalid_timestamp = "Shared Mix Has An Invalid Timestamp"
+;
+; SocialComponent.php line: 2346
+social_component_no_post_access = "Cannot post to that group!"
+;
+; SocialComponent.php line: 2350
+social_component_share_title = "Try out this crawl mix!"
+;
+; SocialComponent.php line: 2352
+social_component_share_description = "%s is sharing the crawl mix %s!"
+;
+; SocialComponent.php line: 2357
+social_component_thread_created = "Thread Created!"
+;
+; SocialComponent.php line: 2408
+social_component_mix_invalid_timestamp = "Invalid Timestamp!"
+;
+; SocialComponent.php line: 2413
+social_component_mix_not_owner = "Not Mix Owner!"
+;
+; SocialComponent.php line: 2423
+social_component_add_crawls = "Add Crawls"
+;
+; SocialComponent.php line: 2425
+social_component_num_results = "Results Shown"
+;
+; SocialComponent.php line: 2427
+social_component_del_frag = "Remove"
+;
+; SocialComponent.php line: 2429
+social_component_weight = "Weight"
+;
+; SocialComponent.php line: 2430
+social_component_name = "Name"
+;
+; SocialComponent.php line: 2432
+social_component_add_keywords = "Keywords"
+;
+; SocialComponent.php line: 2434
+social_component_actions = "Actions"
+;
+; SocialComponent.php line: 2436
+social_component_add_query = "Add Query"
+;
+; SocialComponent.php line: 2437
+social_component_delete = "Delete"
+;
+; SocialComponent.php line: 2487
+social_component_too_many_fragments = "Too Many Search Result Fragments!"
+;
+; SocialComponent.php line: 2498
+social_component_mix_saved = "Crawl Mix Changes Saved!"
+;
+; SystemComponent.php line: 82
+system_component_select_machine = "Select Machine"
+;
+; SystemComponent.php line: 143
+system_component_machine_added = "Machine Added!"
+;
+; SystemComponent.php line: 147
+system_component_machine_exists = "Machine Name Already Exists; Please Delete First!"
+;
+; SystemComponent.php line: 151
+system_component_machine_incomplete = "Missing or Invalid Fields From Machine Form!"
+;
+; SystemComponent.php line: 158
+system_component_machine_doesnt_exists = "Machine Name does not Exists!"
+;
+; SystemComponent.php line: 179
+system_component_stop_service_first = "Machine in use. Please stop the service running on it!"
+;
+; SystemComponent.php line: 185
+system_component_machine_deleted = "Machine Deleted!"
+;
+; SystemComponent.php line: 200
+system_component_updatemode_toggled = "Media Update Mode Toggled!"
+;
+; SystemComponent.php line: 246
+system_component_no_machine_log = "No Log File Found."
+;
+; SystemComponent.php line: 270
+system_component_machine_servers_updated = "Machine&#039;s Servers Updated!"
+;
+; SystemComponent.php line: 274
+system_component_machine_no_action = "Unable to Perform Action!"
+;
+; SystemComponent.php line: 310
+system_component_select_mode = "Select Mode"
+;
+; SystemComponent.php line: 351
+system_component_locale_missing_info = "Field values missing or invalid!"
+;
+; SystemComponent.php line: 358
+system_component_locale_added = "Locale Added!"
+;
+; SystemComponent.php line: 365
+system_component_localename_doesnt_exists = "Locale Does Not Exist!"
+;
+; SystemComponent.php line: 370
+system_component_localename_deleted = "Locale Deleted"
+;
+; SystemComponent.php line: 376
+system_component_localename_doesnt_exists = "Locale Does Not Exist!"
+;
+; SystemComponent.php line: 405
+system_component_locale_updated = "Locale Information Updated!"
+;
+; SystemComponent.php line: 435
+system_component_localestrings_updated = "Locale Strings Updated!"
+;
+; SystemComponent.php line: 446
+system_component_all_strings = "All Strings"
+;
+; SystemComponent.php line: 447
+system_component_missing_strings = "Missing Strings"
+;
+; SystemComponent.php line: 566
+system_component_configure_no_change_db = "Problem Updating Database!"
+;
+; SystemComponent.php line: 571
+system_component_configure_profile_change = "Profile Updated!"
+;
+; SystemComponent.php line: 574
+system_component_configure_no_change_profile = "There was a Problem Updating Profile!"
+;
+; SystemComponent.php line: 607
+system_component_configure_disable_registration = "Disable Registration"
+;
+; SystemComponent.php line: 609
+system_component_configure_no_activation = "No Activation"
+;
+; SystemComponent.php line: 611
+system_component_configure_email_activation = "Email Activation"
+;
+; SystemComponent.php line: 613
+system_component_configure_admin_activation = "Admin Activation"
+;
+; SystemComponent.php line: 617
+system_component_configure_no_advertisements = "No Advertisements"
+;
+; SystemComponent.php line: 619
+system_component_configure_keyword_advertisements = "Keyword Advertisements"
+;
+; SystemComponent.php line: 621
+system_component_configure_external_advertisements = "External Ad Server"
+;
+; SystemComponent.php line: 704
+captchasettings_element_text_captcha = "Text Captcha"
+;
+; SystemComponent.php line: 706
+captchasettings_element_hash_captcha = "Hash Captcha"
+;
+; SystemComponent.php line: 708
+captchasettings_element_image_captcha = "Image Captcha"
+;
+; SystemComponent.php line: 713
+serversettings_element_normal_authentication = "Normal Authentication"
+;
+; SystemComponent.php line: 715
+serversettings_element_zkp_authentication = "ZKP Authentication"
+;
+; SystemComponent.php line: 720
+serversettings_element_normal_authentication = "Normal Authentication"
+;
+; SystemComponent.php line: 744
+system_component_settings_updated = "Settings Updated!"
+;
+; SystemComponent.php line: 747
+system_component_no_update_settings = "No Settings Were Changed!"
+;
+; SystemComponent.php line: 788
+system_component_no_resource_folder = "No Resource Folder!"
+;
+; SystemComponent.php line: 802
+system_component_invalid_filetype = "Invalid File Type!"
+;
+; SystemComponent.php line: 807
+system_component_file_too_big = "File Too Big!"
+;
+; SystemComponent.php line: 822
+system_component_configure_profile_change = "Profile Updated!"
+;
+; SystemComponent.php line: 826
+system_component_configure_no_change_profile = "There was a Problem Updating Profile!"
+;
+; SystemComponent.php line: 875
+system_component_configure_reset_completed = "Reset Completed"
+;
+; SystemComponent.php line: 878
+system_component_configure_no_change_profile = "There was a Problem Updating Profile!"
+;
+; SystemComponent.php line: 957
+system_component_configure_use_absolute_path = "Must use an Absolute path for Work Directory"
+;
+; SystemComponent.php line: 962
+system_component_configure_configure_diff_base_dir = "Work Directory cannot be contained in Seekquarry folder!"
+;
+; SystemComponent.php line: 993
+system_component_configure_work_dir_set = "Work Directory Set! You may need to re-login!"
+;
+; SystemComponent.php line: 1004
+system_component_name_your_bot = "Please Name Your robot"
+;
+; SystemComponent.php line: 1029
+system_component_configure_work_profile_made = "Working Directory and Profile Created!"
+;
+; SystemComponent.php line: 1033
+system_component_configure_no_set_config = "Unable to Update config.php File!"
+;
+; SystemComponent.php line: 1040
+system_component_configure_no_create_profile = "Unable to Create Profile!"
+;
+; SystemComponent.php line: 1047
+system_component_configure_work_dir_invalid = "Work Directory is Invalid! Cannot Create Profile!"
+;
+; SystemComponent.php line: 1054
+system_component_configure_work_dir_invalid = "Work Directory is Invalid! Cannot Create Profile!"
+;
+; SystemComponent.php line: 1083
+system_component_configure_profile_change = "Profile Updated!"
+;
+; SystemComponent.php line: 1087
+system_component_configure_no_change_profile = "There was a Problem Updating Profile!"
+;
+; SystemComponent.php line: 1107
+system_component_describe_robot = "Please Describe Your Robot"
+;
+; SystemComponent.php line: 1161
+system_component_php_version = "PHP Version 5.3 or Newer"
+;
+; SystemComponent.php line: 1169
+system_component_no_write_config_php = "configs/config.php not web server writable."
+;
+; SystemComponent.php line: 1174
+system_component_no_write_work_dir = "Work directory needs to be writable by web server. "
+;
+; SystemComponent.php line: 1179
+system_component_post_size_small = "php.ini file variable post_max_size should be at least 2M"
+;
+; SystemComponent.php line: 1185
+system_component_missing_required = "The following required items were missing: %s"
+;
+; SystemComponent.php line: 1209
+system_component_missing_optional = "The following optional items were missing: %s"
+;
+; SystemComponent.php line: 1215
+system_component_check_passed = "Check Passed."
+;
+; SystemComponent.php line: 1220
+system_component_using_local_config = "Using configs/local_config.php so changing work directory above may not work."
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/controllers
+;
+; MainController.php line: 74
+search_controller_logout_successful = "Logout Successful!!"
+;
+; MainController.php line: 98
+main_controller_download = "Download Form"
+;
+; MainController.php line: 115
+main_controller_missing_fields = "Missing Fields! Form not processed!"
+;
+; MainController.php line: 150
+main_controller_yioop_download = "Yioop Download Information"
+;
+; MainController.php line: 151
+main_controller_click_download = "Use the link below to download Yioop software:"
+;
+; MainController.php line: 164
+main_controller_url_error = "URL Format Error!"
+;
+; MainController.php line: 173
+main_controller_expired_url = "Expire Url. Please fill out the form again to download!"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views
+;
+; AdminView.php line: 71
+admin_view_admin = "Admin"
+;
+; AdminView.php line: 92
+adminview_auto_logout_one_minute = "Auto-logout in One Minute!!"
+;
+; CrawlstatusView.php line: 57
+crawlstatus_view_currently_processing = "Currently Processing"
+;
+; CrawlstatusView.php line: 58
+crawlstatus_view_description = "Description:"
+;
+; CrawlstatusView.php line: 62
+crawlstatus_view_starting_crawl = "Starting New Crawl..."
+;
+; CrawlstatusView.php line: 66
+managecrawls_element_stop_crawl = "Stop Crawl"
+;
+; CrawlstatusView.php line: 70
+crawlstatus_view_resuming_crawl = "Resuming Crawl"
+;
+; CrawlstatusView.php line: 74
+managecrawls_element_stop_crawl = "Stop Crawl"
+;
+; CrawlstatusView.php line: 78
+crawlstatus_view_shutdown_queue = "Shutting Down Queue..."
+;
+; CrawlstatusView.php line: 81
+crawlstatus_view_closing_dict = "Closing Crawl Dictionary..."
+;
+; CrawlstatusView.php line: 84
+crawlstatus_view_run_plugins = "Running Post Processing Plugins..."
+;
+; CrawlstatusView.php line: 92
+managecrawls_element_stop_crawl = "Stop Crawl"
+;
+; CrawlstatusView.php line: 100
+crawlstatus_view_set_index = "Set as Index"
+;
+; CrawlstatusView.php line: 103
+crawlstatus_view_search_index = "Search Index"
+;
+; CrawlstatusView.php line: 110
+crawlstatus_view_changeoptions = "Change Crawl Options"
+;
+; CrawlstatusView.php line: 112
+crawlstatus_view_no_description = "No active crawl"
+;
+; CrawlstatusView.php line: 117
+crawlstatus_view_timestamp = "Timestamp:"
+;
+; CrawlstatusView.php line: 119
+crawlstatus_view_time_started = "Time started:"
+;
+; CrawlstatusView.php line: 125
+crawlstatus_view_indexer_memory = "Indexer Peak Memory:"
+;
+; CrawlstatusView.php line: 127
+crawlstatus_view_scheduler_memory = "Scheduler Peak Memory:"
+;
+; CrawlstatusView.php line: 130
+crawlstatus_view_queue_memory = "Server Peak Memory:"
+;
+; CrawlstatusView.php line: 135
+crawlstatus_view_no_mem_data = "No Memory Data Yet"
+;
+; CrawlstatusView.php line: 139
+crawlstatus_view_fetcher_memory = "Fetcher Peak Memory:"
+;
+; CrawlstatusView.php line: 144
+crawlstatus_view_no_mem_data = "No Memory Data Yet"
+;
+; CrawlstatusView.php line: 147
+crawlstatus_view_webapp_memory = "Web App Peak Memory:"
+;
+; CrawlstatusView.php line: 152
+crawlstatus_view_no_mem_data = "No Memory Data Yet"
+;
+; CrawlstatusView.php line: 155
+crawlstatus_view_urls_per_hour = "Visited Urls/Hour:"
+;
+; CrawlstatusView.php line: 163
+crawlstatus_view_visited_urls = "Visited Urls Count:"
+;
+; CrawlstatusView.php line: 167
+crawlstatus_view_total_urls = "Total Urls Seen:"
+;
+; CrawlstatusView.php line: 170
+crawlstatus_view_most_recent_fetcher = "Most Recent Fetcher:"
+;
+; CrawlstatusView.php line: 179
+crawlstatus_view_no_fetcher = "No Fetcher Queries Yet"
+;
+; CrawlstatusView.php line: 183
+crawlstatus_view_most_recent_urls = "Most Recent Urls"
+;
+; CrawlstatusView.php line: 193
+crawlstatus_view_no_recent_urls = "No Recent Urls (Could mean only link data)"
+;
+; CrawlstatusView.php line: 196
+crawlstatus_view_previous_crawls = "Previous Crawls"
+;
+; CrawlstatusView.php line: 207
+crawlstatus_view_description = "Description:"
+;
+; CrawlstatusView.php line: 210
+crawlstatus_view_timestamp = "Timestamp:"
+;
+; CrawlstatusView.php line: 211
+crawlstatus_view_url_counts = "Visited/Extracted Urls:"
+;
+; CrawlstatusView.php line: 215
+crawlstatus_view_actions = "Actions"
+;
+; CrawlstatusView.php line: 226
+crawlstatus_view_statistics = "Statistics"
+;
+; CrawlstatusView.php line: 242
+crawlstatus_view_resume = "Resume"
+;
+; CrawlstatusView.php line: 244
+crawlstatus_view_no_resume = "Closed"
+;
+; CrawlstatusView.php line: 251
+crawlstatus_view_set_index = "Set as Index"
+;
+; CrawlstatusView.php line: 254
+crawlstatus_view_search_index = "Search Index"
+;
+; CrawlstatusView.php line: 261
+crawlstatus_view_delete = "Delete"
+;
+; CrawlstatusView.php line: 269
+crawlstatus_view_no_previous_crawl = "No Previous Crawls"
+;
+; GroupView.php line: 82
+groupfeed_element_wiki_thread = "%s Wiki Page Discussion"
+;
+; GroupView.php line: 96
+group_view_feed = "Feed"
+;
+; GroupView.php line: 104
+group_view_wiki = "Wiki"
+;
+; GroupView.php line: 106
+group_view_user = "%s User"
+;
+; GroupView.php line: 109
+group_view_myfeeds = "My Feeds"
+;
+; GroupView.php line: 145
+adminview_auto_logout_one_minute = "Auto-logout in One Minute!!"
+;
+; MachinestatusView.php line: 56
+machinestatus_view_no_monitored = "No Monitored Machines"
+;
+; MachinestatusView.php line: 60
+machinestatus_media_updatemode = "Media Updater Mode:"
+;
+; MachinestatusView.php line: 73
+machinestatus_name_server = "Name Server"
+;
+; MachinestatusView.php line: 75
+machinestatus_distributed = "Distributed"
+;
+; MachinestatusView.php line: 78
+machinestatus_name_server = "Name Server"
+;
+; MachinestatusView.php line: 80
+machinestatus_distributed = "Distributed"
+;
+; MachinestatusView.php line: 85
+machinestatus_name_server = "Name Server"
+;
+; MachinestatusView.php line: 94
+machinestatus_view_media_updater = "Media Updater"
+;
+; MachinestatusView.php line: 96
+machinestatus_view_log = "Log"
+;
+; MachinestatusView.php line: 125
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; MachinestatusView.php line: 126
+machinestatus_view_delete = "Delete"
+;
+; MachinestatusView.php line: 148
+machinestatus_view_not_configured = "Machine Not Configured!"
+;
+; MachinestatusView.php line: 158
+machinestatus_view_mirrors = "Mirrors"
+;
+; MachinestatusView.php line: 161
+machinestatus_view_log = "Log"
+;
+; MachinestatusView.php line: 176
+machinestatus_view_queue_server = "Queue Server"
+;
+; MachinestatusView.php line: 179
+machinestatus_view_log = "Log"
+;
+; MachinestatusView.php line: 191
+machinestatus_view_queue_server = "Queue Server"
+;
+; MachinestatusView.php line: 193
+machinestatus_view_no_queue_server = "Machine has no queue server"
+;
+; MachinestatusView.php line: 204
+machinestatus_view_media_updater = "Media Updater"
+;
+; MachinestatusView.php line: 207
+machinestatus_view_log = "Log"
+;
+; MachinestatusView.php line: 229
+machinestatus_view_no_fetchers = "Machine has no fetchers"
+;
+; MachinestatusView.php line: 241
+machinestatus_view_fetchers = "Fetchers"
+;
+; MachinestatusView.php line: 248
+machinestatus_view_log = "Log"
+;
+; NocacheView.php line: 54
+nocache_view_no_cache = "Did not have cache of requested item."
+;
+; NocacheView.php line: 59
+nocache_view_summary_contents = "Summary Data stored in Seekquarry for Item"
+;
+; RecoverView.php line: 71
+recover_view_recover_password = "Recover Account"
+;
+; RecoverView.php line: 104
+register_view_new_password = "New Password"
+;
+; RecoverView.php line: 116
+register_view_retypepassword = "Re-type password:"
+;
+; RecoverView.php line: 131
+recover_view_username = "Username:"
+;
+; RecoverView.php line: 146
+register_view_account_recovery = "Recovery Info:"
+;
+; RecoverView.php line: 153
+register_view_human_check = "Human Check:"
+;
+; RecoverView.php line: 185
+register_view_human_check = "Human Check:"
+;
+; RecoverView.php line: 202
+recover_view_recover_password = "Recover Account"
+;
+; RecoverView.php line: 211
+recover_view_return = "Return to Yioop"
+;
+; RegisterView.php line: 76
+register_view_question0_most = "Which lives or lasts the longest?"
+;
+; RegisterView.php line: 77
+register_view_question0_least = "Which lives or lasts the shortest?"
+;
+; RegisterView.php line: 78
+register_view_question0_choices = "lightning,bacteria,ant,dog,horse,person,oak tree,planet,star,galaxy"
+;
+; RegisterView.php line: 79
+register_view_question1_most = "Which is more abundant?"
+;
+; RegisterView.php line: 80
+register_view_question1_least = "Which is less abundant?"
+;
+; RegisterView.php line: 81
+register_view_question1_choices = "continents,countries,subways,cities,doctors,people,hands,teeth,hair,cells,molecules,atoms,protons"
+;
+; RegisterView.php line: 82
+register_view_question2_most = "Which is usually more pricey?"
+;
+; RegisterView.php line: 83
+register_view_question2_least = "Which is usually less pricey?"
+;
+; RegisterView.php line: 84
+register_view_question2_choices = "a postage stamp,cup of coffee,movie ticket,shoes,bicycle,one month&#039;s rent,car,house,a power plant"
+;
+; RegisterView.php line: 85
+register_view_question3_most = "Which is more round?"
+;
+; RegisterView.php line: 86
+register_view_question3_least = "Which is less round?"
+;
+; RegisterView.php line: 87
+register_view_question3_choices = "a chair,the letter T,a banana,a pear,an apple,an orange,a sphere"
+;
+; RegisterView.php line: 88
+register_view_question4_most = "Which is usually the largest?"
+;
+; RegisterView.php line: 89
+register_view_question4_least = "Which is usually the smallest?"
+;
+; RegisterView.php line: 90
+register_view_question4_choices = "a coin,a baseball,a milk gallon,shopping cart,refrigerator,giraffe,house,volcano,the Moon,the Earth"
+;
+; RegisterView.php line: 91
+register_view_question5_most = "Which is taller?"
+;
+; RegisterView.php line: 92
+register_view_question5_least = "Which is shorter?"
+;
+; RegisterView.php line: 93
+register_view_question5_choices = "ladybug,mouse,cat,toddler,man,horse,elephant,giraffe,tall building,mountain"
+;
+; RegisterView.php line: 94
+register_view_question6_most = "Which takes longer?"
+;
+; RegisterView.php line: 95
+register_view_question6_least = "Which takes less time?"
+;
+; RegisterView.php line: 96
+register_view_question6_choices = "blink,lick envelope,comb hair,apply makeup,watch a movie,run marathon,olympics,summer vacation,year"
+;
+; RegisterView.php line: 97
+register_view_question7_most = "Which is hotter sounding?"
+;
+; RegisterView.php line: 98
+register_view_question7_least = "Which is colder sounding?"
+;
+; RegisterView.php line: 99
+register_view_question7_choices = "Pluto,polar exploring,skating,swimming pool,tea,steam,molten iron,sun"
+;
+; RegisterView.php line: 100
+register_view_question8_most = "Which is the oldest?"
+;
+; RegisterView.php line: 101
+register_view_question8_least = "Which is the newest?"
+;
+; RegisterView.php line: 102
+register_view_question8_choices = "fresh milk,current president,your grandparents,Flight at Kitty Hawk,the Black Death,Egyptian Pyramids,writing,cave paintings,dinosaurs"
+;
+; RegisterView.php line: 103
+register_view_question9_most = "Which holds more?"
+;
+; RegisterView.php line: 104
+register_view_question9_least = "Which holds less?"
+;
+; RegisterView.php line: 105
+register_view_question9_choices = "teaspoon,saucer,cup,bowl,teapot,wash basin,barrel,pickup truck,moving van,oil tanker"
+;
+; RegisterView.php line: 108
+register_view_recovery1_more = "Animal you like the best:"
+;
+; RegisterView.php line: 109
+register_view_recovery1_less = "Animal you like the least:"
+;
+; RegisterView.php line: 110
+register_view_recovery1_choices = "ant,bunny,cat,cockroach,dog,goldfish,hamster,horse,snake,spider,tiger,whale"
+;
+; RegisterView.php line: 111
+register_view_recovery2_more = "Color you like the most:"
+;
+; RegisterView.php line: 112
+register_view_recovery2_less = "Color you like the least:"
+;
+; RegisterView.php line: 113
+register_view_recovery2_choices = "no color,aquamarine,blue,brown,gold,green,gray,mauve,pink,periwinkle,purple,red,silver,turquoise,yellow"
+;
+; RegisterView.php line: 114
+register_view_recovery3_more = "Food you like the most:"
+;
+; RegisterView.php line: 115
+register_view_recovery3_less = "Food you like the least:"
+;
+; RegisterView.php line: 116
+register_view_recovery3_choices = "apple,banana,chicken,fish,lamb,nuts,orange,pork,potato,tomato,steak"
+;
+; RegisterView.php line: 117
+register_view_recovery4_more = "Drink you like the most:"
+;
+; RegisterView.php line: 118
+register_view_recovery4_less = "Drink you like the least:"
+;
+; RegisterView.php line: 119
+register_view_recovery4_choices = "apple juice,beer,coffee,hot tea,ice tea,lemonade,orange juice,soda,sparkling water,still water,wine"
+;
+; RegisterView.php line: 120
+register_view_recovery5_more = "Game you like the most:"
+;
+; RegisterView.php line: 121
+register_view_recovery5_less = "Game you like the least:"
+;
+; RegisterView.php line: 122
+register_view_recovery5_choices = "basketball,backgammon,checkers,chess,football,hockey,skate,ski,tennis,volleyball"
+;
+; RegisterView.php line: 123
+register_view_recovery6_more = "Sound you like the most:"
+;
+; RegisterView.php line: 124
+register_view_recovery6_less = "Sound you like the least:"
+;
+; RegisterView.php line: 125
+register_view_recovery6_choices = "accordian,drum,flute,guitar,harmonica,harp,horn,oboe,piano,triangle,trumpet,violin,whistle,xylophone"
+;
+; RegisterView.php line: 153
+register_view_create_account = "Create Account"
+;
+; RegisterView.php line: 190
+register_view_firstname = "First Name:"
+;
+; RegisterView.php line: 205
+register_view_lastname = "Last Name:"
+;
+; RegisterView.php line: 219
+register_view_username = "Username:"
+;
+; RegisterView.php line: 232
+register_view_email = "Email:"
+;
+; RegisterView.php line: 246
+register_view_password = "Password:"
+;
+; RegisterView.php line: 261
+register_view_retypepassword = "Re-type password:"
+;
+; RegisterView.php line: 277
+register_view_account_recovery = "Recovery Info:"
+;
+; RegisterView.php line: 281
+register_view_human_check = "Human Check:"
+;
+; RegisterView.php line: 283
+register_view_account_recovery = "Recovery Info:"
+;
+; RegisterView.php line: 315
+register_view_human_check = "Human Check:"
+;
+; RegisterView.php line: 329
+register_view_i_agree = "By clicking Create Account, I agree to the"
+;
+; RegisterView.php line: 331
+register_view_terms = "Yioop Terms"
+;
+; RegisterView.php line: 333
+register_view_and = "and"
+;
+; RegisterView.php line: 335
+register_view_privacy = "Privacy Policy"
+;
+; RegisterView.php line: 336
+register_view_period = "."
+;
+; RegisterView.php line: 346
+register_view_create_account = "Create Account"
+;
+; RegisterView.php line: 355
+register_view_return = "Return to Yioop"
+;
+; SearchView.php line: 92
+search_view_title = "Yioop! PHP Search Engine"
+;
+; SearchView.php line: 119
+search_view_input_label = "Enter the terms you would like to search the web for"
+;
+; SearchView.php line: 123
+search_view_input_placeholder = "Type what to find"
+;
+; SearchView.php line: 126
+search_view_search = "Search"
+;
+; SearchView.php line: 155
+search_view_no_index_set = "No Default Index Set"
+;
+; SearchView.php line: 164
+search_view_more_statistics = "More Statistics"
+;
+; SearchView.php line: 201
+search_view_calculated = "%s seconds."
+;
+; SearchView.php line: 203
+search_view_results = "Showing %s - %s of %s"
+;
+; SearchView.php line: 229
+search_view_thesaurus_results = "Thesaurus Results"
+;
+; SearchView.php line: 339
+search_view_word_cloud = "Words:"
+;
+; SearchView.php line: 380
+search_view_cache = "Cached"
+;
+; SearchView.php line: 382
+search_view_as_text = "View&nbsp;as&nbsp;text"
+;
+; SearchView.php line: 393
+search_view_similar = "Similar"
+;
+; SearchView.php line: 402
+search_view_inlink = "Inlinks"
+;
+; SearchView.php line: 419
+search_view_rank = "Rank:%s "
+;
+; SearchView.php line: 421
+search_view_relevancy = "Rel:%s "
+;
+; SearchView.php line: 423
+search_view_proximity = "Prox:%s"
+;
+; SearchView.php line: 427
+search_view_thesaurus_score = "Thesaurus: %s"
+;
+; SearchView.php line: 436
+search_view_score = "Score:%s"
+;
+; SettingsView.php line: 66
+settings_view_settings = "Settings"
+;
+; SettingsView.php line: 73
+settings_view_results_per_page = "Results/Page:"
+;
+; SettingsView.php line: 79
+settings_view_open_in_tabs = "Open in Tabs:"
+;
+; SettingsView.php line: 86
+settings_view_search_index = "Search Index:"
+;
+; SettingsView.php line: 92
+settings_view_language_label = "Language:"
+;
+; SettingsView.php line: 106
+settings_view_return = "Return"
+;
+; SettingsView.php line: 109
+settings_view_save = "Save Settings"
+;
+; SettingsView.php line: 116
+settings_install_search_plugin = "Install Yioop! Open Search Plugin"
+;
+; SigninView.php line: 68
+signin_view_signin = "Signin"
+;
+; SigninView.php line: 81
+sigin_view_signing_in = "Logging on"
+;
+; SigninView.php line: 84
+sigin_view_login_failed = "Login Failed!"
+;
+; SigninView.php line: 92
+signin_view_username = "Username"
+;
+; SigninView.php line: 99
+signin_view_password = "Password"
+;
+; SigninView.php line: 109
+signin_view_login = "Login"
+;
+; SigninView.php line: 124
+signin_view_recover_password = "Forgot Password?"
+;
+; SigninView.php line: 129
+signin_view_create_account = "Create Account"
+;
+; SigninView.php line: 133
+signin_view_return = "Return"
+;
+; StaticView.php line: 68
+static_view_title = "PHP Search Engine - Yioop!"
+;
+; StatisticsView.php line: 75
+statistics_view_statistics = "Statistics"
+;
+; StatisticsView.php line: 80
+statistics_view_calculating = "Calculating... Please be patient."
+;
+; StatisticsView.php line: 94
+statistics_view_error_codes = "Error Codes Seen"
+;
+; StatisticsView.php line: 95
+statistics_view_sizes = "File Sizes Downloaded"
+;
+; StatisticsView.php line: 96
+statistics_view_links_per_page = "Average Links per Page"
+;
+; StatisticsView.php line: 97
+statistics_view_page_date = "Page Modified Dates"
+;
+; StatisticsView.php line: 98
+statistics_view_dns_time = "DNS Lookup Time"
+;
+; StatisticsView.php line: 99
+statistics_view_download_time = "Page Download Time"
+;
+; StatisticsView.php line: 100
+statistics_view_top_level_domain = "Top Level Domains"
+;
+; StatisticsView.php line: 101
+statistics_view_file_extension = "File Extension"
+;
+; StatisticsView.php line: 102
+statistics_view_media_type = "Media Type"
+;
+; StatisticsView.php line: 103
+statistics_view_language = "Web Page Language"
+;
+; StatisticsView.php line: 104
+statistics_view_server = "Web Server"
+;
+; StatisticsView.php line: 105
+statistics_view_os = "Operating System (if detected)"
+;
+; StatisticsView.php line: 108
+statistics_view_general_info = "General Index Info"
+;
+; StatisticsView.php line: 109
+statistics_view_description = "Index Description"
+;
+; StatisticsView.php line: 111
+statistics_view_timestamp = "Timestamp"
+;
+; StatisticsView.php line: 113
+statistics_view_crawl_date = "Crawl Start Time"
+;
+; StatisticsView.php line: 115
+statistics_view_pages = "Downloaded Pages"
+;
+; StatisticsView.php line: 117
+statistics_view_url = "Seen Urls"
+;
+; StatisticsView.php line: 120
+statistics_view_number_hosts = "Hostnames Seen"
+;
+; SuggestView.php line: 69
+suggest_view_suggest_url = "Suggest A URL"
+;
+; SuggestView.php line: 71
+suggest_view_instructions = "Suggest a site for the next web crawl. Up to ten sites per day can be accepted."
+;
+; SuggestView.php line: 95
+suggest_view_url = "URL:"
+;
+; SuggestView.php line: 109
+register_view_human_check = "Human Check:"
+;
+; SuggestView.php line: 143
+suggest_view_human_check = "Human Check:"
+;
+; SuggestView.php line: 164
+suggest_view_submit_url = "Submit"
+;
+; SuggestView.php line: 173
+suggest_view_return = "Return to Yioop"
+;
+; View.php line: 61
+view_locale_version14 = "Version 14"
+;
+; View.php line: 93
+view_logo_alt_text = "Yioop"
+;
+; WikiView.php line: 86
+wiki_view_read = "Read"
+;
+; WikiView.php line: 87
+wiki_view_edit = "Edit"
+;
+; WikiView.php line: 90
+wiki_view_pages = "Pages"
+;
+; WikiView.php line: 135
+wiki_view_feed = "Feed"
+;
+; WikiView.php line: 136
+wiki_view_wiki = "Wiki"
+;
+; WikiView.php line: 160
+adminview_auto_logout_one_minute = "Auto-logout in One Minute!!"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/elements
+;
+; ActivityElement.php line: 56
+activity_element_activities = "Activities"
+;
+; AppearanceElement.php line: 71
+appearance_element_use_wiki_landing = "Use Wiki Public Main Page as Landing Page:"
+;
+; AppearanceElement.php line: 77
+appearance_element_background_color = "Background Color:"
+;
+; AppearanceElement.php line: 84
+appearance_element_background_image = "Background Image:"
+;
+; AppearanceElement.php line: 91
+appearance_element_background_image = "Background Image:"
+;
+; AppearanceElement.php line: 99
+appearance_element_foreground_color = "Foreground Color:"
+;
+; AppearanceElement.php line: 104
+appearance_element_topbar_color = "Top Bar Color:"
+;
+; AppearanceElement.php line: 109
+appearance_element_sidebar_color = "Side Bar Color:"
+;
+; AppearanceElement.php line: 115
+appearance_element_site_logo = "Site Logo:"
+;
+; AppearanceElement.php line: 122
+appearance_element_site_logo = "Site Logo:"
+;
+; AppearanceElement.php line: 132
+appearance_element_mobile_logo = "Mobile Logo:"
+;
+; AppearanceElement.php line: 139
+appearance_element_mobile_logo = "Mobile Logo:"
+;
+; AppearanceElement.php line: 148
+appearance_element_favicon = "Favicon:"
+;
+; AppearanceElement.php line: 155
+appearance_element_favicon = "Favicon:"
+;
+; AppearanceElement.php line: 163
+appearance_element_toolbar = "Search Toolbar"
+;
+; AppearanceElement.php line: 174
+appearance_element_site_timezone = "Timezone:"
+;
+; AppearanceElement.php line: 179
+appearance_element_cookie_name = "Web Cookie Name:"
+;
+; AppearanceElement.php line: 184
+appearance_element_token_name = "Web Token Name:"
+;
+; AppearanceElement.php line: 189
+appearance_element_auxiliary_css = "Auxiliary Style Directives"
+;
+; AppearanceElement.php line: 194
+appearance_element_reset_customizations = "Reset Customizations"
+;
+; AppearanceElement.php line: 199
+appearance_element_save = "Save"
+;
+; ConfigureElement.php line: 72
+configure_element_work_directory = "Search Engine Work Directory"
+;
+; ConfigureElement.php line: 76
+configure_element_load_or_create = "Load or Create"
+;
+; ConfigureElement.php line: 92
+configure_element_component_check = "Component Check"
+;
+; ConfigureElement.php line: 96
+configure_element_profile_settings = "Profile Settings"
+;
+; ConfigureElement.php line: 101
+configure_element_default_language = "Default Language:"
+;
+; ConfigureElement.php line: 108
+configure_element_debug_display = "Debug Display"
+;
+; ConfigureElement.php line: 114
+configure_element_error_info = "Error Info"
+;
+; ConfigureElement.php line: 120
+configure_element_query_info = "Query Info"
+;
+; ConfigureElement.php line: 126
+configure_element_test_info = "Test Info"
+;
+; ConfigureElement.php line: 131
+configure_element_site_access = "Search Access"
+;
+; ConfigureElement.php line: 136
+configure_element_web_access = "Web"
+;
+; ConfigureElement.php line: 141
+configure_element_rss_access = "RSS"
+;
+; ConfigureElement.php line: 146
+configure_element_api_access = "API"
+;
+; ConfigureElement.php line: 150
+configure_element_crawl_robot = "Crawl Robot Set-up"
+;
+; ConfigureElement.php line: 152
+configure_element_robot_name = "Crawl Robot Name:"
+;
+; ConfigureElement.php line: 160
+configure_element_robot_instance = "Robot Instance:"
+;
+; ConfigureElement.php line: 166
+configure_element_robot_description = "Robot Description"
+;
+; ConfigureElement.php line: 175
+serversettings_element_save = "Save"
+;
+; CrawloptionsElement.php line: 59
+crawloptions_element_back_to_manage = "Back"
+;
+; CrawloptionsElement.php line: 62
+crawloptions_element_modify_active_crawl = "Modify Active Crawl"
+;
+; CrawloptionsElement.php line: 64
+crawloptions_element_edit_crawl_options = "Edit Crawl Options"
+;
+; CrawloptionsElement.php line: 87
+crawloptions_element_web_crawl = "Web Crawl"
+;
+; CrawloptionsElement.php line: 97
+crawloptions_element_archive_crawl = "Archive Crawl"
+;
+; CrawloptionsElement.php line: 104
+crawloptions_element_load_options = "Get Crawl Options From:"
+;
+; CrawloptionsElement.php line: 109
+crawloptions_element_crawl_order = "Crawl Order:"
+;
+; CrawloptionsElement.php line: 118
+crawloptions_element_restrict_by_url = "Restrict Sites By Url:"
+;
+; CrawloptionsElement.php line: 126
+crawloptions_element_allowed_to_crawl = "Allowed To Crawl Sites"
+;
+; CrawloptionsElement.php line: 132
+crawloptions_element_disallowed_and_quota_sites = "Disallowed Sites/Sites with Quotas"
+;
+; CrawloptionsElement.php line: 141
+crawloptions_element_seed_sites = "Seed Sites"
+;
+; CrawloptionsElement.php line: 145
+crawloptions_element_add_suggest_urls = "Add User Suggest data"
+;
+; CrawloptionsElement.php line: 156
+crawloptions_element_inject_sites = "Sites to Inject into Current Crawl"
+;
+; CrawloptionsElement.php line: 160
+crawloptions_element_add_suggest_urls = "Add User Suggest data"
+;
+; CrawloptionsElement.php line: 177
+crawloptions_element_reindex_crawl = "Crawl or Arc Folder to Re-index:"
+;
+; CrawloptionsElement.php line: 185
+crawloptions_element_need_api_for_mix = "Seekquarry API access required for mix archive crawls  "
+;
+; CrawloptionsElement.php line: 193
+crawloptions_element_save_options = "Save Options"
+;
+; EditclassifierElement.php line: 62
+editclassifier_back = "Back"
+;
+; EditclassifierElement.php line: 64
+editclassifier_edit_classifier = "Edit Classifier"
+;
+; EditclassifierElement.php line: 76
+editclassifier_classifier_label = "Classifier Label:"
+;
+; EditclassifierElement.php line: 81
+editclassifier_change = "Change"
+;
+; EditclassifierElement.php line: 86
+editclassifier_statistics = "Statistics"
+;
+; EditclassifierElement.php line: 87
+editclassifier_positive_examples = "Positive Examples:"
+;
+; EditclassifierElement.php line: 90
+editclassifier_negative_examples = "Negative Examples:"
+;
+; EditclassifierElement.php line: 93
+editclassifier_accuracy = "Accuracy:"
+;
+; EditclassifierElement.php line: 98
+crawl_component_na = "N/A"
+;
+; EditclassifierElement.php line: 103
+editclassifier_update = "Update"
+;
+; EditclassifierElement.php line: 104
+editclassifier_add_examples = "Add Examples"
+;
+; EditclassifierElement.php line: 113
+editclassifier_source = "Source:"
+;
+; EditclassifierElement.php line: 117
+editclassifier_default_crawl = "Default Crawl"
+;
+; EditclassifierElement.php line: 127
+editclassifier_label_by_hand = "Label By Hand"
+;
+; EditclassifierElement.php line: 129
+editclassifier_all_in_class = "All In Class"
+;
+; EditclassifierElement.php line: 131
+editclassifier_none_in_class = "None In Class"
+;
+; EditclassifierElement.php line: 136
+editclassifier_keywords = "Keywords:"
+;
+; EditclassifierElement.php line: 145
+editclassifier_load = "Load"
+;
+; EditclassifierElement.php line: 151
+editclassifier_finalize = "Finalize"
+;
+; EditclassifierElement.php line: 159
+editclassifier_no_documents = "No Documents"
+;
+; EditlocalesElement.php line: 62
+editlocales_element_back_to_manage = "Back"
+;
+; EditlocalesElement.php line: 64
+editlocales_element_edit_locale = "Edit Locale: %s"
+;
+; EditlocalesElement.php line: 78
+editlocales_element_show = "Show:"
+;
+; EditlocalesElement.php line: 82
+editlocales_element_filter = "Filter:"
+;
+; EditlocalesElement.php line: 87
+editlocales_element_go = "Go"
+;
+; EditlocalesElement.php line: 91
+editlocales_element_no_matching = "No Matching Strings Left To Translate!"
+;
+; EditlocalesElement.php line: 127
+editlocales_element_save = "Save"
+;
+; EditmixElement.php line: 57
+editmix_element_back_to_mix = "Back"
+;
+; EditmixElement.php line: 59
+mixcrawls_element_edit_mix = "Edit Crawl Mix"
+;
+; EditmixElement.php line: 70
+mixcrawls_element_mix_name = "Mix Name"
+;
+; EditmixElement.php line: 76
+mixcrawls_element_mix_components = "Mix Components"
+;
+; EditmixElement.php line: 82
+mixcrawls_element_too_many = "At Maximum Number of Search Fragments!"
+;
+; EditmixElement.php line: 83
+mixcrawls_element_add_fragment = "Add Search Result Fragment"
+;
+; EditmixElement.php line: 88
+mixcrawls_element_save_button = "Save"
+;
+; FooterElement.php line: 58
+footer_element_blog = "Blog"
+;
+; FooterElement.php line: 60
+footer_element_privacy = "Privacy"
+;
+; FooterElement.php line: 62
+footer_element_terms = "Terms"
+;
+; FooterElement.php line: 64
+footer_element_tools = "Tools"
+;
+; FooterElement.php line: 66
+footer_element_bot = "SeekquarryBot"
+;
+; FooterElement.php line: 71
+footer_element_developed_seek_quarry = "Developed at SeekQuarry"
+;
+; FooterElement.php line: 74
+footer_element_copyright_site = "(c) This Site"
+;
+; FooterElement.php line: 76
+footer_element_this_search_engine = "This Search Engine"
+;
+; GroupfeedElement.php line: 86
+groupfeed_element_add_group = "Add Group"
+;
+; GroupfeedElement.php line: 90
+groupfeed_element_request_add = "Request Add Group"
+;
+; GroupfeedElement.php line: 116
+groupfeed_element_wiki_page = "Edit Page"
+;
+; GroupfeedElement.php line: 118
+groupfeed_element_back = "My Group Feeds"
+;
+; GroupfeedElement.php line: 121
+groupfeed_element_back = "My Group Feeds"
+;
+; GroupfeedElement.php line: 131
+groupfeed_element_group_activity = "Group Activity"
+;
+; GroupfeedElement.php line: 135
+groupfeed_element_wiki_thread = "%s Wiki Page Discussion"
+;
+; GroupfeedElement.php line: 154
+groupfeed_element_feed = "Feed"
+;
+; GroupfeedElement.php line: 159
+group_view_wiki = "Wiki"
+;
+; GroupfeedElement.php line: 161
+groupfeed_element_user = "%s User Feed"
+;
+; GroupfeedElement.php line: 205
+groupfeed_element_comment = "Comment"
+;
+; GroupfeedElement.php line: 240
+manageaccount_element_group_wiki = "wiki"
+;
+; GroupfeedElement.php line: 241
+manageaccount_element_group_stats = "%s posts, %s threads"
+;
+; GroupfeedElement.php line: 246
+manageaccount_element_last_post = "Last Post:"
+;
+; GroupfeedElement.php line: 290
+groupfeed_element_comment = "Comment"
+;
+; GroupfeedElement.php line: 300
+groupfeed_element_start_thread = "Start New Thread"
+;
+; GroupfeedElement.php line: 313
+groupfeed_element_start_thread = "Start New Thread"
+;
+; GroupfeedElement.php line: 319
+groupfeed_element_no_posts_yet = "This group has no posts yet!"
+;
+; GroupfeedElement.php line: 324
+groupfeed_element_thread_no_exist = "Thread does not exist! Maybe it was deleted?"
+;
+; GroupfeedElement.php line: 357
+groupfeed_element_edit = "Edit"
+;
+; GroupfeedElement.php line: 362
+groupfeed_element_delete = "Delete"
+;
+; GroupfeedElement.php line: 384
+groupfeed_element_num_posts = "%s posts"
+;
+; GroupfeedElement.php line: 394
+groupfeed_element_num_views = "%s views"
+;
+; GroupfeedElement.php line: 419
+groupfeed_element_start_thread_in_group = "Start New Thread in %s"
+;
+; GroupfeedElement.php line: 421
+groupfeed_element_start_thread_in_group = "Start New Thread in %s"
+;
+; GroupfeedElement.php line: 437
+groupfeed_element_last_edited = "Last Edited: %s"
+;
+; GroupfeedElement.php line: 453
+groupfeed_element_post_vote = "Vote:"
+;
+; GroupfeedElement.php line: 480
+groupfeed_element_last_post_info = "Last Post:"
+;
+; GroupfeedElement.php line: 496
+groupfeed_element_comment = "Comment"
+;
+; GroupfeedElement.php line: 550
+fileupload_helper_drag_textarea = "Drag items into the textarea to add them..."
+;
+; GroupfeedElement.php line: 551
+fileupload_helper_click_textarea = "or click to select them."
+;
+; GroupfeedElement.php line: 575
+groupfeed_element_add_comment = "Add a Comment"
+;
+; GroupfeedElement.php line: 589
+groupfeed_element_save = "Save"
+;
+; GroupfeedElement.php line: 627
+groupfeed_element_subject = "Subject"
+;
+; GroupfeedElement.php line: 634
+groupfeed_element_post = "Post"
+;
+; GroupfeedElement.php line: 647
+groupfeed_element_save = "Save"
+;
+; GroupfeedElement.php line: 682
+groupfeed_element_edit_post = "Edit Post"
+;
+; GroupfeedElement.php line: 685
+groupfeed_element_subject = "Subject"
+;
+; GroupfeedElement.php line: 690
+groupfeed_element_post = "Post"
+;
+; GroupfeedElement.php line: 703
+groupfeed_element_save = "Save"
+;
+; GroupfeedElement.php line: 731
+groupfeed_element_no_longer_update = "Group Feeds No Longer Updating!"
+;
+; MachinelogElement.php line: 57
+machinelog_element_back_to_manage = "Back"
+;
+; MachinelogElement.php line: 62
+machinelog_element_filter = "Filter:"
+;
+; MachinelogElement.php line: 69
+machinelog_element_log_file = "%s Log File"
+;
+; MachinelogElement.php line: 74
+machinelog_element_refresh_off = "Turn Auto Refresh Off"
+;
+; MachinelogElement.php line: 78
+machinelog_element_refresh_on = "Turn Auto Refresh On"
+;
+; ManageaccountElement.php line: 64
+manageaccount_element_edit_or_no_text = "Toggle whether account information is editable"
+;
+; ManageaccountElement.php line: 73
+manageaccount_element_welcome = "Welcome, %s!"
+;
+; ManageaccountElement.php line: 75
+manageaccount_element_what_can_do = "From this page you can access and control aspects of your account."
+;
+; ManageaccountElement.php line: 76
+manageaccount_element_account_details = "Account Details"
+;
+; ManageaccountElement.php line: 107
+manageaccounts_element_icon = "User Icon"
+;
+; ManageaccountElement.php line: 117
+manageusers_element_username = "Username"
+;
+; ManageaccountElement.php line: 124
+manageusers_element_firstname = "First Name"
+;
+; ManageaccountElement.php line: 130
+manageusers_element_lastname = "Last Name"
+;
+; ManageaccountElement.php line: 136
+manageusers_element_email = "Email"
+;
+; ManageaccountElement.php line: 146
+manageaccount_element_is_advertiser = "Advertise With Us"
+;
+; ManageaccountElement.php line: 159
+manageaccount_element_password = "Password:"
+;
+; ManageaccountElement.php line: 166
+manageaccount_element_new_password = "New Password: "
+;
+; ManageaccountElement.php line: 172
+manageaccount_element_retype_password = "Retype: "
+;
+; ManageaccountElement.php line: 184
+manageaccount_element_save = "Save"
+;
+; ManageaccountElement.php line: 190
+manageaccount_element_search_lang_settings = "Language and Search Settings"
+;
+; ManageaccountElement.php line: 195
+manageaccount_element_crawl_and_index = "Crawls and Indexes"
+;
+; ManageaccountElement.php line: 196
+manageaccount_element_crawl_info = "Crawl and index the web or an existing archive and create a searchable index."
+;
+; ManageaccountElement.php line: 197
+manageaccount_element_num_crawls = "You have %s active crawls, %s previous crawl indexes."
+;
+; ManageaccountElement.php line: 200
+manageaccount_element_manage_crawls = "Manage Crawls and Indexes"
+;
+; ManageaccountElement.php line: 205
+manageaccount_element_groups_and_feeds = "Groups and Feeds"
+;
+; ManageaccountElement.php line: 206
+manageaccount_element_group_info = "Create or subscribe to groups to communicate with friends."
+;
+; ManageaccountElement.php line: 208
+manageaccount_element_num_groups = "You belong to %s groups."
+;
+; ManageaccountElement.php line: 211
+manageaccount_element_num_group = "You belong to 1 group."
+;
+; ManageaccountElement.php line: 224
+manageaccount_element_group_wiki = "wiki"
+;
+; ManageaccountElement.php line: 225
+manageaccount_element_group_stats = "%s posts, %s threads"
+;
+; ManageaccountElement.php line: 229
+manageaccount_element_last_post = "Last Post:"
+;
+; ManageaccountElement.php line: 239
+manageaccount_element_manage_all_groups = "Join/Manage All Groups"
+;
+; ManageaccountElement.php line: 241
+manageaccount_element_go_to_group_feed = "See Combined Group Feeds"
+;
+; ManageaccountElement.php line: 242
+manageaccount_element_crawl_mixes = "Crawl Mixes"
+;
+; ManageaccountElement.php line: 243
+manageaccount_element_mixes_info = "Present search results from multiple indexes in the order you prefer. Share your search creations with groups of friends."
+;
+; ManageaccountElement.php line: 245
+manageaccount_element_num_mixes = "You have %s crawl mixes."
+;
+; ManageaccountElement.php line: 248
+manageaccount_element_num_mix = "You have %s crawl mix."
+;
+; ManageaccountElement.php line: 252
+manageaccount_element_manage_mixes = "Create/Manage Crawl Mixes"
+;
+; ManageadvertisementsElement.php line: 58
+manageadvertisements_element_list = "Advertisement List"
+;
+; ManageadvertisementsElement.php line: 65
+manageadvertisements_element_adname = "Ad Name"
+;
+; ManageadvertisementsElement.php line: 70
+manageadvertisements_element_username = "Username"
+;
+; ManageadvertisementsElement.php line: 73
+manageadvertisements_element_keywords = "Keywords"
+;
+; ManageadvertisementsElement.php line: 75
+manageadvertisements_element_budget = "Budget"
+;
+; ManageadvertisementsElement.php line: 76
+manageadvertisements_element_dates = "Date"
+;
+; ManageadvertisementsElement.php line: 77
+manageadvertisements_element_viewclicks = "Views/Clicks"
+;
+; ManageadvertisementsElement.php line: 80
+manageadvertisements_element_status = "Status"
+;
+; ManageadvertisementsElement.php line: 82
+manageadvertisements_element_actions = "Actions"
+;
+; ManageadvertisementsElement.php line: 111
+manageadvertisements_element_active = "Active"
+;
+; ManageadvertisementsElement.php line: 113
+manageadvertisements_element_deactivated = "Deactivated"
+;
+; ManageadvertisementsElement.php line: 115
+manageadvertisements_element_suspended = "Suspended"
+;
+; ManageadvertisementsElement.php line: 117
+manageadvertisements_element_completed = "Completed"
+;
+; ManageadvertisementsElement.php line: 144
+manageadvertisements_element_edit = "Edit"
+;
+; ManageadvertisementsElement.php line: 147
+manageadvertisements_element_edit = "Edit"
+;
+; ManageadvertisementsElement.php line: 157
+manageadvertisements_element_deconfirm = "Deactivate this ad?"
+;
+; ManageadvertisementsElement.php line: 161
+manageadvertisements_element_deactivate = "Deactivate"
+;
+; ManageadvertisementsElement.php line: 166
+manageadvertisements_element_deconfirm = "Deactivate this ad?"
+;
+; ManageadvertisementsElement.php line: 170
+manageadvertisements_element_suspend = "Suspend"
+;
+; ManageadvertisementsElement.php line: 176
+manageadvertisements_element_reconfirm = "Reactivate this ad?"
+;
+; ManageadvertisementsElement.php line: 180
+manageadvertisements_element_reactivate = "Reactivate"
+;
+; ManageadvertisementsElement.php line: 225
+manageadvertisement_element_addadvertisement_form = "Create Advertisement form"
+;
+; ManageadvertisementsElement.php line: 227
+manageadvertisement_element_ad_info = "Advertisement Information"
+;
+; ManageadvertisementsElement.php line: 231
+manageadvertisement_element_purchase_ad = "Purchase Ad Listing"
+;
+; ManageadvertisementsElement.php line: 250
+manageadvertisement_element_ad_user = "Ad Creator"
+;
+; ManageadvertisementsElement.php line: 263
+manageadvertisement_element_displayname = "Ad Title"
+;
+; ManageadvertisementsElement.php line: 282
+manageadvertisement_element_text = "Ad Body"
+;
+; ManageadvertisementsElement.php line: 302
+manageadvertisement_element_ad_url = "Destination URL"
+;
+; ManageadvertisementsElement.php line: 323
+manageeadvertisement_element_ad_duration = "Campaign Duration"
+;
+; ManageadvertisementsElement.php line: 339
+manageeadvertisement_element_start_day = "Start day is day of purchase."
+;
+; ManageadvertisementsElement.php line: 344
+manageeadvertisement_element_keywords = "Keywords"
+;
+; ManageadvertisementsElement.php line: 349
+manageadvertisement_element_keyword_help = "Comma separated list of words"
+;
+; ManageadvertisementsElement.php line: 363
+manageadvertisement_element_keyword_bid_amount = "Minimum Bid Required"
+;
+; ManageadvertisementsElement.php line: 370
+manageadvertisement_element_expensive_word = "Expensive word"
+;
+; ManageadvertisementsElement.php line: 387
+manageadvertisement_element_calculate_bid = "Calculate Bid"
+;
+; ManageadvertisementsElement.php line: 407
+manageadvertisement_element_update = "Update"
+;
+; ManageadvertisementsElement.php line: 416
+manageadvertisement_element_budget = "Budget"
+;
+; ManageadvertisementsElement.php line: 427
+manageadvertisement_element_card_number = "Card Number"
+;
+; ManageadvertisementsElement.php line: 438
+manageadvertisement_element_cvc = "CVC"
+;
+; ManageadvertisementsElement.php line: 447
+manageadvertisement_element_expiration = "Expiration"
+;
+; ManageadvertisementsElement.php line: 465
+manageadvertisement_element_charge_warning = "Clicking Purchase charges the above card the Bid Amount in US dollars."
+;
+; ManageadvertisementsElement.php line: 468
+manageadvertisement_element_program_terms = "Ad Program Terms"
+;
+; ManageadvertisementsElement.php line: 475
+manageadvertisement_element_edit_ad = "Edit Ad"
+;
+; ManageadvertisementsElement.php line: 479
+manageadvertisement_element_purchase = "Purchase"
+;
+; ManageadvertisementsElement.php line: 500
+manageadvertisement_element_preview = "Preview"
+;
+; ManageadvertisementsElement.php line: 538
+manageadvertisements_element_search_advertisement = "Search"
+;
+; ManageadvertisementsElement.php line: 540
+manageadvertisement_element_addadvertisement_form = "Create Advertisement form"
+;
+; ManageadvertisementsElement.php line: 542
+manageadvertisements_element_adname = "Ad Name"
+;
+; ManageadvertisementsElement.php line: 543
+manageadvertisements_element_description = "Description"
+;
+; ManageadvertisementsElement.php line: 544
+manageadvertisements_element_destination_url = "Destination URL"
+;
+; ManageadvertisementsElement.php line: 545
+manageadvertisements_element_keywords = "Keywords"
+;
+; ManageadvertisementsElement.php line: 546
+manageadvertisements_element_budget = "Budget"
+;
+; ManageadvertisementsElement.php line: 547
+manageadvertisements_element_start_date = "Start Date"
+;
+; ManageadvertisementsElement.php line: 548
+manageadvertisements_element_end_date = "End Date"
+;
+; ManageclassifiersElement.php line: 66
+manageclassifiers_available_classifiers = "Available Classifiers"
+;
+; ManageclassifiersElement.php line: 74
+manageclassifiers_label_col = "Label"
+;
+; ManageclassifiersElement.php line: 77
+manageclassifiers_positive_col = "Positive"
+;
+; ManageclassifiersElement.php line: 78
+manageclassifiers_negative_col = "Negative"
+;
+; ManageclassifiersElement.php line: 82
+manageclassifiers_actions_col = "Actions"
+;
+; ManageclassifiersElement.php line: 100
+manageclassifiers_edit = "Edit"
+;
+; ManageclassifiersElement.php line: 103
+manageclassifiers_finalized = "Finalized"
+;
+; ManageclassifiersElement.php line: 109
+manageclassifiers_finalize = "Finalize"
+;
+; ManageclassifiersElement.php line: 111
+manageclassifiers_finalize = "Finalize"
+;
+; ManageclassifiersElement.php line: 116
+manageclassifiers_finalizing = "Finalizing"
+;
+; ManageclassifiersElement.php line: 120
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; ManageclassifiersElement.php line: 123
+manageclassifiers_delete = "Delete"
+;
+; ManageclassifiersElement.php line: 155
+manageclassifiers_manage_classifiers = "Manage Classifiers"
+;
+; ManageclassifiersElement.php line: 165
+manageclassifiers_classifier_name = "Name"
+;
+; ManageclassifiersElement.php line: 170
+manageclassifiers_create_button = "Create"
+;
+; ManageclassifiersElement.php line: 185
+manageclassifiers_element_search = "Search"
+;
+; ManageclassifiersElement.php line: 186
+manageclassifiers_element_create_form = "Create Classifier Form"
+;
+; ManageclassifiersElement.php line: 187
+manageclassifiers_classifier_name = "Name"
+;
+; ManagecrawlsElement.php line: 51
+managecrawls_element_create_crawl = "Create Crawl"
+;
+; ManagecrawlsElement.php line: 60
+managecrawls_element_description = "Name"
+;
+; ManagecrawlsElement.php line: 67
+managecrawls_element_start_new_crawl = "Start New Crawl"
+;
+; ManagecrawlsElement.php line: 71
+managecrawls_element_options = "Options"
+;
+; ManagecrawlsElement.php line: 77
+managecrawls_element_awaiting_status = "Awaiting Crawl Status"
+;
+; ManagecrawlsElement.php line: 95
+managecrawls_element_up_longer_update = "Crawl Status No Longer Updating"
+;
+; ManagegroupsElement.php line: 71
+managegroups_element_not_my_groups = "Not Subscribed to Groups"
+;
+; ManagegroupsElement.php line: 73
+managegroups_element_groups = "Subscribed Groups"
+;
+; ManagegroupsElement.php line: 82
+managegroups_element_groupname = "Name"
+;
+; ManagegroupsElement.php line: 83
+managegroups_element_groupowner = "Owner"
+;
+; ManagegroupsElement.php line: 85
+managegroups_element_registertype = "Register"
+;
+; ManagegroupsElement.php line: 86
+managegroups_element_memberaccess = "Access"
+;
+; ManagegroupsElement.php line: 87
+managegroups_element_voting = "Voting"
+;
+; ManagegroupsElement.php line: 88
+managegroups_element_post_lifetime = "Post Lifetime"
+;
+; ManagegroupsElement.php line: 90
+managegroups_element_actions = "Actions"
+;
+; ManagegroupsElement.php line: 196
+managegroups_element_num_users = "%s users"
+;
+; ManagegroupsElement.php line: 200
+managegroups_element_num_users = "%s users"
+;
+; ManagegroupsElement.php line: 214
+manageaccount_element_group_wiki = "wiki"
+;
+; ManagegroupsElement.php line: 229
+managegroups_element_join = "Join"
+;
+; ManagegroupsElement.php line: 233
+managegroups_element_edit = "Edit"
+;
+; ManagegroupsElement.php line: 238
+managegroups_element_edit = "Edit"
+;
+; ManagegroupsElement.php line: 243
+managegroups_element_delete = "Delete"
+;
+; ManagegroupsElement.php line: 249
+managegroups_element_join = "Join"
+;
+; ManagegroupsElement.php line: 254
+managegroups_element_join = "Join"
+;
+; ManagegroupsElement.php line: 263
+managegroups_element_decline = "Decline"
+;
+; ManagegroupsElement.php line: 265
+managegroups_element_unsubscribe = "Unsubscribe"
+;
+; ManagegroupsElement.php line: 270
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; ManagegroupsElement.php line: 273
+managegroups_element_delete = "Delete"
+;
+; ManagegroupsElement.php line: 303
+managegroups_element_addgroup_form = "Create/Join Group"
+;
+; ManagegroupsElement.php line: 304
+managegroups_element_group_info = "Edit Group"
+;
+; ManagegroupsElement.php line: 306
+managegroups_element_create_group = "Create Group"
+;
+; ManagegroupsElement.php line: 310
+managegroups_element_add_group = "Create/Join Group"
+;
+; ManagegroupsElement.php line: 327
+managegroups_element_groupname = "Name"
+;
+; ManagegroupsElement.php line: 338
+managegroups_element_browse = "Browse"
+;
+; ManagegroupsElement.php line: 348
+managegroups_element_register = "Register"
+;
+; ManagegroupsElement.php line: 355
+managegroups_element_memberaccess = "Access"
+;
+; ManagegroupsElement.php line: 362
+managegroups_element_voting = "Voting"
+;
+; ManagegroupsElement.php line: 369
+managegroups_element_post_lifetime = "Post Lifetime"
+;
+; ManagegroupsElement.php line: 381
+managegroups_element_group_users = "Members"
+;
+; ManagegroupsElement.php line: 385
+managegroups_element_num_users = "%s users"
+;
+; ManagegroupsElement.php line: 412
+managegroups_element_groupowner = "Owner"
+;
+; ManagegroupsElement.php line: 414
+managegroups_element_delete = "Delete"
+;
+; ManagegroupsElement.php line: 423
+managegroups_element_activate = "Activate"
+;
+; ManagegroupsElement.php line: 429
+managegroups_element_ban = "Ban"
+;
+; ManagegroupsElement.php line: 435
+managegroups_element_unban = "Reinstate"
+;
+; ManagegroupsElement.php line: 443
+managegroups_element_delete = "Delete"
+;
+; ManagegroupsElement.php line: 471
+managegroups_element_filter = "Filter"
+;
+; ManagegroupsElement.php line: 492
+managegroups_element_invite = "Invite More Users"
+;
+; ManagegroupsElement.php line: 503
+managegroups_element_save = "Save"
+;
+; ManagegroupsElement.php line: 533
+managegroups_element_group_info = "Edit Group"
+;
+; ManagegroupsElement.php line: 534
+managegroups_element_invite_users_group = "Invite Users to Group"
+;
+; ManagegroupsElement.php line: 546
+managegroups_element_groupname = "Name"
+;
+; ManagegroupsElement.php line: 554
+managegroups_element_usernames = "Usernames (space/comma delimited)"
+;
+; ManagegroupsElement.php line: 561
+managegroups_element_invite = "Invite More Users"
+;
+; ManagegroupsElement.php line: 580
+managegroups_element_addgroup_form = "Create/Join Group"
+;
+; ManagegroupsElement.php line: 581
+managegroups_element_transfer_group_owner = "Transfer Group Owner"
+;
+; ManagegroupsElement.php line: 593
+managegroups_element_groupname = "Name"
+;
+; ManagegroupsElement.php line: 601
+managegroups_element_new_group_owner = "New Owner"
+;
+; ManagegroupsElement.php line: 608
+managegroups_element_change_owner = "Change Owner"
+;
+; ManagegroupsElement.php line: 627
+managegroups_element_discover_groups = "Discover Groups"
+;
+; ManagegroupsElement.php line: 631
+managegroups_element_search_group = "Search Subscribed Groups"
+;
+; ManagegroupsElement.php line: 633
+managegroups_element_addgroup_form = "Create/Join Group"
+;
+; ManagegroupsElement.php line: 635
+managegroups_element_groupname = "Name"
+;
+; ManagegroupsElement.php line: 636
+managegroups_element_groupowner = "Owner"
+;
+; ManagegroupsElement.php line: 637
+managegroups_element_registertype = "Register"
+;
+; ManagegroupsElement.php line: 639
+managegroups_element_memberaccess = "Access"
+;
+; ManagegroupsElement.php line: 641
+managegroups_element_post_lifetime = "Post Lifetime"
+;
+; ManagelocalesElement.php line: 62
+managelocales_element_locale_list = "Locale List"
+;
+; ManagelocalesElement.php line: 72
+managelocales_element_localename = "Name"
+;
+; ManagelocalesElement.php line: 75
+managelocales_element_localetag = "Tag"
+;
+; ManagelocalesElement.php line: 76
+managelocales_element_writingmode = "Mode"
+;
+; ManagelocalesElement.php line: 77
+managelocales_element_enabled = "Enabled"
+;
+; ManagelocalesElement.php line: 81
+managelocales_element_percenttranslated = "Percent"
+;
+; ManagelocalesElement.php line: 82
+managelocales_element_actions = "Actions"
+;
+; ManagelocalesElement.php line: 102
+managelocales_element_true = "true"
+;
+; ManagelocalesElement.php line: 103
+managelocales_element_false = "false"
+;
+; ManagelocalesElement.php line: 110
+managelocales_element_edit = "Edit"
+;
+; ManagelocalesElement.php line: 115
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; ManagelocalesElement.php line: 116
+managelocales_element_delete = "Delete"
+;
+; ManagelocalesElement.php line: 137
+manageloecales_element_add_locale_form = "Add Locale Form"
+;
+; ManagelocalesElement.php line: 138
+managelocales_element_locale_info = "Edit Locale"
+;
+; ManagelocalesElement.php line: 140
+managelocales_element_add_locale = "Add Locale"
+;
+; ManagelocalesElement.php line: 161
+managelocales_element_localenamelabel = "Locale Name:"
+;
+; ManagelocalesElement.php line: 174
+managelocales_element_localetaglabel = "Locale Tag:"
+;
+; ManagelocalesElement.php line: 180
+managelocales_element_writingmodelabel = "Writing Mode:"
+;
+; ManagelocalesElement.php line: 190
+managelocales_element_localeenabled = "Locale Enabled:"
+;
+; ManagelocalesElement.php line: 201
+managelocales_element_submit = "Submit"
+;
+; ManagelocalesElement.php line: 219
+managelocales_element_search_locales = "Search Locales"
+;
+; ManagelocalesElement.php line: 220
+managelocales_element_addlocale_form = "Add Locale Form"
+;
+; ManagelocalesElement.php line: 222
+managelocales_element_localename = "Name"
+;
+; ManagelocalesElement.php line: 223
+managelocales_element_localetag = "Tag"
+;
+; ManagelocalesElement.php line: 224
+managelocales_element_writingmode = "Mode"
+;
+; ManagelocalesElement.php line: 225
+managelocales_element_enabled = "Enabled"
+;
+; ManagelocalesElement.php line: 231
+managelocales_element_true = "true"
+;
+; ManagelocalesElement.php line: 232
+managelocales_element_false = "false"
+;
+; ManagemachinesElement.php line: 56
+managemachines_element_add_machine = "Add Machine"
+;
+; ManagemachinesElement.php line: 67
+managemachines_element_machine_name = "Machine Name:"
+;
+; ManagemachinesElement.php line: 72
+managemachines_element_machineurl = "Machine Url:"
+;
+; ManagemachinesElement.php line: 76
+managemachines_element_is_mirror = "Is Mirror:"
+;
+; ManagemachinesElement.php line: 81
+managemachines_element_parent_name = "Parent Name:"
+;
+; ManagemachinesElement.php line: 87
+managemachines_element_has_queueserver = "Has Queue Server:"
+;
+; ManagemachinesElement.php line: 91
+managemachines_element_num_fetchers = "Number of Fetchers:"
+;
+; ManagemachinesElement.php line: 96
+managemachines_element_submit = "Submit"
+;
+; ManagemachinesElement.php line: 101
+managemachines_element_machine_info = "Machine Information"
+;
+; ManagemachinesElement.php line: 105
+managemachines_element_awaiting_status = "Awaiting statuses of machines..."
+;
+; ManagemachinesElement.php line: 123
+managemachines_element_no_longer_update = "Machine status no longer updating..."
+;
+; ManagerolesElement.php line: 59
+manageroles_element_roles = "Role List"
+;
+; ManagerolesElement.php line: 67
+manageroles_element_rolename = "Name"
+;
+; ManagerolesElement.php line: 68
+manageroles_element_actions = "Actions"
+;
+; ManagerolesElement.php line: 94
+manageroles_element_edit = "Edit"
+;
+; ManagerolesElement.php line: 99
+manageroles_element_delete = "Delete"
+;
+; ManagerolesElement.php line: 103
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; ManagerolesElement.php line: 106
+manageroles_element_delete = "Delete"
+;
+; ManagerolesElement.php line: 140
+manageroles_element_addrole_form = "Add Role Form"
+;
+; ManagerolesElement.php line: 141
+manageroles_element_role_info = "Role Information"
+;
+; ManagerolesElement.php line: 143
+manageroles_element_add_role = "Add Role"
+;
+; ManagerolesElement.php line: 154
+manageroles_element_rolename = "Name"
+;
+; ManagerolesElement.php line: 167
+manageroles_element_role_activities = "Activities"
+;
+; ManagerolesElement.php line: 175
+manageroles_element_delete = "Delete"
+;
+; ManagerolesElement.php line: 183
+manageroles_element_delete = "Delete"
+;
+; ManagerolesElement.php line: 203
+manageroles_element_save = "Save"
+;
+; ManagerolesElement.php line: 220
+manageroles_element_search_role = "Search"
+;
+; ManagerolesElement.php line: 221
+manageroles_element_addrole_form = "Add Role Form"
+;
+; ManagerolesElement.php line: 223
+manageroles_element_rolename = "Name"
+;
+; ManageusersElement.php line: 59
+manageusers_element_users = "User List"
+;
+; ManageusersElement.php line: 68
+manageusers_element_username = "Username"
+;
+; ManageusersElement.php line: 70
+manageusers_element_firstname = "First Name"
+;
+; ManageusersElement.php line: 71
+manageusers_element_lastname = "Last Name"
+;
+; ManageusersElement.php line: 72
+manageusers_element_email = "Email"
+;
+; ManageusersElement.php line: 73
+manageusers_element_groups = "Groups"
+;
+; ManageusersElement.php line: 75
+manageusers_element_status = "Status"
+;
+; ManageusersElement.php line: 76
+manageusers_element_actions = "Actions"
+;
+; ManageusersElement.php line: 141
+manageusers_element_edit = "Edit"
+;
+; ManageusersElement.php line: 145
+manageusers_element_edit = "Edit"
+;
+; ManageusersElement.php line: 151
+manageusers_element_delete = "Delete"
+;
+; ManageusersElement.php line: 155
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; ManageusersElement.php line: 158
+manageusers_element_delete = "Delete"
+;
+; ManageusersElement.php line: 200
+manageusers_element_adduser_form = "Add User Form"
+;
+; ManageusersElement.php line: 201
+manageusers_element_user_info = "User Information"
+;
+; ManageusersElement.php line: 203
+manageusers_element_add_user = "Add User"
+;
+; ManageusersElement.php line: 228
+manageusers_element_username = "Username"
+;
+; ManageusersElement.php line: 238
+manageusers_element_firstname = "First Name"
+;
+; ManageusersElement.php line: 244
+manageusers_element_lastname = "Last Name"
+;
+; ManageusersElement.php line: 250
+manageusers_element_email = "Email"
+;
+; ManageusersElement.php line: 257
+manageusers_element_status = "Status"
+;
+; ManageusersElement.php line: 274
+manageusers_element_roles = "Roles"
+;
+; ManageusersElement.php line: 278
+manageusers_element_num_roles = "%s roles"
+;
+; ManageusersElement.php line: 293
+manageusers_element_delete = "Delete"
+;
+; ManageusersElement.php line: 303
+manageusers_element_delete = "Delete"
+;
+; ManageusersElement.php line: 344
+manageusers_element_filter = "Filter"
+;
+; ManageusersElement.php line: 357
+manageusers_element_add_role = "Add"
+;
+; ManageusersElement.php line: 367
+manageusers_element_groups = "Groups"
+;
+; ManageusersElement.php line: 371
+manageusers_element_num_groups = "%s groups"
+;
+; ManageusersElement.php line: 392
+manageusers_element_delete = "Delete"
+;
+; ManageusersElement.php line: 431
+manageusers_element_filter = "Filter"
+;
+; ManageusersElement.php line: 443
+manageusers_element_add_group = "Add"
+;
+; ManageusersElement.php line: 456
+manageusers_element_password = "Password"
+;
+; ManageusersElement.php line: 462
+manageusers_element_retype_password = "Retype Password"
+;
+; ManageusersElement.php line: 469
+manageusers_element_save = "Save"
+;
+; ManageusersElement.php line: 496
+manageusers_element_search_user = "Search"
+;
+; ManageusersElement.php line: 497
+manageusers_element_adduser_form = "Add User Form"
+;
+; ManageusersElement.php line: 499
+manageusers_element_username = "Username"
+;
+; ManageusersElement.php line: 500
+manageusers_element_firstname = "First Name"
+;
+; ManageusersElement.php line: 501
+manageusers_element_lastname = "Last Name"
+;
+; ManageusersElement.php line: 502
+manageusers_element_email = "Email"
+;
+; ManageusersElement.php line: 503
+manageusers_element_status = "Status"
+;
+; MixcrawlsElement.php line: 65
+mixcrawls_element_available_mixes = "Available Mixes"
+;
+; MixcrawlsElement.php line: 72
+mixcrawls_view_name = "Name"
+;
+; MixcrawlsElement.php line: 74
+mixcrawls_view_definition = "Definition"
+;
+; MixcrawlsElement.php line: 78
+mixcrawls_view_actions = "Actions"
+;
+; MixcrawlsElement.php line: 112
+mixcrawls_view_no_components = "Mix has no components yet"
+;
+; MixcrawlsElement.php line: 118
+mixcrawls_view_share = "Share"
+;
+; MixcrawlsElement.php line: 120
+mixcrawls_view_edit = "Edit"
+;
+; MixcrawlsElement.php line: 125
+mixcrawls_set_index = "Set as Index"
+;
+; MixcrawlsElement.php line: 128
+mixcrawl_search_index = "Search Index"
+;
+; MixcrawlsElement.php line: 134
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; MixcrawlsElement.php line: 136
+mixcrawls_view_delete = "Delete"
+;
+; MixcrawlsElement.php line: 146
+mixcrawls_view_back = "Back"
+;
+; MixcrawlsElement.php line: 147
+mixcrawls_element_share_mix_group = "Share Mix With A Group"
+;
+; MixcrawlsElement.php line: 157
+mixcrawls_element_mixname = "Mix Name"
+;
+; MixcrawlsElement.php line: 163
+mixcrawls_element_group = "Group:"
+;
+; MixcrawlsElement.php line: 169
+mixcrawls_element_share = "Share"
+;
+; MixcrawlsElement.php line: 193
+mixcrawls_element_make_mix = "Make a Crawl Mix"
+;
+; MixcrawlsElement.php line: 203
+mixcrawls_element_mix_name = "Mix Name"
+;
+; MixcrawlsElement.php line: 208
+mixcrawls_element_create_button = "Create"
+;
+; MixcrawlsElement.php line: 224
+mixcrawls_element_search_mix = "Search"
+;
+; MixcrawlsElement.php line: 225
+mixcrawls_element_createmix_form = "Make a Mix Form"
+;
+; MixcrawlsElement.php line: 227
+mixcrawls_element_mixname = "Mix Name"
+;
+; MoreoptionsElement.php line: 82
+moreoptions_element_other_searches = "Other Searches"
+;
+; MoreoptionsElement.php line: 119
+moreoptions_element_previous = "Previous"
+;
+; MoreoptionsElement.php line: 125
+moreoptions_element_next = "Next"
+;
+; MoreoptionsElement.php line: 137
+moreoptions_element_my_accounts = "My Accounts"
+;
+; MoreoptionsElement.php line: 142
+signin_element_settings = "Settings"
+;
+; MoreoptionsElement.php line: 151
+signin_element_signin = "Sign In"
+;
+; MoreoptionsElement.php line: 154
+signin_element_admin = "Admin"
+;
+; MoreoptionsElement.php line: 167
+signin_view_create_account = "Create Account"
+;
+; MoreoptionsElement.php line: 186
+moreoptions_element_suggest = "Suggest a URL"
+;
+; MoreoptionsElement.php line: 188
+moreoptions_element_wiki_pages = "Wiki Pages"
+;
+; MoreoptionsElement.php line: 199
+moreoptions_element_tools = "Tools"
+;
+; PageoptionsElement.php line: 59
+pageoptions_element_crawl_time = "Crawl Time"
+;
+; PageoptionsElement.php line: 64
+pageoptions_element_search_time = "Search Time"
+;
+; PageoptionsElement.php line: 69
+pageoptions_element_test_options = "Test Options"
+;
+; PageoptionsElement.php line: 81
+pageoptions_element_load_options = "Get Page Options From:"
+;
+; PageoptionsElement.php line: 86
+pageoptions_element_page_range = "Byte Range to Download (0 - Value):"
+;
+; PageoptionsElement.php line: 92
+pageoptions_element_summarizer = "Summarizer:"
+;
+; PageoptionsElement.php line: 101
+pageoptions_element_max_description = "Max Page Summary Length in Bytes:"
+;
+; PageoptionsElement.php line: 107
+pageoptions_element_save_cache = "Cache whole crawled pages:"
+;
+; PageoptionsElement.php line: 117
+pageoptions_element_allow_recrawl = "Allow Page Recrawl After:"
+;
+; PageoptionsElement.php line: 124
+pageoptions_element_file_types = "Page File Types to Crawl:"
+;
+; PageoptionsElement.php line: 153
+pageoptions_element_classifiers_rankers = "Classifiers and Rankers"
+;
+; PageoptionsElement.php line: 169
+pageoptions_element_use_classify = "Use to Classify"
+;
+; PageoptionsElement.php line: 170
+pageoptions_element_use_rank = "Use to Rank"
+;
+; PageoptionsElement.php line: 197
+pageoptions_element_no_classifiers = "No classifiers."
+;
+; PageoptionsElement.php line: 200
+pageoptions_element_indexing_plugins = "Indexing Plugins"
+;
+; PageoptionsElement.php line: 206
+pageoptions_element_plugin = "Plugin"
+;
+; PageoptionsElement.php line: 207
+pageoptions_element_plugin_include = "Use in Crawl"
+;
+; PageoptionsElement.php line: 223
+pageoptions_element_configure = "Configure"
+;
+; PageoptionsElement.php line: 235
+pageoptions_element_no_compatible_plugins = "No compatible indexing plugins found!"
+;
+; PageoptionsElement.php line: 238
+pageoptions_element_page_rules = "Page Field Extraction Rules"
+;
+; PageoptionsElement.php line: 247
+page_element_search_page = "Search Page Elements and Links"
+;
+; PageoptionsElement.php line: 254
+pageoptions_element_wd_suggest = "Word Suggest"
+;
+; PageoptionsElement.php line: 262
+pageoptions_element_subsearch_link = "Subsearch"
+;
+; PageoptionsElement.php line: 271
+pageoptions_element_signin_link = "Signin"
+;
+; PageoptionsElement.php line: 279
+pageoptions_element_cache_link = "Cache"
+;
+; PageoptionsElement.php line: 288
+pageoptions_element_similar_link = "Similar"
+;
+; PageoptionsElement.php line: 297
+pageoptions_element_in_link = "Inlinks"
+;
+; PageoptionsElement.php line: 304
+pageoptions_element_ip_link = "IP Address"
+;
+; PageoptionsElement.php line: 313
+pageoptions_element_ranking_factors = "Search Ranking Factors"
+;
+; PageoptionsElement.php line: 318
+pageoptions_element_title_weight = "Title Weight:"
+;
+; PageoptionsElement.php line: 323
+pageoptions_element_description_weight = "Description Weight:"
+;
+; PageoptionsElement.php line: 328
+pageoptions_element_link_weight = "Link Weight:"
+;
+; PageoptionsElement.php line: 333
+pageoptions_element_results_grouping_options = "Search Results Grouping"
+;
+; PageoptionsElement.php line: 338
+pageoptions_element_min_results_to_group = "Minimum Results to Group:"
+;
+; PageoptionsElement.php line: 344
+pageoptions_element_server_alpha = "Server Alpha:"
+;
+; PageoptionsElement.php line: 352
+pageoptions_element_test_page = "Test Page"
+;
+; PageoptionsElement.php line: 356
+pageoptions_element_page_type = "Type:"
+;
+; PageoptionsElement.php line: 372
+pageoptions_element_save_options = "Save"
+;
+; PageoptionsElement.php line: 374
+pageoptions_element_run_tests = "Test Process Page"
+;
+; PageoptionsElement.php line: 380
+pageoptions_element_test_results = "Test Results"
+;
+; PageoptionsElement.php line: 383
+pageoptions_element_page_truncated = "Page truncated from %s to %s bytes."
+;
+; PageoptionsElement.php line: 388
+pageoptions_element_after_process = "After page processor extracts summary"
+;
+; PageoptionsElement.php line: 392
+pageoptions_element_after_rules = "After page rules applied"
+;
+; PageoptionsElement.php line: 396
+pageoptions_element_extracted_words = "Words and positions extracted to index from summary"
+;
+; PageoptionsElement.php line: 400
+pageoptions_element_extracted_metas = "Extracted meta words"
+;
+; PageoptionsElement.php line: 417
+page_element_plugin_back = "Back"
+;
+; PageoptionsElement.php line: 454
+pageoptions_element_run_tests = "Test Process Page"
+;
+; PageoptionsElement.php line: 458
+pageoptions_element_save_options = "Save"
+;
+; ResultseditorElement.php line: 52
+resultseditor_element_edit_page = "Edit Result Page"
+;
+; ResultseditorElement.php line: 57
+resultseditor_element_edited_pages = "Edited Urls:"
+;
+; ResultseditorElement.php line: 66
+resultseditor_element_url_list = "Select a previously edited summary"
+;
+; ResultseditorElement.php line: 68
+resultseditor_element_load_page = "Load"
+;
+; ResultseditorElement.php line: 81
+resultseditor_element_page_url = "URL:"
+;
+; ResultseditorElement.php line: 87
+resultseditor_element_page_title = "Title:"
+;
+; ResultseditorElement.php line: 93
+resultseditor_element_description = "Description"
+;
+; ResultseditorElement.php line: 97
+resultseditor_element_reset = "Reset"
+;
+; ResultseditorElement.php line: 99
+resultseditor_element_save_page = "Save Page"
+;
+; ResultseditorElement.php line: 102
+resultseditor_element_filter_websites = "Filter Websites from Results"
+;
+; ResultseditorElement.php line: 114
+resultseditor_element_sites_to_filter = "Sites to Filter"
+;
+; ResultseditorElement.php line: 119
+resultseditor_element_save_filter = "Save Filter"
+;
+; SearchsourcesElement.php line: 62
+searchsources_element_addsource_form = "Add Source Form"
+;
+; SearchsourcesElement.php line: 63
+searchsources_element_edit_media_source = "Edit Media Source"
+;
+; SearchsourcesElement.php line: 67
+searchsources_element_add_media_source = "Add Media Source"
+;
+; SearchsourcesElement.php line: 90
+searchsources_element_sourcetype = "Type:"
+;
+; SearchsourcesElement.php line: 95
+searchsources_element_sourcename = "Name:"
+;
+; SearchsourcesElement.php line: 104
+searchsources_element_url = "URL:"
+;
+; SearchsourcesElement.php line: 110
+searchsources_element_locale_tag = "Language:"
+;
+; SearchsourcesElement.php line: 115
+searchsources_element_thumbnail = "Thumb:"
+;
+; SearchsourcesElement.php line: 125
+searchsources_element_feed_instruct = "Provide xpaths to news feed components below:"
+;
+; SearchsourcesElement.php line: 128
+searchsources_element_channelpath = "Channel:"
+;
+; SearchsourcesElement.php line: 134
+searchsources_element_itempath = "Item:"
+;
+; SearchsourcesElement.php line: 140
+searchsources_element_titlepath = "Title:"
+;
+; SearchsourcesElement.php line: 146
+searchsources_element_descpath = "Description:"
+;
+; SearchsourcesElement.php line: 152
+searchsources_element_linkpath = "Link:"
+;
+; SearchsourcesElement.php line: 158
+searchsources_element_image_xpath = "Image XPath:"
+;
+; SearchsourcesElement.php line: 164
+searchsources_element_submit = "Submit"
+;
+; SearchsourcesElement.php line: 170
+searchsources_element_media_sources = "Media Sources"
+;
+; SearchsourcesElement.php line: 193
+searchsources_element_medianame = "Name"
+;
+; SearchsourcesElement.php line: 194
+searchsources_element_mediatype = "Type"
+;
+; SearchsourcesElement.php line: 196
+searchsources_element_mediaurls = "Urls"
+;
+; SearchsourcesElement.php line: 199
+searchsources_element_action = "Action"
+;
+; SearchsourcesElement.php line: 227
+searchsources_element_editmedia = "Edit"
+;
+; SearchsourcesElement.php line: 230
+confirm_delete_operation = "Are you sure you want to Delete?"
+;
+; SearchsourcesElement.php line: 233
+searchsources_element_deletemedia = "Delete"
+;
+; SearchsourcesElement.php line: 242
+searchsources_element_addsearch_form = "Add Subsearch Form"
+;
+; SearchsourcesElement.php line: 244
+searchsources_element_edit_subsearch = "Edit Subsearch"
+;
+; SearchsourcesElement.php line: 249
+searchsources_element_add_subsearch = "Add a Subsearch"
+;
+; SearchsourcesElement.php line: 264
+searchsources_element_foldername = "Folder Name:"
+;
+; SearchsourcesElement.php line: 274
+searchsources_element_indexsource = "Index Source:"
+;
+; SearchsourcesElement.php line: 280
+searchsources_element_per_page = "Results Per Page:"
+;
+; SearchsourcesElement.php line: 286
+searchsources_element_submit = "Submit"
+;
+; SearchsourcesElement.php line: 292
+searchsources_element_subsearches = "Current Subsearches"
+;
+; SearchsourcesElement.php line: 302
+searchsources_element_dirname = "Folder Name"
+;
+; SearchsourcesElement.php line: 303
+searchsources_element_index = "Index"
+;
+; SearchsourcesElement.php line: 306
+searchsources_element_localestring = "Localization Identifier"
+;
+; SearchsourcesElement.php line: 307
+searchsources_element_perpage = "Results/Page"
+;
+; SearchsourcesElement.php line: 311
+searchsources_element_actions = "Actions"
+;
+; SearchsourcesElement.php line: 327
+searchsources_element_editsource = "Edit"
+;
+; SearchsourcesElement.php line: 333
+searchsources_element_localize = "Localize"
+;
+; SearchsourcesElement.php line: 335
+searchsources_element_localize = "Localize"
+;
+; SearchsourcesElement.php line: 342
+searchsources_element_deletesubsearch = "Delete"
+;
+; SecurityElement.php line: 58
+security_element_auth_captcha = "Authentication and Captcha Types"
+;
+; SecurityElement.php line: 69
+security_element_authentication_type = "Authentication Type"
+;
+; SecurityElement.php line: 81
+security_element_zero_unavailable = "BC Math nZero Knowledge Authentication Needs OpenSSL or BC Math!"
+;
+; SecurityElement.php line: 90
+security_element_captcha_type = "Captcha Type"
+;
+; SecurityElement.php line: 103
+security_element_save = "Save"
+;
+; SecurityElement.php line: 107
+security_element_captcha_recovery_questions = "Captcha and Recovery Questions"
+;
+; SecurityElement.php line: 113
+security_element_edit_recovery = "Edit Account Recovery Questions"
+;
+; SecurityElement.php line: 118
+security_element_edit_captcha = "Edit Text Captcha Questions"
+;
+; SecurityElement.php line: 123
+security_element_edit_recovery = "Edit Account Recovery Questions"
+;
+; SecurityElement.php line: 126
+security_element_edit_captcha = "Edit Text Captcha Questions"
+;
+; ServersettingsElement.php line: 59
+serversettings_element_server_settings = "Servers and Registration"
+;
+; ServersettingsElement.php line: 62
+serversettings_element_name_server = "Name Server Set-up"
+;
+; ServersettingsElement.php line: 66
+serversettings_element_name_server_key = "Server Key:"
+;
+; ServersettingsElement.php line: 73
+serversettings_element_name_server_url = "Name Server URL:"
+;
+; ServersettingsElement.php line: 81
+serversettings_element_use_memcache = "Use Memcache:"
+;
+; ServersettingsElement.php line: 89
+serversettings_element_memcache_servers = "Memcache Servers"
+;
+; ServersettingsElement.php line: 100
+serversettings_element_use_filecache = "Use Filecache:"
+;
+; ServersettingsElement.php line: 110
+configure_element_database_setup = "Database Set-up"
+;
+; ServersettingsElement.php line: 115
+serversettings_element_database_system = "Database System:"
+;
+; ServersettingsElement.php line: 123
+serversettings_element_databasename = "Database Name:"
+;
+; ServersettingsElement.php line: 130
+serversettings_element_databasehost = "Hostname:"
+;
+; ServersettingsElement.php line: 137
+serversettings_element_databaseuser = "Database User:"
+;
+; ServersettingsElement.php line: 145
+serversettings_element_databasepassword = "Database Password:"
+;
+; ServersettingsElement.php line: 158
+serversettings_element_account_registration = "Account Registration"
+;
+; ServersettingsElement.php line: 169
+serversettings_element_mail_sender = "Sender Email:"
+;
+; ServersettingsElement.php line: 175
+serversettings_element_send_media_updater = "Send Mail From Media Updater"
+;
+; ServersettingsElement.php line: 185
+serversettings_element_use_php_mail = "Use PHP mail() function"
+;
+; ServersettingsElement.php line: 192
+serversettings_element_mail_server = "SMTP Server:"
+;
+; ServersettingsElement.php line: 198
+serversettings_element_mail_serverport = "Server Port:"
+;
+; ServersettingsElement.php line: 205
+serversettings_element_mail_username = "Mail Username:"
+;
+; ServersettingsElement.php line: 211
+serversettings_element_mail_password = "Mail Password:"
+;
+; ServersettingsElement.php line: 218
+serversettings_element_mail_security = "Mail Security:"
+;
+; ServersettingsElement.php line: 228
+serversettings_element_proxy_title = "Proxy Servers"
+;
+; ServersettingsElement.php line: 232
+serversettings_element_tor_proxy = "Tor Proxy  (.onion urls only):"
+;
+; ServersettingsElement.php line: 238
+serversettings_element_use_proxy_servers = "Crawl via Proxies"
+;
+; ServersettingsElement.php line: 247
+serversettings_element_proxy_servers = "Proxy Servers (One per line. Format: address:port or address:port:proxytype)"
+;
+; ServersettingsElement.php line: 256
+serversettings_element_adserver_configuration = "Ad Server Configuration"
+;
+; ServersettingsElement.php line: 261
+serversettings_element_advertising_source = "Advertising Source"
+;
+; ServersettingsElement.php line: 273
+serversettings_element_no_payment_processing = "No Ad Payment Processing Script Configured"
+;
+; ServersettingsElement.php line: 275
+serversettings_element_purchase_processing = "Purchase Payment Scripts At Seekquarry.com"
+;
+; ServersettingsElement.php line: 282
+serversettings_element_ad_location = "Ad Location"
+;
+; ServersettingsElement.php line: 287
+serversettings_element_top = "Top"
+;
+; ServersettingsElement.php line: 292
+serversettings_element_side = "Side"
+;
+; ServersettingsElement.php line: 297
+serversettings_element_both = "Both"
+;
+; ServersettingsElement.php line: 302
+serversettings_element_none = "None"
+;
+; ServersettingsElement.php line: 305
+serversettings_element_global_adscript = "Global Ad Script"
+;
+; ServersettingsElement.php line: 312
+serversettings_element_top_adscript = "Top Ad Script"
+;
+; ServersettingsElement.php line: 319
+serversettings_element_side_adscript = "Side Ad Script"
+;
+; ServersettingsElement.php line: 329
+serversettings_element_save = "Save"
+;
+; SigninElement.php line: 73
+signin_element_settings = "Settings"
+;
+; SigninElement.php line: 77
+signin_element_signin = "Sign In"
+;
+; SigninElement.php line: 81
+signin_element_signout = "Sign Out"
+;
+; SubsearchElement.php line: 69
+subsearch_element_more = "More"
+;
+; WikiElement.php line: 121
+wiki_view_back = "Back"
+;
+; WikiElement.php line: 139
+groupfeed_element_feed = "Feed"
+;
+; WikiElement.php line: 140
+wiki_view_wiki = "Wiki"
+;
+; WikiElement.php line: 144
+wiki_view_page = "%s Page"
+;
+; WikiElement.php line: 148
+wiki_view_read = "Read"
+;
+; WikiElement.php line: 149
+wiki_view_edit = "Edit"
+;
+; WikiElement.php line: 152
+wiki_view_pages = "Pages"
+;
+; WikiElement.php line: 237
+wiki_element_redirect_to = "Redirects to:"
+;
+; WikiElement.php line: 245
+wiki_view_page_no_exist = "%s page does not exist."
+;
+; WikiElement.php line: 246
+wiki_view_create_edit = "You can create this page by clicking on the edit link above."
+;
+; WikiElement.php line: 247
+wiki_view_use_form_below = "Or you can use the form below to create or edit a different page."
+;
+; WikiElement.php line: 259
+wiki_element_submit = "Submit"
+;
+; WikiElement.php line: 265
+wiki_view_syntax_summary = "Wiki Syntax Guide"
+;
+; WikiElement.php line: 268
+wiki_view_page_no_exist = "%s page does not exist."
+;
+; WikiElement.php line: 270
+wiki_view_signin_edit = "If you have sufficient access you might be able to create the page by logging in and navigating back here."
+;
+; WikiElement.php line: 272
+wiki_view_page_no_exist = "%s page does not exist."
+;
+; WikiElement.php line: 302
+wiki_element_history = "History"
+;
+; WikiElement.php line: 306
+wiki_element_discuss = "Discuss"
+;
+; WikiElement.php line: 342
+wiki_element_locale_name = "Locale: %s"
+;
+; WikiElement.php line: 346
+wiki_element_page = "Page: %s"
+;
+; WikiElement.php line: 349
+configure_element_toggle_page_settings = "Settings"
+;
+; WikiElement.php line: 353
+wiki_element_page_type = "Page Type:"
+;
+; WikiElement.php line: 361
+wiki_element_page_alias = "Alias Page To:"
+;
+; WikiElement.php line: 369
+wiki_element_page_border = "Page Border:"
+;
+; WikiElement.php line: 376
+wiki_element_table_of_contents = "Table of Contents:"
+;
+; WikiElement.php line: 385
+wiki_element_title = "Title:"
+;
+; WikiElement.php line: 391
+wiki_element_meta_author = "Author:"
+;
+; WikiElement.php line: 397
+wiki_element_meta_robots = "Meta Robots:"
+;
+; WikiElement.php line: 404
+wiki_element_meta_description = "Meta Description:"
+;
+; WikiElement.php line: 411
+wiki_element_page_header = "Header Page Name:"
+;
+; WikiElement.php line: 417
+wiki_element_page_footer = "Footer Page Name:"
+;
+; WikiElement.php line: 440
+wiki_element_archive_info = "To archive a page so it won&#039;t appear in search results delete its text and save."
+;
+; WikiElement.php line: 443
+wiki_element_edit_reason = "Edit Reason:"
+;
+; WikiElement.php line: 450
+wiki_element_savebutton = "Save"
+;
+; WikiElement.php line: 454
+wiki_element_media_list = "Media List Page"
+;
+; WikiElement.php line: 455
+wiki_element_ml_description = "The uploaded items below will all appear when this page is read as a gallery or media list."
+;
+; WikiElement.php line: 458
+wiki_view_page_resources = "Page Resources"
+;
+; WikiElement.php line: 493
+wiki_view_upload = "Upload"
+;
+; WikiElement.php line: 497
+wiki_element_resources_info = "Resources are images, videos, or files associated with this page."
+;
+; WikiElement.php line: 512
+wiki_element_rename_failed = "Rename Failed!"
+;
+; WikiElement.php line: 578
+wiki_element_rename = "Rename"
+;
+; WikiElement.php line: 582
+wiki_element_add_to_page = "Add to Page"
+;
+; WikiElement.php line: 602
+wiki_element_no_resources = "No resources have been saved to this page yet."
+;
+; WikiElement.php line: 624
+wiki_view_wiki_page_list = "%s Group Wiki Page List"
+;
+; WikiElement.php line: 637
+wiki_view_filter_or_create = "Search group page titles"
+;
+; WikiElement.php line: 639
+wiki_element_go = "Go"
+;
+; WikiElement.php line: 644
+wiki_view_create_page = "Create Page: %s"
+;
+; WikiElement.php line: 655
+wiki_element_redirect_to = "Redirects to:"
+;
+; WikiElement.php line: 677
+wiki_view_no_pages = "This group has no pages yet for the %s locale. Search for a nonexistant page and click edit to create it."
+;
+; WikiElement.php line: 700
+wiki_view_back = "Back"
+;
+; WikiElement.php line: 716
+wiki_view_difference = "Difference:"
+;
+; WikiElement.php line: 722
+wiki_view_go = "Go"
+;
+; WikiElement.php line: 741
+wiki_view_diff_first = "First"
+;
+; WikiElement.php line: 743
+wiki_view_diff_second = "Second"
+;
+; WikiElement.php line: 747
+wiki_view_diff_first = "First"
+;
+; WikiElement.php line: 748
+wiki_view_diff_second = "Second"
+;
+; WikiElement.php line: 754
+wiki_view_edited_by = "Edited by %s. "
+;
+; WikiElement.php line: 758
+wiki_view_page_len = "(%s bytes)."
+;
+; WikiElement.php line: 760
+wiki_view_revert = "Revert"
+;
+; WikiElement.php line: 763
+wiki_view_revert = "Revert"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/helpers
+;
+; FeedsHelper.php line: 70
+feeds_helper_view_feed_results = "News Results for %s"
+;
+; FeedsHelper.php line: 164
+feeds_helper_view_onehour = "1 hour ago"
+;
+; FeedsHelper.php line: 169
+feeds_helper_view_minsecs = "%s m %s s ago"
+;
+; FeedsHelper.php line: 174
+feeds_helper_view_hourdate = "%s hours ago"
+;
+; FileuploadHelper.php line: 72
+fileupload_helper_drag_textarea = "Drag items into the textarea to add them..."
+;
+; FileuploadHelper.php line: 73
+fileupload_helper_click_textarea = "or click to select them."
+;
+; FileuploadHelper.php line: 75
+fileupload_helper_drag_above = "Drag or ..."
+;
+; FileuploadHelper.php line: 76
+fileupload_helper_click_upload = "choose."
+;
+; FileuploadHelper.php line: 117
+basic_js_invalid_filetype = "Invalid Filetype!"
+;
+; FileuploadHelper.php line: 119
+basic_js_file_too_big = "File Size is Too Big!"
+;
+; FileuploadHelper.php line: 121
+basic_js_upload_progress = "Upload Progress: "
+;
+; FileuploadHelper.php line: 123
+basic_js_progress_meter_disabled = "Upload Progress Meter Disabled"
+;
+; FileuploadHelper.php line: 125
+basic_js_upload_error = "Upload Error!"
+;
+; FileuploadHelper.php line: 127
+basic_js_upload_cancelled = "Upload Canceled!"
+;
+; FileuploadHelper.php line: 129
+basic_js_too_many_files = "Trying to add too many files!"
+;
+; HelpbuttonHelper.php line: 106
+wiki_question_mark = "?"
+;
+; HelpbuttonHelper.php line: 138
+wiki_view_edit = "Edit"
+;
+; HelpbuttonHelper.php line: 139
+wiki_view_not_available = "Unable to load Help article!"
+;
+; HelpbuttonHelper.php line: 141
+wiki_view_create_edit = "You can create this page by clicking on the edit link above."
+;
+; HelpbuttonHelper.php line: 143
+wiki_view_page_no_exist = "%s page does not exist."
+;
+; HelpbuttonHelper.php line: 145
+wiki_view_read = "Read"
+;
+; ImagesHelper.php line: 55
+images_helper_view_image_results = "View More Image Results..."
+;
+; PaginationHelper.php line: 97
+pagination_helper_previous = "Prev"
+;
+; PaginationHelper.php line: 121
+pagination_helper_next = "Next"
+;
+; PagingtableHelper.php line: 103
+pagingtable_helper_search = "Search"
+;
+; PagingtableHelper.php line: 125
+pagingtable_helper_show = "Show"
+;
+; PagingtableHelper.php line: 138
+pagingtable_helper_row_range = "Row %s to %s of %s"
+;
+; PagingtableHelper.php line: 215
+pagingtable_helper_row_range = "Row %s to %s of %s"
+;
+; PagingtableHelper.php line: 233
+pagingtable_helper_show = "Show"
+;
+; PagingtableHelper.php line: 241
+pagingtable_helper_search = "Search"
+;
+; SearchformHelper.php line: 119
+searchform_helper_any = "Any"
+;
+; SearchformHelper.php line: 148
+searchform_helper_search = "Search"
+;
+; ToggleHelper.php line: 59
+toggle_helper_on = "On"
+;
+; ToggleHelper.php line: 61
+toggle_helper_off = "Off"
+;
+; ToggleHelper.php line: 65
+toggle_helper_on = "On"
+;
+; ToggleHelper.php line: 67
+toggle_helper_off = "Off"
+;
+; ToggleHelper.php line: 71
+toggle_helper_on = "On"
+;
+; ToggleHelper.php line: 73
+toggle_helper_off = "Off"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/layouts
+;
+; RssLayout.php line: 62
+rss_layout_title = "Open Source Search Engine - Seekquarry : %s"
+;
+; RssLayout.php line: 69
+rss_layout_description = "Search results for: %s"
+;
+; WebLayout.php line: 63
+web_layout_title = "Open Source Search Engine - Seekquarry"
+;
+; WebLayout.php line: 73
+web_layout_description = "Free and Open Source Crawler and Search Engine Software"
+;
+; WebLayout.php line: 75
+web_layout_site_author = "Chris Pollett"
+;
+; WebLayout.php line: 219
+web_layout_query_statistics = "Query Statistics"
+;
+; WebLayout.php line: 223
+web_layout_total_elapsed_time = "Total Elapsed Time for Queries: %s seconds."
+;
+; WebLayout.php line: 228
+web_layout_query_time = "Time: %s seconds."
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/views
+;
+; DownloadView.php line: 65
+download_view_form = "Download Form"
+;
+; DownloadView.php line: 74
+download_view_thank_you = "Thank you for your interest in Yioop Search Engine Software. To obtain an email with a download link please fill out the form below. We use the information collected to better understand our users and to connect our users with services available for our software."
+;
+; DownloadView.php line: 76
+download_view_full_name = "Full Name"
+;
+; DownloadView.php line: 81
+download_view_email = "Email"
+;
+; DownloadView.php line: 85
+download_view_business = "Organization"
+;
+; DownloadView.php line: 90
+download_view_interest = "Briefly Describe your Interest in Yioop Software:"
+;
+; DownloadView.php line: 96
+download_view_get_email = "Send Download Email"
+;
+; DownloadView.php line: 102
+download_view_return_main = "Return"
+;
+; DownloadView.php line: 115
+download_view_required_fields = "Please Fill-in the Required Fields!"
+;
+; DownloadView.php line: 119
+download_view_name_required = "Full Name Required!"
+;
+; DownloadView.php line: 123
+download_view_valid_email = "Please Enter a Valid Email!"
+;
+; StoreView.php line: 65
+download_view_form = "Download Form"
+;
+; StoreView.php line: 74
+download_view_thank_you = "Thank you for your interest in Yioop Search Engine Software. To obtain an email with a download link please fill out the form below. We use the information collected to better understand our users and to connect our users with services available for our software."
+;
+; StoreView.php line: 76
+download_view_full_name = "Full Name"
+;
+; StoreView.php line: 81
+download_view_email = "Email"
+;
+; StoreView.php line: 85
+download_view_business = "Organization"
+;
+; StoreView.php line: 90
+download_view_interest = "Briefly Describe your Interest in Yioop Software:"
+;
+; StoreView.php line: 96
+download_view_get_email = "Send Download Email"
+;
+; StoreView.php line: 102
+download_view_return_main = "Return"
+;
+; StoreView.php line: 115
+download_view_required_fields = "Please Fill-in the Required Fields!"
+;
+; StoreView.php line: 119
+download_view_name_required = "Full Name Required!"
+;
+; StoreView.php line: 123
+download_view_valid_email = "Please Enter a Valid Email!"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/library/indexing_plugins
+;
+; WordfilterPlugin.php line: 355
+wordfilter_plugin_settings_saved = "Word Filter Settings Saved!"
+;
+; WordfilterPlugin.php line: 364
+wordfilter_plugin_defaults_restored = "Defaults restored!"
+;
+; WordfilterPlugin.php line: 469
+wordfilter_plugin_preferences = "Word Filter Preferences"
+;
+; WordfilterPlugin.php line: 473
+wordfilter_plugin_factory_settings = "Factory Settings"
+;
+; WordfilterPlugin.php line: 485
+wordfilter_plugin_save = "Save"
diff --git a/locale/en_US/resources/Tokenizer.php b/locale/en_US/resources/Tokenizer.php
new file mode 100755
index 0000000..f016853
--- /dev/null
+++ b/locale/en_US/resources/Tokenizer.php
@@ -0,0 +1,863 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\en_US\resources;
+
+use seekquarry\yioop\configs as C;
+use seekquarry\yioop\library\PhraseParser;
+
+/* If you would like to use wordnet for thesaurus reordering of query results
+   define the following variable in your configs/local_config.php file with
+   the path to the WordNet executable.
+ */
+if (!C\nsdefined("WORDNET_EXEC")) {
+    C\nsdefine("WORDNET_EXEC", "");
+}
+/**
+ * This class has a collection of methods for English locale specific
+ * tokenization. In particular, it has a stemmer, a stop word remover (for
+ * use mainly in word cloud creation), and a part of speech tagger (if
+ * thesaurus reordering used). The stemmer is my stab at implementing the
+ * Porter Stemmer algorithm
+ * presented http://tartarus.org/~martin/PorterStemmer/def.txt
+ * The code is based on the non-thread safe C version given by Martin Porter.
+ * Since PHP is single-threaded this should be okay.
+ * Here given a word, its stem is that part of the word that
+ * is common to all its inflected variants. For example,
+ * tall is common to tall, taller, tallest. A stemmer takes
+ * a word and tries to produce its stem.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\en-US
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = ["titanic", "programming", "fishing", 'ins',
+        "blues", "factorial", "pbs"];
+    /**
+     * Phrases we would like yioop to rewrite before performing a query
+     * @var array
+     */
+    public static $semantic_rewrites = [
+        "ins" => 'uscis',
+        "mimetype" => 'mime',
+        "military" => 'armed forces',
+        'full metal alchemist' => 'fullmetal alchemist',
+        'bruce schnier' => 'bruce schneier',
+    ];
+    /**
+     * storage used in computing the stem
+     * @var string
+     */
+    private static $buffer;
+    /**
+     * Index of the current end of the word at the current state of computing
+     * its stem
+     * @var int
+     */
+    private static $k;
+    /**
+     * Index to start of the suffix of the word being considered for
+     * manipulation
+     * @var int
+     */
+    private static $j;
+    /**
+     * The constructor for a tokenizer can be used to say that a thesaurus
+     * for final query reordering is present. For english we do this if
+     * the WORDNET_EXEC variable is set. In which case we use WordNet for
+     * our reordering
+     */
+    public function __construct()
+    {
+        if (C\WORDNET_EXEC != "") {
+            $this->use_thesaurus = true;
+        }
+    }
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Computes similar words and scores from WordNet output based on word type.
+     *
+     * @param string $term term to find related thesaurus terms
+     * @param string $word_type is the type of word such as "NN" (noun),
+     *     "VB" (verb), "AJ" (adjective), or "AV" (adverb)
+     *     (all other types will be ignored)
+     * @param string $whole_query the original query $term came from
+     * @return array a sequence of
+     *     (score => array of thesaurus terms) associations. The score
+     *     representing one word sense of term
+     */
+    public static function scoredThesaurusMatches($term, $word_type,
+        $whole_query)
+    {
+        $word_map = ["VB" => "verb", "NN" => "noun", "AJ" => "adj",
+            "AV" => "adv"];
+        //Gets overview of senses of term[$i] into data
+        exec(C\WORDNET_EXEC . " $term -over", $data);
+        if (!$data || ! isset($word_map[$word_type])) { return null; }
+        $full_name = $word_map[$word_type];
+        $lexicon_output = implode("\n", $data);
+        $sense_parts = preg_split("/\bThe\s$full_name".'[^\n]*\n\n/',
+            $lexicon_output);
+        if (!isset($sense_parts[1])) {return null; }
+        list($sense, ) = preg_split("/\bOverview\sof\s/", $sense_parts[1]);
+        $definitions_for_sense = preg_split("/\d+\.\s/", $sense, -1,
+            PREG_SPLIT_NO_EMPTY);
+        $num_definitions = count($definitions_for_sense);
+        $sentence = [];
+        $similar_phrases = [];
+        $avg_scores = [];
+        for ($i = 0; $i < $num_definitions; $i++) {
+            //get sentence fragments examples of using that definition
+            preg_match_all('/\"(.*?)\"/', $definitions_for_sense[$i], $matches);
+            // to separate out the words
+            preg_match('/[\w+\s\,\.\']+\s\-+/', $definitions_for_sense[$i],
+                $match_word);
+            $thesaurus_phrases = preg_split("/\s*\,\s*/",
+                strtolower(rtrim(trim($match_word[0]), "-")));
+            //remove ori ginal term from thesaurus phrases if present
+            $m = 0;
+            foreach ($thesaurus_phrases as $thesaurus_phrase) {
+                $tphrase = trim($thesaurus_phrase);
+                if ($tphrase == trim($term)) {
+                    unset($thesaurus_phrases[$m]);
+                }
+                $m++;
+            }
+            $thesaurus_phrases = array_filter($thesaurus_phrases);
+            if ($thesaurus_phrases == []) {continue;}
+            $num_example_sentences = count($matches[1]);
+            $score = [];
+            for ($j = 0; $j < $num_example_sentences; $j++) {
+                $query_parts = explode(' ', strtolower($whole_query));
+                $example_sentence_parts = explode(' ',
+                    strtolower($matches[1][$j]));
+                $score[$j] = PhraseParser::getCosineRank($query_parts,
+                    $example_sentence_parts);
+                /*  If Cosine similarity is zero then go for
+                 * intersection similarity ranking
+                 */
+                if ($score[$j] == 0) {
+                    $score[$j] = PhraseParser::getIntersection($query_parts,
+                        $example_sentence_parts);
+                }
+            }
+            /*  We use the rounded average of the above times 100 as a score
+                score for a definition. To avoid ties we store in the low
+                order digits 99 - the definition it was
+             */
+            if ($num_example_sentences > 0) {
+                $definition_score = 100 * round(
+                    100 * (array_sum($score) / $num_example_sentences))
+                    + (99 - $i);
+            } else {
+                $definition_score = 99 - $i;
+            }
+            $similar_phrases[$definition_score] = $thesaurus_phrases;
+        }
+        krsort($similar_phrases);
+        return $similar_phrases;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = ['a','able','about','above','abst',
+        'accordance','according','based','accordingly','across','act',
+        'actually','added','adj','affected','affecting','affects','after',
+        'afterwards','again','against','ah','all','almost','alone','along',
+        'already','also','although','always','am','among','amongst','an','and',
+        'announce','another','any','anybody','anyhow','anymore','anyone',
+        'anything','anyway','anyways','anywhere','apparently','approximately',
+        'are','aren','arent','arise','around','as','aside','ask','asking','at',
+        'auth','available','away','awfully','b','back','be','became','because',
+        'become','becomes','becoming','been','before','beforehand','begin',
+        'beginning','beginnings','begins','behind','being','believe','below',
+        'beside','besides','between','beyond','biol','both','brief','briefly',
+        'but','by','c','ca','came','can','cannot','cant','cause','causes',
+        'certain','certainly','co','com','come','comes','contain','containing',
+        'contains','could','couldnt','d','date','did','didnt',
+        'different','do','does','doesnt','doing',
+        'done','dont','down','downwards',
+        'due','during','e','each','ed','edu','effect','eg','eight','eighty',
+        'either','else','elsewhere','end',
+        'ending','enough','especially','et',
+        'et-al','etc','even','ever','every',
+        'everybody','everyone','everything'
+        ,'everywhere','ex','except','f','far','few','ff','fifth','first',
+        'five','fix','followed','following','follows','for','former',
+        'formerly','forth','found','four','from','further','furthermore',
+        'g','gave','get','gets','getting','give','given','gives','giving','go',
+        'goes','gone','got','gotten','h','had','happens','hardly','has','hasnt',
+        'have','havent','having','he','hed','hence','her','here','hereafter',
+        'hereby','herein','heres','hereupon','hers','herself','hes','hi','hid',
+        'him','himself','his','hither','home','how','howbeit',
+        'however', 'http', 'https', 'hundred','i','id','ie','if','ill',
+        'im','immediate','immediately',
+        'importance','important','in','inc','indeed','index','information',
+        'instead','into','invention','inward','is','isnt','it','itd','itll',
+        'its','itself','ive','j','just','k','keep','keeps',
+        'kept','kg','km','know',
+        'known','knows','l','largely','last','lately',
+        'later','latter','latterly',
+        'least','less','lest','let','lets','like','liked','likely','line',
+        'little','ll','look','looking','looks','ltd','m','made','mainly','make',
+        'makes','many','may','maybe','me','mean','means','meantime','meanwhile',
+        'merely','mg','might','million','miss','ml','more','moreover','most',
+        'mostly','mr','mrs','much','mug','must','my','myself','n','na','name',
+        'namely','nay','nd','near','nearly','necessarily','necessary','need',
+        'needs','neither','never','nevertheless','new','next',
+        'nine','ninety','no',
+        'nobody','non','none','nonetheless','noone',
+        'nor','normally','nos','not',
+        'noted','nothing','now','nowhere','o','obtain',
+        'obtained','obviously','of',
+        'off','often','oh','ok','okay','old','omitted','on','once','one','ones',
+        'only','onto','or','ord','other','others',
+        'otherwise','ought','our','ours',
+        'ourselves','out','outside','over','overall','owing','own','p','page',
+        'pages','part','particular','particularly',
+        'past','per','perhaps','placed',
+        'please','plus','poorly','possible','possibly','potentially','pp',
+        'predominantly','present','previously',
+        'primarily','probably','promptly',
+        'proud','provides','put','q','que','quickly','quite','qv','r','ran',
+        'rather','rd','re','readily','really','recent','recently','ref','refs',
+        'regarding','regardless','regards','related','relatively','research',
+        'respectively','resulted','resulting',
+        'results','right','run','s','said',
+        'same','saw','say','saying','says','sec',
+        'section','see','seeing','seem',
+        'seemed','seeming','seems',
+        'seen','self','selves','sent','seven','several',
+        'shall','she','shed','shell',
+        'shes','should','shouldnt','show','showed','shown','showns','shows',
+        'significant','significantly','similar','similarly','since',
+        'six','slightly',
+        'so','some','somebody','somehow','someone','somethan',
+        'something','sometime',
+        'sometimes','somewhat','somewhere','soon',
+        'sorry','specifically','specified',
+        'specify','specifying','still','stop','strongly','sub','substantially',
+        'successfully','such','sufficiently','suggest','sup','sure','t','take',
+        'taken','taking','tell','tends','th','than',
+        'thank','thanks','thanx','that',
+        'thatll','thats','thatve','the','their',
+        'theirs','them','themselves','then',
+        'thence','there','thereafter','thereby','thered','therefore','therein',
+        'therell','thereof','therere','theres','thereto','thereupon','thereve',
+        'these','they','theyd','theyll','theyre',
+        'theyve','think','this','those',
+        'thou','though','thoughh','thousand','throug',
+        'through','throughout','thru',
+        'thus','til','tip','to','together','too',
+        'took','toward','towards','tried',
+        'tries','truly','try','trying','ts','twice','two','u','un','under',
+        'unfortunately','unless','unlike','unlikely','until','unto','up','upon',
+        'ups','us','use','used','useful','usefully','usefulness','uses','using',
+        'usually','v','value','various','ve','very',
+        'via','viz','vol','vols','vs',
+        'w','want','wants','was','wasnt','way','we',
+        'wed','welcome','well','went',
+        'were','werent','weve','what','whatever',
+        'whatll','whats','when','whence',
+        'whenever','where','whereafter','whereas','whereby','wherein','wheres',
+        'whereupon','wherever','whether','which','while','whim','whither','who',
+        'whod','whoever','whole','wholl','whom','whomever','whos','whose','why',
+        'widely','willing','wish','with','within',
+        'without','wont','words','world',
+        'would','wouldnt','www','x','y','yes','yet','you','youd','youll','your',
+        'youre','yours','yourself','yourselves','youve','z','zero'];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/', '',
+            mb_strtolower($page));
+        return $page;
+    }
+    /**
+     * Takes a phrase and tags each term in it with its part of speech.
+     * So each term in the original phrase gets mapped to term~part_of_speech
+     * This tagger is based on a Brill tagger. It makes uses a lexicon
+     * consisting of words from the Brown corpus together with a list of
+     * part of speech tags that that word had in the Brown Corpus. These are
+     * used to get an initial part of speech (in word was not present than
+     * we assume it is a noun). From this a fixed set of rules is used to modify
+     * the initial tag if necessary.
+     *
+     * @param string $phrase text to add parts speech tags to
+     * @return string $tagged_phrase phrase where each term has ~part_of_speech
+     *     appended
+     */
+    public static function tagPartsOfSpeechPhrase($phrase)
+    {
+        preg_match_all("/[\w\d]+/", $phrase, $matches);
+        $tokens = $matches[0];
+        $tagged_tokens = self::tagTokenizePartOfSpeech($phrase);
+        $tagged_phrase  = self::taggedPartOfSpeechTokensToString(
+            $tagged_tokens);
+        return $tagged_phrase;
+    }
+    /**
+     * Computes the stem of an English word
+     *
+     * For example, jumps, jumping, jumpy, all have jump as a stem
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $words
+     */
+    public static function stem($word)
+    {
+        if (in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+
+        self::$buffer = $word;
+        self::$k = strlen($word) - 1;
+        self::$j = self::$k;
+        if (self::$k <= 1) { return $word; }
+        self::step1ab();
+        self::step1c();
+        self::step2();
+        self::step3();
+        self::step4();
+        self::step5();
+        return substr(self::$buffer, 0, self::$k + 1);
+    }
+    /**
+     * Checks to see if the ith character in the buffer is a consonant
+     *
+     * @param int $i the character to check
+     * @return if the ith character is a constant
+     */
+    private static function cons($i)
+    {
+        switch (self::$buffer[$i]) {
+            case 'a':
+                // no break
+            case 'e':
+            case 'i':
+            case 'o':
+            case 'u':
+                return false;
+            case 'y':
+                return ($i== 0 ) ? true : !self::cons($i - 1);
+            default:
+                return true;
+        }
+    }
+    //private methods for stemming
+    /**
+     * m() measures the number of consonant sequences between 0 and j. if c is
+     * a consonant sequence and v a vowel sequence, and [.] indicates arbitrary
+     * presence,
+     * <pre>
+     *   [c][v]       gives 0
+     *   [c]vc[v]     gives 1
+     *   [c]vcvc[v]   gives 2
+     *   [c]vcvcvc[v] gives 3
+     *   ....
+     * </pre>
+     */
+    private static function m()
+    {
+        $n = 0;
+        $i = 0;
+        while(true) {
+            if ($i > self::$j) return $n;
+            if (!self::cons($i)) break;
+            $i++;
+        }
+        $i++;
+        while(true) {
+            while(true) {
+                if ($i > self::$j) return $n;
+                if (self::cons($i)) break;
+                $i++;
+            }
+            $i++;
+            $n++;
+
+            while(true)
+            {
+                if ($i > self::$j) return $n;
+                if (!self::cons($i)) break;
+                $i++;
+            }
+            $i++;
+        }
+    }
+    /**
+     * Checks if 0,...$j contains a vowel
+     *
+     * @return bool whether it does not
+     */
+    private static function vowelinstem()
+    {
+        for ($i = 0; $i <= self::$j; $i++) {
+            if (!self::cons($i)) return true;
+        }
+        return false;
+    }
+    /**
+     * Checks if $j,($j-1) contain a double consonant.
+     *
+     * @param int $j position to check in buffer for double consonant
+     * @return bool if it does or not
+     */
+    private static function doublec($j)
+    {
+        if ($j < 1) { return false; }
+        if (self::$buffer[$j] != self::$buffer[$j - 1]) { return false; }
+        return self::cons($j);
+    }
+    /**
+     * Checks whether the letters at the indices $i-2, $i-1, $i in the buffer
+     * have the form consonant - vowel - consonant and also if the second c is
+     * not w,x or y. this is used when trying to restore an e at the end of a
+     * short word. e.g.
+     *<pre>
+     *   cav(e), lov(e), hop(e), crim(e), but
+     *   snow, box, tray.
+     *</pre>
+     * @param int $i position to check in buffer for consonant-vowel-consonant
+     * @return bool whether the letters at indices have the given form
+     */
+    private static function cvc($i)
+    {
+        if ($i < 2 || !self::cons($i) || self::cons($i - 1) ||
+            !self::cons($i - 2)) return false;
+        $ch = self::$buffer[$i];
+        if ($ch == 'w' || $ch == 'x' || $ch == 'y') return false;
+        return true;
+    }
+    /**
+     * Checks if the buffer currently ends with the string $s
+     *
+     * @param string $s string to use for check
+     * @return bool whether buffer currently ends with $s
+     */
+    private static function ends($s)
+    {
+        $len = strlen($s);
+        $loc = self::$k - $len + 1;
+        if ($loc < 0 ||
+            substr_compare(self::$buffer, $s, $loc, $len) != 0) {
+            return false;
+        }
+        self::$j = self::$k - $len;
+        return true;
+    }
+    /**
+     * setto($s) sets (j+1),...k to the characters in the string $s, readjusting
+     * k.
+     *
+     * @param string $s string to modify the end of buffer with
+     */
+    private static function setto($s)
+    {
+        $len = strlen($s);
+        $loc = self::$j + 1;
+        self::$buffer = substr_replace(self::$buffer, $s, $loc, $len);
+        self::$k = self::$j + $len;
+    }
+    /**
+     * Sets the ending in the buffer to $s if the number of consonant sequences
+     * between $k and $j is positive.
+     *
+     * @param string $s what to change the suffix to
+     */
+    private static function r($s)
+    {
+        if (self::m() > 0) self::setto($s);
+    }
+
+    /** step1ab() gets rid of plurals and -ed or -ing. e.g.
+     * <pre>
+     *    caresses  ->  caress
+     *    ponies    ->  poni
+     *    ties      ->  ti
+     *    caress    ->  caress
+     *    cats      ->  cat
+     *
+     *    feed      ->  feed
+     *    agreed    ->  agree
+     *    disabled  ->  disable
+     *
+     *    matting   ->  mat
+     *    mating    ->  mate
+     *    meeting   ->  meet
+     *    milling   ->  mill
+     *    messing   ->  mess
+     *
+     *    meetings  ->  meet
+     * </pre>
+     */
+    private static function step1ab()
+    {
+        if (self::$buffer[self::$k] == 's') {
+            if (self::ends("sses")) {
+                self::$k -= 2;
+            } else if (self::ends("ies")) {
+                self::setto("i");
+            } else if (self::$buffer[self::$k - 1] != 's') {
+                self::$k--;
+            }
+        }
+        if (self::ends("eed")) {
+            if (self::m() > 0) self::$k--;
+        } else if ((self::ends("ed") || self::ends("ing")) &&
+            self::vowelinstem()) {
+            self::$k = self::$j;
+            if (self::ends("at")) {
+                self::setto("ate");
+            } else if (self::ends("bl")) {
+                self::setto("ble");
+            } else if (self::ends("iz")) {
+                self::setto("ize");
+            } else if (self::doublec(self::$k)) {
+                self::$k--;
+                $ch = self::$buffer[self::$k];
+                if ($ch == 'l' || $ch == 's' || $ch == 'z') self::$k++;
+            } else if (self::m() == 1 && self::cvc(self::$k)) {
+                self::setto("e");
+            }
+       }
+    }
+    /**
+     * step1c() turns terminal y to i when there is another vowel in the stem.
+     */
+    private static function step1c()
+    {
+        if (self::ends("y") && self::vowelinstem()) {
+            self::$buffer[self::$k] = 'i';
+        }
+    }
+    /**
+     * step2() maps double suffices to single ones. so -ization ( = -ize plus
+     * -ation) maps to -ize etc.Note that the string before the suffix must give
+     * m() > 0.
+     */
+    private static function step2()
+    {
+        if (self::$k < 1) return;
+        switch (self::$buffer[self::$k - 1]) {
+            case 'a':
+                if (self::ends("ational")) { self::r("ate"); break; }
+                if (self::ends("tional")) { self::r("tion"); break; }
+                break;
+            case 'c':
+                if (self::ends("enci")) { self::r("ence"); break; }
+                if (self::ends("anci")) { self::r("ance"); break; }
+                break;
+            case 'e':
+                if (self::ends("izer")) { self::r("ize"); break; }
+                break;
+            case 'l':
+                if (self::ends("abli")) { self::r("able"); break; }
+                if (self::ends("alli")) { self::r("al"); break; }
+                if (self::ends("entli")) { self::r("ent"); break; }
+                if (self::ends("eli")) { self::r("e"); break; }
+                if (self::ends("ousli")) { self::r("ous"); break; }
+                break;
+            case 'o':
+                if (self::ends("ization")) { self::r("ize"); break; }
+                if (self::ends("ation")) { self::r("ate"); break; }
+                if (self::ends("ator")) { self::r("ate"); break; }
+                break;
+            case 's':
+                if (self::ends("alism")) { self::r("al"); break; }
+                if (self::ends("iveness")) { self::r("ive"); break; }
+                if (self::ends("fulness")) { self::r("ful"); break; }
+                if (self::ends("ousness")) { self::r("ous"); break; }
+                break;
+            case 't':
+                if (self::ends("aliti")) { self::r("al"); break; }
+                if (self::ends("iviti")) { self::r("ive"); break; }
+                if (self::ends("biliti")) { self::r("ble"); break; }
+                break;
+        }
+    }
+    /**
+     * step3() deals with -ic-, -full, -ness etc. similar strategy to step2.
+     */
+    private static function step3()
+    {
+        switch (self::$buffer[self::$k]) {
+            case 'e':
+                if (self::ends("icate")) { self::r("ic"); break; }
+                if (self::ends("ative")) { self::r(""); break; }
+                if (self::ends("alize")) { self::r("al"); break; }
+                break;
+            case 'i':
+                if (self::ends("iciti")) { self::r("ic"); break; }
+                break;
+            case 'l':
+                if (self::ends("ical")) { self::r("ic"); break; }
+                if (self::ends("ful")) { self::r(""); break; }
+                break;
+            case 's':
+                if (self::ends("ness")) { self::r(""); break; }
+                break;
+        }
+    }
+    /**
+     * step4() takes off -ant, -ence etc., in context <c>vcvc<v>.
+     */
+    private static function step4()
+    {
+        if (self::$k < 1) { return; }
+        switch (self::$buffer[self::$k - 1]) {
+            case 'a':
+                if (self::ends("al")) { break; }
+                return;
+            case 'c':
+                if (self::ends("ance")) { break; }
+                if (self::ends("ence")) { break; }
+                return;
+            case 'e':
+                if (self::ends("er")) break;
+                return;
+            case 'i':
+                if (self::ends("ic")) break;
+                return;
+            case 'l':
+                if (self::ends("able")) break;
+                if (self::ends("ible")) break;
+                return;
+            case 'n':
+                if (self::ends("ant")) break;
+                if (self::ends("ement")) break;
+                if (self::ends("ment")) break;
+                if (self::ends("ent")) break;
+                return;
+            case 'o':
+                if (self::ends("ion") && self::$j >= 0 &&
+                    (self::$buffer[self::$j] == 's' ||
+                    self::$buffer[self::$j] == 't')) break;
+                if (self::ends("ou")) break;
+                return;
+            /* takes care of -ous */
+            case 's':
+                if (self::ends("ism")) break;
+                return;
+            case 't':
+                if (self::ends("ate")) break;
+                if (self::ends("iti")) break;
+                    return;
+            case 'u':
+                if (self::ends("ous")) break;
+                return;
+            case 'v':
+                if (self::ends("ive")) break;
+                return;
+            case 'z':
+                if (self::ends("ize")) break;
+                return;
+            default:
+                return;
+        }
+        if (self::m() > 1) self::$k = self::$j;
+    }
+    /** step5() removes a final -e if m() > 1, and changes -ll to -l if
+     * m() > 1.
+     */
+    private static function step5()
+    {
+        self::$j = self::$k;
+
+        if (self::$buffer[self::$k] == 'e') {
+            $a = self::m();
+            if ($a > 1 || $a == 1 && !self::cvc(self::$k - 1)) self::$k--;
+        }
+        if (self::$buffer[self::$k] == 'l' &&
+            self::doublec(self::$k) && self::m() > 1) self::$k--;
+    }
+    //private methods for part of speech tagging
+    /**
+     * Split input text into terms and output an array with one element
+     * per term, that element consisting of array with the term token
+     * and the part of speech tag.
+     *
+     * @param string $text string to tag and tokenize
+     * @return array of pairs of the form( "token" => token_for_term,
+     *     "tag"=> part_of_speech_tag_for_term) for one each token in $text
+     */
+    private static function tagTokenizePartOfSpeech($text)
+    {
+        static $lex_string = null;
+        if (!$lex_string) {
+            $lex_string = gzdecode(file_get_contents(
+                C\LOCALE_DIR . "/en_US/resources/lexicon.txt.gz"));
+        }
+        preg_match_all("/[\w\d]+/", $text, $matches);
+        $tokens = $matches[0];
+        $nouns = ['NN', 'NNS', 'NNP'];
+        $verbs = ['VBD', 'VBP', 'VB'];
+        $result = [];
+        $previous = ['token' => -1, 'tag' => -1];
+        $previous_token = -1;
+        sort($tokens);
+        $dictionary = [];
+        /*
+            Notice we sorted the tokens, and notice how we use $cur_pos
+            so only advance forward through $lex_string. So the
+            run time of this is bound by at most one scan of $lex_string
+         */
+        $cur_pos = 0;
+        foreach ($tokens as $token) {
+            $token = strtolower(rtrim($token, "."));
+            $token_pos = stripos($lex_string, "\n".$token." ", $cur_pos);
+            if ($token_pos !== false) {
+                $token_pos++;
+                $cur_pos = stripos($lex_string, "\n", $token_pos);
+                $line = trim(substr($lex_string, $token_pos,
+                    $cur_pos - $token_pos));
+                $tag_list = explode(' ', $line);
+                $dictionary[strtolower(rtrim($token, "."))] =
+                    array_slice($tag_list, 1);
+                $cur_pos++;
+            }
+        }
+        // now using our dictionary we tag
+        $i = 0;
+        $tag_list = [];
+        foreach ($matches[0] as $token) {
+            $prev_tag_list = $tag_list;
+            $tag_list = [];
+            // default to a common noun
+            $current = ['token' => $token, 'tag' => 'NN'];
+            // remove trailing full stops
+            $token = strtolower(rtrim($token, "."));
+            if (isset($dictionary[$token])) {
+                $tag_list = $dictionary[$token];
+                $current['tag'] = $tag_list[0];
+            }
+            // Converts verbs after 'the' to nouns
+            if ($previous['tag'] == 'DT' && in_array($current['tag'], $verbs)) {
+                $current['tag'] = 'NN';
+            }
+            // Convert noun to number if . appears
+            if ($current['tag'][0] == 'N' && strpos($token, '.') !== false) {
+                $current['tag'] = 'CD';
+            }
+            $ends_with = substr($token, -2);
+            switch ($ends_with) {
+                case 'ed':
+                    // Convert noun to past particle if ends with 'ed'
+                    if ($current['tag'][0] == 'N') { $current['tag'] = 'VBN'; }
+                break;
+                case 'ly':
+                    // Anything that ends 'ly' is an adverb
+                    $current['tag'] = 'RB';
+                break;
+                case 'al':
+                    // Common noun to adjective if it ends with al
+                    if (in_array($current['tag'], $nouns)) {
+                        $current['tag'] = 'JJ';
+                    }
+                break;
+            }
+            // Noun to verb if the word before is 'would'
+            if ($current['tag'] == 'NN' && $previous_token == 'would') {
+                $current['tag'] = 'VB';
+            }
+            // Convert common noun to gerund
+            if (in_array($current['tag'], $nouns) &&
+                substr($token, -3) == 'ing') { $current['tag'] = 'VBG'; }
+            //nouns followed by adjectives
+            if (in_array($previous['tag'], $nouns) &&
+                $current['tag'] == 'JJ' && in_array('JJ', $prev_tag_list)) {
+                $result[$i - 1]['tag'] = 'JJ';
+                $current['tag'] = 'NN';
+            }
+            /* If we get noun noun, and the second can be a verb,
+             * convert to verb; if noun noun and previous could be an
+             * adjective convert to adjective
+             */
+            if (in_array($previous['tag'], $nouns) &&
+                in_array($current['tag'], $nouns) ) {
+                if (in_array('VBN', $tag_list)) {
+                    $current['tag'] = 'VBN';
+                } else if (in_array('VBZ', $tag_list)) {
+                    $current['tag'] = 'VBZ';
+                } else if (in_array('JJ', $prev_tag_list)) {
+                    $result[$i - 1]['tag'] = 'JJ';
+                }
+            }
+            $result[$i] = $current;
+            $i++;
+            $previous = $current;
+            $previous_token = $token;
+        }
+        return $result;
+    }
+    /**
+     * Takes an array of pairs (token, tag) that came from phrase
+     * and builds a new phrase where terms look like token~tag.
+     *
+     * @param array $tagged_tokens array of pairs as might come from tagTokenize
+     * @return $tagged_phrase a phrase with terms in the format token~tag
+     */
+    private static function taggedPartOfSpeechTokensToString($tagged_tokens)
+    {
+        $tagged_phrase = "";
+        $simplified_parts_of_speech = [
+            "NN" => "NN", "NNS" => "NN", "NNP" => "NN", "NNPS" => "NN",
+            "PRP" => "NN", 'PRP$' => "NN", "WP" => "NN",
+            "VB" => "VB", "VBD" => "VB", "VBN" => "VB", "VBP" => "VB",
+            "VBZ" => "VB",
+            "JJ" => "AJ", "JJR" => "AJ", "JJS" => "AJ",
+            "RB" => "AV", "RBR" => "AV", "RBS" => "AV", "WRB" => "AV"
+        ];
+        foreach ($tagged_tokens as $t) {
+            $tag = trim($t['tag']);
+            $tag = (isset($simplified_parts_of_speech[$tag])) ?
+                $simplified_parts_of_speech[$tag] : $tag;
+            $tagged_phrase .= $t['token'] . "~" . $tag .  " ";
+        }
+        return $tagged_phrase;
+    }
+}
diff --git a/locale/en_US/resources/lexicon.txt.gz b/locale/en_US/resources/lexicon.txt.gz
new file mode 100755
index 0000000..05fb9c5
Binary files /dev/null and b/locale/en_US/resources/lexicon.txt.gz differ
diff --git a/locale/en_US/resources/locale.js b/locale/en_US/resources/locale.js
new file mode 100755
index 0000000..26cf636
--- /dev/null
+++ b/locale/en_US/resources/locale.js
@@ -0,0 +1,48 @@
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Sandhya Vissapragada
+ * @package seek_quarry\locale\en-US
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015s
+ * @filesource
+ */
+
+/*
+ * The alphabet for this locale
+ */
+var alpha = "abcdefghijklmnopqrstuvwxyz";
+
+/*
+ * Transliteration mapping for this locale
+ */
+var roman_array = {};
+
+/*
+ * To analyze the query and generate actual input query from the
+ * transliterated query
+ */
+function analyzeQuery()
+{
+}
diff --git a/locale/en_US/resources/suggest_trie.txt.gz b/locale/en_US/resources/suggest_trie.txt.gz
new file mode 100755
index 0000000..05e4153
Binary files /dev/null and b/locale/en_US/resources/suggest_trie.txt.gz differ
diff --git a/locale/en_US/statistics.txt b/locale/en_US/statistics.txt
new file mode 100755
index 0000000..5a165df
--- /dev/null
+++ b/locale/en_US/statistics.txt
@@ -0,0 +1 @@
+d:100;
\ No newline at end of file
diff --git a/locale/es/resources/Tokenizer.php b/locale/es/resources/Tokenizer.php
new file mode 100755
index 0000000..e01058a
--- /dev/null
+++ b/locale/es/resources/Tokenizer.php
@@ -0,0 +1,422 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\es\resources;
+
+use seekquarry\yioop\library as L;
+
+/**
+ * Spanish specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * This class has a collection of methods for Spanish locale specific
+ * tokenization. In particular, it has a stemmer, a stop word remover (for
+ * use mainly in word cloud creation). The stemmer is my stab at re-implementing
+ * the stemmer algorithm given at http://snowball.tartarus.org
+ * Here given a word, its stem is that part of the word that
+ * is common to all its inflected variants. For example,
+ * tall is common to tall, taller, tallest. A stemmer takes
+ * a word and tries to produce its stem.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\es
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = [];
+    /**
+     * Spanish vowels
+     * @var string
+     */
+    private static $vowel = 'aeiouáéíóúü';
+    /**
+     * Storage used in computing the stem
+     * @var string
+     */
+    private static $buffer;
+    /**
+     * $rv is approximately the string after the first vowel in the $word we
+     * want to stem
+     * @var string
+     */
+    private static $rv;
+    /**
+     * Position in $word to stem of $rv
+     * @var int
+     */
+    private static $rv_index;
+    /**
+     * $r1 is the region after the first non-vowel following a vowel, or the end
+     * of the word if there is no such non-vowel.
+     * @var string
+     */
+    private static $r1;
+    /**
+     * Position in $word to stem of $r1
+     * @var int
+     */
+    private static $r1_index;
+    /**
+     * $r2 is the region after the first non-vowel following a vowel in $r1, or
+     * the end of the word if there is no such non-vowel
+     * @var string
+     */
+    private static $r2;
+    /**
+     * Position in $word to stem of $r2
+     * @var int
+     */
+    private static $r2_index;
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = ["de", "la", "que", "el","en", "y", "a", "los",
+            "del", "se", "las", "por", "un", "para", "con", "no", "una",
+            "su", "al", "lo", "como", "más", "pero", "sus", "le", "ya", "o",
+            "este", "sí", "porque", "esta", "entre", "cuando", "muy", "sin",
+            "sobre", "también", "me", "hasta",
+            "hay", "donde", "quien", "desde",
+            "todo", "nos", "durante", "todos", "uno", "les", "ni", "contra",
+            "otros", "ese", "eso", "ante", "ellos", "e", "esto", "mí", "antes",
+            "algunos", "qué", "unos", "yo", "otro", "otras", "otra", "él",
+            "tanto", "esa", "estos", "mucho", "quienes", "nada", "muchos",
+            "cual", "poco", "ella", "estar", "estas", "algunas", "algo",
+            "nosotros", "mi", "mis", "tú", "te", "ti", "tu", "tus", "ellas",
+            "nosotras", "vosotros", "vosotras", "os", "mío", "mía", "míos",
+            "mías", "tuyo", "tuya", "tuyos", "tuyas", "suyo", "suya", "suyos",
+            "suyas", "nuestro", "nuestra", "nuestros", "nuestras", "vuestro",
+            "vuestra", "vuestros", "vuestras", "esos", "esas", "estoy",
+            "estás", "está", "estamos", "estáis",
+            "están", "esté", "estés",
+            "estemos", "estéis", "estén", "estaré", "estarás", "estará",
+            "estaremos", "estaréis", "estarán", "estaría", "estarías",
+            "estaríamos", "estaríais", "estarían", "estaba", "estabas",
+            "estábamos", "estabais", "estaban", "estuve", "estuviste",
+            "estuvo", "estuvimos", "estuvisteis", "estuvieron", "estuviera",
+            "estuvieras", "estuviéramos", "estuvierais", "estuvieran",
+            "estuviese", "estuvieses", "estuviésemos", "estuvieseis",
+            "estuviesen", "estando", "estado", "estada", "estados", "estadas",
+            "estad", "he", "has", "ha", "hemos", "habéis", "han", "haya",
+            "hayas", "hayamos", "hayáis", "hayan",
+            "habré", "habrás", "habrá",
+            "habremos", "habréis", "habrán",
+            "habría", "habrías", "habríamos",
+            "habríais", "habrían", "había",
+            "habías", "habíamos", "habíais", 'http', 'https',
+            "habían", "hube", "hubiste", "hubo", "hubimos", "hubisteis",
+            "hubieron", "hubiera", "hubieras", "hubiéramos", "hubierais",
+            "hubieran", "hubiese", "hubieses", "hubiésemos", "hubieseis",
+            "hubiesen", "habiendo", "habido", "habida", "habidos", "habidas",
+            "soy", "eres", "es", "somos", "sois", "son", "sea", "seas",
+            "seamos", "seáis", "sean", "seré", "serás", "será", "seremos",
+            "seréis", "serán", "sería", "serías", "seríamos", "seríais",
+            "serían", "era", "eras", "éramos",
+            "erais", "eran", "fui", "fuiste",
+            "fue", "fuimos", "fuisteis", "fueron", "fuera", "fueras",
+            "fuéramos", "fuerais", "fueran", "fuese", "fueses", "fuésemos",
+            "fueseis", "fuesen", "siendo", "sido", "sed", "tengo", "tienes",
+            "tiene", "tenemos", "tenéis", "tienen", "tenga", "tengas",
+            "tengamos", "tengáis", "tengan", "tendré", "tendrás", "tendrá",
+            "tendremos", "tendréis", "tendrán", "tendría", "tendrías",
+            "tendríamos", "tendríais", "tendrían", "tenía", "tenías",
+            "teníamos", "teníais", "tenían", "tuve", "tuviste", "tuvo",
+            "tuvimos", "tuvisteis", "tuvieron", "tuviera", "tuvieras",
+            "tuviéramos", "tuvierais", "tuvieran", "tuviese", "tuvieses",
+            "tuviésemos", "tuvieseis", "tuviesen", "teniendo", "tenido",
+            "tenida", "tenidos", "tenidas", "tened"];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/', '',
+            mb_strtolower($page));
+        return $page;
+    }
+    /**
+     * Computes the stem of a French word
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $words
+     */
+    public static function stem($word)
+    {
+        if (in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+        self::$buffer = mb_strtolower($word, "UTF-8");
+        self::computeRegions();
+        self::step0(); // attached pronoun
+        $before_step1 = self::$buffer;
+        self::step1(); //suffix removal
+        if ($before_step1 == self::$buffer) {
+            self::step2a(); //verb suffixes beginning with y
+            if ($before_step1 == self::$buffer) {
+                self::step2b(); //other verb suffixes
+            }
+        }
+        self::step3();
+        self::removeAccents();
+        return self::$buffer;
+    }
+    /**
+     * This computes the three regions of the word rv, r1, and r2 used in the
+     * rest of the stemmer
+     * $rv is defined as follows: If the second letter is a consonant,
+     *   $rv is the region after the next following vowel, or if the first two
+     *   letters are vowels, RV is the region after the next consonant,
+     *   and otherwise (consonant-vowel case) RV is the region after the third
+     *   letter. But RV is the end of the word if these positions cannot be
+     *   found.
+     * $r1 is the region after the first non-vowel following a vowel, or the end
+     * of the word if there is no such non-vowel.
+     * $r2 is the region after the first non-vowel following a vowel in $r1, or
+     * the end of the word if there is no such non-vowel
+     */
+    private static function computeRegions()
+    {
+        $word = self::$buffer;
+        $vowel = static::$vowel;
+        self::$rv_index = -1;
+        $start_letters = mb_substr($word, 0, 2, 'UTF-8');
+        $second_letter = mb_substr($word, 1, 1, 'UTF-8');
+        $len_start = strlen($start_letters);
+        if (($loc = L\preg_search("/[^$vowel]/u", $second_letter)) != -1) {
+            self::$rv_index = L\preg_search("/[$vowel]/", $word, $len_start);
+        } else if (($loc = L\preg_search("/^[$vowel]{2}/u", $word)) != -1) {
+            $tmp = strlen(mb_substr($word, 0, 2));
+            $loc += $tmp;
+            self::$rv_index = max(L\preg_search("/[^$vowel]/u", $word, $loc),
+                $tmp);
+        } else {
+            if (strlen($word) >= 3) {
+                self::$rv_index = strlen(mb_substr($word, 0, 2, "UTF-8"));
+            }
+        }
+        preg_match("/[$vowel][^$vowel]/u", $word, $matches,
+            PREG_OFFSET_CAPTURE);
+        self::$r1 = "";
+        $len = strlen($word);
+        self::$r1_index = isset($matches[0][1]) ? $matches[0][1] +
+            strlen(mb_substr($word,$matches[0][1], 2, 'UTF-8')) : $len;
+        if (self::$r1_index != $len) {
+            self::$r1 = substr($word, self::$r1_index);
+        }
+        if (self::$r1_index != $len) {
+            preg_match("/[$vowel][^$vowel]/u", self::$r1, $matches,
+                PREG_OFFSET_CAPTURE);
+            self::$r2_index = isset($matches[0][1]) ? $matches[0][1] +
+                strlen(mb_substr(self::$r1, $matches[0][1], 2, 'UTF-8')) : $len;
+            if (self::$r2_index != $len) {
+                self::$r2 = substr(self::$r1, self::$r2_index);
+                self::$r2_index += self::$r1_index;
+            }
+        }
+        if (self::$r1_index != $len && self::$r1_index < 3) {
+            self::$r1_index = 3;
+            self::$r1 = substr($word, 3);
+        }
+    }
+    /**
+     * Remove attached pronouns
+     */
+    private static function step0()
+    {
+        $word = self::$buffer;
+        $rv_index = self::$rv_index;
+        $first_char_len = max(strlen(mb_substr(substr($word, $rv_index), 0, 1,
+            "UTF-8")), 1);
+        $end_pattern =
+            '(me|se|sela|selo|selas|selos|la|le|lo|las|les|los|nos)$/u';
+        $start = "/(iéndo|ándo|ár|ér|ír)";
+        $new_word = L\preg_offset_replace($start . $end_pattern, '$1', $word,
+            $rv_index + $first_char_len);
+        if ($new_word != $word) {
+            $word = preg_replace(array('/iéndo$/u', '/ándo$/u', '/ár$/u',
+                '/ér$/u', '/ír$/u'), ['iendo', 'ando', 'ar', 'er', 'ir'],
+                $new_word);
+        } else {
+            $start = "/(iendo|ando|ar|er|ir)";
+            $word = L\preg_offset_replace($start . $end_pattern, '$1',
+                $word, $rv_index + $first_char_len);
+            $start = "/uyendo";
+            $word = L\preg_offset_replace($start . $end_pattern, '$1',
+                $word, $rv_index + $first_char_len);
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Standard suffix removal
+     */
+    private static function step1()
+    {
+        $word = self::$buffer;
+        $rv_index = self::$rv_index;
+        $r1_index = self::$r1_index;
+        $r2_index = self::$r2_index;
+        $r2_char_len = strlen(mb_substr($word, $r2_index, 1, "UTF-8"));
+        $r1_char_len = strlen(mb_substr($word, $r1_index, 1, "UTF-8"));
+        if (L\preg_search('/amente$/u', $word, $r2_index + $r2_char_len) != -1){
+            $word = L\preg_offset_replace('/((((at)?iv)?)|'.
+                '(oc|ic|ad)?)amente$/u', '', $word, $r1_index + $r1_char_len);
+            if ($word == self::$buffer) {
+                $word = preg_replace('/amente$/u', '', $word);
+            }
+        } else if (L\preg_search('/amente$/u', $word, $r1_index) != -1) {
+            $word = preg_replace('/amente$/u', '', $word);
+        } else {
+            $word = L\preg_offset_replace('/logía(s)?$/u', 'log', $word,
+                $r2_index);
+            $word = L\preg_offset_replace('/(ución|uciones)$/u', 'u', $word,
+                $r2_index);
+            $word = L\preg_offset_replace('/(encia|encias)$/u', 'ente', $word,
+                $r2_index);
+            if ($word == self::$buffer) {
+                $patterns = [
+                    '/(anza|anzas|ico|ica|icos|icas|ismo|ismos|able|'.
+                    'ables|ible|ibles|ista|istas|oso|osa|osos|osas|amiento|'.
+                    'amientos|imiento|imientos)$/u',
+                    '/(ic)?(adora|ador|ación|adoras|'.
+                    'adores|aciones|ante|antes|'.
+                    'ancia|ancias)$/u',
+                    '/(ante|able|ible)?mente$/u',
+                    '/(abil|ic|iv)?(idad|idades)$/u',
+                    '/(at)?(iva|ivo|ivas|ivos)$/u'
+                ];
+                $original = $word;
+                foreach ($patterns as $pattern) {
+                    $word = L\preg_offset_replace($pattern, '', $word, $r2_index);
+                    if ($word != $original) {break; }
+                }
+            }
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Stem verb suffixes beginning y
+     */
+    private static function step2a()
+    {
+        $word = self::$buffer;
+        $rv_index = self::$rv_index;
+        if (L\preg_search(
+            '/u(ya|ye|yan|yen|yeron|yendo|yo|yó|yas|yes|yais|yamos)$/u', $word,
+            $rv_index) != -1) {
+            self::$buffer = preg_replace(
+                '/(ya|ye|yan|yen|yeron|yendo|yo|yó|yas|yes|yais|yamos)$/u', '',
+                $word);
+        }
+    }
+    /**
+     * Stem other verb suffixes
+     */
+    private static function step2b()
+    {
+        $word = self::$buffer;
+        $rv_index = self::$rv_index;
+        $first_char_len = max(strlen(mb_substr(substr($word, $rv_index), 0, 1,
+            "UTF-8")), 1);
+        $pattern = '/(aríamos|eríamos|iríamos|'.
+        'iéramos|iésemos|aremos|áramos|' .
+            'ábamos|ásemos|eremos|iremos|aríais|' .
+            'asteis|eríais|arían|arías|' .
+            'erían|erías|ierais|ieseis|isteis|' .
+            'iríais|irían|irías|aseis|aréis|'.
+            'abais|arais|eréis|íamos|iendo|ieran|' .
+            'ieras|ieses|iréis|ieron|iesen' .
+            '|aban|abas|adas|ados|amos|ando|aran|' .
+            'arán|aras|arás|aron|asen|ases' .
+            '|erán|irán|erás|irás|iese|' .
+            '(er|ar|ir)?ía|aste|íais|idas|idos|imos'.
+            '|iste|iera|áis|ará|aré|erá|eré|ías|' .
+            'irá|iré|aba|ada|ado|ara|ase'.
+            '|(í)?an|ida|ido|ad|ed|id|ió|ar|er|ir|as|ís)$/u';
+        if (L\preg_search($pattern, $word, $rv_index + $first_char_len) != -1 ){
+            $word = L\preg_offset_replace($pattern, '', $word, $rv_index +
+                $first_char_len);
+        } else if (L\preg_search('/gu(en|es|éis|emos)$/u', $word, $rv_index -
+            $first_char_len)
+            != -1) {
+            $word = preg_replace('/u(en|es|éis|emos)$/u', '', $word);
+        } else if (L\preg_search('/(en|es|éis|emos)$/u', $word, $rv_index +
+            $first_char_len)  != -1){
+            $word = preg_replace('/(en|es|éis|emos)$/u', '', $word);
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Delete residual suffixes
+     */
+    private static function step3()
+    {
+        $word = self::$buffer;
+        $rv_index = self::$rv_index;
+        $first_char_len = max(strlen(mb_substr(substr($word, $rv_index), 0, 1,
+            "UTF-8")), 1);
+        if (L\preg_search('/(os|a|o|á|í|ó)$/u', $word, $rv_index
+            + $first_char_len) != -1) {
+            $word = L\preg_offset_replace('/(os|a|o|á|í|ó)$/u', '', $word,
+                $rv_index + $first_char_len);
+        } else if (($loc = L\preg_search('/gu(e|é)$/u', $word)) != -1 &&
+            $loc >= $rv_index - 1) {
+            $word = preg_replace('/u(e|é)$/u', '', $word);
+        } else if (($loc = L\preg_search('/(e|é)$/u', $word, $rv_index +
+            $first_char_len)) !=-1){
+            $word = preg_replace('/(e|é)$/u', '', $word);
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Un-accent end
+     */
+    private static function removeAccents()
+    {
+        $vowel = static::$vowel;
+        self::$buffer = preg_replace(array('/á/u', '/é/u',
+            '/í/u', '/ó/u', '/ú/u'), ['a','e','i', 'o','u'],
+            self::$buffer);
+    }
+}
diff --git a/locale/fa/resources/Tokenizer.php b/locale/fa/resources/Tokenizer.php
new file mode 100755
index 0000000..bc820c9
--- /dev/null
+++ b/locale/fa/resources/Tokenizer.php
@@ -0,0 +1,233 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\fa\resources;
+
+/**
+ * Persian specific tokenization code. In particular, it has a stemmer,
+ * The stemmer is my stab at porting Nick Patch's Perl port,
+ * https://metacpan.org/pod/Lingua::Stem::UniNE::FA, of the
+ * stemming algorithm by Ljiljana Dolamic and Jacques
+ * Savoy of the University of Neuchâtel. The Java version of this is at
+ * http://members.unine.ch/jacques.savoy/clef/persianStemmerUnicode.txt
+ * (beware of Java's handling of Unicode).
+ * Here given a word, its stem is that part of the word that
+ * is common to all its inflected variants. For example,
+ * tall is common to tall, taller, tallest. A stemmer takes
+ * a word and tries to produce its stem.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\fa
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = [];
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = [
+            "در", "به", "از", "كه", "مي", "اين", "است", "را", "با", "هاي",
+            "براي", "آن", "يك", "شود", "شده","خود", "ها", "كرد", "شد", "اي",
+            "تا", "كند", "بر", "بود", "گفت", "نيز", "وي", "هم", "كنند",
+            "دارد", "ما", "كرده", "يا", "اما", "بايد", "دو", "اند", "هر",
+            "خواهد", "او", "مورد", "آنها", "باشد", "ديگر", "مردم", "نمي",
+            "بين", "پيش", "پس", "اگر", "همه", "صورت", "يكي", "هستند",
+            "بي", "من", "دهد", "هزار", "نيست", "استفاده", "داد", "داشته",
+            "راه", "داشت", "چه", "همچنين", "كردند", "داده", "بوده",
+            "دارند", "همين", "ميليون", "سوي", "شوند", "بيشتر", "بسيار",
+            "روي", "گرفته", "هايي", "تواند", "اول", "نام", "هيچ", "چند",
+            "جديد", "بيش", "شدن", "كردن", "كنيم", "نشان", "حتي", "اينكه",
+            "ولی", "توسط", "چنين", "برخي", "نه", "ديروز", "دوم",
+            "درباره", "بعد", "مختلف", "گيرد", "شما", "گفته", "آنان",
+            "بار", "طور", "گرفت", "دهند", "گذاري", "بسياري", "طي",
+            "بودند", "ميليارد", "بدون", "تمام", "كل", "تر",
+            "براساس", "شدند", "ترين", "امروز", "باشند", "ندارد",
+            "چون", "قابل", "گويد", "ديگري", "همان", "خواهند",
+            "قبل", "آمده", "اكنون", "تحت", "طريق", "گيري", "جاي",
+            "هنوز", "چرا", "البته", "كنيد", "سازي", "سوم", "كنم",
+            "بلكه", "زير", "توانند", "ضمن", "فقط", "بودن", "حق",
+            "آيد", "وقتي", "اش", "يابد", "نخستين", "مقابل", "خدمات",
+            "امسال", "تاكنون", "مانند", "تازه", "آورد", "فكر",
+            "آنچه", "نخست", "نشده", "شايد", "چهار", "جريان",
+            "پنج", "ساخته", "زيرا", "نزديك", "برداري", "كسي",
+            "ريزي", "رفت", "گردد", "مثل", "آمد", "ام", "بهترين",
+            "دانست", "كمتر", "دادن", "تمامي", "جلوگيري",
+            "بيشتري", "ايم", "ناشي", "چيزي", "آنكه", "بالا",
+            "بنابراين", "ايشان", "بعضي", "دادند", "داشتند",
+            "برخوردار", "نخواهد", "هنگام", "نبايد", "غير", "نبود",
+            "ديده", "وگو", "داريم", "چگونه", "بندي", "خواست", "فوق", "ده",
+            "نوعي", "هستيم", "ديگران", "همچنان", "سراسر", "ندارند",
+            "گروهي", "سعي", "روزهاي", "آنجا", "يكديگر", "كردم",
+            "بيست", "بروز", "سپس", "رفته", "آورده", "نمايد",
+            "باشيم", "گويند", "زياد", "خويش", "همواره", "گذاشته",
+            "شش", "نداشته", "شناسي", "خواهيم", "آباد", "داشتن",
+            "نظير", "همچون", "باره", "نكرده", "شان", "سابق",
+            "هفت", "دانند", "جايي", "بی", "جز", "زیرِ", "رویِ",
+            "سریِ", "تویِ", "جلویِ", "پیشِ", "عقبِ", "بالایِ",
+            "خارجِ", "وسطِ", "بیرونِ", "سویِ", "کنارِ", "پاعینِ",
+            "نزدِ", "نزدیکِ","دنبالِ", "حدودِ", "برابرِ", "طبقِ",
+            "مانندِ", "ضدِّ", "هنگامِ", "برایِ", "مثلِ", "بارة",
+            "اثرِ", "تولِ", "علّتِ", "سمتِ", "عنوانِ", "قصدِ",
+            "روب", "جدا", "کی", "که", "چیست", "هست", "کجا", "کجاست",
+            "کَی", "چطور", "کدام", "آیا", "مگر", "چندین",
+            "یک", "چیزی", "دیگر", "کسی", "بعری", "هیچ", "چیز",
+            "جا", "کس", "هرگز", "یا", "تنها", "بلکه", "خیاه",
+            "بله", "بلی", "آره", "آری", "مرسی", "البتّه",
+            "لطفاً", "ّه", "انکه",
+            "وقتیکه", "همین", "پیش", "مدّتی", "هنگامی", "مان", "تان"
+            ];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/u', '',
+            mb_strtolower($page));
+        return $page;
+    }
+    /**
+     * Computes the stem of a Persian word
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $word
+     */
+    public static function stem($word)
+    {
+        if (in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+        $word = mb_strtolower($word);
+        $word = self::removeKasra($word);
+        $word = self::removeSuffix($word);
+        $word = self::removeKasra($word);
+        return $word;
+    }
+    /**
+     * Removes a Kasra diacritic mark if appears
+     * at the end of a word.
+     * @param string $word word to remove mark from
+     * @return string result of removal
+     */
+    private static function removeKasra($word)
+    {
+        if(mb_strlen($word) < 5) {
+            return $word;
+        }
+        $kasra = json_decode('"\u0650"');
+        $word = preg_replace('/'.$kasra.'$/u', "", $word);
+        return $word;
+    }
+    /**
+     * Removes common Persian suffixes
+     *
+     * @param string $word to remove suffixes from
+     * @return string result of suffix removal
+     */
+    private static function removeSuffix($word)
+    {
+        $length = mb_strlen($word);
+        if ($length > 7) {
+            $modified_word = preg_replace("/(?:
+                آباد | باره | بندی | بندي | ترین | ترين | ریزی |
+                ريزي | سازی | سازي | گیری | گيري | هایی | هايي
+                ) $/xu", "", $word);
+            if($modified_word != $word) {
+                return $modified_word;
+            }
+        }
+        if ($length > 6) {
+            $modified_word = preg_replace("/(?:
+                    اند | ایم | ايم | شان | های | هاي
+                ) $/xu", "", $word);
+            if($modified_word != $word) {
+                return $modified_word;
+            }
+        }
+        if ($length > 5) {
+            $modified_word = preg_replace("/ ان $/xu", "", $word);
+            if($modified_word != $word) {
+                return self::normalize($word);
+            }
+            $modified_word = preg_replace("/(?:
+                    ات | اش | ام | تر | را | ون | ها | هء | ین | ين
+                ) $/xu", "", $word);
+            if($modified_word != $word) {
+                return $modified_word;
+            }
+        }
+        if ($length > 3) {
+            $modified_word = preg_replace("/(?: ت | ش | م | ه | ی | ي ) $/xu",
+                "", $word);
+            if($modified_word != $word) {
+                return $modified_word;
+            }
+        }
+        return $word;
+    }
+    /**
+     * Performs additional end word stripping
+     *
+     * @param string $word to remove suffixes from
+     * @return string result of suffix removal
+     */
+    private static function normalize($word)
+    {
+        $length = mb_strlen($word);
+        if($length < 4) {
+            return $word;
+        }
+        $modified_word = preg_replace("/(?: ت | ر | ش | گ | م | ى ) $/xu", "",
+            $word);
+        if($modified_word != $word) {
+            $word = $modified_word;
+            if(mb_strlen($word) < 4) {
+                return $word;
+            }
+            $word = preg_replace("/(?: ی | ي ) $/xu", "", $word);
+        }
+        return $word;
+    }
+}
+
diff --git a/locale/fr_FR/configure.ini b/locale/fr_FR/configure.ini
new file mode 100755
index 0000000..9163f93
--- /dev/null
+++ b/locale/fr_FR/configure.ini
@@ -0,0 +1,4503 @@
+; ***** BEGIN LICENSE BLOCK *****
+;  SeekQuarry/Yioop Open Source Pure PHP Search Engine, Crawler, and Indexer
+;  Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+;
+;  This program is free software: you can redistribute it and/or modify
+;  it under the terms of the GNU General Public License as published by
+;  the Free Software Foundation, either version 3 of the License, or
+;  (at your option) any later version.
+;
+;  This program is distributed in the hope that it will be useful,
+;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;  GNU General Public License for more details.
+;
+;  You should have received a copy of the GNU General Public License
+;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;  ***** END LICENSE BLOCK *****
+;
+; configure.ini
+;
+; fr_FR configuration file
+;
+[general]
+;
+; Strings to translate on various pages
+;
+[strings]
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers
+;
+; AdminController.php line: 114
+admin_controller_need_cookies = ""
+;
+; AdminController.php line: 164
+admin_controller_account_not_active = ""
+;
+; AdminController.php line: 170
+admin_controller_login_successful = "D&eacute;connexion r&eacute;ussie!"
+;
+; AdminController.php line: 189
+admin_controller_no_back_button = ""
+;
+; AdminController.php line: 203
+admin_controller_login_failed = ""
+;
+; AdminController.php line: 209
+admin_controller_login_to_config = ""
+;
+; AdminController.php line: 213
+admin_controller_status_updates_stopped = ""
+;
+; AdminController.php line: 367
+admin_controller_account_access = ""
+;
+; AdminController.php line: 368
+admin_controller_social = ""
+;
+; AdminController.php line: 369
+admin_controller_crawl_settings = ""
+;
+; AdminController.php line: 370
+admin_controller_system_settings = ""
+;
+; AdminController.php line: 371
+admin_controller_advertisement = ""
+;
+; AdminController.php line: 545
+admin_controller_equal = ""
+;
+; AdminController.php line: 546
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 547
+admin_controller_contains = ""
+;
+; AdminController.php line: 548
+admin_controller_begins_with = ""
+;
+; AdminController.php line: 549
+admin_controller_ends_with = ""
+;
+; AdminController.php line: 552
+admin_controller_equal = ""
+;
+; AdminController.php line: 553
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 556
+admin_controller_no_sort = ""
+;
+; AdminController.php line: 557
+admin_controller_sort_ascending = ""
+;
+; AdminController.php line: 558
+admin_controller_sort_descending = ""
+;
+; MachineController.php line: 193
+machine_controller_nolines = ""
+;
+; RegisterController.php line: 249
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 315
+register_controller_account_created = ""
+;
+; RegisterController.php line: 333
+register_controller_registration_email_sent = ""
+;
+; RegisterController.php line: 335
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 336
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 338
+register_controller_email_body = ""
+;
+; RegisterController.php line: 372
+register_controller_account_request_made = ""
+;
+; RegisterController.php line: 376
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 377
+register_controller_admin_activation_message = ""
+;
+; RegisterController.php line: 419
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 425
+register_controller_already_activated = ""
+;
+; RegisterController.php line: 432
+register_controller_account_activated = ""
+;
+; RegisterController.php line: 435
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 483
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 492
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 496
+register_controller_account_recover_email = ""
+;
+; RegisterController.php line: 500
+register_controller_recover_request = ""
+;
+; RegisterController.php line: 501
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 503
+register_controller_recover_body = ""
+;
+; RegisterController.php line: 537
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 549
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 562
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 569
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 573
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 579
+register_controller_password_changed = ""
+;
+; RegisterController.php line: 587
+register_controller_passwords_dont_match = ""
+;
+; RegisterController.php line: 601
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 605
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 732
+register_controller_invalid_url = ""
+;
+; RegisterController.php line: 736
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 749
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 759
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 786
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 800
+register_controller_suggest_full = ""
+;
+; RegisterController.php line: 804
+register_controller_url_submitted = ""
+;
+; RegisterController.php line: 1006
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 1012
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 1027
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 1038
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 1066
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 1069
+register_controller_check_email = ""
+;
+; RegisterController.php line: 1076
+register_controller_user_already_exists = ""
+;
+; SearchController.php line: 280
+search_controller_web = ""
+;
+; SearchController.php line: 341
+search_controller_logout_successful = ""
+;
+; SearchController.php line: 549
+search_controller_mix_info = ""
+;
+; SearchController.php line: 555
+search_controller_crawl_info = "L&#039;index: %s -- Taille: %s pages / %s urls"
+;
+; SearchController.php line: 591
+search_controller_search = "Afficher les r&eacute;sultats pour "
+;
+; SearchController.php line: 695
+search_controller_no_index_set = ""
+;
+; SearchController.php line: 698
+search_controller_no_index_set = ""
+;
+; SearchController.php line: 800
+search_controller_get_keyword_ads = ""
+;
+; SearchController.php line: 803
+search_controller_ad_keyword_description = ""
+;
+; SearchController.php line: 1382
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1391
+search_controller_no_archive_page = ""
+;
+; SearchController.php line: 1441
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1446
+search_controller_original_page = ""
+;
+; SearchController.php line: 1463
+search_controller_extracted_title = ""
+;
+; SearchController.php line: 1465
+search_controller_extracted_description = ""
+;
+; SearchController.php line: 1467
+search_controller_extracted_links = ""
+;
+; SearchController.php line: 1472
+search_controller_extracted_allow_paths = ""
+;
+; SearchController.php line: 1478
+search_controller_extracted_disallow_paths = ""
+;
+; SearchController.php line: 1484
+search_controller_crawl_delay = ""
+;
+; SearchController.php line: 1548
+search_controller_cache_comment = ""
+;
+; SearchController.php line: 1559
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1594
+search_controller_cached_version = ""
+;
+; SearchController.php line: 1689
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1707
+search_controller_header_summaries = ""
+;
+; SearchController.php line: 1821
+search_controller_history = ""
+;
+; SearchController.php line: 1991
+search_controller_all_cached = ""
+;
+; SearchController.php line: 2022
+search_controller_year = "Ann&eacute;e:"
+;
+; SearchController.php line: 2023
+search_controller_month = "Mois:"
+;
+; SettingsController.php line: 115
+settings_controller_crawl_mix = ""
+;
+; SettingsController.php line: 130
+settings_controller_settings_saved = "Configurations sauvegard&eacute;es"
+;
+; StaticController.php line: 68
+static_controller_logout_successful = ""
+;
+; StaticController.php line: 146
+static_controller_complete_title = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers/components
+;
+; AccountaccessComponent.php line: 155
+accountaccess_component_no_posts_yet = ""
+;
+; AccountaccessComponent.php line: 171
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 181
+accountaccess_component_passwords_dont_match = ""
+;
+; AccountaccessComponent.php line: 188
+accountaccess_component_invalid_password = ""
+;
+; AccountaccessComponent.php line: 230
+accountaccess_component_unknown_imagetype = ""
+;
+; AccountaccessComponent.php line: 235
+accountaccess_component_icon_too_big = ""
+;
+; AccountaccessComponent.php line: 244
+accountaccess_component_no_user_folder = ""
+;
+; AccountaccessComponent.php line: 253
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 294
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 295
+accountaccess_component_inactive_status = ""
+;
+; AccountaccessComponent.php line: 297
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 300
+accountaccess_component_request_join = ""
+;
+; AccountaccessComponent.php line: 301
+accountaccess_component_invited = ""
+;
+; AccountaccessComponent.php line: 302
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 304
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 352
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 357
+accountaccess_component_passwords_dont_match = ""
+;
+; AccountaccessComponent.php line: 361
+accountaccess_component_invalid_username = ""
+;
+; AccountaccessComponent.php line: 365
+accountaccess_component_user_exists = ""
+;
+; AccountaccessComponent.php line: 394
+accountaccess_component_user_added = ""
+;
+; AccountaccessComponent.php line: 403
+accountaccess_component_user_doesnt_exist = ""
+;
+; AccountaccessComponent.php line: 410
+accountaccess_component_cant_edit_public_user = ""
+;
+; AccountaccessComponent.php line: 452
+accountaccess_component_passwords_dont_match = ""
+;
+; AccountaccessComponent.php line: 458
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 464
+accountaccess_component_user_filter_group = ""
+;
+; AccountaccessComponent.php line: 468
+accountaccess_component_user_filter_role = ""
+;
+; AccountaccessComponent.php line: 479
+accountaccess_component_username_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 484
+accountaccess_component_cant_delete_builtin = ""
+;
+; AccountaccessComponent.php line: 489
+accountaccess_component_user_deleted = ""
+;
+; AccountaccessComponent.php line: 498
+accountaccess_component_username_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 503
+accountaccess_component_rolename_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 509
+accountaccess_component_rolename_already_added = ""
+;
+; AccountaccessComponent.php line: 515
+accountaccess_component_rolename_added = ""
+;
+; AccountaccessComponent.php line: 525
+accountaccess_component_username_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 530
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 536
+accountaccess_component_groupname_already_added = ""
+;
+; AccountaccessComponent.php line: 544
+accountaccess_component_groupname_added = ""
+;
+; AccountaccessComponent.php line: 554
+accountaccess_component_username_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 559
+accountaccess_component_rolename_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 568
+accountaccess_component_rolename_deleted = ""
+;
+; AccountaccessComponent.php line: 578
+accountaccess_component_username_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 583
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 592
+accountaccess_component_group_deleted = ""
+;
+; AccountaccessComponent.php line: 609
+accountaccess_component_username_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 615
+accountaccess_component_userstatus_updated = ""
+;
+; AccountaccessComponent.php line: 778
+accountaccess_component_select_activityname = ""
+;
+; AccountaccessComponent.php line: 803
+accountaccess_component_rolename_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 819
+accountaccess_component_activity_added = ""
+;
+; AccountaccessComponent.php line: 828
+accountaccess_component_rolename_exists = ""
+;
+; AccountaccessComponent.php line: 834
+accountaccess_component_rolename_added = ""
+;
+; AccountaccessComponent.php line: 838
+accountaccess_component_rolename_blank = ""
+;
+; AccountaccessComponent.php line: 847
+accountaccess_component_rolename_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 865
+accountaccess_component_activity_deleted = ""
+;
+; AccountaccessComponent.php line: 873
+accountaccess_component_rolename_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 878
+accountaccess_component_rolename_deleted = ""
+;
+; AccountaccessComponent.php line: 910
+accountaccess_component_role_updated = ""
+;
+; AdvertisementComponent.php line: 55
+advertisement_component_num_days = ""
+;
+; AdvertisementComponent.php line: 56
+advertisement_component_one_day = ""
+;
+; AdvertisementComponent.php line: 57
+advertisement_component_seven_days = ""
+;
+; AdvertisementComponent.php line: 58
+advertisement_component_thirty_days = ""
+;
+; AdvertisementComponent.php line: 59
+advertisement_component_ninety_days = ""
+;
+; AdvertisementComponent.php line: 60
+advertisement_component_one_eighty_days = ""
+;
+; AdvertisementComponent.php line: 69
+advertisement_component_month = ""
+;
+; AdvertisementComponent.php line: 76
+advertisement_component_year = ""
+;
+; AdvertisementComponent.php line: 100
+advertisement_component_fields_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 105
+advertisement_component_duration_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 110
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 157
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 163
+advertisement_component_bid_too_low = ""
+;
+; AdvertisementComponent.php line: 171
+advertisement_component_processing_error = ""
+;
+; AdvertisementComponent.php line: 178
+advertisement_component_ad_created = ""
+;
+; AdvertisementComponent.php line: 206
+advertisement_component_status_changed = ""
+;
+; AdvertisementComponent.php line: 252
+advertisement_component_ad_updated = ""
+;
+; CrawlComponent.php line: 92
+crawl_component_starting_new_crawl = ""
+;
+; CrawlComponent.php line: 107
+crawl_component_stop_crawl = ""
+;
+; CrawlComponent.php line: 135
+crawl_component_resume_crawl = ""
+;
+; CrawlComponent.php line: 143
+crawl_component_delete_crawl_success = ""
+;
+; CrawlComponent.php line: 147
+crawl_component_delete_crawl_fail = ""
+;
+; CrawlComponent.php line: 156
+crawl_component_set_index = ""
+;
+; CrawlComponent.php line: 188
+crawl_component_no_description = ""
+;
+; CrawlComponent.php line: 336
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 337
+crawl_component_use_defaults = ""
+;
+; CrawlComponent.php line: 340
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 344
+crawl_component_previous_crawl = ""
+;
+; CrawlComponent.php line: 415
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 429
+crawl_component_add_suggest = ""
+;
+; CrawlComponent.php line: 433
+crawl_component_no_new_suggests = ""
+;
+; CrawlComponent.php line: 479
+crawl_component_breadth_first = ""
+;
+; CrawlComponent.php line: 481
+crawl_component_page_importance = ""
+;
+; CrawlComponent.php line: 545
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 555
+crawl_component_urls_injected = ""
+;
+; CrawlComponent.php line: 565
+crawl_component_update_seed_info = ""
+;
+; CrawlComponent.php line: 619
+crawl_component_new_classifier = ""
+;
+; CrawlComponent.php line: 623
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 646
+crawl_component_classifier_deleted = ""
+;
+; CrawlComponent.php line: 650
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 661
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 679
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 705
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 751
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 760
+crawl_component_load_failed = ""
+;
+; CrawlComponent.php line: 762
+crawl_component_loading = ""
+;
+; CrawlComponent.php line: 764
+crawl_component_added_examples = ""
+;
+; CrawlComponent.php line: 766
+crawl_component_label_update_failed = ""
+;
+; CrawlComponent.php line: 768
+crawl_component_updating = ""
+;
+; CrawlComponent.php line: 770
+crawl_component_acc_update_failed = ""
+;
+; CrawlComponent.php line: 772
+crawl_component_na = ""
+;
+; CrawlComponent.php line: 774
+crawl_component_no_docs = ""
+;
+; CrawlComponent.php line: 776
+crawl_component_num_docs = ""
+;
+; CrawlComponent.php line: 778
+crawl_component_in_class = ""
+;
+; CrawlComponent.php line: 780
+crawl_component_not_in_class = ""
+;
+; CrawlComponent.php line: 782
+crawl_component_skip = ""
+;
+; CrawlComponent.php line: 784
+crawl_component_prediction = ""
+;
+; CrawlComponent.php line: 786
+crawl_component_scores = ""
+;
+; CrawlComponent.php line: 823
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 824
+crawl_component_use_defaults = ""
+;
+; CrawlComponent.php line: 826
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 834
+crawl_component_recrawl_never = ""
+;
+; CrawlComponent.php line: 835
+crawl_component_recrawl_1day = ""
+;
+; CrawlComponent.php line: 836
+crawl_component_recrawl_2day = ""
+;
+; CrawlComponent.php line: 837
+crawl_component_recrawl_3day = ""
+;
+; CrawlComponent.php line: 838
+crawl_component_recrawl_7day = ""
+;
+; CrawlComponent.php line: 839
+crawl_component_recrawl_14day = ""
+;
+; CrawlComponent.php line: 847
+crawl_component_basic = ""
+;
+; CrawlComponent.php line: 848
+crawl_component_centroid = ""
+;
+; CrawlComponent.php line: 849
+crawl_component_graph_based = ""
+;
+; CrawlComponent.php line: 1137
+crawl_component_page_options_updated = ""
+;
+; CrawlComponent.php line: 1165
+crawl_component_page_options_running_tests = ""
+;
+; CrawlComponent.php line: 1346
+crawl_component_results_editor_update = ""
+;
+; CrawlComponent.php line: 1361
+crawl_component_edited_pages = ""
+;
+; CrawlComponent.php line: 1374
+crawl_component_results_editor_need_url = ""
+;
+; CrawlComponent.php line: 1380
+crawl_component_results_editor_page_updated = ""
+;
+; CrawlComponent.php line: 1393
+crawl_component_results_editor_page_loaded = ""
+;
+; CrawlComponent.php line: 1424
+crawl_component_media_kind = ""
+;
+; CrawlComponent.php line: 1425
+crawl_component_video = ""
+;
+; CrawlComponent.php line: 1426
+crawl_component_rss_feed = ""
+;
+; CrawlComponent.php line: 1427
+crawl_component_html_feed = ""
+;
+; CrawlComponent.php line: 1441
+crawl_component_sources_indexes = ""
+;
+; CrawlComponent.php line: 1496
+crawl_component_no_source_type = ""
+;
+; CrawlComponent.php line: 1510
+crawl_component_missing_type = ""
+;
+; CrawlComponent.php line: 1524
+crawl_component_invalid_url = ""
+;
+; CrawlComponent.php line: 1531
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1548
+crawl_component_media_source_added = ""
+;
+; CrawlComponent.php line: 1561
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1569
+crawl_component_subsearch_added = ""
+;
+; CrawlComponent.php line: 1575
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1581
+crawl_component_media_source_deleted = ""
+;
+; CrawlComponent.php line: 1588
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1595
+crawl_component_subsearch_deleted = ""
+;
+; CrawlComponent.php line: 1630
+crawl_component_subsearch_updated = ""
+;
+; CrawlComponent.php line: 1705
+crawl_component_media_source_updated = ""
+;
+; SocialComponent.php line: 92
+social_component_request_join = ""
+;
+; SocialComponent.php line: 93
+social_component_invited = ""
+;
+; SocialComponent.php line: 94
+social_component_active_status = ""
+;
+; SocialComponent.php line: 95
+social_component_suspended_status = ""
+;
+; SocialComponent.php line: 98
+social_component_no_join = ""
+;
+; SocialComponent.php line: 99
+social_component_by_request = ""
+;
+; SocialComponent.php line: 101
+social_component_public_request = ""
+;
+; SocialComponent.php line: 102
+social_component_public_join = ""
+;
+; SocialComponent.php line: 105
+social_component_private = ""
+;
+; SocialComponent.php line: 106
+social_component_read = ""
+;
+; SocialComponent.php line: 107
+social_component_read_comment = ""
+;
+; SocialComponent.php line: 108
+social_component_read_write = ""
+;
+; SocialComponent.php line: 109
+social_component_read_wiki = ""
+;
+; SocialComponent.php line: 112
+social_component_no_voting = ""
+;
+; SocialComponent.php line: 113
+social_component_up_voting = ""
+;
+; SocialComponent.php line: 114
+social_component_up_down_voting = ""
+;
+; SocialComponent.php line: 117
+social_component_forever = ""
+;
+; SocialComponent.php line: 118
+social_component_one_hour = ""
+;
+; SocialComponent.php line: 119
+social_component_one_day = ""
+;
+; SocialComponent.php line: 120
+social_component_one_month = ""
+;
+; SocialComponent.php line: 192
+accountaccess_component_user_activated = ""
+;
+; SocialComponent.php line: 197
+accountaccess_component_no_user_activated = ""
+;
+; SocialComponent.php line: 216
+social_component_joined = ""
+;
+; SocialComponent.php line: 220
+social_component_groupname_unavailable = ""
+;
+; SocialComponent.php line: 226
+social_component_name_available = ""
+;
+; SocialComponent.php line: 243
+social_component_user_banned = ""
+;
+; SocialComponent.php line: 248
+social_component_no_user_banned = ""
+;
+; SocialComponent.php line: 269
+social_component_owner_changed = ""
+;
+; SocialComponent.php line: 274
+social_component_not_in_group = ""
+;
+; SocialComponent.php line: 280
+social_component_not_a_user = ""
+;
+; SocialComponent.php line: 296
+social_component_groupname_exists = ""
+;
+; SocialComponent.php line: 320
+social_component_groupname_added = ""
+;
+; SocialComponent.php line: 329
+social_component_groupname_doesnt_exists = ""
+;
+; SocialComponent.php line: 336
+social_component_group_deleted = ""
+;
+; SocialComponent.php line: 339
+social_component_no_delete_group = ""
+;
+; SocialComponent.php line: 352
+social_component_user_deleted = ""
+;
+; SocialComponent.php line: 357
+social_component_no_delete_user_group = ""
+;
+; SocialComponent.php line: 406
+social_component_users_invited = ""
+;
+; SocialComponent.php line: 411
+social_component_no_users_invited = ""
+;
+; SocialComponent.php line: 427
+social_component_joined = ""
+;
+; SocialComponent.php line: 430
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 471
+social_component_user_reinstated = ""
+;
+; SocialComponent.php line: 476
+social_component_no_user_reinstated = ""
+;
+; SocialComponent.php line: 483
+social_component_request_join = ""
+;
+; SocialComponent.php line: 485
+social_component_invited = ""
+;
+; SocialComponent.php line: 487
+social_component_banned_status = ""
+;
+; SocialComponent.php line: 504
+social_component_unsubscribe = ""
+;
+; SocialComponent.php line: 508
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 556
+social_component_group_joined = ""
+;
+; SocialComponent.php line: 558
+social_component_group_request_join = ""
+;
+; SocialComponent.php line: 573
+social_component_activate_group = ""
+;
+; SocialComponent.php line: 580
+social_component_activate_body = ""
+;
+; SocialComponent.php line: 584
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 585
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 656
+social_component_no_permission = ""
+;
+; SocialComponent.php line: 669
+social_component_group_updated = ""
+;
+; SocialComponent.php line: 677
+social_component_unknown_access = ""
+;
+; SocialComponent.php line: 685
+social_component_group_filter_users = ""
+;
+; SocialComponent.php line: 776
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 780
+social_component_no_comment = ""
+;
+; SocialComponent.php line: 792
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 798
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 802
+social_component_join_group = ""
+;
+; SocialComponent.php line: 805
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 820
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 833
+social_component_thread_notification = ""
+;
+; SocialComponent.php line: 835
+social_component_notify_body = ""
+;
+; SocialComponent.php line: 838
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 839
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 841
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 848
+social_component_comment_added = ""
+;
+; SocialComponent.php line: 859
+social_component_groupname_cant_add = ""
+;
+; SocialComponent.php line: 865
+social_component_delete_error = ""
+;
+; SocialComponent.php line: 885
+social_component_item_deleted = ""
+;
+; SocialComponent.php line: 888
+social_component_no_item_deleted = ""
+;
+; SocialComponent.php line: 896
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 905
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 910
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 914
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 918
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 924
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 929
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 940
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 948
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 961
+social_component_new_thread_mail = ""
+;
+; SocialComponent.php line: 965
+social_component_new_thread_body = ""
+;
+; SocialComponent.php line: 969
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 970
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 975
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 983
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 991
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 995
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 1001
+social_component_post_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1009
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1022
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1031
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1034
+social_component_post_updated = ""
+;
+; SocialComponent.php line: 1041
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 1050
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 1055
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 1059
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 1063
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 1094
+social_component_join_group = ""
+;
+; SocialComponent.php line: 1097
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 1373
+accountaccess_component_no_posts_yet = ""
+;
+; SocialComponent.php line: 1416
+social_component_search = ""
+;
+; SocialComponent.php line: 1503
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1506
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1530
+social_component_standard_page = ""
+;
+; SocialComponent.php line: 1531
+social_component_page_alias = ""
+;
+; SocialComponent.php line: 1532
+social_component_media_list = ""
+;
+; SocialComponent.php line: 1533
+social_component_presentation = ""
+;
+; SocialComponent.php line: 1536
+social_component_solid = ""
+;
+; SocialComponent.php line: 1537
+social_component_dashed = ""
+;
+; SocialComponent.php line: 1538
+social_component_none = ""
+;
+; SocialComponent.php line: 1577
+social_component_missing_fields = ""
+;
+; SocialComponent.php line: 1583
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1633
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1634
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1639
+social_component_page_saved = ""
+;
+; SocialComponent.php line: 1651
+social_component_resource_deleted = ""
+;
+; SocialComponent.php line: 1656
+social_component_resource_not_deleted = ""
+;
+; SocialComponent.php line: 1673
+social_component_resource_renamed = ""
+;
+; SocialComponent.php line: 1678
+social_component_resource_not_renamed = ""
+;
+; SocialComponent.php line: 1688
+social_component_resource_save_first = ""
+;
+; SocialComponent.php line: 1700
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1702
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1706
+social_component_resource_uploaded = ""
+;
+; SocialComponent.php line: 1711
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1758
+social_component_back = ""
+;
+; SocialComponent.php line: 1759
+social_component_history_page = ""
+;
+; SocialComponent.php line: 1794
+social_component_back = ""
+;
+; SocialComponent.php line: 1795
+social_component_diff_page = ""
+;
+; SocialComponent.php line: 1809
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1817
+social_component_page_revert_to = ""
+;
+; SocialComponent.php line: 1821
+social_component_page_reverted = ""
+;
+; SocialComponent.php line: 1825
+social_component_revert_error = ""
+;
+; SocialComponent.php line: 1896
+social_component_main = ""
+;
+; SocialComponent.php line: 2142
+wiki_js_small = ""
+;
+; SocialComponent.php line: 2143
+wiki_js_medium = ""
+;
+; SocialComponent.php line: 2144
+wiki_js_large = ""
+;
+; SocialComponent.php line: 2145
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2146
+wiki_js_prompt_heading = ""
+;
+; SocialComponent.php line: 2147
+wiki_js_example = ""
+;
+; SocialComponent.php line: 2148
+wiki_js_table_title = ""
+;
+; SocialComponent.php line: 2149
+wiki_js_submit = ""
+;
+; SocialComponent.php line: 2150
+wiki_js_cancel = ""
+;
+; SocialComponent.php line: 2151
+wiki_js_bold = ""
+;
+; SocialComponent.php line: 2152
+wiki_js_italic = ""
+;
+; SocialComponent.php line: 2153
+wiki_js_underline = ""
+;
+; SocialComponent.php line: 2154
+wiki_js_strike = ""
+;
+; SocialComponent.php line: 2155
+wiki_js_heading = ""
+;
+; SocialComponent.php line: 2156
+wiki_js_heading1 = ""
+;
+; SocialComponent.php line: 2157
+wiki_js_heading2 = ""
+;
+; SocialComponent.php line: 2158
+wiki_js_heading3 = ""
+;
+; SocialComponent.php line: 2159
+wiki_js_heading4 = ""
+;
+; SocialComponent.php line: 2160
+wiki_js_bullet = ""
+;
+; SocialComponent.php line: 2161
+wiki_js_enum = ""
+;
+; SocialComponent.php line: 2162
+wiki_js_nowiki = ""
+;
+; SocialComponent.php line: 2163
+wiki_js_add_search = ""
+;
+; SocialComponent.php line: 2164
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2165
+wiki_js_add_wiki_table = ""
+;
+; SocialComponent.php line: 2166
+wiki_js_for_table_cols = ""
+;
+; SocialComponent.php line: 2167
+wiki_js_for_table_rows = ""
+;
+; SocialComponent.php line: 2168
+wiki_js_add_hyperlink = ""
+;
+; SocialComponent.php line: 2169
+wiki_js_link_text = ""
+;
+; SocialComponent.php line: 2170
+wiki_js_link_url = ""
+;
+; SocialComponent.php line: 2171
+wiki_js_placeholder = ""
+;
+; SocialComponent.php line: 2172
+wiki_js_centeraligned = ""
+;
+; SocialComponent.php line: 2173
+wiki_js_rightaligned = ""
+;
+; SocialComponent.php line: 2174
+wiki_js_leftaligned = ""
+;
+; SocialComponent.php line: 2176
+wiki_js_definitionlist_item = ""
+;
+; SocialComponent.php line: 2178
+wiki_js_definitionlist_definition = ""
+;
+; SocialComponent.php line: 2180
+wiki_js_slide_sample_title = ""
+;
+; SocialComponent.php line: 2182
+wiki_js_slide_sample_bullet = ""
+;
+; SocialComponent.php line: 2184
+wiki_js_slide_resource_description = ""
+;
+; SocialComponent.php line: 2222
+social_component_select_crawl = ""
+;
+; SocialComponent.php line: 2223
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2225
+social_component_select_crawl = ""
+;
+; SocialComponent.php line: 2227
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2257
+social_component_mix_created = ""
+;
+; SocialComponent.php line: 2260
+social_component_invalid_name = ""
+;
+; SocialComponent.php line: 2268
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2272
+social_component_mix_deleted = ""
+;
+; SocialComponent.php line: 2291
+social_component_mix_doesnt_exists = ""
+;
+; SocialComponent.php line: 2299
+social_component_mix_imported = ""
+;
+; SocialComponent.php line: 2313
+social_component_set_index = ""
+;
+; SocialComponent.php line: 2322
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 2328
+social_component_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2346
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 2350
+social_component_share_title = ""
+;
+; SocialComponent.php line: 2352
+social_component_share_description = ""
+;
+; SocialComponent.php line: 2357
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 2408
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2413
+social_component_mix_not_owner = ""
+;
+; SocialComponent.php line: 2423
+social_component_add_crawls = ""
+;
+; SocialComponent.php line: 2425
+social_component_num_results = ""
+;
+; SocialComponent.php line: 2427
+social_component_del_frag = ""
+;
+; SocialComponent.php line: 2429
+social_component_weight = ""
+;
+; SocialComponent.php line: 2430
+social_component_name = ""
+;
+; SocialComponent.php line: 2432
+social_component_add_keywords = ""
+;
+; SocialComponent.php line: 2434
+social_component_actions = ""
+;
+; SocialComponent.php line: 2436
+social_component_add_query = ""
+;
+; SocialComponent.php line: 2437
+social_component_delete = ""
+;
+; SocialComponent.php line: 2487
+social_component_too_many_fragments = ""
+;
+; SocialComponent.php line: 2498
+social_component_mix_saved = ""
+;
+; SystemComponent.php line: 82
+system_component_select_machine = ""
+;
+; SystemComponent.php line: 143
+system_component_machine_added = ""
+;
+; SystemComponent.php line: 147
+system_component_machine_exists = ""
+;
+; SystemComponent.php line: 151
+system_component_machine_incomplete = ""
+;
+; SystemComponent.php line: 158
+system_component_machine_doesnt_exists = ""
+;
+; SystemComponent.php line: 179
+system_component_stop_service_first = ""
+;
+; SystemComponent.php line: 185
+system_component_machine_deleted = ""
+;
+; SystemComponent.php line: 200
+system_component_updatemode_toggled = ""
+;
+; SystemComponent.php line: 246
+system_component_no_machine_log = ""
+;
+; SystemComponent.php line: 270
+system_component_machine_servers_updated = ""
+;
+; SystemComponent.php line: 274
+system_component_machine_no_action = ""
+;
+; SystemComponent.php line: 310
+system_component_select_mode = ""
+;
+; SystemComponent.php line: 351
+system_component_locale_missing_info = ""
+;
+; SystemComponent.php line: 358
+system_component_locale_added = ""
+;
+; SystemComponent.php line: 365
+system_component_localename_doesnt_exists = ""
+;
+; SystemComponent.php line: 370
+system_component_localename_deleted = ""
+;
+; SystemComponent.php line: 376
+system_component_localename_doesnt_exists = ""
+;
+; SystemComponent.php line: 405
+system_component_locale_updated = ""
+;
+; SystemComponent.php line: 435
+system_component_localestrings_updated = ""
+;
+; SystemComponent.php line: 446
+system_component_all_strings = ""
+;
+; SystemComponent.php line: 447
+system_component_missing_strings = ""
+;
+; SystemComponent.php line: 566
+system_component_configure_no_change_db = ""
+;
+; SystemComponent.php line: 571
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 574
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 607
+system_component_configure_disable_registration = ""
+;
+; SystemComponent.php line: 609
+system_component_configure_no_activation = ""
+;
+; SystemComponent.php line: 611
+system_component_configure_email_activation = ""
+;
+; SystemComponent.php line: 613
+system_component_configure_admin_activation = ""
+;
+; SystemComponent.php line: 617
+system_component_configure_no_advertisements = ""
+;
+; SystemComponent.php line: 619
+system_component_configure_keyword_advertisements = ""
+;
+; SystemComponent.php line: 621
+system_component_configure_external_advertisements = ""
+;
+; SystemComponent.php line: 704
+captchasettings_element_text_captcha = ""
+;
+; SystemComponent.php line: 706
+captchasettings_element_hash_captcha = ""
+;
+; SystemComponent.php line: 708
+captchasettings_element_image_captcha = ""
+;
+; SystemComponent.php line: 713
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 715
+serversettings_element_zkp_authentication = ""
+;
+; SystemComponent.php line: 720
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 744
+system_component_settings_updated = ""
+;
+; SystemComponent.php line: 747
+system_component_no_update_settings = ""
+;
+; SystemComponent.php line: 788
+system_component_no_resource_folder = ""
+;
+; SystemComponent.php line: 802
+system_component_invalid_filetype = ""
+;
+; SystemComponent.php line: 807
+system_component_file_too_big = ""
+;
+; SystemComponent.php line: 822
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 826
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 875
+system_component_configure_reset_completed = ""
+;
+; SystemComponent.php line: 878
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 957
+system_component_configure_use_absolute_path = ""
+;
+; SystemComponent.php line: 962
+system_component_configure_configure_diff_base_dir = ""
+;
+; SystemComponent.php line: 993
+system_component_configure_work_dir_set = ""
+;
+; SystemComponent.php line: 1004
+system_component_name_your_bot = ""
+;
+; SystemComponent.php line: 1029
+system_component_configure_work_profile_made = ""
+;
+; SystemComponent.php line: 1033
+system_component_configure_no_set_config = ""
+;
+; SystemComponent.php line: 1040
+system_component_configure_no_create_profile = ""
+;
+; SystemComponent.php line: 1047
+system_component_configure_work_dir_invalid = ""
+;
+; SystemComponent.php line: 1054
+system_component_configure_work_dir_invalid = ""
+;
+; SystemComponent.php line: 1083
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 1087
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 1107
+system_component_describe_robot = ""
+;
+; SystemComponent.php line: 1161
+system_component_php_version = ""
+;
+; SystemComponent.php line: 1169
+system_component_no_write_config_php = ""
+;
+; SystemComponent.php line: 1174
+system_component_no_write_work_dir = ""
+;
+; SystemComponent.php line: 1179
+system_component_post_size_small = ""
+;
+; SystemComponent.php line: 1185
+system_component_missing_required = ""
+;
+; SystemComponent.php line: 1209
+system_component_missing_optional = ""
+;
+; SystemComponent.php line: 1215
+system_component_check_passed = ""
+;
+; SystemComponent.php line: 1220
+system_component_using_local_config = ""
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/controllers
+;
+; MainController.php line: 74
+search_controller_logout_successful = ""
+;
+; MainController.php line: 98
+main_controller_download = ""
+;
+; MainController.php line: 115
+main_controller_missing_fields = ""
+;
+; MainController.php line: 150
+main_controller_yioop_download = ""
+;
+; MainController.php line: 151
+main_controller_click_download = ""
+;
+; MainController.php line: 164
+main_controller_url_error = ""
+;
+; MainController.php line: 173
+main_controller_expired_url = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views
+;
+; AdminView.php line: 71
+admin_view_admin = "Administration"
+;
+; AdminView.php line: 92
+adminview_auto_logout_one_minute = ""
+;
+; CrawlstatusView.php line: 57
+crawlstatus_view_currently_processing = ""
+;
+; CrawlstatusView.php line: 58
+crawlstatus_view_description = ""
+;
+; CrawlstatusView.php line: 62
+crawlstatus_view_starting_crawl = ""
+;
+; CrawlstatusView.php line: 66
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 70
+crawlstatus_view_resuming_crawl = ""
+;
+; CrawlstatusView.php line: 74
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 78
+crawlstatus_view_shutdown_queue = ""
+;
+; CrawlstatusView.php line: 81
+crawlstatus_view_closing_dict = ""
+;
+; CrawlstatusView.php line: 84
+crawlstatus_view_run_plugins = ""
+;
+; CrawlstatusView.php line: 92
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 100
+crawlstatus_view_set_index = ""
+;
+; CrawlstatusView.php line: 103
+crawlstatus_view_search_index = ""
+;
+; CrawlstatusView.php line: 110
+crawlstatus_view_changeoptions = ""
+;
+; CrawlstatusView.php line: 112
+crawlstatus_view_no_description = ""
+;
+; CrawlstatusView.php line: 117
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 119
+crawlstatus_view_time_started = ""
+;
+; CrawlstatusView.php line: 125
+crawlstatus_view_indexer_memory = ""
+;
+; CrawlstatusView.php line: 127
+crawlstatus_view_scheduler_memory = ""
+;
+; CrawlstatusView.php line: 130
+crawlstatus_view_queue_memory = ""
+;
+; CrawlstatusView.php line: 135
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 139
+crawlstatus_view_fetcher_memory = ""
+;
+; CrawlstatusView.php line: 144
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 147
+crawlstatus_view_webapp_memory = ""
+;
+; CrawlstatusView.php line: 152
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 155
+crawlstatus_view_urls_per_hour = ""
+;
+; CrawlstatusView.php line: 163
+crawlstatus_view_visited_urls = ""
+;
+; CrawlstatusView.php line: 167
+crawlstatus_view_total_urls = ""
+;
+; CrawlstatusView.php line: 170
+crawlstatus_view_most_recent_fetcher = ""
+;
+; CrawlstatusView.php line: 179
+crawlstatus_view_no_fetcher = ""
+;
+; CrawlstatusView.php line: 183
+crawlstatus_view_most_recent_urls = ""
+;
+; CrawlstatusView.php line: 193
+crawlstatus_view_no_recent_urls = ""
+;
+; CrawlstatusView.php line: 196
+crawlstatus_view_previous_crawls = ""
+;
+; CrawlstatusView.php line: 207
+crawlstatus_view_description = ""
+;
+; CrawlstatusView.php line: 210
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 211
+crawlstatus_view_url_counts = ""
+;
+; CrawlstatusView.php line: 215
+crawlstatus_view_actions = ""
+;
+; CrawlstatusView.php line: 226
+crawlstatus_view_statistics = ""
+;
+; CrawlstatusView.php line: 242
+crawlstatus_view_resume = ""
+;
+; CrawlstatusView.php line: 244
+crawlstatus_view_no_resume = ""
+;
+; CrawlstatusView.php line: 251
+crawlstatus_view_set_index = ""
+;
+; CrawlstatusView.php line: 254
+crawlstatus_view_search_index = ""
+;
+; CrawlstatusView.php line: 261
+crawlstatus_view_delete = ""
+;
+; CrawlstatusView.php line: 269
+crawlstatus_view_no_previous_crawl = ""
+;
+; GroupView.php line: 82
+groupfeed_element_wiki_thread = ""
+;
+; GroupView.php line: 96
+group_view_feed = ""
+;
+; GroupView.php line: 104
+group_view_wiki = ""
+;
+; GroupView.php line: 106
+group_view_user = ""
+;
+; GroupView.php line: 109
+group_view_myfeeds = ""
+;
+; GroupView.php line: 145
+adminview_auto_logout_one_minute = ""
+;
+; MachinestatusView.php line: 56
+machinestatus_view_no_monitored = ""
+;
+; MachinestatusView.php line: 60
+machinestatus_media_updatemode = ""
+;
+; MachinestatusView.php line: 73
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 75
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 78
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 80
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 85
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 94
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 96
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 125
+confirm_delete_operation = ""
+;
+; MachinestatusView.php line: 126
+machinestatus_view_delete = ""
+;
+; MachinestatusView.php line: 148
+machinestatus_view_not_configured = ""
+;
+; MachinestatusView.php line: 158
+machinestatus_view_mirrors = ""
+;
+; MachinestatusView.php line: 161
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 176
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 179
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 191
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 193
+machinestatus_view_no_queue_server = ""
+;
+; MachinestatusView.php line: 204
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 207
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 229
+machinestatus_view_no_fetchers = ""
+;
+; MachinestatusView.php line: 241
+machinestatus_view_fetchers = ""
+;
+; MachinestatusView.php line: 248
+machinestatus_view_log = ""
+;
+; NocacheView.php line: 54
+nocache_view_no_cache = ""
+;
+; NocacheView.php line: 59
+nocache_view_summary_contents = ""
+;
+; RecoverView.php line: 71
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 104
+register_view_new_password = ""
+;
+; RecoverView.php line: 116
+register_view_retypepassword = ""
+;
+; RecoverView.php line: 131
+recover_view_username = ""
+;
+; RecoverView.php line: 146
+register_view_account_recovery = ""
+;
+; RecoverView.php line: 153
+register_view_human_check = ""
+;
+; RecoverView.php line: 185
+register_view_human_check = ""
+;
+; RecoverView.php line: 202
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 211
+recover_view_return = ""
+;
+; RegisterView.php line: 76
+register_view_question0_most = ""
+;
+; RegisterView.php line: 77
+register_view_question0_least = ""
+;
+; RegisterView.php line: 78
+register_view_question0_choices = ""
+;
+; RegisterView.php line: 79
+register_view_question1_most = ""
+;
+; RegisterView.php line: 80
+register_view_question1_least = ""
+;
+; RegisterView.php line: 81
+register_view_question1_choices = ""
+;
+; RegisterView.php line: 82
+register_view_question2_most = ""
+;
+; RegisterView.php line: 83
+register_view_question2_least = ""
+;
+; RegisterView.php line: 84
+register_view_question2_choices = ""
+;
+; RegisterView.php line: 85
+register_view_question3_most = ""
+;
+; RegisterView.php line: 86
+register_view_question3_least = ""
+;
+; RegisterView.php line: 87
+register_view_question3_choices = ""
+;
+; RegisterView.php line: 88
+register_view_question4_most = ""
+;
+; RegisterView.php line: 89
+register_view_question4_least = ""
+;
+; RegisterView.php line: 90
+register_view_question4_choices = ""
+;
+; RegisterView.php line: 91
+register_view_question5_most = ""
+;
+; RegisterView.php line: 92
+register_view_question5_least = ""
+;
+; RegisterView.php line: 93
+register_view_question5_choices = ""
+;
+; RegisterView.php line: 94
+register_view_question6_most = ""
+;
+; RegisterView.php line: 95
+register_view_question6_least = ""
+;
+; RegisterView.php line: 96
+register_view_question6_choices = ""
+;
+; RegisterView.php line: 97
+register_view_question7_most = ""
+;
+; RegisterView.php line: 98
+register_view_question7_least = ""
+;
+; RegisterView.php line: 99
+register_view_question7_choices = ""
+;
+; RegisterView.php line: 100
+register_view_question8_most = ""
+;
+; RegisterView.php line: 101
+register_view_question8_least = ""
+;
+; RegisterView.php line: 102
+register_view_question8_choices = ""
+;
+; RegisterView.php line: 103
+register_view_question9_most = ""
+;
+; RegisterView.php line: 104
+register_view_question9_least = ""
+;
+; RegisterView.php line: 105
+register_view_question9_choices = ""
+;
+; RegisterView.php line: 108
+register_view_recovery1_more = ""
+;
+; RegisterView.php line: 109
+register_view_recovery1_less = ""
+;
+; RegisterView.php line: 110
+register_view_recovery1_choices = ""
+;
+; RegisterView.php line: 111
+register_view_recovery2_more = ""
+;
+; RegisterView.php line: 112
+register_view_recovery2_less = ""
+;
+; RegisterView.php line: 113
+register_view_recovery2_choices = ""
+;
+; RegisterView.php line: 114
+register_view_recovery3_more = ""
+;
+; RegisterView.php line: 115
+register_view_recovery3_less = ""
+;
+; RegisterView.php line: 116
+register_view_recovery3_choices = ""
+;
+; RegisterView.php line: 117
+register_view_recovery4_more = ""
+;
+; RegisterView.php line: 118
+register_view_recovery4_less = ""
+;
+; RegisterView.php line: 119
+register_view_recovery4_choices = ""
+;
+; RegisterView.php line: 120
+register_view_recovery5_more = ""
+;
+; RegisterView.php line: 121
+register_view_recovery5_less = ""
+;
+; RegisterView.php line: 122
+register_view_recovery5_choices = ""
+;
+; RegisterView.php line: 123
+register_view_recovery6_more = ""
+;
+; RegisterView.php line: 124
+register_view_recovery6_less = ""
+;
+; RegisterView.php line: 125
+register_view_recovery6_choices = ""
+;
+; RegisterView.php line: 153
+register_view_create_account = ""
+;
+; RegisterView.php line: 190
+register_view_firstname = ""
+;
+; RegisterView.php line: 205
+register_view_lastname = ""
+;
+; RegisterView.php line: 219
+register_view_username = ""
+;
+; RegisterView.php line: 232
+register_view_email = ""
+;
+; RegisterView.php line: 246
+register_view_password = ""
+;
+; RegisterView.php line: 261
+register_view_retypepassword = ""
+;
+; RegisterView.php line: 277
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 281
+register_view_human_check = ""
+;
+; RegisterView.php line: 283
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 315
+register_view_human_check = ""
+;
+; RegisterView.php line: 329
+register_view_i_agree = ""
+;
+; RegisterView.php line: 331
+register_view_terms = ""
+;
+; RegisterView.php line: 333
+register_view_and = ""
+;
+; RegisterView.php line: 335
+register_view_privacy = ""
+;
+; RegisterView.php line: 336
+register_view_period = ""
+;
+; RegisterView.php line: 346
+register_view_create_account = ""
+;
+; RegisterView.php line: 355
+register_view_return = ""
+;
+; SearchView.php line: 92
+search_view_title = "Moteur de recherche PHP -Yioop!"
+;
+; SearchView.php line: 119
+search_view_input_label = "&Eacute;crivez les limites de recherche"
+;
+; SearchView.php line: 123
+search_view_input_placeholder = "Trouvez ce que vous cherchez"
+;
+; SearchView.php line: 126
+search_view_search = "Rechercher"
+;
+; SearchView.php line: 155
+search_view_no_index_set = ""
+;
+; SearchView.php line: 164
+search_view_more_statistics = "Plus de statistiques"
+;
+; SearchView.php line: 201
+search_view_calculated = "%s secondes."
+;
+; SearchView.php line: 203
+search_view_results = "Affichage de %s - %s sur %s r&eacute;sultats"
+;
+; SearchView.php line: 229
+search_view_thesaurus_results = ""
+;
+; SearchView.php line: 339
+search_view_word_cloud = ""
+;
+; SearchView.php line: 380
+search_view_cache = "En&nbsp;Cache"
+;
+; SearchView.php line: 382
+search_view_as_text = "Version&nbsp;texte"
+;
+; SearchView.php line: 393
+search_view_similar = "Pages&nbsp;similaires"
+;
+; SearchView.php line: 402
+search_view_inlink = "Liens retour"
+;
+; SearchView.php line: 419
+search_view_rank = "Rang: %s"
+;
+; SearchView.php line: 421
+search_view_relevancy = "Pertinence: %s"
+;
+; SearchView.php line: 423
+search_view_proximity = "Proximit&eacute;: %s"
+;
+; SearchView.php line: 427
+search_view_thesaurus_score = ""
+;
+; SearchView.php line: 436
+search_view_score = "Total: %s"
+;
+; SettingsView.php line: 66
+settings_view_settings = "Pr&eacute;f&eacute;rences"
+;
+; SettingsView.php line: 73
+settings_view_results_per_page = "R&eacute;sultats par page"
+;
+; SettingsView.php line: 79
+settings_view_open_in_tabs = "Ouvrez les r&eacute;sultats dans un nouvel onglet"
+;
+; SettingsView.php line: 86
+settings_view_search_index = "L&#039;index de recherche:"
+;
+; SettingsView.php line: 92
+settings_view_language_label = "Langage:"
+;
+; SettingsView.php line: 106
+settings_view_return = ""
+;
+; SettingsView.php line: 109
+settings_view_save = "Enregistrer les pr&eacute;f&eacute;rences"
+;
+; SettingsView.php line: 116
+settings_install_search_plugin = "Installez Yioop embrochable"
+;
+; SigninView.php line: 68
+signin_view_signin = "Connexion"
+;
+; SigninView.php line: 81
+sigin_view_signing_in = ""
+;
+; SigninView.php line: 84
+sigin_view_login_failed = ""
+;
+; SigninView.php line: 92
+signin_view_username = "Nom de l&#039;utilisateur:"
+;
+; SigninView.php line: 99
+signin_view_password = "Mot de passe"
+;
+; SigninView.php line: 109
+signin_view_login = "Se connecter"
+;
+; SigninView.php line: 124
+signin_view_recover_password = ""
+;
+; SigninView.php line: 129
+signin_view_create_account = ""
+;
+; SigninView.php line: 133
+signin_view_return = ""
+;
+; StaticView.php line: 68
+static_view_title = ""
+;
+; StatisticsView.php line: 75
+statistics_view_statistics = ""
+;
+; StatisticsView.php line: 80
+statistics_view_calculating = ""
+;
+; StatisticsView.php line: 94
+statistics_view_error_codes = ""
+;
+; StatisticsView.php line: 95
+statistics_view_sizes = ""
+;
+; StatisticsView.php line: 96
+statistics_view_links_per_page = ""
+;
+; StatisticsView.php line: 97
+statistics_view_page_date = ""
+;
+; StatisticsView.php line: 98
+statistics_view_dns_time = ""
+;
+; StatisticsView.php line: 99
+statistics_view_download_time = ""
+;
+; StatisticsView.php line: 100
+statistics_view_top_level_domain = ""
+;
+; StatisticsView.php line: 101
+statistics_view_file_extension = ""
+;
+; StatisticsView.php line: 102
+statistics_view_media_type = ""
+;
+; StatisticsView.php line: 103
+statistics_view_language = ""
+;
+; StatisticsView.php line: 104
+statistics_view_server = ""
+;
+; StatisticsView.php line: 105
+statistics_view_os = ""
+;
+; StatisticsView.php line: 108
+statistics_view_general_info = ""
+;
+; StatisticsView.php line: 109
+statistics_view_description = ""
+;
+; StatisticsView.php line: 111
+statistics_view_timestamp = ""
+;
+; StatisticsView.php line: 113
+statistics_view_crawl_date = ""
+;
+; StatisticsView.php line: 115
+statistics_view_pages = ""
+;
+; StatisticsView.php line: 117
+statistics_view_url = ""
+;
+; StatisticsView.php line: 120
+statistics_view_number_hosts = ""
+;
+; SuggestView.php line: 69
+suggest_view_suggest_url = ""
+;
+; SuggestView.php line: 71
+suggest_view_instructions = ""
+;
+; SuggestView.php line: 95
+suggest_view_url = ""
+;
+; SuggestView.php line: 109
+register_view_human_check = ""
+;
+; SuggestView.php line: 143
+suggest_view_human_check = ""
+;
+; SuggestView.php line: 164
+suggest_view_submit_url = ""
+;
+; SuggestView.php line: 173
+suggest_view_return = ""
+;
+; View.php line: 61
+view_locale_version14 = ""
+;
+; View.php line: 93
+view_logo_alt_text = ""
+;
+; WikiView.php line: 86
+wiki_view_read = ""
+;
+; WikiView.php line: 87
+wiki_view_edit = ""
+;
+; WikiView.php line: 90
+wiki_view_pages = ""
+;
+; WikiView.php line: 135
+wiki_view_feed = ""
+;
+; WikiView.php line: 136
+wiki_view_wiki = ""
+;
+; WikiView.php line: 160
+adminview_auto_logout_one_minute = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/elements
+;
+; ActivityElement.php line: 56
+activity_element_activities = ""
+;
+; AppearanceElement.php line: 71
+appearance_element_use_wiki_landing = ""
+;
+; AppearanceElement.php line: 77
+appearance_element_background_color = ""
+;
+; AppearanceElement.php line: 84
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 91
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 99
+appearance_element_foreground_color = ""
+;
+; AppearanceElement.php line: 104
+appearance_element_topbar_color = ""
+;
+; AppearanceElement.php line: 109
+appearance_element_sidebar_color = ""
+;
+; AppearanceElement.php line: 115
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 122
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 132
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 139
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 148
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 155
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 163
+appearance_element_toolbar = ""
+;
+; AppearanceElement.php line: 174
+appearance_element_site_timezone = ""
+;
+; AppearanceElement.php line: 179
+appearance_element_cookie_name = ""
+;
+; AppearanceElement.php line: 184
+appearance_element_token_name = ""
+;
+; AppearanceElement.php line: 189
+appearance_element_auxiliary_css = ""
+;
+; AppearanceElement.php line: 194
+appearance_element_reset_customizations = ""
+;
+; AppearanceElement.php line: 199
+appearance_element_save = ""
+;
+; ConfigureElement.php line: 72
+configure_element_work_directory = ""
+;
+; ConfigureElement.php line: 76
+configure_element_load_or_create = ""
+;
+; ConfigureElement.php line: 92
+configure_element_component_check = ""
+;
+; ConfigureElement.php line: 96
+configure_element_profile_settings = ""
+;
+; ConfigureElement.php line: 101
+configure_element_default_language = ""
+;
+; ConfigureElement.php line: 108
+configure_element_debug_display = ""
+;
+; ConfigureElement.php line: 114
+configure_element_error_info = ""
+;
+; ConfigureElement.php line: 120
+configure_element_query_info = ""
+;
+; ConfigureElement.php line: 126
+configure_element_test_info = ""
+;
+; ConfigureElement.php line: 131
+configure_element_site_access = ""
+;
+; ConfigureElement.php line: 136
+configure_element_web_access = ""
+;
+; ConfigureElement.php line: 141
+configure_element_rss_access = ""
+;
+; ConfigureElement.php line: 146
+configure_element_api_access = ""
+;
+; ConfigureElement.php line: 150
+configure_element_crawl_robot = ""
+;
+; ConfigureElement.php line: 152
+configure_element_robot_name = ""
+;
+; ConfigureElement.php line: 160
+configure_element_robot_instance = ""
+;
+; ConfigureElement.php line: 166
+configure_element_robot_description = ""
+;
+; ConfigureElement.php line: 175
+serversettings_element_save = ""
+;
+; CrawloptionsElement.php line: 59
+crawloptions_element_back_to_manage = ""
+;
+; CrawloptionsElement.php line: 62
+crawloptions_element_modify_active_crawl = ""
+;
+; CrawloptionsElement.php line: 64
+crawloptions_element_edit_crawl_options = ""
+;
+; CrawloptionsElement.php line: 87
+crawloptions_element_web_crawl = ""
+;
+; CrawloptionsElement.php line: 97
+crawloptions_element_archive_crawl = ""
+;
+; CrawloptionsElement.php line: 104
+crawloptions_element_load_options = ""
+;
+; CrawloptionsElement.php line: 109
+crawloptions_element_crawl_order = ""
+;
+; CrawloptionsElement.php line: 118
+crawloptions_element_restrict_by_url = ""
+;
+; CrawloptionsElement.php line: 126
+crawloptions_element_allowed_to_crawl = ""
+;
+; CrawloptionsElement.php line: 132
+crawloptions_element_disallowed_and_quota_sites = ""
+;
+; CrawloptionsElement.php line: 141
+crawloptions_element_seed_sites = ""
+;
+; CrawloptionsElement.php line: 145
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 156
+crawloptions_element_inject_sites = ""
+;
+; CrawloptionsElement.php line: 160
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 177
+crawloptions_element_reindex_crawl = ""
+;
+; CrawloptionsElement.php line: 185
+crawloptions_element_need_api_for_mix = ""
+;
+; CrawloptionsElement.php line: 193
+crawloptions_element_save_options = ""
+;
+; EditclassifierElement.php line: 62
+editclassifier_back = ""
+;
+; EditclassifierElement.php line: 64
+editclassifier_edit_classifier = ""
+;
+; EditclassifierElement.php line: 76
+editclassifier_classifier_label = ""
+;
+; EditclassifierElement.php line: 81
+editclassifier_change = ""
+;
+; EditclassifierElement.php line: 86
+editclassifier_statistics = ""
+;
+; EditclassifierElement.php line: 87
+editclassifier_positive_examples = ""
+;
+; EditclassifierElement.php line: 90
+editclassifier_negative_examples = ""
+;
+; EditclassifierElement.php line: 93
+editclassifier_accuracy = ""
+;
+; EditclassifierElement.php line: 98
+crawl_component_na = ""
+;
+; EditclassifierElement.php line: 103
+editclassifier_update = ""
+;
+; EditclassifierElement.php line: 104
+editclassifier_add_examples = ""
+;
+; EditclassifierElement.php line: 113
+editclassifier_source = ""
+;
+; EditclassifierElement.php line: 117
+editclassifier_default_crawl = ""
+;
+; EditclassifierElement.php line: 127
+editclassifier_label_by_hand = ""
+;
+; EditclassifierElement.php line: 129
+editclassifier_all_in_class = ""
+;
+; EditclassifierElement.php line: 131
+editclassifier_none_in_class = ""
+;
+; EditclassifierElement.php line: 136
+editclassifier_keywords = ""
+;
+; EditclassifierElement.php line: 145
+editclassifier_load = ""
+;
+; EditclassifierElement.php line: 151
+editclassifier_finalize = ""
+;
+; EditclassifierElement.php line: 159
+editclassifier_no_documents = ""
+;
+; EditlocalesElement.php line: 62
+editlocales_element_back_to_manage = ""
+;
+; EditlocalesElement.php line: 64
+editlocales_element_edit_locale = ""
+;
+; EditlocalesElement.php line: 78
+editlocales_element_show = ""
+;
+; EditlocalesElement.php line: 82
+editlocales_element_filter = ""
+;
+; EditlocalesElement.php line: 87
+editlocales_element_go = ""
+;
+; EditlocalesElement.php line: 91
+editlocales_element_no_matching = ""
+;
+; EditlocalesElement.php line: 127
+editlocales_element_save = ""
+;
+; EditmixElement.php line: 57
+editmix_element_back_to_mix = ""
+;
+; EditmixElement.php line: 59
+mixcrawls_element_edit_mix = ""
+;
+; EditmixElement.php line: 70
+mixcrawls_element_mix_name = ""
+;
+; EditmixElement.php line: 76
+mixcrawls_element_mix_components = ""
+;
+; EditmixElement.php line: 82
+mixcrawls_element_too_many = ""
+;
+; EditmixElement.php line: 83
+mixcrawls_element_add_fragment = ""
+;
+; EditmixElement.php line: 88
+mixcrawls_element_save_button = ""
+;
+; FooterElement.php line: 58
+footer_element_blog = "Blog"
+;
+; FooterElement.php line: 60
+footer_element_privacy = "Confidentialit&eacute;"
+;
+; FooterElement.php line: 62
+footer_element_terms = "Termes"
+;
+; FooterElement.php line: 64
+footer_element_tools = "Outils"
+;
+; FooterElement.php line: 66
+footer_element_bot = "YioopBot"
+;
+; FooterElement.php line: 71
+footer_element_developed_seek_quarry = "D&eacute;velopp&eacute; &agrave; Seekquarry"
+;
+; FooterElement.php line: 74
+footer_element_copyright_site = ""
+;
+; FooterElement.php line: 76
+footer_element_this_search_engine = ""
+;
+; GroupfeedElement.php line: 86
+groupfeed_element_add_group = ""
+;
+; GroupfeedElement.php line: 90
+groupfeed_element_request_add = ""
+;
+; GroupfeedElement.php line: 116
+groupfeed_element_wiki_page = ""
+;
+; GroupfeedElement.php line: 118
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 121
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 131
+groupfeed_element_group_activity = ""
+;
+; GroupfeedElement.php line: 135
+groupfeed_element_wiki_thread = ""
+;
+; GroupfeedElement.php line: 154
+groupfeed_element_feed = ""
+;
+; GroupfeedElement.php line: 159
+group_view_wiki = ""
+;
+; GroupfeedElement.php line: 161
+groupfeed_element_user = ""
+;
+; GroupfeedElement.php line: 205
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 240
+manageaccount_element_group_wiki = ""
+;
+; GroupfeedElement.php line: 241
+manageaccount_element_group_stats = ""
+;
+; GroupfeedElement.php line: 246
+manageaccount_element_last_post = ""
+;
+; GroupfeedElement.php line: 290
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 300
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 313
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 319
+groupfeed_element_no_posts_yet = ""
+;
+; GroupfeedElement.php line: 324
+groupfeed_element_thread_no_exist = ""
+;
+; GroupfeedElement.php line: 357
+groupfeed_element_edit = ""
+;
+; GroupfeedElement.php line: 362
+groupfeed_element_delete = ""
+;
+; GroupfeedElement.php line: 384
+groupfeed_element_num_posts = ""
+;
+; GroupfeedElement.php line: 394
+groupfeed_element_num_views = ""
+;
+; GroupfeedElement.php line: 419
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 421
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 437
+groupfeed_element_last_edited = ""
+;
+; GroupfeedElement.php line: 453
+groupfeed_element_post_vote = ""
+;
+; GroupfeedElement.php line: 480
+groupfeed_element_last_post_info = ""
+;
+; GroupfeedElement.php line: 496
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 550
+fileupload_helper_drag_textarea = ""
+;
+; GroupfeedElement.php line: 551
+fileupload_helper_click_textarea = ""
+;
+; GroupfeedElement.php line: 575
+groupfeed_element_add_comment = ""
+;
+; GroupfeedElement.php line: 589
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 627
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 634
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 647
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 682
+groupfeed_element_edit_post = ""
+;
+; GroupfeedElement.php line: 685
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 690
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 703
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 731
+groupfeed_element_no_longer_update = ""
+;
+; MachinelogElement.php line: 57
+machinelog_element_back_to_manage = ""
+;
+; MachinelogElement.php line: 62
+machinelog_element_filter = ""
+;
+; MachinelogElement.php line: 69
+machinelog_element_log_file = ""
+;
+; MachinelogElement.php line: 74
+machinelog_element_refresh_off = "Outre"
+;
+; MachinelogElement.php line: 78
+machinelog_element_refresh_on = "Sur"
+;
+; ManageaccountElement.php line: 64
+manageaccount_element_edit_or_no_text = ""
+;
+; ManageaccountElement.php line: 73
+manageaccount_element_welcome = ""
+;
+; ManageaccountElement.php line: 75
+manageaccount_element_what_can_do = ""
+;
+; ManageaccountElement.php line: 76
+manageaccount_element_account_details = ""
+;
+; ManageaccountElement.php line: 107
+manageaccounts_element_icon = ""
+;
+; ManageaccountElement.php line: 117
+manageusers_element_username = ""
+;
+; ManageaccountElement.php line: 124
+manageusers_element_firstname = ""
+;
+; ManageaccountElement.php line: 130
+manageusers_element_lastname = ""
+;
+; ManageaccountElement.php line: 136
+manageusers_element_email = ""
+;
+; ManageaccountElement.php line: 146
+manageaccount_element_is_advertiser = ""
+;
+; ManageaccountElement.php line: 159
+manageaccount_element_password = ""
+;
+; ManageaccountElement.php line: 166
+manageaccount_element_new_password = "Nouveau Mot de passe:"
+;
+; ManageaccountElement.php line: 172
+manageaccount_element_retype_password = "Veuillez resaisir votre mot de passe:     "
+;
+; ManageaccountElement.php line: 184
+manageaccount_element_save = ""
+;
+; ManageaccountElement.php line: 190
+manageaccount_element_search_lang_settings = ""
+;
+; ManageaccountElement.php line: 195
+manageaccount_element_crawl_and_index = ""
+;
+; ManageaccountElement.php line: 196
+manageaccount_element_crawl_info = ""
+;
+; ManageaccountElement.php line: 197
+manageaccount_element_num_crawls = ""
+;
+; ManageaccountElement.php line: 200
+manageaccount_element_manage_crawls = ""
+;
+; ManageaccountElement.php line: 205
+manageaccount_element_groups_and_feeds = ""
+;
+; ManageaccountElement.php line: 206
+manageaccount_element_group_info = ""
+;
+; ManageaccountElement.php line: 208
+manageaccount_element_num_groups = ""
+;
+; ManageaccountElement.php line: 211
+manageaccount_element_num_group = ""
+;
+; ManageaccountElement.php line: 224
+manageaccount_element_group_wiki = ""
+;
+; ManageaccountElement.php line: 225
+manageaccount_element_group_stats = ""
+;
+; ManageaccountElement.php line: 229
+manageaccount_element_last_post = ""
+;
+; ManageaccountElement.php line: 239
+manageaccount_element_manage_all_groups = ""
+;
+; ManageaccountElement.php line: 241
+manageaccount_element_go_to_group_feed = ""
+;
+; ManageaccountElement.php line: 242
+manageaccount_element_crawl_mixes = ""
+;
+; ManageaccountElement.php line: 243
+manageaccount_element_mixes_info = ""
+;
+; ManageaccountElement.php line: 245
+manageaccount_element_num_mixes = ""
+;
+; ManageaccountElement.php line: 248
+manageaccount_element_num_mix = ""
+;
+; ManageaccountElement.php line: 252
+manageaccount_element_manage_mixes = ""
+;
+; ManageadvertisementsElement.php line: 58
+manageadvertisements_element_list = ""
+;
+; ManageadvertisementsElement.php line: 65
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 70
+manageadvertisements_element_username = ""
+;
+; ManageadvertisementsElement.php line: 73
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 75
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 76
+manageadvertisements_element_dates = ""
+;
+; ManageadvertisementsElement.php line: 77
+manageadvertisements_element_viewclicks = ""
+;
+; ManageadvertisementsElement.php line: 80
+manageadvertisements_element_status = ""
+;
+; ManageadvertisementsElement.php line: 82
+manageadvertisements_element_actions = ""
+;
+; ManageadvertisementsElement.php line: 111
+manageadvertisements_element_active = ""
+;
+; ManageadvertisementsElement.php line: 113
+manageadvertisements_element_deactivated = ""
+;
+; ManageadvertisementsElement.php line: 115
+manageadvertisements_element_suspended = ""
+;
+; ManageadvertisementsElement.php line: 117
+manageadvertisements_element_completed = ""
+;
+; ManageadvertisementsElement.php line: 144
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 147
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 157
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 161
+manageadvertisements_element_deactivate = ""
+;
+; ManageadvertisementsElement.php line: 166
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 170
+manageadvertisements_element_suspend = ""
+;
+; ManageadvertisementsElement.php line: 176
+manageadvertisements_element_reconfirm = ""
+;
+; ManageadvertisementsElement.php line: 180
+manageadvertisements_element_reactivate = ""
+;
+; ManageadvertisementsElement.php line: 225
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 227
+manageadvertisement_element_ad_info = ""
+;
+; ManageadvertisementsElement.php line: 231
+manageadvertisement_element_purchase_ad = ""
+;
+; ManageadvertisementsElement.php line: 250
+manageadvertisement_element_ad_user = ""
+;
+; ManageadvertisementsElement.php line: 263
+manageadvertisement_element_displayname = ""
+;
+; ManageadvertisementsElement.php line: 282
+manageadvertisement_element_text = ""
+;
+; ManageadvertisementsElement.php line: 302
+manageadvertisement_element_ad_url = ""
+;
+; ManageadvertisementsElement.php line: 323
+manageeadvertisement_element_ad_duration = ""
+;
+; ManageadvertisementsElement.php line: 339
+manageeadvertisement_element_start_day = ""
+;
+; ManageadvertisementsElement.php line: 344
+manageeadvertisement_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 349
+manageadvertisement_element_keyword_help = ""
+;
+; ManageadvertisementsElement.php line: 363
+manageadvertisement_element_keyword_bid_amount = ""
+;
+; ManageadvertisementsElement.php line: 370
+manageadvertisement_element_expensive_word = ""
+;
+; ManageadvertisementsElement.php line: 387
+manageadvertisement_element_calculate_bid = ""
+;
+; ManageadvertisementsElement.php line: 407
+manageadvertisement_element_update = ""
+;
+; ManageadvertisementsElement.php line: 416
+manageadvertisement_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 427
+manageadvertisement_element_card_number = ""
+;
+; ManageadvertisementsElement.php line: 438
+manageadvertisement_element_cvc = ""
+;
+; ManageadvertisementsElement.php line: 447
+manageadvertisement_element_expiration = ""
+;
+; ManageadvertisementsElement.php line: 465
+manageadvertisement_element_charge_warning = ""
+;
+; ManageadvertisementsElement.php line: 468
+manageadvertisement_element_program_terms = ""
+;
+; ManageadvertisementsElement.php line: 475
+manageadvertisement_element_edit_ad = ""
+;
+; ManageadvertisementsElement.php line: 479
+manageadvertisement_element_purchase = ""
+;
+; ManageadvertisementsElement.php line: 500
+manageadvertisement_element_preview = ""
+;
+; ManageadvertisementsElement.php line: 538
+manageadvertisements_element_search_advertisement = ""
+;
+; ManageadvertisementsElement.php line: 540
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 542
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 543
+manageadvertisements_element_description = ""
+;
+; ManageadvertisementsElement.php line: 544
+manageadvertisements_element_destination_url = ""
+;
+; ManageadvertisementsElement.php line: 545
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 546
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 547
+manageadvertisements_element_start_date = ""
+;
+; ManageadvertisementsElement.php line: 548
+manageadvertisements_element_end_date = ""
+;
+; ManageclassifiersElement.php line: 66
+manageclassifiers_available_classifiers = ""
+;
+; ManageclassifiersElement.php line: 74
+manageclassifiers_label_col = ""
+;
+; ManageclassifiersElement.php line: 77
+manageclassifiers_positive_col = ""
+;
+; ManageclassifiersElement.php line: 78
+manageclassifiers_negative_col = ""
+;
+; ManageclassifiersElement.php line: 82
+manageclassifiers_actions_col = ""
+;
+; ManageclassifiersElement.php line: 100
+manageclassifiers_edit = ""
+;
+; ManageclassifiersElement.php line: 103
+manageclassifiers_finalized = ""
+;
+; ManageclassifiersElement.php line: 109
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 111
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 116
+manageclassifiers_finalizing = ""
+;
+; ManageclassifiersElement.php line: 120
+confirm_delete_operation = ""
+;
+; ManageclassifiersElement.php line: 123
+manageclassifiers_delete = ""
+;
+; ManageclassifiersElement.php line: 155
+manageclassifiers_manage_classifiers = ""
+;
+; ManageclassifiersElement.php line: 165
+manageclassifiers_classifier_name = ""
+;
+; ManageclassifiersElement.php line: 170
+manageclassifiers_create_button = ""
+;
+; ManageclassifiersElement.php line: 185
+manageclassifiers_element_search = ""
+;
+; ManageclassifiersElement.php line: 186
+manageclassifiers_element_create_form = ""
+;
+; ManageclassifiersElement.php line: 187
+manageclassifiers_classifier_name = ""
+;
+; ManagecrawlsElement.php line: 51
+managecrawls_element_create_crawl = ""
+;
+; ManagecrawlsElement.php line: 60
+managecrawls_element_description = ""
+;
+; ManagecrawlsElement.php line: 67
+managecrawls_element_start_new_crawl = ""
+;
+; ManagecrawlsElement.php line: 71
+managecrawls_element_options = ""
+;
+; ManagecrawlsElement.php line: 77
+managecrawls_element_awaiting_status = ""
+;
+; ManagecrawlsElement.php line: 95
+managecrawls_element_up_longer_update = ""
+;
+; ManagegroupsElement.php line: 71
+managegroups_element_not_my_groups = ""
+;
+; ManagegroupsElement.php line: 73
+managegroups_element_groups = ""
+;
+; ManagegroupsElement.php line: 82
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 83
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 85
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 86
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 87
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 88
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 90
+managegroups_element_actions = ""
+;
+; ManagegroupsElement.php line: 196
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 200
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 214
+manageaccount_element_group_wiki = ""
+;
+; ManagegroupsElement.php line: 229
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 233
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 238
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 243
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 249
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 254
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 263
+managegroups_element_decline = ""
+;
+; ManagegroupsElement.php line: 265
+managegroups_element_unsubscribe = ""
+;
+; ManagegroupsElement.php line: 270
+confirm_delete_operation = ""
+;
+; ManagegroupsElement.php line: 273
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 303
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 304
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 306
+managegroups_element_create_group = ""
+;
+; ManagegroupsElement.php line: 310
+managegroups_element_add_group = ""
+;
+; ManagegroupsElement.php line: 327
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 338
+managegroups_element_browse = ""
+;
+; ManagegroupsElement.php line: 348
+managegroups_element_register = ""
+;
+; ManagegroupsElement.php line: 355
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 362
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 369
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 381
+managegroups_element_group_users = ""
+;
+; ManagegroupsElement.php line: 385
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 412
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 414
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 423
+managegroups_element_activate = ""
+;
+; ManagegroupsElement.php line: 429
+managegroups_element_ban = ""
+;
+; ManagegroupsElement.php line: 435
+managegroups_element_unban = ""
+;
+; ManagegroupsElement.php line: 443
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 471
+managegroups_element_filter = ""
+;
+; ManagegroupsElement.php line: 492
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 503
+managegroups_element_save = ""
+;
+; ManagegroupsElement.php line: 533
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 534
+managegroups_element_invite_users_group = ""
+;
+; ManagegroupsElement.php line: 546
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 554
+managegroups_element_usernames = ""
+;
+; ManagegroupsElement.php line: 561
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 580
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 581
+managegroups_element_transfer_group_owner = ""
+;
+; ManagegroupsElement.php line: 593
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 601
+managegroups_element_new_group_owner = ""
+;
+; ManagegroupsElement.php line: 608
+managegroups_element_change_owner = ""
+;
+; ManagegroupsElement.php line: 627
+managegroups_element_discover_groups = ""
+;
+; ManagegroupsElement.php line: 631
+managegroups_element_search_group = ""
+;
+; ManagegroupsElement.php line: 633
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 635
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 636
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 637
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 639
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 641
+managegroups_element_post_lifetime = ""
+;
+; ManagelocalesElement.php line: 62
+managelocales_element_locale_list = ""
+;
+; ManagelocalesElement.php line: 72
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 75
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 76
+managelocales_element_writingmode = ""
+;
+; ManagelocalesElement.php line: 77
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 81
+managelocales_element_percenttranslated = ""
+;
+; ManagelocalesElement.php line: 82
+managelocales_element_actions = ""
+;
+; ManagelocalesElement.php line: 102
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 103
+managelocales_element_false = ""
+;
+; ManagelocalesElement.php line: 110
+managelocales_element_edit = ""
+;
+; ManagelocalesElement.php line: 115
+confirm_delete_operation = ""
+;
+; ManagelocalesElement.php line: 116
+managelocales_element_delete = ""
+;
+; ManagelocalesElement.php line: 137
+manageloecales_element_add_locale_form = ""
+;
+; ManagelocalesElement.php line: 138
+managelocales_element_locale_info = ""
+;
+; ManagelocalesElement.php line: 140
+managelocales_element_add_locale = ""
+;
+; ManagelocalesElement.php line: 161
+managelocales_element_localenamelabel = ""
+;
+; ManagelocalesElement.php line: 174
+managelocales_element_localetaglabel = ""
+;
+; ManagelocalesElement.php line: 180
+managelocales_element_writingmodelabel = ""
+;
+; ManagelocalesElement.php line: 190
+managelocales_element_localeenabled = ""
+;
+; ManagelocalesElement.php line: 201
+managelocales_element_submit = ""
+;
+; ManagelocalesElement.php line: 219
+managelocales_element_search_locales = ""
+;
+; ManagelocalesElement.php line: 220
+managelocales_element_addlocale_form = ""
+;
+; ManagelocalesElement.php line: 222
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 223
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 224
+managelocales_element_writingmode = ""
+;
+; ManagelocalesElement.php line: 225
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 231
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 232
+managelocales_element_false = ""
+;
+; ManagemachinesElement.php line: 56
+managemachines_element_add_machine = ""
+;
+; ManagemachinesElement.php line: 67
+managemachines_element_machine_name = ""
+;
+; ManagemachinesElement.php line: 72
+managemachines_element_machineurl = ""
+;
+; ManagemachinesElement.php line: 76
+managemachines_element_is_mirror = ""
+;
+; ManagemachinesElement.php line: 81
+managemachines_element_parent_name = ""
+;
+; ManagemachinesElement.php line: 87
+managemachines_element_has_queueserver = ""
+;
+; ManagemachinesElement.php line: 91
+managemachines_element_num_fetchers = ""
+;
+; ManagemachinesElement.php line: 96
+managemachines_element_submit = ""
+;
+; ManagemachinesElement.php line: 101
+managemachines_element_machine_info = ""
+;
+; ManagemachinesElement.php line: 105
+managemachines_element_awaiting_status = ""
+;
+; ManagemachinesElement.php line: 123
+managemachines_element_no_longer_update = ""
+;
+; ManagerolesElement.php line: 59
+manageroles_element_roles = ""
+;
+; ManagerolesElement.php line: 67
+manageroles_element_rolename = ""
+;
+; ManagerolesElement.php line: 68
+manageroles_element_actions = ""
+;
+; ManagerolesElement.php line: 94
+manageroles_element_edit = ""
+;
+; ManagerolesElement.php line: 99
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 103
+confirm_delete_operation = ""
+;
+; ManagerolesElement.php line: 106
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 140
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 141
+manageroles_element_role_info = ""
+;
+; ManagerolesElement.php line: 143
+manageroles_element_add_role = ""
+;
+; ManagerolesElement.php line: 154
+manageroles_element_rolename = ""
+;
+; ManagerolesElement.php line: 167
+manageroles_element_role_activities = ""
+;
+; ManagerolesElement.php line: 175
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 183
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 203
+manageroles_element_save = ""
+;
+; ManagerolesElement.php line: 220
+manageroles_element_search_role = ""
+;
+; ManagerolesElement.php line: 221
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 223
+manageroles_element_rolename = ""
+;
+; ManageusersElement.php line: 59
+manageusers_element_users = ""
+;
+; ManageusersElement.php line: 68
+manageusers_element_username = ""
+;
+; ManageusersElement.php line: 70
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 71
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 72
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 73
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 75
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 76
+manageusers_element_actions = ""
+;
+; ManageusersElement.php line: 141
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 145
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 151
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 155
+confirm_delete_operation = ""
+;
+; ManageusersElement.php line: 158
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 200
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 201
+manageusers_element_user_info = ""
+;
+; ManageusersElement.php line: 203
+manageusers_element_add_user = ""
+;
+; ManageusersElement.php line: 228
+manageusers_element_username = ""
+;
+; ManageusersElement.php line: 238
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 244
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 250
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 257
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 274
+manageusers_element_roles = ""
+;
+; ManageusersElement.php line: 278
+manageusers_element_num_roles = ""
+;
+; ManageusersElement.php line: 293
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 303
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 344
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 357
+manageusers_element_add_role = ""
+;
+; ManageusersElement.php line: 367
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 371
+manageusers_element_num_groups = ""
+;
+; ManageusersElement.php line: 392
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 431
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 443
+manageusers_element_add_group = ""
+;
+; ManageusersElement.php line: 456
+manageusers_element_password = "Mot de passe:"
+;
+; ManageusersElement.php line: 462
+manageusers_element_retype_password = "Veuillez resaisir votre mot de passe:"
+;
+; ManageusersElement.php line: 469
+manageusers_element_save = ""
+;
+; ManageusersElement.php line: 496
+manageusers_element_search_user = ""
+;
+; ManageusersElement.php line: 497
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 499
+manageusers_element_username = ""
+;
+; ManageusersElement.php line: 500
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 501
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 502
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 503
+manageusers_element_status = ""
+;
+; MixcrawlsElement.php line: 65
+mixcrawls_element_available_mixes = ""
+;
+; MixcrawlsElement.php line: 72
+mixcrawls_view_name = ""
+;
+; MixcrawlsElement.php line: 74
+mixcrawls_view_definition = ""
+;
+; MixcrawlsElement.php line: 78
+mixcrawls_view_actions = ""
+;
+; MixcrawlsElement.php line: 112
+mixcrawls_view_no_components = ""
+;
+; MixcrawlsElement.php line: 118
+mixcrawls_view_share = ""
+;
+; MixcrawlsElement.php line: 120
+mixcrawls_view_edit = ""
+;
+; MixcrawlsElement.php line: 125
+mixcrawls_set_index = ""
+;
+; MixcrawlsElement.php line: 128
+mixcrawl_search_index = ""
+;
+; MixcrawlsElement.php line: 134
+confirm_delete_operation = ""
+;
+; MixcrawlsElement.php line: 136
+mixcrawls_view_delete = ""
+;
+; MixcrawlsElement.php line: 146
+mixcrawls_view_back = ""
+;
+; MixcrawlsElement.php line: 147
+mixcrawls_element_share_mix_group = ""
+;
+; MixcrawlsElement.php line: 157
+mixcrawls_element_mixname = ""
+;
+; MixcrawlsElement.php line: 163
+mixcrawls_element_group = ""
+;
+; MixcrawlsElement.php line: 169
+mixcrawls_element_share = ""
+;
+; MixcrawlsElement.php line: 193
+mixcrawls_element_make_mix = ""
+;
+; MixcrawlsElement.php line: 203
+mixcrawls_element_mix_name = ""
+;
+; MixcrawlsElement.php line: 208
+mixcrawls_element_create_button = ""
+;
+; MixcrawlsElement.php line: 224
+mixcrawls_element_search_mix = ""
+;
+; MixcrawlsElement.php line: 225
+mixcrawls_element_createmix_form = ""
+;
+; MixcrawlsElement.php line: 227
+mixcrawls_element_mixname = ""
+;
+; MoreoptionsElement.php line: 82
+moreoptions_element_other_searches = ""
+;
+; MoreoptionsElement.php line: 119
+moreoptions_element_previous = ""
+;
+; MoreoptionsElement.php line: 125
+moreoptions_element_next = ""
+;
+; MoreoptionsElement.php line: 137
+moreoptions_element_my_accounts = ""
+;
+; MoreoptionsElement.php line: 142
+signin_element_settings = "Param&egrave;tres de recherche"
+;
+; MoreoptionsElement.php line: 151
+signin_element_signin = "Connexion"
+;
+; MoreoptionsElement.php line: 154
+signin_element_admin = "Administration"
+;
+; MoreoptionsElement.php line: 167
+signin_view_create_account = ""
+;
+; MoreoptionsElement.php line: 186
+moreoptions_element_suggest = ""
+;
+; MoreoptionsElement.php line: 188
+moreoptions_element_wiki_pages = ""
+;
+; MoreoptionsElement.php line: 199
+moreoptions_element_tools = ""
+;
+; PageoptionsElement.php line: 59
+pageoptions_element_crawl_time = ""
+;
+; PageoptionsElement.php line: 64
+pageoptions_element_search_time = ""
+;
+; PageoptionsElement.php line: 69
+pageoptions_element_test_options = ""
+;
+; PageoptionsElement.php line: 81
+pageoptions_element_load_options = ""
+;
+; PageoptionsElement.php line: 86
+pageoptions_element_page_range = ""
+;
+; PageoptionsElement.php line: 92
+pageoptions_element_summarizer = ""
+;
+; PageoptionsElement.php line: 101
+pageoptions_element_max_description = ""
+;
+; PageoptionsElement.php line: 107
+pageoptions_element_save_cache = ""
+;
+; PageoptionsElement.php line: 117
+pageoptions_element_allow_recrawl = ""
+;
+; PageoptionsElement.php line: 124
+pageoptions_element_file_types = ""
+;
+; PageoptionsElement.php line: 153
+pageoptions_element_classifiers_rankers = ""
+;
+; PageoptionsElement.php line: 169
+pageoptions_element_use_classify = ""
+;
+; PageoptionsElement.php line: 170
+pageoptions_element_use_rank = ""
+;
+; PageoptionsElement.php line: 197
+pageoptions_element_no_classifiers = ""
+;
+; PageoptionsElement.php line: 200
+pageoptions_element_indexing_plugins = ""
+;
+; PageoptionsElement.php line: 206
+pageoptions_element_plugin = ""
+;
+; PageoptionsElement.php line: 207
+pageoptions_element_plugin_include = ""
+;
+; PageoptionsElement.php line: 223
+pageoptions_element_configure = ""
+;
+; PageoptionsElement.php line: 235
+pageoptions_element_no_compatible_plugins = ""
+;
+; PageoptionsElement.php line: 238
+pageoptions_element_page_rules = ""
+;
+; PageoptionsElement.php line: 247
+page_element_search_page = ""
+;
+; PageoptionsElement.php line: 254
+pageoptions_element_wd_suggest = ""
+;
+; PageoptionsElement.php line: 262
+pageoptions_element_subsearch_link = ""
+;
+; PageoptionsElement.php line: 271
+pageoptions_element_signin_link = ""
+;
+; PageoptionsElement.php line: 279
+pageoptions_element_cache_link = ""
+;
+; PageoptionsElement.php line: 288
+pageoptions_element_similar_link = ""
+;
+; PageoptionsElement.php line: 297
+pageoptions_element_in_link = ""
+;
+; PageoptionsElement.php line: 304
+pageoptions_element_ip_link = ""
+;
+; PageoptionsElement.php line: 313
+pageoptions_element_ranking_factors = ""
+;
+; PageoptionsElement.php line: 318
+pageoptions_element_title_weight = ""
+;
+; PageoptionsElement.php line: 323
+pageoptions_element_description_weight = ""
+;
+; PageoptionsElement.php line: 328
+pageoptions_element_link_weight = ""
+;
+; PageoptionsElement.php line: 333
+pageoptions_element_results_grouping_options = ""
+;
+; PageoptionsElement.php line: 338
+pageoptions_element_min_results_to_group = ""
+;
+; PageoptionsElement.php line: 344
+pageoptions_element_server_alpha = ""
+;
+; PageoptionsElement.php line: 352
+pageoptions_element_test_page = ""
+;
+; PageoptionsElement.php line: 356
+pageoptions_element_page_type = ""
+;
+; PageoptionsElement.php line: 372
+pageoptions_element_save_options = ""
+;
+; PageoptionsElement.php line: 374
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 380
+pageoptions_element_test_results = ""
+;
+; PageoptionsElement.php line: 383
+pageoptions_element_page_truncated = ""
+;
+; PageoptionsElement.php line: 388
+pageoptions_element_after_process = ""
+;
+; PageoptionsElement.php line: 392
+pageoptions_element_after_rules = ""
+;
+; PageoptionsElement.php line: 396
+pageoptions_element_extracted_words = ""
+;
+; PageoptionsElement.php line: 400
+pageoptions_element_extracted_metas = ""
+;
+; PageoptionsElement.php line: 417
+page_element_plugin_back = ""
+;
+; PageoptionsElement.php line: 454
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 458
+pageoptions_element_save_options = ""
+;
+; ResultseditorElement.php line: 52
+resultseditor_element_edit_page = ""
+;
+; ResultseditorElement.php line: 57
+resultseditor_element_edited_pages = ""
+;
+; ResultseditorElement.php line: 66
+resultseditor_element_url_list = ""
+;
+; ResultseditorElement.php line: 68
+resultseditor_element_load_page = ""
+;
+; ResultseditorElement.php line: 81
+resultseditor_element_page_url = ""
+;
+; ResultseditorElement.php line: 87
+resultseditor_element_page_title = ""
+;
+; ResultseditorElement.php line: 93
+resultseditor_element_description = ""
+;
+; ResultseditorElement.php line: 97
+resultseditor_element_reset = ""
+;
+; ResultseditorElement.php line: 99
+resultseditor_element_save_page = ""
+;
+; ResultseditorElement.php line: 102
+resultseditor_element_filter_websites = ""
+;
+; ResultseditorElement.php line: 114
+resultseditor_element_sites_to_filter = ""
+;
+; ResultseditorElement.php line: 119
+resultseditor_element_save_filter = ""
+;
+; SearchsourcesElement.php line: 62
+searchsources_element_addsource_form = ""
+;
+; SearchsourcesElement.php line: 63
+searchsources_element_edit_media_source = ""
+;
+; SearchsourcesElement.php line: 67
+searchsources_element_add_media_source = ""
+;
+; SearchsourcesElement.php line: 90
+searchsources_element_sourcetype = ""
+;
+; SearchsourcesElement.php line: 95
+searchsources_element_sourcename = ""
+;
+; SearchsourcesElement.php line: 104
+searchsources_element_url = ""
+;
+; SearchsourcesElement.php line: 110
+searchsources_element_locale_tag = ""
+;
+; SearchsourcesElement.php line: 115
+searchsources_element_thumbnail = ""
+;
+; SearchsourcesElement.php line: 125
+searchsources_element_feed_instruct = ""
+;
+; SearchsourcesElement.php line: 128
+searchsources_element_channelpath = ""
+;
+; SearchsourcesElement.php line: 134
+searchsources_element_itempath = ""
+;
+; SearchsourcesElement.php line: 140
+searchsources_element_titlepath = ""
+;
+; SearchsourcesElement.php line: 146
+searchsources_element_descpath = ""
+;
+; SearchsourcesElement.php line: 152
+searchsources_element_linkpath = ""
+;
+; SearchsourcesElement.php line: 158
+searchsources_element_image_xpath = ""
+;
+; SearchsourcesElement.php line: 164
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 170
+searchsources_element_media_sources = ""
+;
+; SearchsourcesElement.php line: 193
+searchsources_element_medianame = ""
+;
+; SearchsourcesElement.php line: 194
+searchsources_element_mediatype = ""
+;
+; SearchsourcesElement.php line: 196
+searchsources_element_mediaurls = ""
+;
+; SearchsourcesElement.php line: 199
+searchsources_element_action = ""
+;
+; SearchsourcesElement.php line: 227
+searchsources_element_editmedia = ""
+;
+; SearchsourcesElement.php line: 230
+confirm_delete_operation = ""
+;
+; SearchsourcesElement.php line: 233
+searchsources_element_deletemedia = ""
+;
+; SearchsourcesElement.php line: 242
+searchsources_element_addsearch_form = ""
+;
+; SearchsourcesElement.php line: 244
+searchsources_element_edit_subsearch = ""
+;
+; SearchsourcesElement.php line: 249
+searchsources_element_add_subsearch = ""
+;
+; SearchsourcesElement.php line: 264
+searchsources_element_foldername = ""
+;
+; SearchsourcesElement.php line: 274
+searchsources_element_indexsource = ""
+;
+; SearchsourcesElement.php line: 280
+searchsources_element_per_page = ""
+;
+; SearchsourcesElement.php line: 286
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 292
+searchsources_element_subsearches = ""
+;
+; SearchsourcesElement.php line: 302
+searchsources_element_dirname = ""
+;
+; SearchsourcesElement.php line: 303
+searchsources_element_index = ""
+;
+; SearchsourcesElement.php line: 306
+searchsources_element_localestring = ""
+;
+; SearchsourcesElement.php line: 307
+searchsources_element_perpage = ""
+;
+; SearchsourcesElement.php line: 311
+searchsources_element_actions = ""
+;
+; SearchsourcesElement.php line: 327
+searchsources_element_editsource = ""
+;
+; SearchsourcesElement.php line: 333
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 335
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 342
+searchsources_element_deletesubsearch = ""
+;
+; SecurityElement.php line: 58
+security_element_auth_captcha = ""
+;
+; SecurityElement.php line: 69
+security_element_authentication_type = ""
+;
+; SecurityElement.php line: 81
+security_element_zero_unavailable = ""
+;
+; SecurityElement.php line: 90
+security_element_captcha_type = ""
+;
+; SecurityElement.php line: 103
+security_element_save = ""
+;
+; SecurityElement.php line: 107
+security_element_captcha_recovery_questions = ""
+;
+; SecurityElement.php line: 113
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 118
+security_element_edit_captcha = ""
+;
+; SecurityElement.php line: 123
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 126
+security_element_edit_captcha = ""
+;
+; ServersettingsElement.php line: 59
+serversettings_element_server_settings = ""
+;
+; ServersettingsElement.php line: 62
+serversettings_element_name_server = ""
+;
+; ServersettingsElement.php line: 66
+serversettings_element_name_server_key = ""
+;
+; ServersettingsElement.php line: 73
+serversettings_element_name_server_url = ""
+;
+; ServersettingsElement.php line: 81
+serversettings_element_use_memcache = ""
+;
+; ServersettingsElement.php line: 89
+serversettings_element_memcache_servers = ""
+;
+; ServersettingsElement.php line: 100
+serversettings_element_use_filecache = ""
+;
+; ServersettingsElement.php line: 110
+configure_element_database_setup = ""
+;
+; ServersettingsElement.php line: 115
+serversettings_element_database_system = ""
+;
+; ServersettingsElement.php line: 123
+serversettings_element_databasename = ""
+;
+; ServersettingsElement.php line: 130
+serversettings_element_databasehost = ""
+;
+; ServersettingsElement.php line: 137
+serversettings_element_databaseuser = ""
+;
+; ServersettingsElement.php line: 145
+serversettings_element_databasepassword = ""
+;
+; ServersettingsElement.php line: 158
+serversettings_element_account_registration = ""
+;
+; ServersettingsElement.php line: 169
+serversettings_element_mail_sender = ""
+;
+; ServersettingsElement.php line: 175
+serversettings_element_send_media_updater = ""
+;
+; ServersettingsElement.php line: 185
+serversettings_element_use_php_mail = ""
+;
+; ServersettingsElement.php line: 192
+serversettings_element_mail_server = ""
+;
+; ServersettingsElement.php line: 198
+serversettings_element_mail_serverport = ""
+;
+; ServersettingsElement.php line: 205
+serversettings_element_mail_username = ""
+;
+; ServersettingsElement.php line: 211
+serversettings_element_mail_password = ""
+;
+; ServersettingsElement.php line: 218
+serversettings_element_mail_security = ""
+;
+; ServersettingsElement.php line: 228
+serversettings_element_proxy_title = ""
+;
+; ServersettingsElement.php line: 232
+serversettings_element_tor_proxy = ""
+;
+; ServersettingsElement.php line: 238
+serversettings_element_use_proxy_servers = ""
+;
+; ServersettingsElement.php line: 247
+serversettings_element_proxy_servers = ""
+;
+; ServersettingsElement.php line: 256
+serversettings_element_adserver_configuration = ""
+;
+; ServersettingsElement.php line: 261
+serversettings_element_advertising_source = ""
+;
+; ServersettingsElement.php line: 273
+serversettings_element_no_payment_processing = ""
+;
+; ServersettingsElement.php line: 275
+serversettings_element_purchase_processing = ""
+;
+; ServersettingsElement.php line: 282
+serversettings_element_ad_location = ""
+;
+; ServersettingsElement.php line: 287
+serversettings_element_top = ""
+;
+; ServersettingsElement.php line: 292
+serversettings_element_side = ""
+;
+; ServersettingsElement.php line: 297
+serversettings_element_both = ""
+;
+; ServersettingsElement.php line: 302
+serversettings_element_none = ""
+;
+; ServersettingsElement.php line: 305
+serversettings_element_global_adscript = ""
+;
+; ServersettingsElement.php line: 312
+serversettings_element_top_adscript = ""
+;
+; ServersettingsElement.php line: 319
+serversettings_element_side_adscript = ""
+;
+; ServersettingsElement.php line: 329
+serversettings_element_save = ""
+;
+; SigninElement.php line: 73
+signin_element_settings = "Param&egrave;tres de recherche"
+;
+; SigninElement.php line: 77
+signin_element_signin = "Connexion"
+;
+; SigninElement.php line: 81
+signin_element_signout = "D&eacute;connexion"
+;
+; SubsearchElement.php line: 69
+subsearch_element_more = "Plus"
+;
+; WikiElement.php line: 121
+wiki_view_back = ""
+;
+; WikiElement.php line: 139
+groupfeed_element_feed = ""
+;
+; WikiElement.php line: 140
+wiki_view_wiki = ""
+;
+; WikiElement.php line: 144
+wiki_view_page = ""
+;
+; WikiElement.php line: 148
+wiki_view_read = ""
+;
+; WikiElement.php line: 149
+wiki_view_edit = ""
+;
+; WikiElement.php line: 152
+wiki_view_pages = ""
+;
+; WikiElement.php line: 237
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 245
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 246
+wiki_view_create_edit = ""
+;
+; WikiElement.php line: 247
+wiki_view_use_form_below = ""
+;
+; WikiElement.php line: 259
+wiki_element_submit = ""
+;
+; WikiElement.php line: 265
+wiki_view_syntax_summary = ""
+;
+; WikiElement.php line: 268
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 270
+wiki_view_signin_edit = ""
+;
+; WikiElement.php line: 272
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 302
+wiki_element_history = ""
+;
+; WikiElement.php line: 306
+wiki_element_discuss = ""
+;
+; WikiElement.php line: 342
+wiki_element_locale_name = ""
+;
+; WikiElement.php line: 346
+wiki_element_page = ""
+;
+; WikiElement.php line: 349
+configure_element_toggle_page_settings = ""
+;
+; WikiElement.php line: 353
+wiki_element_page_type = ""
+;
+; WikiElement.php line: 361
+wiki_element_page_alias = ""
+;
+; WikiElement.php line: 369
+wiki_element_page_border = ""
+;
+; WikiElement.php line: 376
+wiki_element_table_of_contents = ""
+;
+; WikiElement.php line: 385
+wiki_element_title = ""
+;
+; WikiElement.php line: 391
+wiki_element_meta_author = ""
+;
+; WikiElement.php line: 397
+wiki_element_meta_robots = ""
+;
+; WikiElement.php line: 404
+wiki_element_meta_description = ""
+;
+; WikiElement.php line: 411
+wiki_element_page_header = ""
+;
+; WikiElement.php line: 417
+wiki_element_page_footer = ""
+;
+; WikiElement.php line: 440
+wiki_element_archive_info = ""
+;
+; WikiElement.php line: 443
+wiki_element_edit_reason = ""
+;
+; WikiElement.php line: 450
+wiki_element_savebutton = ""
+;
+; WikiElement.php line: 454
+wiki_element_media_list = ""
+;
+; WikiElement.php line: 455
+wiki_element_ml_description = ""
+;
+; WikiElement.php line: 458
+wiki_view_page_resources = ""
+;
+; WikiElement.php line: 493
+wiki_view_upload = ""
+;
+; WikiElement.php line: 497
+wiki_element_resources_info = ""
+;
+; WikiElement.php line: 512
+wiki_element_rename_failed = ""
+;
+; WikiElement.php line: 578
+wiki_element_rename = ""
+;
+; WikiElement.php line: 582
+wiki_element_add_to_page = ""
+;
+; WikiElement.php line: 602
+wiki_element_no_resources = ""
+;
+; WikiElement.php line: 624
+wiki_view_wiki_page_list = ""
+;
+; WikiElement.php line: 637
+wiki_view_filter_or_create = ""
+;
+; WikiElement.php line: 639
+wiki_element_go = ""
+;
+; WikiElement.php line: 644
+wiki_view_create_page = ""
+;
+; WikiElement.php line: 655
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 677
+wiki_view_no_pages = ""
+;
+; WikiElement.php line: 700
+wiki_view_back = ""
+;
+; WikiElement.php line: 716
+wiki_view_difference = ""
+;
+; WikiElement.php line: 722
+wiki_view_go = ""
+;
+; WikiElement.php line: 741
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 743
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 747
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 748
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 754
+wiki_view_edited_by = ""
+;
+; WikiElement.php line: 758
+wiki_view_page_len = ""
+;
+; WikiElement.php line: 760
+wiki_view_revert = ""
+;
+; WikiElement.php line: 763
+wiki_view_revert = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/helpers
+;
+; FeedsHelper.php line: 70
+feeds_helper_view_feed_results = "R&eacute;sultats de nouvelles pour %s"
+;
+; FeedsHelper.php line: 164
+feeds_helper_view_onehour = "il y a une heure"
+;
+; FeedsHelper.php line: 169
+feeds_helper_view_minsecs = ""
+;
+; FeedsHelper.php line: 174
+feeds_helper_view_hourdate = "il y a %s heures"
+;
+; FileuploadHelper.php line: 72
+fileupload_helper_drag_textarea = ""
+;
+; FileuploadHelper.php line: 73
+fileupload_helper_click_textarea = ""
+;
+; FileuploadHelper.php line: 75
+fileupload_helper_drag_above = ""
+;
+; FileuploadHelper.php line: 76
+fileupload_helper_click_upload = ""
+;
+; FileuploadHelper.php line: 117
+basic_js_invalid_filetype = ""
+;
+; FileuploadHelper.php line: 119
+basic_js_file_too_big = ""
+;
+; FileuploadHelper.php line: 121
+basic_js_upload_progress = ""
+;
+; FileuploadHelper.php line: 123
+basic_js_progress_meter_disabled = ""
+;
+; FileuploadHelper.php line: 125
+basic_js_upload_error = ""
+;
+; FileuploadHelper.php line: 127
+basic_js_upload_cancelled = ""
+;
+; FileuploadHelper.php line: 129
+basic_js_too_many_files = ""
+;
+; HelpbuttonHelper.php line: 106
+wiki_question_mark = "?"
+;
+; HelpbuttonHelper.php line: 138
+wiki_view_edit = ""
+;
+; HelpbuttonHelper.php line: 139
+wiki_view_not_available = ""
+;
+; HelpbuttonHelper.php line: 141
+wiki_view_create_edit = ""
+;
+; HelpbuttonHelper.php line: 143
+wiki_view_page_no_exist = ""
+;
+; HelpbuttonHelper.php line: 145
+wiki_view_read = ""
+;
+; ImagesHelper.php line: 55
+images_helper_view_image_results = "Visualisez plus de r&eacute;sultats d&#039;image..."
+;
+; PaginationHelper.php line: 97
+pagination_helper_previous = "Pr&eacute;c."
+;
+; PaginationHelper.php line: 121
+pagination_helper_next = "Proch."
+;
+; PagingtableHelper.php line: 103
+pagingtable_helper_search = ""
+;
+; PagingtableHelper.php line: 125
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 138
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 215
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 233
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 241
+pagingtable_helper_search = ""
+;
+; SearchformHelper.php line: 119
+searchform_helper_any = ""
+;
+; SearchformHelper.php line: 148
+searchform_helper_search = ""
+;
+; ToggleHelper.php line: 59
+toggle_helper_on = "Sur"
+;
+; ToggleHelper.php line: 61
+toggle_helper_off = "Outre"
+;
+; ToggleHelper.php line: 65
+toggle_helper_on = "Sur"
+;
+; ToggleHelper.php line: 67
+toggle_helper_off = "Outre"
+;
+; ToggleHelper.php line: 71
+toggle_helper_on = "Sur"
+;
+; ToggleHelper.php line: 73
+toggle_helper_off = "Outre"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/layouts
+;
+; RssLayout.php line: 62
+rss_layout_title = "Moteur de recherche PHP -Yioop! %s"
+;
+; RssLayout.php line: 69
+rss_layout_description = "%s R&eacute;sultats"
+;
+; WebLayout.php line: 63
+web_layout_title = "Moteur de recherche PHP -Yioop!"
+;
+; WebLayout.php line: 73
+web_layout_description = "Trouvez ce que vous cherchez"
+;
+; WebLayout.php line: 75
+web_layout_site_author = ""
+;
+; WebLayout.php line: 219
+web_layout_query_statistics = ""
+;
+; WebLayout.php line: 223
+web_layout_total_elapsed_time = ""
+;
+; WebLayout.php line: 228
+web_layout_query_time = ""
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/views
+;
+; DownloadView.php line: 65
+download_view_form = ""
+;
+; DownloadView.php line: 74
+download_view_thank_you = ""
+;
+; DownloadView.php line: 76
+download_view_full_name = ""
+;
+; DownloadView.php line: 81
+download_view_email = ""
+;
+; DownloadView.php line: 85
+download_view_business = ""
+;
+; DownloadView.php line: 90
+download_view_interest = ""
+;
+; DownloadView.php line: 96
+download_view_get_email = ""
+;
+; DownloadView.php line: 102
+download_view_return_main = ""
+;
+; DownloadView.php line: 115
+download_view_required_fields = ""
+;
+; DownloadView.php line: 119
+download_view_name_required = ""
+;
+; DownloadView.php line: 123
+download_view_valid_email = ""
+;
+; StoreView.php line: 65
+download_view_form = ""
+;
+; StoreView.php line: 74
+download_view_thank_you = ""
+;
+; StoreView.php line: 76
+download_view_full_name = ""
+;
+; StoreView.php line: 81
+download_view_email = ""
+;
+; StoreView.php line: 85
+download_view_business = ""
+;
+; StoreView.php line: 90
+download_view_interest = ""
+;
+; StoreView.php line: 96
+download_view_get_email = ""
+;
+; StoreView.php line: 102
+download_view_return_main = ""
+;
+; StoreView.php line: 115
+download_view_required_fields = ""
+;
+; StoreView.php line: 119
+download_view_name_required = ""
+;
+; StoreView.php line: 123
+download_view_valid_email = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/library/indexing_plugins
+;
+; WordfilterPlugin.php line: 355
+wordfilter_plugin_settings_saved = ""
+;
+; WordfilterPlugin.php line: 364
+wordfilter_plugin_defaults_restored = ""
+;
+; WordfilterPlugin.php line: 469
+wordfilter_plugin_preferences = ""
+;
+; WordfilterPlugin.php line: 473
+wordfilter_plugin_factory_settings = ""
+;
+; WordfilterPlugin.php line: 485
+wordfilter_plugin_save = ""
diff --git a/locale/fr_FR/resources/Tokenizer.php b/locale/fr_FR/resources/Tokenizer.php
new file mode 100755
index 0000000..96321b2
--- /dev/null
+++ b/locale/fr_FR/resources/Tokenizer.php
@@ -0,0 +1,488 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\fr_FR\resources;
+
+use seekquarry\yioop\library as L;
+
+/**
+ * This class has a collection of methods for French locale specific
+ * tokenization. In particular, it has a stemmer, a stop word remover (for
+ * use mainly in word cloud creation). The stemmer is my stab at re-implementing
+ * the stemmer algorithm given at http://snowball.tartarus.org and was
+ * inspired by http://snowball.tartarus.org/otherlangs/french_javascript.txt
+ * Here given a word, its stem is that part of the word that
+ * is common to all its inflected variants. For example,
+ * tall is common to tall, taller, tallest. A stemmer takes
+ * a word and tries to produce its stem.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\fr-FR
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = ["titanic"];
+    /**
+     * French vowels
+     * @var string
+     */
+    private static $vowel = 'aeiouyàâëéèêïîôûù';
+    /**
+     * Storage used in computing the stem
+     * @var string
+     */
+    private static $buffer;
+    /**
+     * $rv is approximately the string after the first vowel in the $word we
+     * want to stem
+     * @var string
+     */
+    private static $rv;
+    /**
+     * Position in $word to stem of $rv
+     * @var int
+     */
+    private static $rv_index;
+    /**
+     * $r1 is the region after the first non-vowel following a vowel, or the end
+     * of the word if there is no such non-vowel.
+     * @var string
+     */
+    private static $r1;
+    /**
+     * Position in $word to stem of $r1
+     * @var int
+     */
+    private static $r1_index;
+    /**
+     * $r2 is the region after the first non-vowel following a vowel in $r1, or
+     * the end of the word if there is no such non-vowel
+     * @var string
+     */
+    private static $r2;
+    /**
+     * Position in $word to stem of $r2
+     * @var int
+     */
+    private static $r2_index;
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = ['alors', 'au', 'aucuns', 'aussi', 'autre', 'avant',
+            'avec', 'avoir', 'bon', 'car', 'ce', 'cela', 'ces', 'ceux',
+            'chaque', 'ci', 'comme', 'comment', 'dans', 'des', 'du', 'dedans',
+            'dehors', 'depuis', 'deux', 'devrait', 'doit', 'donc', 'dos',
+            'droite', 'début', 'elle', 'elles', 'en', 'encore', 'essai', 'est',
+            'et', 'eu', 'fait', 'faites', 'fois', 'font', 'force', 'haut',
+            'hors', 'http', 'https', 'ici', 'il', 'ils', 'je', 'juste', 'la',
+            'le', 'les','leur',
+            'là', 'ma', 'maintenant', 'mais', 'mes', 'mine', 'moins', 'mon',
+            'mot', 'même', 'ni', 'nommés', 'notre', 'nous', 'nouveaux', 'ou',
+            'où', 'par', 'parce', 'parole', 'pas', 'personnes', 'peut', 'peu',
+            'pièce', 'plupart', 'pour', 'pourquoi', 'quand', 'que', 'quel',
+            'quelle', 'quelles', 'quels', 'qui', 'sa', 'sans', 'ses',
+            'seulement', 'si', 'sien', 'son', 'sont', 'sous', 'soyez', 'sujet',
+            'sur', 'ta', 'tandis', 'tellement', 'tels', 'tes', 'ton', 'tous',
+            'tout', 'trop', 'très', 'tu','valeur', 'voie', 'voient', 'vont',
+            'votre','vous','vu','ça','étaient', 'état', 'étions', 'été',
+            'être'];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/', '',
+            mb_strtolower($page));
+        return $page;
+    }
+    /**
+     * Computes the stem of a French word
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $words
+     */
+    public static function stem($word)
+    {
+        if (in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+        $before_process = mb_strtolower($word, "UTF-8");
+        self::$buffer = $before_process;
+        self::computeNonVowels();
+        self::computeNonVowelRegions();
+        self::step1(); //suffix removal
+        $word_step1 = self::$buffer;
+        if (self::step2a($before_process) //verb suffixes beginning with i
+            && $word_step1 == self::$buffer) {
+            self::step2b(); //other verb suffixes
+        }
+        if (mb_strtolower(self::$buffer, "UTF-8") != $before_process) {
+            self::step3();
+        } else {
+            self::step4();
+        }
+        self::step5(); //un-double
+        self::step6(); //un-accent
+        self::$buffer = mb_strtolower(self::$buffer, "UTF-8");
+        return self::$buffer;
+    }
+    /**
+     * If a vowel shouldn't be treated as a volume it is capitalized by
+     * this method. (Operations done on buffer.)
+     */
+    private static function computeNonVowels()
+    {
+        $vowel = static::$vowel;
+        self::$buffer = preg_replace("/qu/u", "qU", self::$buffer);
+        self::$buffer = preg_replace("/([$vowel])y/u", '$1Y',
+            self::$buffer);
+        self::$buffer = preg_replace("/y([$vowel])/u", 'Y$1',
+            self::$buffer);
+        self::$buffer = preg_replace("/([$vowel])u([$vowel])/u", '$1U$2',
+            self::$buffer);
+        self::$buffer = preg_replace("/([$vowel])i([$vowel])/u", '$1I$2',
+            self::$buffer);
+    }
+    /**
+     * $r1 is the region after the first non-vowel following a vowel, or the end
+     * of the word if there is no such non-vowel.
+     * $r2 is the region after the first non-vowel following a vowel in $r1, or
+     * the end of the word if there is no such non-vowel
+     */
+    private static function computeNonVowelRegions()
+    {
+        $word = self::$buffer;
+        $vowel = static::$vowel;
+        self::$rv = "";
+        self::$rv_index = -1;
+        if (L\preg_search('/^(par|col|tap)/u', $word) != -1 ||
+            L\preg_search("/^[$vowel]{2}/u", $word) != -1) {
+            self::$rv = substr($word, 3);
+            self::$rv_index = 3;
+        } else {
+            self::$rv_index = L\preg_search("/[$vowel]/u", $word,
+                strlen(mb_substr($word, 0, 1, 'UTF-8')));
+            if (self::$rv_index != -1){
+                self::$rv_index += 1;
+                self::$rv = substr($word, self::$rv_index);
+            } else {
+                self::$rv_index = strlen($word);
+            }
+        }
+        preg_match("/[$vowel][^$vowel]/u", $word, $matches,
+            PREG_OFFSET_CAPTURE);
+        self::$r1 = "";
+        $len = strlen($word);
+        self::$r1_index = isset($matches[0][1]) ? $matches[0][1] +
+            strlen(mb_substr($word,$matches[0][1], 2, 'UTF-8')) : $len;
+        if (self::$r1_index != $len) {
+            self::$r1 = substr($word, self::$r1_index);
+        }
+        if (self::$r1_index != $len) {
+            preg_match("/[$vowel][^$vowel]/", self::$r1, $matches,
+                PREG_OFFSET_CAPTURE);
+            self::$r2_index = isset($matches[0][1]) ? $matches[0][1] +
+                strlen(mb_substr(self::$r1, $matches[0][1], 2, 'UTF-8')) : $len;
+            if (self::$r2_index != $len) {
+                self::$r2 = substr(self::$r1, self::$r2_index);
+                self::$r2_index += self::$r1_index;
+            }
+        }
+        if (self::$r1_index != $len && self::$r1_index < 3) {
+            self::$r1_index = 3;
+            self::$r1 = substr($word, 3);
+        }
+    }
+    /**
+     * Standard suffix removal
+     */
+    private static function step1()
+    {
+        $word = self::$buffer;
+        $vowel = static::$vowel;
+        $rv_index = self::$rv_index;
+        $r1_index = self::$r1_index;
+        $r2_index = self::$r2_index;
+        $a_index = [];
+        $patterns = ['/(ance|iqUe|isme|able|iste|eux|'.
+            'ances|iqUes|ismes|ables|istes)$/u',
+            '/(atrice|ateur|ation|atrices|ateurs|ations)$/u',
+            '/(logie|logies)$/u', '/(usion|ution|usions|utions)$/u',
+            '/(ence|ences)$/u', '/(ement|ements)$/u', '/(ité|ités)$/u',
+            '/(if|ive|ifs|ives)$/u', '/(eaux)$/u', '/(aux)$/u',
+            '/(euse|euses)$/u',
+            "/[^$vowel](issement|issements)".'$/u', '/(amment)$/u',
+            '/(emment)$/u', "/[$vowel]".'(ment|ments)$/u'];
+        $i = 1;
+        foreach ($patterns as $pattern) {
+            $a_index[$i] = L\preg_search($pattern, $word);
+            $i++;
+        }
+        if ($a_index[1] != -1 && $a_index[1] >= $r2_index) {
+            $word = substr($word, 0, $a_index[1]);
+        } else if ($a_index[2] != -1 && $a_index[2] >= $r2_index) {
+            $word = substr($word, 0, $a_index[2]);
+            $a2_index2 = L\preg_search('/(ic)$/', $word);
+            if ($a2_index2 != -1 && $a2_index2 >= $r2_index){
+                $word = substr($word, 0, $a2_index2);
+                    //if preceded by ic, delete if in R2,
+            } else { //else replace by iqU
+                $word = preg_replace('/(ic)$/u','iqU', $word);
+            }
+        } else if ($a_index[3] != -1 && $a_index[3] >= $r2_index) {
+            //replace with log if in R2
+            $word = preg_replace('/(logie|logies)$/','log', $word);
+        } else if ($a_index[4] != -1 && $a_index[4] >= $r2_index){
+            //replace with u if in R2
+            $word = preg_replace('/(usion|ution|usions|utions)$/u','u', $word);
+        } else if ($a_index[5] != -1 && $a_index[5] >= $r2_index) {
+            //replace with ent if in R2
+            $word = preg_replace('/(ence|ences)$/u','ent', $word);
+        } else if ($a_index[12] != -1 && $a_index[12] >= $r1_index) {
+            //+1- amendment to non-vowel
+            $word = substr($word, 0, $a_index[12] + 1);
+        } else if ($a_index[6] != -1 && $a_index[6] >= $rv_index) {
+            if (L\preg_search("/(issement|issements)$/", $word) < 0) {
+                $word = substr($word, 0, $a_index[6]);
+                if (L\preg_search('/(iv)$/', $word) >= $r2_index) {
+                    $word = preg_replace('/(iv)$/u', '', $word);
+                    if (L\preg_search('/(at)$/', $word) >= $r2_index){
+                        $word = preg_replace('/(at)$/u', '', $word);
+                    }
+                } else if (
+                    ($a6_index2 = L\preg_search('/(eus)$/u', $word)) != -1) {
+                    if ($a6_index2 >= $r2_index) {
+                        $word = substr($word, 0, $a6_index2);
+                    } else if ($a6_index2 >= $r1_index){
+                        $word = substr($word, 0, $a6_index2) . "eux";
+                    }
+                } else if (L\preg_search('/(abl|iqU)$/', $word) >= $r2_index) {
+                    //if preceded by abl or iqU, delete if in R2,
+                    $word = preg_replace('/(abl|iqU)$/u', '', $word);
+                } else if (L\preg_search('/(ièr|Ièr)$/', $word) >= $rv_index) {
+                    //if preceded by abl or iqU, delete if in R2,
+                    $word = preg_replace('/(ièr|Ièr)$/u', 'i', $word);
+                }
+            } else if (L\preg_search("/[^$vowel](issement|issements)".'$/u',
+                $word) > 0) {
+                $word = preg_replace("/(issement|issements)".'$/u',
+                    '', $word);
+            }
+        } else if ($a_index[7] != -1 && $a_index[7] >= $r2_index) {
+            //delete if in R2
+            $word = substr($word, 0, $a_index[7]);
+            /*if preceded by abil, delete if in R2, else replace by abl,
+              otherwise,
+             */
+            if (($a7_index2 = L\preg_search('/(abil)$/', $word)) != -1) {
+                if ($a7_index2 >= $r2_index){
+                    $word = substr($word, 0, $a7_index2);
+                } else {
+                    $word = substr($word, 0, $a7_index2) . "abl";
+                }
+            } else if (($a7_index3 = L\preg_search('/(ic)$/', $word)) != -1) {
+                if ($a7_index3 >= $r2_index) {
+                    //if preceded by ic, delete if in R2,
+                    $word = substr($word, 0, $a7_index3);
+                } else {
+                    //else replace by iqU
+                    $word = preg_replace('/(ic)$/u', 'iqU', $word);
+                }
+            } else if (L\preg_search('/(iv)$/', $word) >= $r2_index){
+                $word = preg_replace('/(iv)$/u', '', $word);
+            }
+        } else if ($a_index[8] != -1 && $a_index[8] >= $r2_index) {
+            $word = substr($word, 0, $a_index[8]);
+            if (L\preg_search('/(at)$/', $word) >= $r2_index) {
+                $word = preg_replace('/(at)$/', '', $word);
+                if (L\preg_search('/(ic)$/', $word) >= $r2_index) {
+                    $word = preg_replace('/(ic)$/u', '', $word);
+                } else {
+                    $word = preg_replace('/(ic)$/u', 'iqU', $word);
+                }
+            }
+        } else if ($a_index[9] != -1) {
+            $word = preg_replace('/(eaux)/u', 'eau', $word);
+        } else if ($a_index[10] >= $r1_index) {
+            $word = preg_replace('/(aux)/u', 'al', $word);
+        } else if ($a_index[11] != -1 ){
+            $a11_index2 = L\preg_search('/(euse|euses)$/u', $word);
+            if ($a11_index2 >= $r2_index){
+                $word = substr($word, 0, $a11_index2);
+            } else if ($a11_index2 >= $r1_index){
+                $word = substr($word, 0, $a11_index2) . "eux";
+            }
+        }  else if ($a_index[13] != -1 && $a_index[13] >= $rv_index) {
+            $word = preg_replace('/(amment)$/u', 'ant', $word);
+        } else if ($a_index[14] != -1 && $a_index[14] >= $rv_index) {
+            $word = preg_replace('/(emment)$/u','ent', $word);
+        } else if ($a_index[15] != -1 && $a_index[15] >= $rv_index &&
+            $a_index[6] < 0) {
+            $tmp_index = L\preg_search('/(ment|ments)$/u', $word);
+            $word = substr($word, 0, $tmp_index);
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Stem verb suffixes beginning i
+     * @param string $ori_word original word before stemming
+     */
+    private static function step2a($ori_word)
+    {
+        $vowel = static::$vowel;
+        if ($ori_word == mb_strtolower(self::$buffer, "UTF-8") ||
+            (preg_match('/(amment|emment|ment|ments)$/u', $ori_word)
+            && !preg_match('/(ement(s)?)$/u', $ori_word))) {
+            $b1_regex = "/([^$vowel])".'(îmes|ît|îtes|i|ie|ies|ir|ira|irai|'.
+                'iraIent|irais|irait|iras|irent|irez|iriez|irions|irons|'.
+                'iront|is|issaIent|issais|issait|issant|issante|issantes|'.
+                'issants|isse|issent|isses|issez|issiez|issions|issons|it)$/u';
+            if (L\preg_search($b1_regex, self::$buffer) >= self::$rv_index) {
+                self::$buffer = preg_replace($b1_regex, '$1', self::$buffer);
+            }
+            return true;
+        }
+        return false;
+    }
+    /**
+     * Stem other verb suffixes
+     */
+    private static function step2b()
+    {
+        $word = self::$buffer;
+        if (L\preg_search('/(ions)$/u', $word) >= self::$r2_index &&
+            L\preg_search('/erions$/u', $word) == -1) {
+            $word = preg_replace('/(ions)$/u', '', $word);
+        } else {
+            $b2_regex = '/(é|ée|ées|és|èrent|er|' .
+                'era|erai|eraIent|erais|erait|'.
+                'eras|erez|eriez|erions|erons|eront|iez)$/u';
+            if (L\preg_search($b2_regex, $word) >= self::$rv_index) {
+                $word = preg_replace($b2_regex, '', $word);
+            } else if (L\preg_search('/iez$/iu', $word) >= self::$rv_index) {
+                //I am trying to avoid issues that eriez is a prefix of eriez
+                $word = preg_replace('/iez$/iu', '', $word);
+            }  else if (L\preg_search('/ez$/iu', $word) >= self::$rv_index) {
+                //I am trying to avoid issues that ez is a prefix of iez
+                $word = preg_replace('/ez$/iu', '', $word);
+            } else {
+                $b3_regex = '/e(âmes|ât|âtes|a|ai|aIent|' .
+                    'ais|ait|ant|ante|antes' .
+                    '|ants|as|asse|assent|asses|assiez|assions)$/u';
+                if (L\preg_search($b3_regex, $word) >= self::$rv_index) {
+                    $word = preg_replace($b3_regex, '', $word);
+                } else {
+                    $b3_regex2 = '/(âmes|ât|âtes|a|ai|aIent|' .
+                        'ais|ait|ant|ante|'.
+                        'antes|ants|as|asse|assent|asses|assiez|assions)$/u';
+                    if (L\preg_search($b3_regex2, $word) >= self::$rv_index) {
+                        $word = preg_replace($b3_regex2, '', $word);
+                    }
+                }
+            }
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Gets rid of cedille's (make c's) and words ending with Y (make i)
+     */
+    private static function step3()
+    {
+        $word = self::$buffer;
+        $word = preg_replace('/Y$/u', 'i', $word);
+        $word = preg_replace('/ç$/u', 'c', $word);
+        self::$buffer = $word;
+    }
+    /**
+     * If the word ends in an s, not preceded by a, i, o, u, è or s, delete it.
+     */
+    private static function step4()
+    {
+        $word = self::$buffer;
+
+        if (L\preg_search('/([^aiouès])s$/u', $word) >= 0) {
+            $word = preg_replace('/([^aiouès])s$/u', '$1', $word);
+        }
+        $e1_index = L\preg_search('/ion$/u', $word);
+        if ($e1_index >= self::$r2_index &&
+            L\preg_search('/[st]ion$/u', $word) >= self::$rv_index) {
+            $word = substr($word, 0, $e1_index);
+        } else {
+            $e2_index = L\preg_search('/(ier|ière|Ier|Ière)$/u', $word);
+            if ($e2_index != -1 && $e2_index >= self::$rv_index) {
+                $word = substr($word, 0, $e2_index)."i";
+            } else {
+                if (L\preg_search('/e$/u', $word) >= self::$rv_index) {
+                    $word = preg_replace('/e$/u', '', $word);   //delete last e
+                } else if (L\preg_search('/guë$/u', $word) >= self::$rv_index) {
+                    $word = preg_replace('/guë$/u', 'gu', $word);
+                }
+            }
+        }
+        self::$buffer = $word;
+    }
+    /**
+     * Un-double letter end
+     */
+    private static function step5()
+    {
+        self::$buffer = preg_replace("/(en|on)(n)$/u", '$1',
+            self::$buffer);
+        self::$buffer = preg_replace("/(ett)$/u", 'et',
+            self::$buffer);
+        self::$buffer = preg_replace("/(el|eil)(l)$/u", '$1',
+            self::$buffer);
+    }
+    /**
+     * Un-accent end
+     */
+    private static function step6()
+    {
+        $vowel = static::$vowel;
+        self::$buffer = preg_replace("/[éè]([^$vowel]+)$/u", 'e$1',
+            self::$buffer);
+        self:$buffer = mb_strtolower(self::$buffer);
+    }
+}
diff --git a/locale/fr_FR/resources/locale.js b/locale/fr_FR/resources/locale.js
new file mode 100755
index 0000000..77ec9b7
--- /dev/null
+++ b/locale/fr_FR/resources/locale.js
@@ -0,0 +1,45 @@
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\fr-FR
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015s
+ * @filesource
+ */
+/*
+ * The alphabet for this locale
+ */
+var alpha = "aåàbcçdeéêfghiîïjklmnoôpqrstuûvwxyz";
+/*
+ * Transliteration maping for this locale
+ */
+var roman_array = {};
+/*
+ * To analyze the query and generate actual input query from the
+ * transliterated query
+ */
+function analyzeQuery()
+{
+}
diff --git a/locale/fr_FR/resources/suggest_trie.txt.gz b/locale/fr_FR/resources/suggest_trie.txt.gz
new file mode 100755
index 0000000..6748fae
Binary files /dev/null and b/locale/fr_FR/resources/suggest_trie.txt.gz differ
diff --git a/locale/fr_FR/statistics.txt b/locale/fr_FR/statistics.txt
new file mode 100755
index 0000000..5ac0911
--- /dev/null
+++ b/locale/fr_FR/statistics.txt
@@ -0,0 +1 @@
+d:5;
\ No newline at end of file
diff --git a/locale/he/resources/Tokenizer.php b/locale/he/resources/Tokenizer.php
new file mode 100755
index 0000000..bb43f8a
--- /dev/null
+++ b/locale/he/resources/Tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\he\resources;
+
+/**
+ * Hebrew specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\he
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/hi/resources/Tokenizer.php b/locale/hi/resources/Tokenizer.php
new file mode 100755
index 0000000..90e2453
--- /dev/null
+++ b/locale/hi/resources/Tokenizer.php
@@ -0,0 +1,147 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\hi\resources;
+
+/**
+ * Hindi specific tokenization code. In particular, it has a stemmer,
+ * The stemmer is my stab at porting Ljiljana Dolamic (University of Neuchatel,
+ * www.unine.ch/info/clef/) Java stemming algorithm:
+ * http://members.unine.ch/jacques.savoy/clef/HindiStemmerLight.java.txt
+ * Here given a word, its stem is that part of the word that
+ * is common to all its inflected variants. For example,
+ * tall is common to tall, taller, tallest. A stemmer takes
+ * a word and tries to produce its stem.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\fa
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = [];
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = [
+            "पर ", "इन ", "वह ", "यिह ", "वुह ", "जिन्हें", "जिन्हों",
+            "तिन्हें", "तिन्हों", "किन्हों", "किन्हें", "इत्यादि", "द्वारा",
+            "इन्हें", "इन्हों", "उन्हों", "बिलकुल", "निहायत", "ऱ्वासा",
+            "इन्हीं", "उन्हीं", "उन्हें", "इसमें", "जितना", "दुसरा",
+            "कितना", "दबारा", "साबुत", "वग़ैरह", "दूसरे", "कौनसा", "लेकिन",
+            "होता", "करने", "किया", "लिये", "अपने", "नहीं", "दिया", "इसका",
+            "करना", "वाले", "सकते", "इसके", "सबसे", "होने", "करते", "बहुत",
+            "वर्ग", "करें", "होती", "अपनी", "उनके", "कहते", "होते", "करता",
+            "उनकी", "इसकी", "सकता", "रखें", "अपना", "उसके", "जिसे",
+            "तिसे", "किसे", "किसी", "काफ़ी", "पहले", "नीचे", "बाला", "यहाँ",
+            "जैसा", "जैसे", "मानो", "अंदर", "भीतर", "पूरा", "सारा", "होना",
+            "उनको", "वहाँ", "वहीं", "जहाँ", "जीधर","उनका", "इनका", "के",
+            "हैं", "गया", "बनी", "एवं", "हुआ", "साथ", "बाद", "लिए", "कुछ",
+            "कहा", "यदि", "हुई", "इसे", "हुए", "अभी", "सभी", "कुल", "रहा",
+            "रहे", "इसी", "उसे", "जिस", "जिन", "तिस", "तिन", "कौन", "किस",
+            "कोई", "ऐसे", "तरह", "किर", "साभ", "संग", "यही", "बही", "उसी",
+            "फिर", "मगर", "का", "एक", "यह", "से", "को", "इस", "कि", "जो",
+            "कर", "मे", "ने", "तो", "ही", "या", "हो", "था", "तक", "आप", "ये",
+            "थे", "दो", "वे", "थी", "जा", "ना", "उस", "एस", "पे", "उन", "सो",
+            "भी", "और", "घर", "तब", "जब", "अत", "व", "न"
+        ];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/u', '',
+            $page);
+        return $page;
+    }
+    /**
+     * Computes the stem of an Hindi word
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $word
+     */
+    public static function stem($word)
+    {
+        if (in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+        $word = self::removeSuffix($word);
+        return $word;
+    }
+    /**
+     * Removes common Hindi suffixes
+     *
+     * @param string $word to remove suffixes from
+     * @return string result of suffix removal
+     */
+    private static function removeSuffix($word)
+    {
+        $length = mb_strlen($word);
+        if ($length > 5) {
+            $last_three = mb_substr($word, -3);
+            if (in_array($last_three, ["िया", "ियो"])) {
+                $word = mb_substr($word, 0, -3);
+                return $word;
+            }
+        }
+        if ($length > 4) {
+            $last_two = mb_substr($word, -2);
+            if (in_array($last_two, ["ाए", " ाओ", " ुआ", " ुओ",
+                "ये", " ेन", " ेण", " ीय", "टी", "ार", "ाई"])) {
+                $word = mb_substr($word, 0, -2);
+                return $word;
+            }
+        }
+        if ($length > 3) {
+            $last_one = mb_substr($word, -1);
+             if (in_array($last_one, [" ा", " े", " ी", " ो", "ि ",
+                "अ"])) {
+                $word = mb_substr($word, 0, -1);
+                return $word;
+            }
+        }
+        return $word;
+    }
+
+}
diff --git a/locale/hi/resources/suggest_trie.txt.gz b/locale/hi/resources/suggest_trie.txt.gz
new file mode 100755
index 0000000..9218c00
Binary files /dev/null and b/locale/hi/resources/suggest_trie.txt.gz differ
diff --git a/locale/in_ID/configure.ini b/locale/in_ID/configure.ini
new file mode 100755
index 0000000..88ca75f
--- /dev/null
+++ b/locale/in_ID/configure.ini
@@ -0,0 +1,4503 @@
+; ***** BEGIN LICENSE BLOCK *****
+;  SeekQuarry/Yioop Open Source Pure PHP Search Engine, Crawler, and Indexer
+;  Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+;
+;  This program is free software: you can redistribute it and/or modify
+;  it under the terms of the GNU General Public License as published by
+;  the Free Software Foundation, either version 3 of the License, or
+;  (at your option) any later version.
+;
+;  This program is distributed in the hope that it will be useful,
+;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;  GNU General Public License for more details.
+;
+;  You should have received a copy of the GNU General Public License
+;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;  ***** END LICENSE BLOCK *****
+;
+; configure.ini
+;
+; in_ID configuration file
+;
+[general]
+;
+; Strings to translate on various pages
+;
+[strings]
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers
+;
+; AdminController.php line: 114
+admin_controller_need_cookies = ""
+;
+; AdminController.php line: 164
+admin_controller_account_not_active = ""
+;
+; AdminController.php line: 170
+admin_controller_login_successful = "Login berhasil"
+;
+; AdminController.php line: 189
+admin_controller_no_back_button = ""
+;
+; AdminController.php line: 203
+admin_controller_login_failed = "Login tidak berhasil"
+;
+; AdminController.php line: 209
+admin_controller_login_to_config = ""
+;
+; AdminController.php line: 213
+admin_controller_status_updates_stopped = ""
+;
+; AdminController.php line: 367
+admin_controller_account_access = ""
+;
+; AdminController.php line: 368
+admin_controller_social = ""
+;
+; AdminController.php line: 369
+admin_controller_crawl_settings = ""
+;
+; AdminController.php line: 370
+admin_controller_system_settings = ""
+;
+; AdminController.php line: 371
+admin_controller_advertisement = ""
+;
+; AdminController.php line: 545
+admin_controller_equal = ""
+;
+; AdminController.php line: 546
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 547
+admin_controller_contains = ""
+;
+; AdminController.php line: 548
+admin_controller_begins_with = ""
+;
+; AdminController.php line: 549
+admin_controller_ends_with = ""
+;
+; AdminController.php line: 552
+admin_controller_equal = ""
+;
+; AdminController.php line: 553
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 556
+admin_controller_no_sort = ""
+;
+; AdminController.php line: 557
+admin_controller_sort_ascending = ""
+;
+; AdminController.php line: 558
+admin_controller_sort_descending = ""
+;
+; MachineController.php line: 193
+machine_controller_nolines = ""
+;
+; RegisterController.php line: 249
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 315
+register_controller_account_created = ""
+;
+; RegisterController.php line: 333
+register_controller_registration_email_sent = ""
+;
+; RegisterController.php line: 335
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 336
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 338
+register_controller_email_body = ""
+;
+; RegisterController.php line: 372
+register_controller_account_request_made = ""
+;
+; RegisterController.php line: 376
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 377
+register_controller_admin_activation_message = ""
+;
+; RegisterController.php line: 419
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 425
+register_controller_already_activated = ""
+;
+; RegisterController.php line: 432
+register_controller_account_activated = ""
+;
+; RegisterController.php line: 435
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 483
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 492
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 496
+register_controller_account_recover_email = ""
+;
+; RegisterController.php line: 500
+register_controller_recover_request = ""
+;
+; RegisterController.php line: 501
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 503
+register_controller_recover_body = ""
+;
+; RegisterController.php line: 537
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 549
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 562
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 569
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 573
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 579
+register_controller_password_changed = ""
+;
+; RegisterController.php line: 587
+register_controller_passwords_dont_match = ""
+;
+; RegisterController.php line: 601
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 605
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 732
+register_controller_invalid_url = ""
+;
+; RegisterController.php line: 736
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 749
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 759
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 786
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 800
+register_controller_suggest_full = ""
+;
+; RegisterController.php line: 804
+register_controller_url_submitted = ""
+;
+; RegisterController.php line: 1006
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 1012
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 1027
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 1038
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 1066
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 1069
+register_controller_check_email = ""
+;
+; RegisterController.php line: 1076
+register_controller_user_already_exists = ""
+;
+; SearchController.php line: 280
+search_controller_web = ""
+;
+; SearchController.php line: 341
+search_controller_logout_successful = "Logout berhasil"
+;
+; SearchController.php line: 549
+search_controller_mix_info = ""
+;
+; SearchController.php line: 555
+search_controller_crawl_info = ""
+;
+; SearchController.php line: 591
+search_controller_search = ""
+;
+; SearchController.php line: 695
+search_controller_no_index_set = ""
+;
+; SearchController.php line: 698
+search_controller_no_index_set = ""
+;
+; SearchController.php line: 800
+search_controller_get_keyword_ads = ""
+;
+; SearchController.php line: 803
+search_controller_ad_keyword_description = ""
+;
+; SearchController.php line: 1382
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1391
+search_controller_no_archive_page = ""
+;
+; SearchController.php line: 1441
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1446
+search_controller_original_page = ""
+;
+; SearchController.php line: 1463
+search_controller_extracted_title = ""
+;
+; SearchController.php line: 1465
+search_controller_extracted_description = ""
+;
+; SearchController.php line: 1467
+search_controller_extracted_links = ""
+;
+; SearchController.php line: 1472
+search_controller_extracted_allow_paths = ""
+;
+; SearchController.php line: 1478
+search_controller_extracted_disallow_paths = ""
+;
+; SearchController.php line: 1484
+search_controller_crawl_delay = ""
+;
+; SearchController.php line: 1548
+search_controller_cache_comment = ""
+;
+; SearchController.php line: 1559
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1594
+search_controller_cached_version = ""
+;
+; SearchController.php line: 1689
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1707
+search_controller_header_summaries = ""
+;
+; SearchController.php line: 1821
+search_controller_history = ""
+;
+; SearchController.php line: 1991
+search_controller_all_cached = ""
+;
+; SearchController.php line: 2022
+search_controller_year = ""
+;
+; SearchController.php line: 2023
+search_controller_month = ""
+;
+; SettingsController.php line: 115
+settings_controller_crawl_mix = ""
+;
+; SettingsController.php line: 130
+settings_controller_settings_saved = ""
+;
+; StaticController.php line: 68
+static_controller_logout_successful = ""
+;
+; StaticController.php line: 146
+static_controller_complete_title = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers/components
+;
+; AccountaccessComponent.php line: 155
+accountaccess_component_no_posts_yet = ""
+;
+; AccountaccessComponent.php line: 171
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 181
+accountaccess_component_passwords_dont_match = "Kata sandi tidak sesuai"
+;
+; AccountaccessComponent.php line: 188
+accountaccess_component_invalid_password = ""
+;
+; AccountaccessComponent.php line: 230
+accountaccess_component_unknown_imagetype = ""
+;
+; AccountaccessComponent.php line: 235
+accountaccess_component_icon_too_big = ""
+;
+; AccountaccessComponent.php line: 244
+accountaccess_component_no_user_folder = ""
+;
+; AccountaccessComponent.php line: 253
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 294
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 295
+accountaccess_component_inactive_status = ""
+;
+; AccountaccessComponent.php line: 297
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 300
+accountaccess_component_request_join = ""
+;
+; AccountaccessComponent.php line: 301
+accountaccess_component_invited = ""
+;
+; AccountaccessComponent.php line: 302
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 304
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 352
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 357
+accountaccess_component_passwords_dont_match = "Kata sandi tidak sesuai"
+;
+; AccountaccessComponent.php line: 361
+accountaccess_component_invalid_username = ""
+;
+; AccountaccessComponent.php line: 365
+accountaccess_component_user_exists = ""
+;
+; AccountaccessComponent.php line: 394
+accountaccess_component_user_added = ""
+;
+; AccountaccessComponent.php line: 403
+accountaccess_component_user_doesnt_exist = ""
+;
+; AccountaccessComponent.php line: 410
+accountaccess_component_cant_edit_public_user = ""
+;
+; AccountaccessComponent.php line: 452
+accountaccess_component_passwords_dont_match = "Kata sandi tidak sesuai"
+;
+; AccountaccessComponent.php line: 458
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 464
+accountaccess_component_user_filter_group = ""
+;
+; AccountaccessComponent.php line: 468
+accountaccess_component_user_filter_role = ""
+;
+; AccountaccessComponent.php line: 479
+accountaccess_component_username_doesnt_exists = "Username tidak ditemukan"
+;
+; AccountaccessComponent.php line: 484
+accountaccess_component_cant_delete_builtin = ""
+;
+; AccountaccessComponent.php line: 489
+accountaccess_component_user_deleted = ""
+;
+; AccountaccessComponent.php line: 498
+accountaccess_component_username_doesnt_exists = "Username tidak ditemukan"
+;
+; AccountaccessComponent.php line: 503
+accountaccess_component_rolename_doesnt_exists = "Rolename tidak ditemukan"
+;
+; AccountaccessComponent.php line: 509
+accountaccess_component_rolename_already_added = ""
+;
+; AccountaccessComponent.php line: 515
+accountaccess_component_rolename_added = "Rolename telah ditambah"
+;
+; AccountaccessComponent.php line: 525
+accountaccess_component_username_doesnt_exists = "Username tidak ditemukan"
+;
+; AccountaccessComponent.php line: 530
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 536
+accountaccess_component_groupname_already_added = ""
+;
+; AccountaccessComponent.php line: 544
+accountaccess_component_groupname_added = ""
+;
+; AccountaccessComponent.php line: 554
+accountaccess_component_username_doesnt_exists = "Username tidak ditemukan"
+;
+; AccountaccessComponent.php line: 559
+accountaccess_component_rolename_doesnt_exists = "Rolename tidak ditemukan"
+;
+; AccountaccessComponent.php line: 568
+accountaccess_component_rolename_deleted = "Rolename telah dihapus"
+;
+; AccountaccessComponent.php line: 578
+accountaccess_component_username_doesnt_exists = "Username tidak ditemukan"
+;
+; AccountaccessComponent.php line: 583
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 592
+accountaccess_component_group_deleted = ""
+;
+; AccountaccessComponent.php line: 609
+accountaccess_component_username_doesnt_exists = "Username tidak ditemukan"
+;
+; AccountaccessComponent.php line: 615
+accountaccess_component_userstatus_updated = ""
+;
+; AccountaccessComponent.php line: 778
+accountaccess_component_select_activityname = "Pilih name aktivitas"
+;
+; AccountaccessComponent.php line: 803
+accountaccess_component_rolename_doesnt_exists = "Rolename tidak ditemukan"
+;
+; AccountaccessComponent.php line: 819
+accountaccess_component_activity_added = "Aktivitas telah ditambah"
+;
+; AccountaccessComponent.php line: 828
+accountaccess_component_rolename_exists = "Rolename ditemukan"
+;
+; AccountaccessComponent.php line: 834
+accountaccess_component_rolename_added = "Rolename telah ditambah"
+;
+; AccountaccessComponent.php line: 838
+accountaccess_component_rolename_blank = ""
+;
+; AccountaccessComponent.php line: 847
+accountaccess_component_rolename_doesnt_exists = "Rolename tidak ditemukan"
+;
+; AccountaccessComponent.php line: 865
+accountaccess_component_activity_deleted = "Aktivitas telah dihapus"
+;
+; AccountaccessComponent.php line: 873
+accountaccess_component_rolename_doesnt_exists = "Rolename tidak ditemukan"
+;
+; AccountaccessComponent.php line: 878
+accountaccess_component_rolename_deleted = "Rolename telah dihapus"
+;
+; AccountaccessComponent.php line: 910
+accountaccess_component_role_updated = ""
+;
+; AdvertisementComponent.php line: 55
+advertisement_component_num_days = ""
+;
+; AdvertisementComponent.php line: 56
+advertisement_component_one_day = ""
+;
+; AdvertisementComponent.php line: 57
+advertisement_component_seven_days = ""
+;
+; AdvertisementComponent.php line: 58
+advertisement_component_thirty_days = ""
+;
+; AdvertisementComponent.php line: 59
+advertisement_component_ninety_days = ""
+;
+; AdvertisementComponent.php line: 60
+advertisement_component_one_eighty_days = ""
+;
+; AdvertisementComponent.php line: 69
+advertisement_component_month = ""
+;
+; AdvertisementComponent.php line: 76
+advertisement_component_year = ""
+;
+; AdvertisementComponent.php line: 100
+advertisement_component_fields_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 105
+advertisement_component_duration_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 110
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 157
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 163
+advertisement_component_bid_too_low = ""
+;
+; AdvertisementComponent.php line: 171
+advertisement_component_processing_error = ""
+;
+; AdvertisementComponent.php line: 178
+advertisement_component_ad_created = ""
+;
+; AdvertisementComponent.php line: 206
+advertisement_component_status_changed = ""
+;
+; AdvertisementComponent.php line: 252
+advertisement_component_ad_updated = ""
+;
+; CrawlComponent.php line: 92
+crawl_component_starting_new_crawl = ""
+;
+; CrawlComponent.php line: 107
+crawl_component_stop_crawl = ""
+;
+; CrawlComponent.php line: 135
+crawl_component_resume_crawl = ""
+;
+; CrawlComponent.php line: 143
+crawl_component_delete_crawl_success = ""
+;
+; CrawlComponent.php line: 147
+crawl_component_delete_crawl_fail = ""
+;
+; CrawlComponent.php line: 156
+crawl_component_set_index = ""
+;
+; CrawlComponent.php line: 188
+crawl_component_no_description = ""
+;
+; CrawlComponent.php line: 336
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 337
+crawl_component_use_defaults = ""
+;
+; CrawlComponent.php line: 340
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 344
+crawl_component_previous_crawl = ""
+;
+; CrawlComponent.php line: 415
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 429
+crawl_component_add_suggest = ""
+;
+; CrawlComponent.php line: 433
+crawl_component_no_new_suggests = ""
+;
+; CrawlComponent.php line: 479
+crawl_component_breadth_first = ""
+;
+; CrawlComponent.php line: 481
+crawl_component_page_importance = ""
+;
+; CrawlComponent.php line: 545
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 555
+crawl_component_urls_injected = ""
+;
+; CrawlComponent.php line: 565
+crawl_component_update_seed_info = ""
+;
+; CrawlComponent.php line: 619
+crawl_component_new_classifier = ""
+;
+; CrawlComponent.php line: 623
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 646
+crawl_component_classifier_deleted = ""
+;
+; CrawlComponent.php line: 650
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 661
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 679
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 705
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 751
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 760
+crawl_component_load_failed = ""
+;
+; CrawlComponent.php line: 762
+crawl_component_loading = ""
+;
+; CrawlComponent.php line: 764
+crawl_component_added_examples = ""
+;
+; CrawlComponent.php line: 766
+crawl_component_label_update_failed = ""
+;
+; CrawlComponent.php line: 768
+crawl_component_updating = ""
+;
+; CrawlComponent.php line: 770
+crawl_component_acc_update_failed = ""
+;
+; CrawlComponent.php line: 772
+crawl_component_na = ""
+;
+; CrawlComponent.php line: 774
+crawl_component_no_docs = ""
+;
+; CrawlComponent.php line: 776
+crawl_component_num_docs = ""
+;
+; CrawlComponent.php line: 778
+crawl_component_in_class = ""
+;
+; CrawlComponent.php line: 780
+crawl_component_not_in_class = ""
+;
+; CrawlComponent.php line: 782
+crawl_component_skip = ""
+;
+; CrawlComponent.php line: 784
+crawl_component_prediction = ""
+;
+; CrawlComponent.php line: 786
+crawl_component_scores = ""
+;
+; CrawlComponent.php line: 823
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 824
+crawl_component_use_defaults = ""
+;
+; CrawlComponent.php line: 826
+crawl_component_use_below = ""
+;
+; CrawlComponent.php line: 834
+crawl_component_recrawl_never = ""
+;
+; CrawlComponent.php line: 835
+crawl_component_recrawl_1day = ""
+;
+; CrawlComponent.php line: 836
+crawl_component_recrawl_2day = ""
+;
+; CrawlComponent.php line: 837
+crawl_component_recrawl_3day = ""
+;
+; CrawlComponent.php line: 838
+crawl_component_recrawl_7day = ""
+;
+; CrawlComponent.php line: 839
+crawl_component_recrawl_14day = ""
+;
+; CrawlComponent.php line: 847
+crawl_component_basic = ""
+;
+; CrawlComponent.php line: 848
+crawl_component_centroid = ""
+;
+; CrawlComponent.php line: 849
+crawl_component_graph_based = ""
+;
+; CrawlComponent.php line: 1137
+crawl_component_page_options_updated = ""
+;
+; CrawlComponent.php line: 1165
+crawl_component_page_options_running_tests = ""
+;
+; CrawlComponent.php line: 1346
+crawl_component_results_editor_update = ""
+;
+; CrawlComponent.php line: 1361
+crawl_component_edited_pages = ""
+;
+; CrawlComponent.php line: 1374
+crawl_component_results_editor_need_url = ""
+;
+; CrawlComponent.php line: 1380
+crawl_component_results_editor_page_updated = ""
+;
+; CrawlComponent.php line: 1393
+crawl_component_results_editor_page_loaded = ""
+;
+; CrawlComponent.php line: 1424
+crawl_component_media_kind = ""
+;
+; CrawlComponent.php line: 1425
+crawl_component_video = ""
+;
+; CrawlComponent.php line: 1426
+crawl_component_rss_feed = ""
+;
+; CrawlComponent.php line: 1427
+crawl_component_html_feed = ""
+;
+; CrawlComponent.php line: 1441
+crawl_component_sources_indexes = ""
+;
+; CrawlComponent.php line: 1496
+crawl_component_no_source_type = ""
+;
+; CrawlComponent.php line: 1510
+crawl_component_missing_type = ""
+;
+; CrawlComponent.php line: 1524
+crawl_component_invalid_url = ""
+;
+; CrawlComponent.php line: 1531
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1548
+crawl_component_media_source_added = ""
+;
+; CrawlComponent.php line: 1561
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1569
+crawl_component_subsearch_added = ""
+;
+; CrawlComponent.php line: 1575
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1581
+crawl_component_media_source_deleted = ""
+;
+; CrawlComponent.php line: 1588
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1595
+crawl_component_subsearch_deleted = ""
+;
+; CrawlComponent.php line: 1630
+crawl_component_subsearch_updated = ""
+;
+; CrawlComponent.php line: 1705
+crawl_component_media_source_updated = ""
+;
+; SocialComponent.php line: 92
+social_component_request_join = ""
+;
+; SocialComponent.php line: 93
+social_component_invited = ""
+;
+; SocialComponent.php line: 94
+social_component_active_status = ""
+;
+; SocialComponent.php line: 95
+social_component_suspended_status = ""
+;
+; SocialComponent.php line: 98
+social_component_no_join = ""
+;
+; SocialComponent.php line: 99
+social_component_by_request = ""
+;
+; SocialComponent.php line: 101
+social_component_public_request = ""
+;
+; SocialComponent.php line: 102
+social_component_public_join = ""
+;
+; SocialComponent.php line: 105
+social_component_private = ""
+;
+; SocialComponent.php line: 106
+social_component_read = ""
+;
+; SocialComponent.php line: 107
+social_component_read_comment = ""
+;
+; SocialComponent.php line: 108
+social_component_read_write = ""
+;
+; SocialComponent.php line: 109
+social_component_read_wiki = ""
+;
+; SocialComponent.php line: 112
+social_component_no_voting = ""
+;
+; SocialComponent.php line: 113
+social_component_up_voting = ""
+;
+; SocialComponent.php line: 114
+social_component_up_down_voting = ""
+;
+; SocialComponent.php line: 117
+social_component_forever = ""
+;
+; SocialComponent.php line: 118
+social_component_one_hour = ""
+;
+; SocialComponent.php line: 119
+social_component_one_day = ""
+;
+; SocialComponent.php line: 120
+social_component_one_month = ""
+;
+; SocialComponent.php line: 192
+accountaccess_component_user_activated = ""
+;
+; SocialComponent.php line: 197
+accountaccess_component_no_user_activated = ""
+;
+; SocialComponent.php line: 216
+social_component_joined = ""
+;
+; SocialComponent.php line: 220
+social_component_groupname_unavailable = ""
+;
+; SocialComponent.php line: 226
+social_component_name_available = ""
+;
+; SocialComponent.php line: 243
+social_component_user_banned = ""
+;
+; SocialComponent.php line: 248
+social_component_no_user_banned = ""
+;
+; SocialComponent.php line: 269
+social_component_owner_changed = ""
+;
+; SocialComponent.php line: 274
+social_component_not_in_group = ""
+;
+; SocialComponent.php line: 280
+social_component_not_a_user = ""
+;
+; SocialComponent.php line: 296
+social_component_groupname_exists = ""
+;
+; SocialComponent.php line: 320
+social_component_groupname_added = ""
+;
+; SocialComponent.php line: 329
+social_component_groupname_doesnt_exists = ""
+;
+; SocialComponent.php line: 336
+social_component_group_deleted = ""
+;
+; SocialComponent.php line: 339
+social_component_no_delete_group = ""
+;
+; SocialComponent.php line: 352
+social_component_user_deleted = ""
+;
+; SocialComponent.php line: 357
+social_component_no_delete_user_group = ""
+;
+; SocialComponent.php line: 406
+social_component_users_invited = ""
+;
+; SocialComponent.php line: 411
+social_component_no_users_invited = ""
+;
+; SocialComponent.php line: 427
+social_component_joined = ""
+;
+; SocialComponent.php line: 430
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 471
+social_component_user_reinstated = ""
+;
+; SocialComponent.php line: 476
+social_component_no_user_reinstated = ""
+;
+; SocialComponent.php line: 483
+social_component_request_join = ""
+;
+; SocialComponent.php line: 485
+social_component_invited = ""
+;
+; SocialComponent.php line: 487
+social_component_banned_status = ""
+;
+; SocialComponent.php line: 504
+social_component_unsubscribe = ""
+;
+; SocialComponent.php line: 508
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 556
+social_component_group_joined = ""
+;
+; SocialComponent.php line: 558
+social_component_group_request_join = ""
+;
+; SocialComponent.php line: 573
+social_component_activate_group = ""
+;
+; SocialComponent.php line: 580
+social_component_activate_body = ""
+;
+; SocialComponent.php line: 584
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 585
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 656
+social_component_no_permission = ""
+;
+; SocialComponent.php line: 669
+social_component_group_updated = ""
+;
+; SocialComponent.php line: 677
+social_component_unknown_access = ""
+;
+; SocialComponent.php line: 685
+social_component_group_filter_users = ""
+;
+; SocialComponent.php line: 776
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 780
+social_component_no_comment = ""
+;
+; SocialComponent.php line: 792
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 798
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 802
+social_component_join_group = ""
+;
+; SocialComponent.php line: 805
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 820
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 833
+social_component_thread_notification = ""
+;
+; SocialComponent.php line: 835
+social_component_notify_body = ""
+;
+; SocialComponent.php line: 838
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 839
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 841
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 848
+social_component_comment_added = ""
+;
+; SocialComponent.php line: 859
+social_component_groupname_cant_add = ""
+;
+; SocialComponent.php line: 865
+social_component_delete_error = ""
+;
+; SocialComponent.php line: 885
+social_component_item_deleted = ""
+;
+; SocialComponent.php line: 888
+social_component_no_item_deleted = ""
+;
+; SocialComponent.php line: 896
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 905
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 910
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 914
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 918
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 924
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 929
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 940
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 948
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 961
+social_component_new_thread_mail = ""
+;
+; SocialComponent.php line: 965
+social_component_new_thread_body = ""
+;
+; SocialComponent.php line: 969
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 970
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 975
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 983
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 991
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 995
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 1001
+social_component_post_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1009
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1022
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1031
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1034
+social_component_post_updated = ""
+;
+; SocialComponent.php line: 1041
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 1050
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 1055
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 1059
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 1063
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 1094
+social_component_join_group = ""
+;
+; SocialComponent.php line: 1097
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 1373
+accountaccess_component_no_posts_yet = ""
+;
+; SocialComponent.php line: 1416
+social_component_search = ""
+;
+; SocialComponent.php line: 1503
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1506
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1530
+social_component_standard_page = ""
+;
+; SocialComponent.php line: 1531
+social_component_page_alias = ""
+;
+; SocialComponent.php line: 1532
+social_component_media_list = ""
+;
+; SocialComponent.php line: 1533
+social_component_presentation = ""
+;
+; SocialComponent.php line: 1536
+social_component_solid = ""
+;
+; SocialComponent.php line: 1537
+social_component_dashed = ""
+;
+; SocialComponent.php line: 1538
+social_component_none = ""
+;
+; SocialComponent.php line: 1577
+social_component_missing_fields = ""
+;
+; SocialComponent.php line: 1583
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1633
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1634
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1639
+social_component_page_saved = ""
+;
+; SocialComponent.php line: 1651
+social_component_resource_deleted = ""
+;
+; SocialComponent.php line: 1656
+social_component_resource_not_deleted = ""
+;
+; SocialComponent.php line: 1673
+social_component_resource_renamed = ""
+;
+; SocialComponent.php line: 1678
+social_component_resource_not_renamed = ""
+;
+; SocialComponent.php line: 1688
+social_component_resource_save_first = ""
+;
+; SocialComponent.php line: 1700
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1702
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1706
+social_component_resource_uploaded = ""
+;
+; SocialComponent.php line: 1711
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1758
+social_component_back = ""
+;
+; SocialComponent.php line: 1759
+social_component_history_page = ""
+;
+; SocialComponent.php line: 1794
+social_component_back = ""
+;
+; SocialComponent.php line: 1795
+social_component_diff_page = ""
+;
+; SocialComponent.php line: 1809
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1817
+social_component_page_revert_to = ""
+;
+; SocialComponent.php line: 1821
+social_component_page_reverted = ""
+;
+; SocialComponent.php line: 1825
+social_component_revert_error = ""
+;
+; SocialComponent.php line: 1896
+social_component_main = ""
+;
+; SocialComponent.php line: 2142
+wiki_js_small = ""
+;
+; SocialComponent.php line: 2143
+wiki_js_medium = ""
+;
+; SocialComponent.php line: 2144
+wiki_js_large = ""
+;
+; SocialComponent.php line: 2145
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2146
+wiki_js_prompt_heading = ""
+;
+; SocialComponent.php line: 2147
+wiki_js_example = ""
+;
+; SocialComponent.php line: 2148
+wiki_js_table_title = ""
+;
+; SocialComponent.php line: 2149
+wiki_js_submit = ""
+;
+; SocialComponent.php line: 2150
+wiki_js_cancel = ""
+;
+; SocialComponent.php line: 2151
+wiki_js_bold = ""
+;
+; SocialComponent.php line: 2152
+wiki_js_italic = ""
+;
+; SocialComponent.php line: 2153
+wiki_js_underline = ""
+;
+; SocialComponent.php line: 2154
+wiki_js_strike = ""
+;
+; SocialComponent.php line: 2155
+wiki_js_heading = ""
+;
+; SocialComponent.php line: 2156
+wiki_js_heading1 = ""
+;
+; SocialComponent.php line: 2157
+wiki_js_heading2 = ""
+;
+; SocialComponent.php line: 2158
+wiki_js_heading3 = ""
+;
+; SocialComponent.php line: 2159
+wiki_js_heading4 = ""
+;
+; SocialComponent.php line: 2160
+wiki_js_bullet = ""
+;
+; SocialComponent.php line: 2161
+wiki_js_enum = ""
+;
+; SocialComponent.php line: 2162
+wiki_js_nowiki = ""
+;
+; SocialComponent.php line: 2163
+wiki_js_add_search = ""
+;
+; SocialComponent.php line: 2164
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2165
+wiki_js_add_wiki_table = ""
+;
+; SocialComponent.php line: 2166
+wiki_js_for_table_cols = ""
+;
+; SocialComponent.php line: 2167
+wiki_js_for_table_rows = ""
+;
+; SocialComponent.php line: 2168
+wiki_js_add_hyperlink = ""
+;
+; SocialComponent.php line: 2169
+wiki_js_link_text = ""
+;
+; SocialComponent.php line: 2170
+wiki_js_link_url = ""
+;
+; SocialComponent.php line: 2171
+wiki_js_placeholder = ""
+;
+; SocialComponent.php line: 2172
+wiki_js_centeraligned = ""
+;
+; SocialComponent.php line: 2173
+wiki_js_rightaligned = ""
+;
+; SocialComponent.php line: 2174
+wiki_js_leftaligned = ""
+;
+; SocialComponent.php line: 2176
+wiki_js_definitionlist_item = ""
+;
+; SocialComponent.php line: 2178
+wiki_js_definitionlist_definition = ""
+;
+; SocialComponent.php line: 2180
+wiki_js_slide_sample_title = ""
+;
+; SocialComponent.php line: 2182
+wiki_js_slide_sample_bullet = ""
+;
+; SocialComponent.php line: 2184
+wiki_js_slide_resource_description = ""
+;
+; SocialComponent.php line: 2222
+social_component_select_crawl = ""
+;
+; SocialComponent.php line: 2223
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2225
+social_component_select_crawl = ""
+;
+; SocialComponent.php line: 2227
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2257
+social_component_mix_created = ""
+;
+; SocialComponent.php line: 2260
+social_component_invalid_name = ""
+;
+; SocialComponent.php line: 2268
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2272
+social_component_mix_deleted = ""
+;
+; SocialComponent.php line: 2291
+social_component_mix_doesnt_exists = ""
+;
+; SocialComponent.php line: 2299
+social_component_mix_imported = ""
+;
+; SocialComponent.php line: 2313
+social_component_set_index = ""
+;
+; SocialComponent.php line: 2322
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 2328
+social_component_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2346
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 2350
+social_component_share_title = ""
+;
+; SocialComponent.php line: 2352
+social_component_share_description = ""
+;
+; SocialComponent.php line: 2357
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 2408
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2413
+social_component_mix_not_owner = ""
+;
+; SocialComponent.php line: 2423
+social_component_add_crawls = ""
+;
+; SocialComponent.php line: 2425
+social_component_num_results = ""
+;
+; SocialComponent.php line: 2427
+social_component_del_frag = ""
+;
+; SocialComponent.php line: 2429
+social_component_weight = ""
+;
+; SocialComponent.php line: 2430
+social_component_name = ""
+;
+; SocialComponent.php line: 2432
+social_component_add_keywords = ""
+;
+; SocialComponent.php line: 2434
+social_component_actions = ""
+;
+; SocialComponent.php line: 2436
+social_component_add_query = ""
+;
+; SocialComponent.php line: 2437
+social_component_delete = ""
+;
+; SocialComponent.php line: 2487
+social_component_too_many_fragments = ""
+;
+; SocialComponent.php line: 2498
+social_component_mix_saved = ""
+;
+; SystemComponent.php line: 82
+system_component_select_machine = ""
+;
+; SystemComponent.php line: 143
+system_component_machine_added = ""
+;
+; SystemComponent.php line: 147
+system_component_machine_exists = ""
+;
+; SystemComponent.php line: 151
+system_component_machine_incomplete = ""
+;
+; SystemComponent.php line: 158
+system_component_machine_doesnt_exists = ""
+;
+; SystemComponent.php line: 179
+system_component_stop_service_first = ""
+;
+; SystemComponent.php line: 185
+system_component_machine_deleted = ""
+;
+; SystemComponent.php line: 200
+system_component_updatemode_toggled = ""
+;
+; SystemComponent.php line: 246
+system_component_no_machine_log = ""
+;
+; SystemComponent.php line: 270
+system_component_machine_servers_updated = ""
+;
+; SystemComponent.php line: 274
+system_component_machine_no_action = ""
+;
+; SystemComponent.php line: 310
+system_component_select_mode = ""
+;
+; SystemComponent.php line: 351
+system_component_locale_missing_info = ""
+;
+; SystemComponent.php line: 358
+system_component_locale_added = "Locale telah ditambah"
+;
+; SystemComponent.php line: 365
+system_component_localename_doesnt_exists = "Locale tidak ditemukan"
+;
+; SystemComponent.php line: 370
+system_component_localename_deleted = "Locale telah dihapus"
+;
+; SystemComponent.php line: 376
+system_component_localename_doesnt_exists = "Locale tidak ditemukan"
+;
+; SystemComponent.php line: 405
+system_component_locale_updated = ""
+;
+; SystemComponent.php line: 435
+system_component_localestrings_updated = ""
+;
+; SystemComponent.php line: 446
+system_component_all_strings = ""
+;
+; SystemComponent.php line: 447
+system_component_missing_strings = ""
+;
+; SystemComponent.php line: 566
+system_component_configure_no_change_db = ""
+;
+; SystemComponent.php line: 571
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 574
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 607
+system_component_configure_disable_registration = ""
+;
+; SystemComponent.php line: 609
+system_component_configure_no_activation = ""
+;
+; SystemComponent.php line: 611
+system_component_configure_email_activation = ""
+;
+; SystemComponent.php line: 613
+system_component_configure_admin_activation = ""
+;
+; SystemComponent.php line: 617
+system_component_configure_no_advertisements = ""
+;
+; SystemComponent.php line: 619
+system_component_configure_keyword_advertisements = ""
+;
+; SystemComponent.php line: 621
+system_component_configure_external_advertisements = ""
+;
+; SystemComponent.php line: 704
+captchasettings_element_text_captcha = ""
+;
+; SystemComponent.php line: 706
+captchasettings_element_hash_captcha = ""
+;
+; SystemComponent.php line: 708
+captchasettings_element_image_captcha = ""
+;
+; SystemComponent.php line: 713
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 715
+serversettings_element_zkp_authentication = ""
+;
+; SystemComponent.php line: 720
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 744
+system_component_settings_updated = ""
+;
+; SystemComponent.php line: 747
+system_component_no_update_settings = ""
+;
+; SystemComponent.php line: 788
+system_component_no_resource_folder = ""
+;
+; SystemComponent.php line: 802
+system_component_invalid_filetype = ""
+;
+; SystemComponent.php line: 807
+system_component_file_too_big = ""
+;
+; SystemComponent.php line: 822
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 826
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 875
+system_component_configure_reset_completed = ""
+;
+; SystemComponent.php line: 878
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 957
+system_component_configure_use_absolute_path = ""
+;
+; SystemComponent.php line: 962
+system_component_configure_configure_diff_base_dir = ""
+;
+; SystemComponent.php line: 993
+system_component_configure_work_dir_set = ""
+;
+; SystemComponent.php line: 1004
+system_component_name_your_bot = ""
+;
+; SystemComponent.php line: 1029
+system_component_configure_work_profile_made = ""
+;
+; SystemComponent.php line: 1033
+system_component_configure_no_set_config = ""
+;
+; SystemComponent.php line: 1040
+system_component_configure_no_create_profile = ""
+;
+; SystemComponent.php line: 1047
+system_component_configure_work_dir_invalid = ""
+;
+; SystemComponent.php line: 1054
+system_component_configure_work_dir_invalid = ""
+;
+; SystemComponent.php line: 1083
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 1087
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 1107
+system_component_describe_robot = ""
+;
+; SystemComponent.php line: 1161
+system_component_php_version = ""
+;
+; SystemComponent.php line: 1169
+system_component_no_write_config_php = ""
+;
+; SystemComponent.php line: 1174
+system_component_no_write_work_dir = ""
+;
+; SystemComponent.php line: 1179
+system_component_post_size_small = ""
+;
+; SystemComponent.php line: 1185
+system_component_missing_required = ""
+;
+; SystemComponent.php line: 1209
+system_component_missing_optional = ""
+;
+; SystemComponent.php line: 1215
+system_component_check_passed = ""
+;
+; SystemComponent.php line: 1220
+system_component_using_local_config = ""
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/controllers
+;
+; MainController.php line: 74
+search_controller_logout_successful = "Logout berhasil"
+;
+; MainController.php line: 98
+main_controller_download = ""
+;
+; MainController.php line: 115
+main_controller_missing_fields = ""
+;
+; MainController.php line: 150
+main_controller_yioop_download = ""
+;
+; MainController.php line: 151
+main_controller_click_download = ""
+;
+; MainController.php line: 164
+main_controller_url_error = ""
+;
+; MainController.php line: 173
+main_controller_expired_url = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views
+;
+; AdminView.php line: 71
+admin_view_admin = "Administratif"
+;
+; AdminView.php line: 92
+adminview_auto_logout_one_minute = ""
+;
+; CrawlstatusView.php line: 57
+crawlstatus_view_currently_processing = ""
+;
+; CrawlstatusView.php line: 58
+crawlstatus_view_description = ""
+;
+; CrawlstatusView.php line: 62
+crawlstatus_view_starting_crawl = ""
+;
+; CrawlstatusView.php line: 66
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 70
+crawlstatus_view_resuming_crawl = ""
+;
+; CrawlstatusView.php line: 74
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 78
+crawlstatus_view_shutdown_queue = ""
+;
+; CrawlstatusView.php line: 81
+crawlstatus_view_closing_dict = ""
+;
+; CrawlstatusView.php line: 84
+crawlstatus_view_run_plugins = ""
+;
+; CrawlstatusView.php line: 92
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 100
+crawlstatus_view_set_index = ""
+;
+; CrawlstatusView.php line: 103
+crawlstatus_view_search_index = ""
+;
+; CrawlstatusView.php line: 110
+crawlstatus_view_changeoptions = ""
+;
+; CrawlstatusView.php line: 112
+crawlstatus_view_no_description = ""
+;
+; CrawlstatusView.php line: 117
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 119
+crawlstatus_view_time_started = ""
+;
+; CrawlstatusView.php line: 125
+crawlstatus_view_indexer_memory = ""
+;
+; CrawlstatusView.php line: 127
+crawlstatus_view_scheduler_memory = ""
+;
+; CrawlstatusView.php line: 130
+crawlstatus_view_queue_memory = ""
+;
+; CrawlstatusView.php line: 135
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 139
+crawlstatus_view_fetcher_memory = ""
+;
+; CrawlstatusView.php line: 144
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 147
+crawlstatus_view_webapp_memory = ""
+;
+; CrawlstatusView.php line: 152
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 155
+crawlstatus_view_urls_per_hour = ""
+;
+; CrawlstatusView.php line: 163
+crawlstatus_view_visited_urls = ""
+;
+; CrawlstatusView.php line: 167
+crawlstatus_view_total_urls = ""
+;
+; CrawlstatusView.php line: 170
+crawlstatus_view_most_recent_fetcher = ""
+;
+; CrawlstatusView.php line: 179
+crawlstatus_view_no_fetcher = ""
+;
+; CrawlstatusView.php line: 183
+crawlstatus_view_most_recent_urls = ""
+;
+; CrawlstatusView.php line: 193
+crawlstatus_view_no_recent_urls = ""
+;
+; CrawlstatusView.php line: 196
+crawlstatus_view_previous_crawls = ""
+;
+; CrawlstatusView.php line: 207
+crawlstatus_view_description = ""
+;
+; CrawlstatusView.php line: 210
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 211
+crawlstatus_view_url_counts = ""
+;
+; CrawlstatusView.php line: 215
+crawlstatus_view_actions = ""
+;
+; CrawlstatusView.php line: 226
+crawlstatus_view_statistics = ""
+;
+; CrawlstatusView.php line: 242
+crawlstatus_view_resume = ""
+;
+; CrawlstatusView.php line: 244
+crawlstatus_view_no_resume = ""
+;
+; CrawlstatusView.php line: 251
+crawlstatus_view_set_index = ""
+;
+; CrawlstatusView.php line: 254
+crawlstatus_view_search_index = ""
+;
+; CrawlstatusView.php line: 261
+crawlstatus_view_delete = ""
+;
+; CrawlstatusView.php line: 269
+crawlstatus_view_no_previous_crawl = ""
+;
+; GroupView.php line: 82
+groupfeed_element_wiki_thread = ""
+;
+; GroupView.php line: 96
+group_view_feed = ""
+;
+; GroupView.php line: 104
+group_view_wiki = ""
+;
+; GroupView.php line: 106
+group_view_user = ""
+;
+; GroupView.php line: 109
+group_view_myfeeds = ""
+;
+; GroupView.php line: 145
+adminview_auto_logout_one_minute = ""
+;
+; MachinestatusView.php line: 56
+machinestatus_view_no_monitored = ""
+;
+; MachinestatusView.php line: 60
+machinestatus_media_updatemode = ""
+;
+; MachinestatusView.php line: 73
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 75
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 78
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 80
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 85
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 94
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 96
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 125
+confirm_delete_operation = ""
+;
+; MachinestatusView.php line: 126
+machinestatus_view_delete = ""
+;
+; MachinestatusView.php line: 148
+machinestatus_view_not_configured = ""
+;
+; MachinestatusView.php line: 158
+machinestatus_view_mirrors = ""
+;
+; MachinestatusView.php line: 161
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 176
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 179
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 191
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 193
+machinestatus_view_no_queue_server = ""
+;
+; MachinestatusView.php line: 204
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 207
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 229
+machinestatus_view_no_fetchers = ""
+;
+; MachinestatusView.php line: 241
+machinestatus_view_fetchers = ""
+;
+; MachinestatusView.php line: 248
+machinestatus_view_log = ""
+;
+; NocacheView.php line: 54
+nocache_view_no_cache = ""
+;
+; NocacheView.php line: 59
+nocache_view_summary_contents = ""
+;
+; RecoverView.php line: 71
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 104
+register_view_new_password = ""
+;
+; RecoverView.php line: 116
+register_view_retypepassword = ""
+;
+; RecoverView.php line: 131
+recover_view_username = ""
+;
+; RecoverView.php line: 146
+register_view_account_recovery = ""
+;
+; RecoverView.php line: 153
+register_view_human_check = ""
+;
+; RecoverView.php line: 185
+register_view_human_check = ""
+;
+; RecoverView.php line: 202
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 211
+recover_view_return = ""
+;
+; RegisterView.php line: 76
+register_view_question0_most = ""
+;
+; RegisterView.php line: 77
+register_view_question0_least = ""
+;
+; RegisterView.php line: 78
+register_view_question0_choices = ""
+;
+; RegisterView.php line: 79
+register_view_question1_most = ""
+;
+; RegisterView.php line: 80
+register_view_question1_least = ""
+;
+; RegisterView.php line: 81
+register_view_question1_choices = ""
+;
+; RegisterView.php line: 82
+register_view_question2_most = ""
+;
+; RegisterView.php line: 83
+register_view_question2_least = ""
+;
+; RegisterView.php line: 84
+register_view_question2_choices = ""
+;
+; RegisterView.php line: 85
+register_view_question3_most = ""
+;
+; RegisterView.php line: 86
+register_view_question3_least = ""
+;
+; RegisterView.php line: 87
+register_view_question3_choices = ""
+;
+; RegisterView.php line: 88
+register_view_question4_most = ""
+;
+; RegisterView.php line: 89
+register_view_question4_least = ""
+;
+; RegisterView.php line: 90
+register_view_question4_choices = ""
+;
+; RegisterView.php line: 91
+register_view_question5_most = ""
+;
+; RegisterView.php line: 92
+register_view_question5_least = ""
+;
+; RegisterView.php line: 93
+register_view_question5_choices = ""
+;
+; RegisterView.php line: 94
+register_view_question6_most = ""
+;
+; RegisterView.php line: 95
+register_view_question6_least = ""
+;
+; RegisterView.php line: 96
+register_view_question6_choices = ""
+;
+; RegisterView.php line: 97
+register_view_question7_most = ""
+;
+; RegisterView.php line: 98
+register_view_question7_least = ""
+;
+; RegisterView.php line: 99
+register_view_question7_choices = ""
+;
+; RegisterView.php line: 100
+register_view_question8_most = ""
+;
+; RegisterView.php line: 101
+register_view_question8_least = ""
+;
+; RegisterView.php line: 102
+register_view_question8_choices = ""
+;
+; RegisterView.php line: 103
+register_view_question9_most = ""
+;
+; RegisterView.php line: 104
+register_view_question9_least = ""
+;
+; RegisterView.php line: 105
+register_view_question9_choices = ""
+;
+; RegisterView.php line: 108
+register_view_recovery1_more = ""
+;
+; RegisterView.php line: 109
+register_view_recovery1_less = ""
+;
+; RegisterView.php line: 110
+register_view_recovery1_choices = ""
+;
+; RegisterView.php line: 111
+register_view_recovery2_more = ""
+;
+; RegisterView.php line: 112
+register_view_recovery2_less = ""
+;
+; RegisterView.php line: 113
+register_view_recovery2_choices = ""
+;
+; RegisterView.php line: 114
+register_view_recovery3_more = ""
+;
+; RegisterView.php line: 115
+register_view_recovery3_less = ""
+;
+; RegisterView.php line: 116
+register_view_recovery3_choices = ""
+;
+; RegisterView.php line: 117
+register_view_recovery4_more = ""
+;
+; RegisterView.php line: 118
+register_view_recovery4_less = ""
+;
+; RegisterView.php line: 119
+register_view_recovery4_choices = ""
+;
+; RegisterView.php line: 120
+register_view_recovery5_more = ""
+;
+; RegisterView.php line: 121
+register_view_recovery5_less = ""
+;
+; RegisterView.php line: 122
+register_view_recovery5_choices = ""
+;
+; RegisterView.php line: 123
+register_view_recovery6_more = ""
+;
+; RegisterView.php line: 124
+register_view_recovery6_less = ""
+;
+; RegisterView.php line: 125
+register_view_recovery6_choices = ""
+;
+; RegisterView.php line: 153
+register_view_create_account = ""
+;
+; RegisterView.php line: 190
+register_view_firstname = ""
+;
+; RegisterView.php line: 205
+register_view_lastname = ""
+;
+; RegisterView.php line: 219
+register_view_username = ""
+;
+; RegisterView.php line: 232
+register_view_email = ""
+;
+; RegisterView.php line: 246
+register_view_password = ""
+;
+; RegisterView.php line: 261
+register_view_retypepassword = ""
+;
+; RegisterView.php line: 277
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 281
+register_view_human_check = ""
+;
+; RegisterView.php line: 283
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 315
+register_view_human_check = ""
+;
+; RegisterView.php line: 329
+register_view_i_agree = ""
+;
+; RegisterView.php line: 331
+register_view_terms = ""
+;
+; RegisterView.php line: 333
+register_view_and = ""
+;
+; RegisterView.php line: 335
+register_view_privacy = ""
+;
+; RegisterView.php line: 336
+register_view_period = ""
+;
+; RegisterView.php line: 346
+register_view_create_account = ""
+;
+; RegisterView.php line: 355
+register_view_return = ""
+;
+; SearchView.php line: 92
+search_view_title = ""
+;
+; SearchView.php line: 119
+search_view_input_label = ""
+;
+; SearchView.php line: 123
+search_view_input_placeholder = ""
+;
+; SearchView.php line: 126
+search_view_search = "Cari"
+;
+; SearchView.php line: 155
+search_view_no_index_set = ""
+;
+; SearchView.php line: 164
+search_view_more_statistics = ""
+;
+; SearchView.php line: 201
+search_view_calculated = ""
+;
+; SearchView.php line: 203
+search_view_results = "Hasil"
+;
+; SearchView.php line: 229
+search_view_thesaurus_results = ""
+;
+; SearchView.php line: 339
+search_view_word_cloud = ""
+;
+; SearchView.php line: 380
+search_view_cache = ""
+;
+; SearchView.php line: 382
+search_view_as_text = ""
+;
+; SearchView.php line: 393
+search_view_similar = ""
+;
+; SearchView.php line: 402
+search_view_inlink = ""
+;
+; SearchView.php line: 419
+search_view_rank = "Urutan"
+;
+; SearchView.php line: 421
+search_view_relevancy = ""
+;
+; SearchView.php line: 423
+search_view_proximity = ""
+;
+; SearchView.php line: 427
+search_view_thesaurus_score = ""
+;
+; SearchView.php line: 436
+search_view_score = ""
+;
+; SettingsView.php line: 66
+settings_view_settings = ""
+;
+; SettingsView.php line: 73
+settings_view_results_per_page = ""
+;
+; SettingsView.php line: 79
+settings_view_open_in_tabs = ""
+;
+; SettingsView.php line: 86
+settings_view_search_index = ""
+;
+; SettingsView.php line: 92
+settings_view_language_label = ""
+;
+; SettingsView.php line: 106
+settings_view_return = ""
+;
+; SettingsView.php line: 109
+settings_view_save = ""
+;
+; SettingsView.php line: 116
+settings_install_search_plugin = ""
+;
+; SigninView.php line: 68
+signin_view_signin = ""
+;
+; SigninView.php line: 81
+sigin_view_signing_in = ""
+;
+; SigninView.php line: 84
+sigin_view_login_failed = ""
+;
+; SigninView.php line: 92
+signin_view_username = ""
+;
+; SigninView.php line: 99
+signin_view_password = "Kata sandi"
+;
+; SigninView.php line: 109
+signin_view_login = ""
+;
+; SigninView.php line: 124
+signin_view_recover_password = ""
+;
+; SigninView.php line: 129
+signin_view_create_account = ""
+;
+; SigninView.php line: 133
+signin_view_return = ""
+;
+; StaticView.php line: 68
+static_view_title = ""
+;
+; StatisticsView.php line: 75
+statistics_view_statistics = ""
+;
+; StatisticsView.php line: 80
+statistics_view_calculating = ""
+;
+; StatisticsView.php line: 94
+statistics_view_error_codes = ""
+;
+; StatisticsView.php line: 95
+statistics_view_sizes = ""
+;
+; StatisticsView.php line: 96
+statistics_view_links_per_page = ""
+;
+; StatisticsView.php line: 97
+statistics_view_page_date = ""
+;
+; StatisticsView.php line: 98
+statistics_view_dns_time = ""
+;
+; StatisticsView.php line: 99
+statistics_view_download_time = ""
+;
+; StatisticsView.php line: 100
+statistics_view_top_level_domain = ""
+;
+; StatisticsView.php line: 101
+statistics_view_file_extension = ""
+;
+; StatisticsView.php line: 102
+statistics_view_media_type = ""
+;
+; StatisticsView.php line: 103
+statistics_view_language = ""
+;
+; StatisticsView.php line: 104
+statistics_view_server = ""
+;
+; StatisticsView.php line: 105
+statistics_view_os = ""
+;
+; StatisticsView.php line: 108
+statistics_view_general_info = ""
+;
+; StatisticsView.php line: 109
+statistics_view_description = ""
+;
+; StatisticsView.php line: 111
+statistics_view_timestamp = ""
+;
+; StatisticsView.php line: 113
+statistics_view_crawl_date = ""
+;
+; StatisticsView.php line: 115
+statistics_view_pages = ""
+;
+; StatisticsView.php line: 117
+statistics_view_url = ""
+;
+; StatisticsView.php line: 120
+statistics_view_number_hosts = ""
+;
+; SuggestView.php line: 69
+suggest_view_suggest_url = ""
+;
+; SuggestView.php line: 71
+suggest_view_instructions = ""
+;
+; SuggestView.php line: 95
+suggest_view_url = ""
+;
+; SuggestView.php line: 109
+register_view_human_check = ""
+;
+; SuggestView.php line: 143
+suggest_view_human_check = ""
+;
+; SuggestView.php line: 164
+suggest_view_submit_url = ""
+;
+; SuggestView.php line: 173
+suggest_view_return = ""
+;
+; View.php line: 61
+view_locale_version14 = ""
+;
+; View.php line: 93
+view_logo_alt_text = ""
+;
+; WikiView.php line: 86
+wiki_view_read = ""
+;
+; WikiView.php line: 87
+wiki_view_edit = ""
+;
+; WikiView.php line: 90
+wiki_view_pages = ""
+;
+; WikiView.php line: 135
+wiki_view_feed = ""
+;
+; WikiView.php line: 136
+wiki_view_wiki = ""
+;
+; WikiView.php line: 160
+adminview_auto_logout_one_minute = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/elements
+;
+; ActivityElement.php line: 56
+activity_element_activities = ""
+;
+; AppearanceElement.php line: 71
+appearance_element_use_wiki_landing = ""
+;
+; AppearanceElement.php line: 77
+appearance_element_background_color = ""
+;
+; AppearanceElement.php line: 84
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 91
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 99
+appearance_element_foreground_color = ""
+;
+; AppearanceElement.php line: 104
+appearance_element_topbar_color = ""
+;
+; AppearanceElement.php line: 109
+appearance_element_sidebar_color = ""
+;
+; AppearanceElement.php line: 115
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 122
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 132
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 139
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 148
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 155
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 163
+appearance_element_toolbar = ""
+;
+; AppearanceElement.php line: 174
+appearance_element_site_timezone = ""
+;
+; AppearanceElement.php line: 179
+appearance_element_cookie_name = ""
+;
+; AppearanceElement.php line: 184
+appearance_element_token_name = ""
+;
+; AppearanceElement.php line: 189
+appearance_element_auxiliary_css = ""
+;
+; AppearanceElement.php line: 194
+appearance_element_reset_customizations = ""
+;
+; AppearanceElement.php line: 199
+appearance_element_save = ""
+;
+; ConfigureElement.php line: 72
+configure_element_work_directory = ""
+;
+; ConfigureElement.php line: 76
+configure_element_load_or_create = ""
+;
+; ConfigureElement.php line: 92
+configure_element_component_check = ""
+;
+; ConfigureElement.php line: 96
+configure_element_profile_settings = ""
+;
+; ConfigureElement.php line: 101
+configure_element_default_language = ""
+;
+; ConfigureElement.php line: 108
+configure_element_debug_display = ""
+;
+; ConfigureElement.php line: 114
+configure_element_error_info = ""
+;
+; ConfigureElement.php line: 120
+configure_element_query_info = ""
+;
+; ConfigureElement.php line: 126
+configure_element_test_info = ""
+;
+; ConfigureElement.php line: 131
+configure_element_site_access = ""
+;
+; ConfigureElement.php line: 136
+configure_element_web_access = ""
+;
+; ConfigureElement.php line: 141
+configure_element_rss_access = ""
+;
+; ConfigureElement.php line: 146
+configure_element_api_access = ""
+;
+; ConfigureElement.php line: 150
+configure_element_crawl_robot = ""
+;
+; ConfigureElement.php line: 152
+configure_element_robot_name = ""
+;
+; ConfigureElement.php line: 160
+configure_element_robot_instance = ""
+;
+; ConfigureElement.php line: 166
+configure_element_robot_description = ""
+;
+; ConfigureElement.php line: 175
+serversettings_element_save = ""
+;
+; CrawloptionsElement.php line: 59
+crawloptions_element_back_to_manage = ""
+;
+; CrawloptionsElement.php line: 62
+crawloptions_element_modify_active_crawl = ""
+;
+; CrawloptionsElement.php line: 64
+crawloptions_element_edit_crawl_options = ""
+;
+; CrawloptionsElement.php line: 87
+crawloptions_element_web_crawl = ""
+;
+; CrawloptionsElement.php line: 97
+crawloptions_element_archive_crawl = ""
+;
+; CrawloptionsElement.php line: 104
+crawloptions_element_load_options = ""
+;
+; CrawloptionsElement.php line: 109
+crawloptions_element_crawl_order = ""
+;
+; CrawloptionsElement.php line: 118
+crawloptions_element_restrict_by_url = ""
+;
+; CrawloptionsElement.php line: 126
+crawloptions_element_allowed_to_crawl = ""
+;
+; CrawloptionsElement.php line: 132
+crawloptions_element_disallowed_and_quota_sites = ""
+;
+; CrawloptionsElement.php line: 141
+crawloptions_element_seed_sites = ""
+;
+; CrawloptionsElement.php line: 145
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 156
+crawloptions_element_inject_sites = ""
+;
+; CrawloptionsElement.php line: 160
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 177
+crawloptions_element_reindex_crawl = ""
+;
+; CrawloptionsElement.php line: 185
+crawloptions_element_need_api_for_mix = ""
+;
+; CrawloptionsElement.php line: 193
+crawloptions_element_save_options = ""
+;
+; EditclassifierElement.php line: 62
+editclassifier_back = ""
+;
+; EditclassifierElement.php line: 64
+editclassifier_edit_classifier = ""
+;
+; EditclassifierElement.php line: 76
+editclassifier_classifier_label = ""
+;
+; EditclassifierElement.php line: 81
+editclassifier_change = ""
+;
+; EditclassifierElement.php line: 86
+editclassifier_statistics = ""
+;
+; EditclassifierElement.php line: 87
+editclassifier_positive_examples = ""
+;
+; EditclassifierElement.php line: 90
+editclassifier_negative_examples = ""
+;
+; EditclassifierElement.php line: 93
+editclassifier_accuracy = ""
+;
+; EditclassifierElement.php line: 98
+crawl_component_na = ""
+;
+; EditclassifierElement.php line: 103
+editclassifier_update = ""
+;
+; EditclassifierElement.php line: 104
+editclassifier_add_examples = ""
+;
+; EditclassifierElement.php line: 113
+editclassifier_source = ""
+;
+; EditclassifierElement.php line: 117
+editclassifier_default_crawl = ""
+;
+; EditclassifierElement.php line: 127
+editclassifier_label_by_hand = ""
+;
+; EditclassifierElement.php line: 129
+editclassifier_all_in_class = ""
+;
+; EditclassifierElement.php line: 131
+editclassifier_none_in_class = ""
+;
+; EditclassifierElement.php line: 136
+editclassifier_keywords = ""
+;
+; EditclassifierElement.php line: 145
+editclassifier_load = ""
+;
+; EditclassifierElement.php line: 151
+editclassifier_finalize = ""
+;
+; EditclassifierElement.php line: 159
+editclassifier_no_documents = ""
+;
+; EditlocalesElement.php line: 62
+editlocales_element_back_to_manage = ""
+;
+; EditlocalesElement.php line: 64
+editlocales_element_edit_locale = ""
+;
+; EditlocalesElement.php line: 78
+editlocales_element_show = ""
+;
+; EditlocalesElement.php line: 82
+editlocales_element_filter = ""
+;
+; EditlocalesElement.php line: 87
+editlocales_element_go = ""
+;
+; EditlocalesElement.php line: 91
+editlocales_element_no_matching = ""
+;
+; EditlocalesElement.php line: 127
+editlocales_element_save = ""
+;
+; EditmixElement.php line: 57
+editmix_element_back_to_mix = ""
+;
+; EditmixElement.php line: 59
+mixcrawls_element_edit_mix = ""
+;
+; EditmixElement.php line: 70
+mixcrawls_element_mix_name = ""
+;
+; EditmixElement.php line: 76
+mixcrawls_element_mix_components = ""
+;
+; EditmixElement.php line: 82
+mixcrawls_element_too_many = ""
+;
+; EditmixElement.php line: 83
+mixcrawls_element_add_fragment = ""
+;
+; EditmixElement.php line: 88
+mixcrawls_element_save_button = ""
+;
+; FooterElement.php line: 58
+footer_element_blog = ""
+;
+; FooterElement.php line: 60
+footer_element_privacy = ""
+;
+; FooterElement.php line: 62
+footer_element_terms = ""
+;
+; FooterElement.php line: 64
+footer_element_tools = ""
+;
+; FooterElement.php line: 66
+footer_element_bot = ""
+;
+; FooterElement.php line: 71
+footer_element_developed_seek_quarry = ""
+;
+; FooterElement.php line: 74
+footer_element_copyright_site = ""
+;
+; FooterElement.php line: 76
+footer_element_this_search_engine = ""
+;
+; GroupfeedElement.php line: 86
+groupfeed_element_add_group = ""
+;
+; GroupfeedElement.php line: 90
+groupfeed_element_request_add = ""
+;
+; GroupfeedElement.php line: 116
+groupfeed_element_wiki_page = ""
+;
+; GroupfeedElement.php line: 118
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 121
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 131
+groupfeed_element_group_activity = ""
+;
+; GroupfeedElement.php line: 135
+groupfeed_element_wiki_thread = ""
+;
+; GroupfeedElement.php line: 154
+groupfeed_element_feed = ""
+;
+; GroupfeedElement.php line: 159
+group_view_wiki = ""
+;
+; GroupfeedElement.php line: 161
+groupfeed_element_user = ""
+;
+; GroupfeedElement.php line: 205
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 240
+manageaccount_element_group_wiki = ""
+;
+; GroupfeedElement.php line: 241
+manageaccount_element_group_stats = ""
+;
+; GroupfeedElement.php line: 246
+manageaccount_element_last_post = ""
+;
+; GroupfeedElement.php line: 290
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 300
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 313
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 319
+groupfeed_element_no_posts_yet = ""
+;
+; GroupfeedElement.php line: 324
+groupfeed_element_thread_no_exist = ""
+;
+; GroupfeedElement.php line: 357
+groupfeed_element_edit = ""
+;
+; GroupfeedElement.php line: 362
+groupfeed_element_delete = ""
+;
+; GroupfeedElement.php line: 384
+groupfeed_element_num_posts = ""
+;
+; GroupfeedElement.php line: 394
+groupfeed_element_num_views = ""
+;
+; GroupfeedElement.php line: 419
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 421
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 437
+groupfeed_element_last_edited = ""
+;
+; GroupfeedElement.php line: 453
+groupfeed_element_post_vote = ""
+;
+; GroupfeedElement.php line: 480
+groupfeed_element_last_post_info = ""
+;
+; GroupfeedElement.php line: 496
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 550
+fileupload_helper_drag_textarea = ""
+;
+; GroupfeedElement.php line: 551
+fileupload_helper_click_textarea = ""
+;
+; GroupfeedElement.php line: 575
+groupfeed_element_add_comment = ""
+;
+; GroupfeedElement.php line: 589
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 627
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 634
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 647
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 682
+groupfeed_element_edit_post = ""
+;
+; GroupfeedElement.php line: 685
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 690
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 703
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 731
+groupfeed_element_no_longer_update = ""
+;
+; MachinelogElement.php line: 57
+machinelog_element_back_to_manage = ""
+;
+; MachinelogElement.php line: 62
+machinelog_element_filter = ""
+;
+; MachinelogElement.php line: 69
+machinelog_element_log_file = ""
+;
+; MachinelogElement.php line: 74
+machinelog_element_refresh_off = ""
+;
+; MachinelogElement.php line: 78
+machinelog_element_refresh_on = ""
+;
+; ManageaccountElement.php line: 64
+manageaccount_element_edit_or_no_text = ""
+;
+; ManageaccountElement.php line: 73
+manageaccount_element_welcome = ""
+;
+; ManageaccountElement.php line: 75
+manageaccount_element_what_can_do = ""
+;
+; ManageaccountElement.php line: 76
+manageaccount_element_account_details = ""
+;
+; ManageaccountElement.php line: 107
+manageaccounts_element_icon = ""
+;
+; ManageaccountElement.php line: 117
+manageusers_element_username = "username"
+;
+; ManageaccountElement.php line: 124
+manageusers_element_firstname = ""
+;
+; ManageaccountElement.php line: 130
+manageusers_element_lastname = ""
+;
+; ManageaccountElement.php line: 136
+manageusers_element_email = ""
+;
+; ManageaccountElement.php line: 146
+manageaccount_element_is_advertiser = ""
+;
+; ManageaccountElement.php line: 159
+manageaccount_element_password = ""
+;
+; ManageaccountElement.php line: 166
+manageaccount_element_new_password = ""
+;
+; ManageaccountElement.php line: 172
+manageaccount_element_retype_password = ""
+;
+; ManageaccountElement.php line: 184
+manageaccount_element_save = ""
+;
+; ManageaccountElement.php line: 190
+manageaccount_element_search_lang_settings = ""
+;
+; ManageaccountElement.php line: 195
+manageaccount_element_crawl_and_index = ""
+;
+; ManageaccountElement.php line: 196
+manageaccount_element_crawl_info = ""
+;
+; ManageaccountElement.php line: 197
+manageaccount_element_num_crawls = ""
+;
+; ManageaccountElement.php line: 200
+manageaccount_element_manage_crawls = ""
+;
+; ManageaccountElement.php line: 205
+manageaccount_element_groups_and_feeds = ""
+;
+; ManageaccountElement.php line: 206
+manageaccount_element_group_info = ""
+;
+; ManageaccountElement.php line: 208
+manageaccount_element_num_groups = ""
+;
+; ManageaccountElement.php line: 211
+manageaccount_element_num_group = ""
+;
+; ManageaccountElement.php line: 224
+manageaccount_element_group_wiki = ""
+;
+; ManageaccountElement.php line: 225
+manageaccount_element_group_stats = ""
+;
+; ManageaccountElement.php line: 229
+manageaccount_element_last_post = ""
+;
+; ManageaccountElement.php line: 239
+manageaccount_element_manage_all_groups = ""
+;
+; ManageaccountElement.php line: 241
+manageaccount_element_go_to_group_feed = ""
+;
+; ManageaccountElement.php line: 242
+manageaccount_element_crawl_mixes = ""
+;
+; ManageaccountElement.php line: 243
+manageaccount_element_mixes_info = ""
+;
+; ManageaccountElement.php line: 245
+manageaccount_element_num_mixes = ""
+;
+; ManageaccountElement.php line: 248
+manageaccount_element_num_mix = ""
+;
+; ManageaccountElement.php line: 252
+manageaccount_element_manage_mixes = ""
+;
+; ManageadvertisementsElement.php line: 58
+manageadvertisements_element_list = ""
+;
+; ManageadvertisementsElement.php line: 65
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 70
+manageadvertisements_element_username = ""
+;
+; ManageadvertisementsElement.php line: 73
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 75
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 76
+manageadvertisements_element_dates = ""
+;
+; ManageadvertisementsElement.php line: 77
+manageadvertisements_element_viewclicks = ""
+;
+; ManageadvertisementsElement.php line: 80
+manageadvertisements_element_status = ""
+;
+; ManageadvertisementsElement.php line: 82
+manageadvertisements_element_actions = ""
+;
+; ManageadvertisementsElement.php line: 111
+manageadvertisements_element_active = ""
+;
+; ManageadvertisementsElement.php line: 113
+manageadvertisements_element_deactivated = ""
+;
+; ManageadvertisementsElement.php line: 115
+manageadvertisements_element_suspended = ""
+;
+; ManageadvertisementsElement.php line: 117
+manageadvertisements_element_completed = ""
+;
+; ManageadvertisementsElement.php line: 144
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 147
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 157
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 161
+manageadvertisements_element_deactivate = ""
+;
+; ManageadvertisementsElement.php line: 166
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 170
+manageadvertisements_element_suspend = ""
+;
+; ManageadvertisementsElement.php line: 176
+manageadvertisements_element_reconfirm = ""
+;
+; ManageadvertisementsElement.php line: 180
+manageadvertisements_element_reactivate = ""
+;
+; ManageadvertisementsElement.php line: 225
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 227
+manageadvertisement_element_ad_info = ""
+;
+; ManageadvertisementsElement.php line: 231
+manageadvertisement_element_purchase_ad = ""
+;
+; ManageadvertisementsElement.php line: 250
+manageadvertisement_element_ad_user = ""
+;
+; ManageadvertisementsElement.php line: 263
+manageadvertisement_element_displayname = ""
+;
+; ManageadvertisementsElement.php line: 282
+manageadvertisement_element_text = ""
+;
+; ManageadvertisementsElement.php line: 302
+manageadvertisement_element_ad_url = ""
+;
+; ManageadvertisementsElement.php line: 323
+manageeadvertisement_element_ad_duration = ""
+;
+; ManageadvertisementsElement.php line: 339
+manageeadvertisement_element_start_day = ""
+;
+; ManageadvertisementsElement.php line: 344
+manageeadvertisement_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 349
+manageadvertisement_element_keyword_help = ""
+;
+; ManageadvertisementsElement.php line: 363
+manageadvertisement_element_keyword_bid_amount = ""
+;
+; ManageadvertisementsElement.php line: 370
+manageadvertisement_element_expensive_word = ""
+;
+; ManageadvertisementsElement.php line: 387
+manageadvertisement_element_calculate_bid = ""
+;
+; ManageadvertisementsElement.php line: 407
+manageadvertisement_element_update = ""
+;
+; ManageadvertisementsElement.php line: 416
+manageadvertisement_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 427
+manageadvertisement_element_card_number = ""
+;
+; ManageadvertisementsElement.php line: 438
+manageadvertisement_element_cvc = ""
+;
+; ManageadvertisementsElement.php line: 447
+manageadvertisement_element_expiration = ""
+;
+; ManageadvertisementsElement.php line: 465
+manageadvertisement_element_charge_warning = ""
+;
+; ManageadvertisementsElement.php line: 468
+manageadvertisement_element_program_terms = ""
+;
+; ManageadvertisementsElement.php line: 475
+manageadvertisement_element_edit_ad = ""
+;
+; ManageadvertisementsElement.php line: 479
+manageadvertisement_element_purchase = ""
+;
+; ManageadvertisementsElement.php line: 500
+manageadvertisement_element_preview = ""
+;
+; ManageadvertisementsElement.php line: 538
+manageadvertisements_element_search_advertisement = ""
+;
+; ManageadvertisementsElement.php line: 540
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 542
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 543
+manageadvertisements_element_description = ""
+;
+; ManageadvertisementsElement.php line: 544
+manageadvertisements_element_destination_url = ""
+;
+; ManageadvertisementsElement.php line: 545
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 546
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 547
+manageadvertisements_element_start_date = ""
+;
+; ManageadvertisementsElement.php line: 548
+manageadvertisements_element_end_date = ""
+;
+; ManageclassifiersElement.php line: 66
+manageclassifiers_available_classifiers = ""
+;
+; ManageclassifiersElement.php line: 74
+manageclassifiers_label_col = ""
+;
+; ManageclassifiersElement.php line: 77
+manageclassifiers_positive_col = ""
+;
+; ManageclassifiersElement.php line: 78
+manageclassifiers_negative_col = ""
+;
+; ManageclassifiersElement.php line: 82
+manageclassifiers_actions_col = ""
+;
+; ManageclassifiersElement.php line: 100
+manageclassifiers_edit = ""
+;
+; ManageclassifiersElement.php line: 103
+manageclassifiers_finalized = ""
+;
+; ManageclassifiersElement.php line: 109
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 111
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 116
+manageclassifiers_finalizing = ""
+;
+; ManageclassifiersElement.php line: 120
+confirm_delete_operation = ""
+;
+; ManageclassifiersElement.php line: 123
+manageclassifiers_delete = ""
+;
+; ManageclassifiersElement.php line: 155
+manageclassifiers_manage_classifiers = ""
+;
+; ManageclassifiersElement.php line: 165
+manageclassifiers_classifier_name = ""
+;
+; ManageclassifiersElement.php line: 170
+manageclassifiers_create_button = ""
+;
+; ManageclassifiersElement.php line: 185
+manageclassifiers_element_search = ""
+;
+; ManageclassifiersElement.php line: 186
+manageclassifiers_element_create_form = ""
+;
+; ManageclassifiersElement.php line: 187
+manageclassifiers_classifier_name = ""
+;
+; ManagecrawlsElement.php line: 51
+managecrawls_element_create_crawl = ""
+;
+; ManagecrawlsElement.php line: 60
+managecrawls_element_description = ""
+;
+; ManagecrawlsElement.php line: 67
+managecrawls_element_start_new_crawl = ""
+;
+; ManagecrawlsElement.php line: 71
+managecrawls_element_options = ""
+;
+; ManagecrawlsElement.php line: 77
+managecrawls_element_awaiting_status = ""
+;
+; ManagecrawlsElement.php line: 95
+managecrawls_element_up_longer_update = ""
+;
+; ManagegroupsElement.php line: 71
+managegroups_element_not_my_groups = ""
+;
+; ManagegroupsElement.php line: 73
+managegroups_element_groups = ""
+;
+; ManagegroupsElement.php line: 82
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 83
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 85
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 86
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 87
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 88
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 90
+managegroups_element_actions = ""
+;
+; ManagegroupsElement.php line: 196
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 200
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 214
+manageaccount_element_group_wiki = ""
+;
+; ManagegroupsElement.php line: 229
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 233
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 238
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 243
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 249
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 254
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 263
+managegroups_element_decline = ""
+;
+; ManagegroupsElement.php line: 265
+managegroups_element_unsubscribe = ""
+;
+; ManagegroupsElement.php line: 270
+confirm_delete_operation = ""
+;
+; ManagegroupsElement.php line: 273
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 303
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 304
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 306
+managegroups_element_create_group = ""
+;
+; ManagegroupsElement.php line: 310
+managegroups_element_add_group = ""
+;
+; ManagegroupsElement.php line: 327
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 338
+managegroups_element_browse = ""
+;
+; ManagegroupsElement.php line: 348
+managegroups_element_register = ""
+;
+; ManagegroupsElement.php line: 355
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 362
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 369
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 381
+managegroups_element_group_users = ""
+;
+; ManagegroupsElement.php line: 385
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 412
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 414
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 423
+managegroups_element_activate = ""
+;
+; ManagegroupsElement.php line: 429
+managegroups_element_ban = ""
+;
+; ManagegroupsElement.php line: 435
+managegroups_element_unban = ""
+;
+; ManagegroupsElement.php line: 443
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 471
+managegroups_element_filter = ""
+;
+; ManagegroupsElement.php line: 492
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 503
+managegroups_element_save = ""
+;
+; ManagegroupsElement.php line: 533
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 534
+managegroups_element_invite_users_group = ""
+;
+; ManagegroupsElement.php line: 546
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 554
+managegroups_element_usernames = ""
+;
+; ManagegroupsElement.php line: 561
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 580
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 581
+managegroups_element_transfer_group_owner = ""
+;
+; ManagegroupsElement.php line: 593
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 601
+managegroups_element_new_group_owner = ""
+;
+; ManagegroupsElement.php line: 608
+managegroups_element_change_owner = ""
+;
+; ManagegroupsElement.php line: 627
+managegroups_element_discover_groups = ""
+;
+; ManagegroupsElement.php line: 631
+managegroups_element_search_group = ""
+;
+; ManagegroupsElement.php line: 633
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 635
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 636
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 637
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 639
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 641
+managegroups_element_post_lifetime = ""
+;
+; ManagelocalesElement.php line: 62
+managelocales_element_locale_list = ""
+;
+; ManagelocalesElement.php line: 72
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 75
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 76
+managelocales_element_writingmode = ""
+;
+; ManagelocalesElement.php line: 77
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 81
+managelocales_element_percenttranslated = ""
+;
+; ManagelocalesElement.php line: 82
+managelocales_element_actions = ""
+;
+; ManagelocalesElement.php line: 102
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 103
+managelocales_element_false = ""
+;
+; ManagelocalesElement.php line: 110
+managelocales_element_edit = ""
+;
+; ManagelocalesElement.php line: 115
+confirm_delete_operation = ""
+;
+; ManagelocalesElement.php line: 116
+managelocales_element_delete = ""
+;
+; ManagelocalesElement.php line: 137
+manageloecales_element_add_locale_form = ""
+;
+; ManagelocalesElement.php line: 138
+managelocales_element_locale_info = ""
+;
+; ManagelocalesElement.php line: 140
+managelocales_element_add_locale = ""
+;
+; ManagelocalesElement.php line: 161
+managelocales_element_localenamelabel = ""
+;
+; ManagelocalesElement.php line: 174
+managelocales_element_localetaglabel = ""
+;
+; ManagelocalesElement.php line: 180
+managelocales_element_writingmodelabel = ""
+;
+; ManagelocalesElement.php line: 190
+managelocales_element_localeenabled = ""
+;
+; ManagelocalesElement.php line: 201
+managelocales_element_submit = ""
+;
+; ManagelocalesElement.php line: 219
+managelocales_element_search_locales = ""
+;
+; ManagelocalesElement.php line: 220
+managelocales_element_addlocale_form = ""
+;
+; ManagelocalesElement.php line: 222
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 223
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 224
+managelocales_element_writingmode = ""
+;
+; ManagelocalesElement.php line: 225
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 231
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 232
+managelocales_element_false = ""
+;
+; ManagemachinesElement.php line: 56
+managemachines_element_add_machine = ""
+;
+; ManagemachinesElement.php line: 67
+managemachines_element_machine_name = ""
+;
+; ManagemachinesElement.php line: 72
+managemachines_element_machineurl = ""
+;
+; ManagemachinesElement.php line: 76
+managemachines_element_is_mirror = ""
+;
+; ManagemachinesElement.php line: 81
+managemachines_element_parent_name = ""
+;
+; ManagemachinesElement.php line: 87
+managemachines_element_has_queueserver = ""
+;
+; ManagemachinesElement.php line: 91
+managemachines_element_num_fetchers = ""
+;
+; ManagemachinesElement.php line: 96
+managemachines_element_submit = ""
+;
+; ManagemachinesElement.php line: 101
+managemachines_element_machine_info = ""
+;
+; ManagemachinesElement.php line: 105
+managemachines_element_awaiting_status = ""
+;
+; ManagemachinesElement.php line: 123
+managemachines_element_no_longer_update = ""
+;
+; ManagerolesElement.php line: 59
+manageroles_element_roles = ""
+;
+; ManagerolesElement.php line: 67
+manageroles_element_rolename = ""
+;
+; ManagerolesElement.php line: 68
+manageroles_element_actions = ""
+;
+; ManagerolesElement.php line: 94
+manageroles_element_edit = ""
+;
+; ManagerolesElement.php line: 99
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 103
+confirm_delete_operation = ""
+;
+; ManagerolesElement.php line: 106
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 140
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 141
+manageroles_element_role_info = ""
+;
+; ManagerolesElement.php line: 143
+manageroles_element_add_role = "Tambah role"
+;
+; ManagerolesElement.php line: 154
+manageroles_element_rolename = ""
+;
+; ManagerolesElement.php line: 167
+manageroles_element_role_activities = ""
+;
+; ManagerolesElement.php line: 175
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 183
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 203
+manageroles_element_save = ""
+;
+; ManagerolesElement.php line: 220
+manageroles_element_search_role = ""
+;
+; ManagerolesElement.php line: 221
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 223
+manageroles_element_rolename = ""
+;
+; ManageusersElement.php line: 59
+manageusers_element_users = ""
+;
+; ManageusersElement.php line: 68
+manageusers_element_username = "username"
+;
+; ManageusersElement.php line: 70
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 71
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 72
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 73
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 75
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 76
+manageusers_element_actions = ""
+;
+; ManageusersElement.php line: 141
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 145
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 151
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 155
+confirm_delete_operation = ""
+;
+; ManageusersElement.php line: 158
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 200
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 201
+manageusers_element_user_info = ""
+;
+; ManageusersElement.php line: 203
+manageusers_element_add_user = ""
+;
+; ManageusersElement.php line: 228
+manageusers_element_username = "username"
+;
+; ManageusersElement.php line: 238
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 244
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 250
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 257
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 274
+manageusers_element_roles = ""
+;
+; ManageusersElement.php line: 278
+manageusers_element_num_roles = ""
+;
+; ManageusersElement.php line: 293
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 303
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 344
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 357
+manageusers_element_add_role = ""
+;
+; ManageusersElement.php line: 367
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 371
+manageusers_element_num_groups = ""
+;
+; ManageusersElement.php line: 392
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 431
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 443
+manageusers_element_add_group = ""
+;
+; ManageusersElement.php line: 456
+manageusers_element_password = "Kata sandi"
+;
+; ManageusersElement.php line: 462
+manageusers_element_retype_password = "Masukin lagi kata sandi"
+;
+; ManageusersElement.php line: 469
+manageusers_element_save = ""
+;
+; ManageusersElement.php line: 496
+manageusers_element_search_user = ""
+;
+; ManageusersElement.php line: 497
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 499
+manageusers_element_username = "username"
+;
+; ManageusersElement.php line: 500
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 501
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 502
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 503
+manageusers_element_status = ""
+;
+; MixcrawlsElement.php line: 65
+mixcrawls_element_available_mixes = ""
+;
+; MixcrawlsElement.php line: 72
+mixcrawls_view_name = ""
+;
+; MixcrawlsElement.php line: 74
+mixcrawls_view_definition = ""
+;
+; MixcrawlsElement.php line: 78
+mixcrawls_view_actions = ""
+;
+; MixcrawlsElement.php line: 112
+mixcrawls_view_no_components = ""
+;
+; MixcrawlsElement.php line: 118
+mixcrawls_view_share = ""
+;
+; MixcrawlsElement.php line: 120
+mixcrawls_view_edit = ""
+;
+; MixcrawlsElement.php line: 125
+mixcrawls_set_index = ""
+;
+; MixcrawlsElement.php line: 128
+mixcrawl_search_index = ""
+;
+; MixcrawlsElement.php line: 134
+confirm_delete_operation = ""
+;
+; MixcrawlsElement.php line: 136
+mixcrawls_view_delete = ""
+;
+; MixcrawlsElement.php line: 146
+mixcrawls_view_back = ""
+;
+; MixcrawlsElement.php line: 147
+mixcrawls_element_share_mix_group = ""
+;
+; MixcrawlsElement.php line: 157
+mixcrawls_element_mixname = ""
+;
+; MixcrawlsElement.php line: 163
+mixcrawls_element_group = ""
+;
+; MixcrawlsElement.php line: 169
+mixcrawls_element_share = ""
+;
+; MixcrawlsElement.php line: 193
+mixcrawls_element_make_mix = ""
+;
+; MixcrawlsElement.php line: 203
+mixcrawls_element_mix_name = ""
+;
+; MixcrawlsElement.php line: 208
+mixcrawls_element_create_button = ""
+;
+; MixcrawlsElement.php line: 224
+mixcrawls_element_search_mix = ""
+;
+; MixcrawlsElement.php line: 225
+mixcrawls_element_createmix_form = ""
+;
+; MixcrawlsElement.php line: 227
+mixcrawls_element_mixname = ""
+;
+; MoreoptionsElement.php line: 82
+moreoptions_element_other_searches = ""
+;
+; MoreoptionsElement.php line: 119
+moreoptions_element_previous = ""
+;
+; MoreoptionsElement.php line: 125
+moreoptions_element_next = ""
+;
+; MoreoptionsElement.php line: 137
+moreoptions_element_my_accounts = ""
+;
+; MoreoptionsElement.php line: 142
+signin_element_settings = ""
+;
+; MoreoptionsElement.php line: 151
+signin_element_signin = "Masuk"
+;
+; MoreoptionsElement.php line: 154
+signin_element_admin = "Administratif"
+;
+; MoreoptionsElement.php line: 167
+signin_view_create_account = ""
+;
+; MoreoptionsElement.php line: 186
+moreoptions_element_suggest = ""
+;
+; MoreoptionsElement.php line: 188
+moreoptions_element_wiki_pages = ""
+;
+; MoreoptionsElement.php line: 199
+moreoptions_element_tools = ""
+;
+; PageoptionsElement.php line: 59
+pageoptions_element_crawl_time = ""
+;
+; PageoptionsElement.php line: 64
+pageoptions_element_search_time = ""
+;
+; PageoptionsElement.php line: 69
+pageoptions_element_test_options = ""
+;
+; PageoptionsElement.php line: 81
+pageoptions_element_load_options = ""
+;
+; PageoptionsElement.php line: 86
+pageoptions_element_page_range = ""
+;
+; PageoptionsElement.php line: 92
+pageoptions_element_summarizer = ""
+;
+; PageoptionsElement.php line: 101
+pageoptions_element_max_description = ""
+;
+; PageoptionsElement.php line: 107
+pageoptions_element_save_cache = ""
+;
+; PageoptionsElement.php line: 117
+pageoptions_element_allow_recrawl = ""
+;
+; PageoptionsElement.php line: 124
+pageoptions_element_file_types = ""
+;
+; PageoptionsElement.php line: 153
+pageoptions_element_classifiers_rankers = ""
+;
+; PageoptionsElement.php line: 169
+pageoptions_element_use_classify = ""
+;
+; PageoptionsElement.php line: 170
+pageoptions_element_use_rank = ""
+;
+; PageoptionsElement.php line: 197
+pageoptions_element_no_classifiers = ""
+;
+; PageoptionsElement.php line: 200
+pageoptions_element_indexing_plugins = ""
+;
+; PageoptionsElement.php line: 206
+pageoptions_element_plugin = ""
+;
+; PageoptionsElement.php line: 207
+pageoptions_element_plugin_include = ""
+;
+; PageoptionsElement.php line: 223
+pageoptions_element_configure = ""
+;
+; PageoptionsElement.php line: 235
+pageoptions_element_no_compatible_plugins = ""
+;
+; PageoptionsElement.php line: 238
+pageoptions_element_page_rules = ""
+;
+; PageoptionsElement.php line: 247
+page_element_search_page = ""
+;
+; PageoptionsElement.php line: 254
+pageoptions_element_wd_suggest = ""
+;
+; PageoptionsElement.php line: 262
+pageoptions_element_subsearch_link = ""
+;
+; PageoptionsElement.php line: 271
+pageoptions_element_signin_link = ""
+;
+; PageoptionsElement.php line: 279
+pageoptions_element_cache_link = ""
+;
+; PageoptionsElement.php line: 288
+pageoptions_element_similar_link = ""
+;
+; PageoptionsElement.php line: 297
+pageoptions_element_in_link = ""
+;
+; PageoptionsElement.php line: 304
+pageoptions_element_ip_link = ""
+;
+; PageoptionsElement.php line: 313
+pageoptions_element_ranking_factors = ""
+;
+; PageoptionsElement.php line: 318
+pageoptions_element_title_weight = ""
+;
+; PageoptionsElement.php line: 323
+pageoptions_element_description_weight = ""
+;
+; PageoptionsElement.php line: 328
+pageoptions_element_link_weight = ""
+;
+; PageoptionsElement.php line: 333
+pageoptions_element_results_grouping_options = ""
+;
+; PageoptionsElement.php line: 338
+pageoptions_element_min_results_to_group = ""
+;
+; PageoptionsElement.php line: 344
+pageoptions_element_server_alpha = ""
+;
+; PageoptionsElement.php line: 352
+pageoptions_element_test_page = ""
+;
+; PageoptionsElement.php line: 356
+pageoptions_element_page_type = ""
+;
+; PageoptionsElement.php line: 372
+pageoptions_element_save_options = ""
+;
+; PageoptionsElement.php line: 374
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 380
+pageoptions_element_test_results = ""
+;
+; PageoptionsElement.php line: 383
+pageoptions_element_page_truncated = ""
+;
+; PageoptionsElement.php line: 388
+pageoptions_element_after_process = ""
+;
+; PageoptionsElement.php line: 392
+pageoptions_element_after_rules = ""
+;
+; PageoptionsElement.php line: 396
+pageoptions_element_extracted_words = ""
+;
+; PageoptionsElement.php line: 400
+pageoptions_element_extracted_metas = ""
+;
+; PageoptionsElement.php line: 417
+page_element_plugin_back = ""
+;
+; PageoptionsElement.php line: 454
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 458
+pageoptions_element_save_options = ""
+;
+; ResultseditorElement.php line: 52
+resultseditor_element_edit_page = ""
+;
+; ResultseditorElement.php line: 57
+resultseditor_element_edited_pages = ""
+;
+; ResultseditorElement.php line: 66
+resultseditor_element_url_list = ""
+;
+; ResultseditorElement.php line: 68
+resultseditor_element_load_page = ""
+;
+; ResultseditorElement.php line: 81
+resultseditor_element_page_url = ""
+;
+; ResultseditorElement.php line: 87
+resultseditor_element_page_title = ""
+;
+; ResultseditorElement.php line: 93
+resultseditor_element_description = ""
+;
+; ResultseditorElement.php line: 97
+resultseditor_element_reset = ""
+;
+; ResultseditorElement.php line: 99
+resultseditor_element_save_page = ""
+;
+; ResultseditorElement.php line: 102
+resultseditor_element_filter_websites = ""
+;
+; ResultseditorElement.php line: 114
+resultseditor_element_sites_to_filter = ""
+;
+; ResultseditorElement.php line: 119
+resultseditor_element_save_filter = ""
+;
+; SearchsourcesElement.php line: 62
+searchsources_element_addsource_form = ""
+;
+; SearchsourcesElement.php line: 63
+searchsources_element_edit_media_source = ""
+;
+; SearchsourcesElement.php line: 67
+searchsources_element_add_media_source = ""
+;
+; SearchsourcesElement.php line: 90
+searchsources_element_sourcetype = ""
+;
+; SearchsourcesElement.php line: 95
+searchsources_element_sourcename = ""
+;
+; SearchsourcesElement.php line: 104
+searchsources_element_url = ""
+;
+; SearchsourcesElement.php line: 110
+searchsources_element_locale_tag = ""
+;
+; SearchsourcesElement.php line: 115
+searchsources_element_thumbnail = ""
+;
+; SearchsourcesElement.php line: 125
+searchsources_element_feed_instruct = ""
+;
+; SearchsourcesElement.php line: 128
+searchsources_element_channelpath = ""
+;
+; SearchsourcesElement.php line: 134
+searchsources_element_itempath = ""
+;
+; SearchsourcesElement.php line: 140
+searchsources_element_titlepath = ""
+;
+; SearchsourcesElement.php line: 146
+searchsources_element_descpath = ""
+;
+; SearchsourcesElement.php line: 152
+searchsources_element_linkpath = ""
+;
+; SearchsourcesElement.php line: 158
+searchsources_element_image_xpath = ""
+;
+; SearchsourcesElement.php line: 164
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 170
+searchsources_element_media_sources = ""
+;
+; SearchsourcesElement.php line: 193
+searchsources_element_medianame = ""
+;
+; SearchsourcesElement.php line: 194
+searchsources_element_mediatype = ""
+;
+; SearchsourcesElement.php line: 196
+searchsources_element_mediaurls = ""
+;
+; SearchsourcesElement.php line: 199
+searchsources_element_action = ""
+;
+; SearchsourcesElement.php line: 227
+searchsources_element_editmedia = ""
+;
+; SearchsourcesElement.php line: 230
+confirm_delete_operation = ""
+;
+; SearchsourcesElement.php line: 233
+searchsources_element_deletemedia = ""
+;
+; SearchsourcesElement.php line: 242
+searchsources_element_addsearch_form = ""
+;
+; SearchsourcesElement.php line: 244
+searchsources_element_edit_subsearch = ""
+;
+; SearchsourcesElement.php line: 249
+searchsources_element_add_subsearch = ""
+;
+; SearchsourcesElement.php line: 264
+searchsources_element_foldername = ""
+;
+; SearchsourcesElement.php line: 274
+searchsources_element_indexsource = ""
+;
+; SearchsourcesElement.php line: 280
+searchsources_element_per_page = ""
+;
+; SearchsourcesElement.php line: 286
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 292
+searchsources_element_subsearches = ""
+;
+; SearchsourcesElement.php line: 302
+searchsources_element_dirname = ""
+;
+; SearchsourcesElement.php line: 303
+searchsources_element_index = ""
+;
+; SearchsourcesElement.php line: 306
+searchsources_element_localestring = ""
+;
+; SearchsourcesElement.php line: 307
+searchsources_element_perpage = ""
+;
+; SearchsourcesElement.php line: 311
+searchsources_element_actions = ""
+;
+; SearchsourcesElement.php line: 327
+searchsources_element_editsource = ""
+;
+; SearchsourcesElement.php line: 333
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 335
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 342
+searchsources_element_deletesubsearch = ""
+;
+; SecurityElement.php line: 58
+security_element_auth_captcha = ""
+;
+; SecurityElement.php line: 69
+security_element_authentication_type = ""
+;
+; SecurityElement.php line: 81
+security_element_zero_unavailable = ""
+;
+; SecurityElement.php line: 90
+security_element_captcha_type = ""
+;
+; SecurityElement.php line: 103
+security_element_save = ""
+;
+; SecurityElement.php line: 107
+security_element_captcha_recovery_questions = ""
+;
+; SecurityElement.php line: 113
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 118
+security_element_edit_captcha = ""
+;
+; SecurityElement.php line: 123
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 126
+security_element_edit_captcha = ""
+;
+; ServersettingsElement.php line: 59
+serversettings_element_server_settings = ""
+;
+; ServersettingsElement.php line: 62
+serversettings_element_name_server = ""
+;
+; ServersettingsElement.php line: 66
+serversettings_element_name_server_key = ""
+;
+; ServersettingsElement.php line: 73
+serversettings_element_name_server_url = ""
+;
+; ServersettingsElement.php line: 81
+serversettings_element_use_memcache = ""
+;
+; ServersettingsElement.php line: 89
+serversettings_element_memcache_servers = ""
+;
+; ServersettingsElement.php line: 100
+serversettings_element_use_filecache = ""
+;
+; ServersettingsElement.php line: 110
+configure_element_database_setup = ""
+;
+; ServersettingsElement.php line: 115
+serversettings_element_database_system = ""
+;
+; ServersettingsElement.php line: 123
+serversettings_element_databasename = ""
+;
+; ServersettingsElement.php line: 130
+serversettings_element_databasehost = ""
+;
+; ServersettingsElement.php line: 137
+serversettings_element_databaseuser = ""
+;
+; ServersettingsElement.php line: 145
+serversettings_element_databasepassword = ""
+;
+; ServersettingsElement.php line: 158
+serversettings_element_account_registration = ""
+;
+; ServersettingsElement.php line: 169
+serversettings_element_mail_sender = ""
+;
+; ServersettingsElement.php line: 175
+serversettings_element_send_media_updater = ""
+;
+; ServersettingsElement.php line: 185
+serversettings_element_use_php_mail = ""
+;
+; ServersettingsElement.php line: 192
+serversettings_element_mail_server = ""
+;
+; ServersettingsElement.php line: 198
+serversettings_element_mail_serverport = ""
+;
+; ServersettingsElement.php line: 205
+serversettings_element_mail_username = ""
+;
+; ServersettingsElement.php line: 211
+serversettings_element_mail_password = ""
+;
+; ServersettingsElement.php line: 218
+serversettings_element_mail_security = ""
+;
+; ServersettingsElement.php line: 228
+serversettings_element_proxy_title = ""
+;
+; ServersettingsElement.php line: 232
+serversettings_element_tor_proxy = ""
+;
+; ServersettingsElement.php line: 238
+serversettings_element_use_proxy_servers = ""
+;
+; ServersettingsElement.php line: 247
+serversettings_element_proxy_servers = ""
+;
+; ServersettingsElement.php line: 256
+serversettings_element_adserver_configuration = ""
+;
+; ServersettingsElement.php line: 261
+serversettings_element_advertising_source = ""
+;
+; ServersettingsElement.php line: 273
+serversettings_element_no_payment_processing = ""
+;
+; ServersettingsElement.php line: 275
+serversettings_element_purchase_processing = ""
+;
+; ServersettingsElement.php line: 282
+serversettings_element_ad_location = ""
+;
+; ServersettingsElement.php line: 287
+serversettings_element_top = ""
+;
+; ServersettingsElement.php line: 292
+serversettings_element_side = ""
+;
+; ServersettingsElement.php line: 297
+serversettings_element_both = ""
+;
+; ServersettingsElement.php line: 302
+serversettings_element_none = ""
+;
+; ServersettingsElement.php line: 305
+serversettings_element_global_adscript = ""
+;
+; ServersettingsElement.php line: 312
+serversettings_element_top_adscript = ""
+;
+; ServersettingsElement.php line: 319
+serversettings_element_side_adscript = ""
+;
+; ServersettingsElement.php line: 329
+serversettings_element_save = ""
+;
+; SigninElement.php line: 73
+signin_element_settings = ""
+;
+; SigninElement.php line: 77
+signin_element_signin = "Masuk"
+;
+; SigninElement.php line: 81
+signin_element_signout = "Keluar"
+;
+; SubsearchElement.php line: 69
+subsearch_element_more = ""
+;
+; WikiElement.php line: 121
+wiki_view_back = ""
+;
+; WikiElement.php line: 139
+groupfeed_element_feed = ""
+;
+; WikiElement.php line: 140
+wiki_view_wiki = ""
+;
+; WikiElement.php line: 144
+wiki_view_page = ""
+;
+; WikiElement.php line: 148
+wiki_view_read = ""
+;
+; WikiElement.php line: 149
+wiki_view_edit = ""
+;
+; WikiElement.php line: 152
+wiki_view_pages = ""
+;
+; WikiElement.php line: 237
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 245
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 246
+wiki_view_create_edit = ""
+;
+; WikiElement.php line: 247
+wiki_view_use_form_below = ""
+;
+; WikiElement.php line: 259
+wiki_element_submit = ""
+;
+; WikiElement.php line: 265
+wiki_view_syntax_summary = ""
+;
+; WikiElement.php line: 268
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 270
+wiki_view_signin_edit = ""
+;
+; WikiElement.php line: 272
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 302
+wiki_element_history = ""
+;
+; WikiElement.php line: 306
+wiki_element_discuss = ""
+;
+; WikiElement.php line: 342
+wiki_element_locale_name = ""
+;
+; WikiElement.php line: 346
+wiki_element_page = ""
+;
+; WikiElement.php line: 349
+configure_element_toggle_page_settings = ""
+;
+; WikiElement.php line: 353
+wiki_element_page_type = ""
+;
+; WikiElement.php line: 361
+wiki_element_page_alias = ""
+;
+; WikiElement.php line: 369
+wiki_element_page_border = ""
+;
+; WikiElement.php line: 376
+wiki_element_table_of_contents = ""
+;
+; WikiElement.php line: 385
+wiki_element_title = ""
+;
+; WikiElement.php line: 391
+wiki_element_meta_author = ""
+;
+; WikiElement.php line: 397
+wiki_element_meta_robots = ""
+;
+; WikiElement.php line: 404
+wiki_element_meta_description = ""
+;
+; WikiElement.php line: 411
+wiki_element_page_header = ""
+;
+; WikiElement.php line: 417
+wiki_element_page_footer = ""
+;
+; WikiElement.php line: 440
+wiki_element_archive_info = ""
+;
+; WikiElement.php line: 443
+wiki_element_edit_reason = ""
+;
+; WikiElement.php line: 450
+wiki_element_savebutton = ""
+;
+; WikiElement.php line: 454
+wiki_element_media_list = ""
+;
+; WikiElement.php line: 455
+wiki_element_ml_description = ""
+;
+; WikiElement.php line: 458
+wiki_view_page_resources = ""
+;
+; WikiElement.php line: 493
+wiki_view_upload = ""
+;
+; WikiElement.php line: 497
+wiki_element_resources_info = ""
+;
+; WikiElement.php line: 512
+wiki_element_rename_failed = ""
+;
+; WikiElement.php line: 578
+wiki_element_rename = ""
+;
+; WikiElement.php line: 582
+wiki_element_add_to_page = ""
+;
+; WikiElement.php line: 602
+wiki_element_no_resources = ""
+;
+; WikiElement.php line: 624
+wiki_view_wiki_page_list = ""
+;
+; WikiElement.php line: 637
+wiki_view_filter_or_create = ""
+;
+; WikiElement.php line: 639
+wiki_element_go = ""
+;
+; WikiElement.php line: 644
+wiki_view_create_page = ""
+;
+; WikiElement.php line: 655
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 677
+wiki_view_no_pages = ""
+;
+; WikiElement.php line: 700
+wiki_view_back = ""
+;
+; WikiElement.php line: 716
+wiki_view_difference = ""
+;
+; WikiElement.php line: 722
+wiki_view_go = ""
+;
+; WikiElement.php line: 741
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 743
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 747
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 748
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 754
+wiki_view_edited_by = ""
+;
+; WikiElement.php line: 758
+wiki_view_page_len = ""
+;
+; WikiElement.php line: 760
+wiki_view_revert = ""
+;
+; WikiElement.php line: 763
+wiki_view_revert = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/helpers
+;
+; FeedsHelper.php line: 70
+feeds_helper_view_feed_results = ""
+;
+; FeedsHelper.php line: 164
+feeds_helper_view_onehour = ""
+;
+; FeedsHelper.php line: 169
+feeds_helper_view_minsecs = ""
+;
+; FeedsHelper.php line: 174
+feeds_helper_view_hourdate = ""
+;
+; FileuploadHelper.php line: 72
+fileupload_helper_drag_textarea = ""
+;
+; FileuploadHelper.php line: 73
+fileupload_helper_click_textarea = ""
+;
+; FileuploadHelper.php line: 75
+fileupload_helper_drag_above = ""
+;
+; FileuploadHelper.php line: 76
+fileupload_helper_click_upload = ""
+;
+; FileuploadHelper.php line: 117
+basic_js_invalid_filetype = ""
+;
+; FileuploadHelper.php line: 119
+basic_js_file_too_big = ""
+;
+; FileuploadHelper.php line: 121
+basic_js_upload_progress = ""
+;
+; FileuploadHelper.php line: 123
+basic_js_progress_meter_disabled = ""
+;
+; FileuploadHelper.php line: 125
+basic_js_upload_error = ""
+;
+; FileuploadHelper.php line: 127
+basic_js_upload_cancelled = ""
+;
+; FileuploadHelper.php line: 129
+basic_js_too_many_files = ""
+;
+; HelpbuttonHelper.php line: 106
+wiki_question_mark = ""
+;
+; HelpbuttonHelper.php line: 138
+wiki_view_edit = ""
+;
+; HelpbuttonHelper.php line: 139
+wiki_view_not_available = ""
+;
+; HelpbuttonHelper.php line: 141
+wiki_view_create_edit = ""
+;
+; HelpbuttonHelper.php line: 143
+wiki_view_page_no_exist = ""
+;
+; HelpbuttonHelper.php line: 145
+wiki_view_read = ""
+;
+; ImagesHelper.php line: 55
+images_helper_view_image_results = ""
+;
+; PaginationHelper.php line: 97
+pagination_helper_previous = "Sebelum"
+;
+; PaginationHelper.php line: 121
+pagination_helper_next = "Sesudah"
+;
+; PagingtableHelper.php line: 103
+pagingtable_helper_search = ""
+;
+; PagingtableHelper.php line: 125
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 138
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 215
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 233
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 241
+pagingtable_helper_search = ""
+;
+; SearchformHelper.php line: 119
+searchform_helper_any = ""
+;
+; SearchformHelper.php line: 148
+searchform_helper_search = ""
+;
+; ToggleHelper.php line: 59
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 61
+toggle_helper_off = ""
+;
+; ToggleHelper.php line: 65
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 67
+toggle_helper_off = ""
+;
+; ToggleHelper.php line: 71
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 73
+toggle_helper_off = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/layouts
+;
+; RssLayout.php line: 62
+rss_layout_title = ""
+;
+; RssLayout.php line: 69
+rss_layout_description = ""
+;
+; WebLayout.php line: 63
+web_layout_title = ""
+;
+; WebLayout.php line: 73
+web_layout_description = ""
+;
+; WebLayout.php line: 75
+web_layout_site_author = ""
+;
+; WebLayout.php line: 219
+web_layout_query_statistics = ""
+;
+; WebLayout.php line: 223
+web_layout_total_elapsed_time = ""
+;
+; WebLayout.php line: 228
+web_layout_query_time = ""
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/views
+;
+; DownloadView.php line: 65
+download_view_form = ""
+;
+; DownloadView.php line: 74
+download_view_thank_you = ""
+;
+; DownloadView.php line: 76
+download_view_full_name = ""
+;
+; DownloadView.php line: 81
+download_view_email = ""
+;
+; DownloadView.php line: 85
+download_view_business = ""
+;
+; DownloadView.php line: 90
+download_view_interest = ""
+;
+; DownloadView.php line: 96
+download_view_get_email = ""
+;
+; DownloadView.php line: 102
+download_view_return_main = ""
+;
+; DownloadView.php line: 115
+download_view_required_fields = ""
+;
+; DownloadView.php line: 119
+download_view_name_required = ""
+;
+; DownloadView.php line: 123
+download_view_valid_email = ""
+;
+; StoreView.php line: 65
+download_view_form = ""
+;
+; StoreView.php line: 74
+download_view_thank_you = ""
+;
+; StoreView.php line: 76
+download_view_full_name = ""
+;
+; StoreView.php line: 81
+download_view_email = ""
+;
+; StoreView.php line: 85
+download_view_business = ""
+;
+; StoreView.php line: 90
+download_view_interest = ""
+;
+; StoreView.php line: 96
+download_view_get_email = ""
+;
+; StoreView.php line: 102
+download_view_return_main = ""
+;
+; StoreView.php line: 115
+download_view_required_fields = ""
+;
+; StoreView.php line: 119
+download_view_name_required = ""
+;
+; StoreView.php line: 123
+download_view_valid_email = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/library/indexing_plugins
+;
+; WordfilterPlugin.php line: 355
+wordfilter_plugin_settings_saved = ""
+;
+; WordfilterPlugin.php line: 364
+wordfilter_plugin_defaults_restored = ""
+;
+; WordfilterPlugin.php line: 469
+wordfilter_plugin_preferences = ""
+;
+; WordfilterPlugin.php line: 473
+wordfilter_plugin_factory_settings = ""
+;
+; WordfilterPlugin.php line: 485
+wordfilter_plugin_save = ""
diff --git a/locale/in_ID/resources/Tokenizer.php b/locale/in_ID/resources/Tokenizer.php
new file mode 100755
index 0000000..a6ffe98
--- /dev/null
+++ b/locale/in_ID/resources/Tokenizer.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\in_ID\resources;
+
+use seekquarry\yioop\models\LocaleModel;
+
+/**
+ * Indonesian specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\in_ID
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/in_ID/resources/locale.js b/locale/in_ID/resources/locale.js
new file mode 100755
index 0000000..517ea39
--- /dev/null
+++ b/locale/in_ID/resources/locale.js
@@ -0,0 +1,45 @@
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\in-ID
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015s
+ * @filesource
+ */
+/*
+ * The alphabet for this locale
+ */
+var alpha = "abcdefghijklmnopqrstuvwxyz";
+/*
+ * Transliteration mapping for this locale
+ */
+var roman_array = {};
+/*
+ * To analyze the query and generate actual input query from the
+ * transliterated query
+ */
+function analyzeQuery()
+{
+}
diff --git a/locale/in_ID/resources/suggest_trie.txt.gz b/locale/in_ID/resources/suggest_trie.txt.gz
new file mode 100755
index 0000000..1ef4b27
Binary files /dev/null and b/locale/in_ID/resources/suggest_trie.txt.gz differ
diff --git a/locale/in_ID/statistics.txt b/locale/in_ID/statistics.txt
new file mode 100755
index 0000000..ada6b5a
--- /dev/null
+++ b/locale/in_ID/statistics.txt
@@ -0,0 +1 @@
+d:2;
\ No newline at end of file
diff --git a/locale/it/resources/Tokenizer.php b/locale/it/resources/Tokenizer.php
new file mode 100755
index 0000000..c093917
--- /dev/null
+++ b/locale/it/resources/Tokenizer.php
@@ -0,0 +1,770 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\it\resources;
+
+/**
+ * Italian specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\it
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = [];
+    /**
+     * Storage used in computing the stem
+     * @var string
+     */
+    private static $buffer;
+    /**
+     * Storage used in computing the starting index of region R1
+     * @var int
+     */
+    private static $r1_start;
+    /**
+     * Storage used in computing the starting index of region R2
+     * @var int
+     */
+    private static $r2_start;
+    /**
+     * Storage used in computing the starting index of region RV
+     * @var int
+     */
+    private static $rv_start;
+    /**
+     * Storage used in computing region R1
+     * @var string
+     */
+    private static $r1_string;
+    /**
+     * Storage used in computing region R2
+     * @var string
+     */
+    private static $r2_string;
+    /**
+     * Storage used in computing Region RV
+     * @var string
+     */
+    private static $rv_string;
+    /**
+     * Storage for computing the starting position for the longest suffix
+     * @var int
+     */
+    private static $max_suffix_pos;
+    /**
+     * Storage used in determinig if step1 removed any endings from the word
+     * @var bool
+     */
+    private static $step1_changes;
+    /**
+     * This method currently does nothing. For some locales it could
+     * used to split strings of the form "thisisastring" into a string
+     * with the words seperated: "this is a string"
+     *
+     * @param string $pre_segment string to be segmented
+     * @return string after segmentation done (same string in this case)
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = [
+            'http', 'https',
+            "ad", "al", "allo", "ai", "agli", "all", "agl", "alla",
+            "alle", "con", "col", "coi", "da", "dal", "dallo", "dai",
+            "dagli", "dall", "dagl", "dalla", "dalle", "di", "del",
+            "dello", "dei", "degli", "dell", "degl", "della", "delle",
+            "in", "nel", "nello", "nei", "negli", "nell", "negl", "nella",
+            "nelle", "su", "sul", "sullo", "sui", "sugli", "sull", "sugl",
+            "sulla", "sulle", "per", "tra", "contro", "io", "tu", "lui",
+            "lei", "noi", "voi", "loro", "mio", "mia", "miei", "mie", "tuo",
+            "tua", "tuoi", "tue", "suo", "sua", "suoi", "sue", "nostro",
+            "nostra", "nostri", "nostre", "vostro", "vostra", "vostri",
+            "vostre", "mi", "ti", "ci", "vi", "lo", "la", "li", "le", "gli",
+            "ne", "il", "un", "uno", "una", "ma", "ed", "se", "perché",
+            "anche", "come", "dov", "dove", "che", "chi", "cui", "non", "più",
+            "quale", "quanto", "quanti", "quanta", "quante", "quello", "quelli",
+            "quella", "quelle", "questo", "questi", "questa", "queste", "si",
+            "tutto", "tutti", "a", "c", "e", "i", "l", "o", "ho", "hai", "ha",
+            "abbiamo", "avete", "hanno", "abbia", "abbiate", "abbiano", "avrò",
+            "avrai", "avrà", "avremo", "avrete", "avranno", "avrei", "avresti",
+            "avrebbe", "avremmo", "avreste", "avrebbero", "avevo", "avevi",
+            "aveva", "avevamo", "avevate", "avevano", "ebbi", "avesti", "ebbe",
+            "avemmo", "aveste", "ebbero", "avessi", "avesse", "avessimo",
+            "avessero", "avendo", "avuto", "avuta", "avuti", "avute", "sono",
+            "sei", "è", "siamo", "siete", "sia", "siate", "siano", "sarò",
+            "sarai", "sarà", "saremo", "sarete", "saranno", "sarei", "saresti",
+            "sarebbe", "saremmo", "sareste", "sarebbero", "ero", "eri", "era",
+            "eravamo", "eravate", "erano", "fui", "fosti", "fu", "fummo",
+            "foste", "furono", "fossi", "fosse", "fossimo", "fossero",
+            "essendo", "faccio", "fai", "facciamo", "fanno", "faccia",
+            "facciate", "facciano", "farò", "farai", "farà", "faremo",
+            "farete", "faranno", "farei", "faresti", "farebbe", "faremmo",
+            "fareste", "farebbero", "facevo", "facevi", "faceva", "facevamo",
+            "facevate", "facevano", "feci", "facesti", "fece", "facemmo",
+            "faceste", "fecero", "facessi", "facesse", "facessimo", "facessero",
+            "facendo", "sto", "stai", "sta", "stiamo", "stanno", "stia",
+            "stiate", "stiano", "starò", "starai", "starà", "staremo",
+            "starete", "staranno", "starei", "staresti", "starebbe", "staremmo",
+            "stareste", "starebbero", "stavo", "stavi", "stava", "stavamo",
+            "stavate", "stavano", "stetti", "stesti", "stette", "stemmo",
+            "steste", "stettero", "stessi", "stesse", "stessimo", "stessero",
+            "stando"
+        ];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/', '',
+            mb_strtolower($page));
+        return $page;
+    }
+    /**
+     * Computes the stem of an Italian word
+     * Example guardando,guardandogli,guardandola,guardano all stem to guard
+     *
+     * @param string $word is the word to be stemmed
+     * @return string stem of $word
+     */
+    public static function stem($word)
+    {
+        self::$buffer = $word;
+        self::$step1_changes = false;
+        self::$max_suffix_pos = -1;
+        self::prelude();
+        self::step0();
+        self::step1();
+        self::step2();
+        self::step3a();
+        self::step3b();
+        self::postlude();
+        return self::$buffer;
+    }
+    /**
+     * Checks if a string is a suffix for another string
+     *
+     * @param $parent_string is the string in which we wish to find the suffix
+     * @param $substring is the suffix we wish to check
+     * @return $pos as the starting position of the suffix $substring in
+     * $parent_string if it exists, else false
+     */
+    private static function checkForSuffix($parent_string,$substring)
+    {
+        $pos = strrpos($parent_string,$substring);
+        if ($pos !== false &&
+           (strlen($parent_string) - $pos == strlen($substring)))
+            return $pos;
+        else
+            return false;
+    }
+    /**
+     * Checks if a string occurs in another string
+     *
+     * @param $string is the parent string
+     * @param $substring is the string checked to be a sub-string of $string
+     * @return bool if $substring is a substring of $string
+     */
+    private static function in($string, $substring)
+    {
+        $pos = strpos($string, $substring);
+        if ($pos !== false) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+    /**
+     * Computes the starting index for region R1
+     *
+     * @param $string is the string for which we wish to find the index
+     * @return $r1_start as the starting index for R1 for $string
+     */
+    private static function r1($string)
+    {
+       $r1_start = -1;
+       for ($i = 0; $i < strlen($string); $i++){
+           if ($i >= 1){
+               if (self::isVowel($string[$i - 1]) &&
+                  !self::isVowel($string[$i])){
+                   $r1_start = $i + 1;
+                    break;
+                }
+            }
+        }
+        if ($r1_start != -1){
+            if ($r1_start > strlen($string) - 1)
+                $r1_start = -1;
+            else{
+                if ($string[$r1_start] == "`")
+                    $r1_start += 1;
+            }
+        }
+        return $r1_start;
+    }
+    /**
+     * Computes the starting index for region R2
+     *
+     * @param $string is the string for which we wish to find the index
+     * @return $r2_start as the starting index for R1 for $string
+     */
+    private static function r2($string)
+    {
+        $r2_start = -1;
+        $r1_start = self::r1($string);
+        if ($r1_start !== -1) {
+            $len = strlen($string);
+            for ($i = $r1_start; $i < $len; $i++) {
+                if ($i >= $r1_start + 1){
+                    if (self::isVowel($string[$i - 1]) &&
+                       !self::isVowel($string[$i])) {
+                        $r2_start = $i + 1;
+                        break;
+                    }
+                }
+            }
+        }
+        if ($r2_start != -1){
+            if ($r2_start > strlen($string) - 1) {
+                $r2_start = -1;
+            } else {
+                if ($string[$r2_start] == "`") {
+                    $r2_start += 1;
+                }
+            }
+        }
+
+        return $r2_start;
+    }
+    /**
+     * Computes the starting index for region RV
+     *
+     * @param $string is the string for which we wish to find the index
+     * @return $rv_start as the starting index for RV for $string
+     */
+    private static function rv($string)
+    {
+        $i = 0;
+        $j = 1;
+        $rv_start = -1;
+        $length = strlen($string);
+        if ($length <= 2)
+            $rv_start = -1;
+        else{
+            if (self::isVowel($string[$j])){
+                if (self::isVowel($string[$i])){
+                    for ($k = $j + 1; $k < $length; $k++){
+                        if (!self::isVowel($string[$k])){
+                            $rv_start = $k + 1;
+                            break;
+                        }
+                    }
+                } else {
+                    $rv_start = 3;
+                }
+            } else {
+                for ($k = $j + 1; $k < $length; $k++){
+                    if (self::isVowel($string[$k])){
+                        $rv_start = $k + 1;
+                        break;
+                    }
+                }
+            }
+        }
+        if ($rv_start != -1){
+            if ($rv_start >= $length)
+                $rv_start = -1;
+            else{
+                if ($string[$rv_start] == "`")
+                    $rv_start += 1;
+            }
+        }
+        return $rv_start;
+    }
+    /**
+     * Computes regions R1, R2 and RV in the form
+     * strings. $r1_string, $r2_string, $r3_string for R1,R2 and R3
+     * repectively
+     */
+    private static function getRegions()
+    {
+        if ((self::$r1_start = self::r1(self::$buffer)) != -1) {
+            self::$r1_string = substr(self::$buffer,self::$r1_start);
+        } else {
+            self::$r1_string = null;
+        }
+        if ((self::$r2_start = self::r2(self::$buffer)) != -1) {
+            self::$r2_string = substr(self::$buffer,self::$r2_start);
+        } else {
+            self::$r2_string = null;
+        }
+        if ((self::$rv_start = self::rv(self::$buffer)) != -1) {
+            self::$rv_string = substr(self::$buffer,self::$rv_start);
+        } else {
+            self::$rv_string = null;
+        }
+    }
+    /**
+     * Checks if a character is a vowel or not
+     *
+     * @param $char is the character to be checked
+     * @return bool if $char is a vowel
+     */
+    private static function isVowel($char)
+    {
+        switch ($char)
+        {
+            case "U":
+                // no break
+            case "I":
+            case "`":
+                return false;
+            case "a":
+                // no break
+            case "e":
+            case "i":
+            case "o":
+            case "u":
+                return true;
+        }
+    }
+    /**
+     * Computes the longest suffix for a given string from a given set of
+     * suffixes
+     *
+     * @param $string is the for which the maximum suffix is to be found
+     * @param $suffixes is an array of suffixes
+     * @return $max_suffix is the longest suffix for $string
+     */
+    private static function maxSuffix($string, $suffixes)
+    {
+        $max_length = 0;
+        $max_suffix = null;
+        foreach ($suffixes as $suffix){
+            $pos = strrpos($string,$suffix);
+            if ($pos !== false){
+                $string_tail = substr($string,$pos);
+                $suffix_length = strlen($suffix);
+                if (!strcmp($string_tail, $suffix)){
+                    if ($suffix_length > $max_length){
+                        $max_suffix = $suffix;
+                        $max_length = $suffix_length;
+                        self::$max_suffix_pos = $pos;
+                    }
+                }
+            }
+        }
+        return $max_suffix;
+    }
+    /**
+     * Replaces all acute accents in a string by grave accents and also handles
+     * accented characters
+     *
+     * @param $string is the string from in which the acute accents are to be
+     * replaced
+     * @return $string with changes
+     */
+    private static function acuteByGrave($string)
+    {
+        $pattern2 = ["/á/","/é/","/ó/","/ú/","/è/",
+            "/ì/","/ò/","/ù/", "/à/","/í/"];
+        $replacement = ["a`","e`","o`","u`","e`",
+            "i`","o`","u`","a`","i`"];
+        $string = preg_replace($pattern2,$replacement,$string);
+        return($string);
+    }
+    /**
+     * Performs the following functions:
+     * Replaces acute accents with grave accents
+     * Marks u after q and u,i preceded and followed by a vowel as a non vowel
+     * by converting to upper case
+     */
+    private static function prelude()
+    {
+        $pattern_array = ["/Qu/","/qu/"];
+        $replacement_array = ["QU","qU"];
+        //Replace acute accents by grave accents
+        self::$buffer = self::acuteByGrave(self::$buffer);
+        /**
+         * Convert u preceded by q and u,i preceded and followed by vowels
+         * to upper case to mark them as non vowels
+         */
+        self::$buffer = preg_replace($pattern_array,$replacement_array,
+                       self::$buffer);
+        for ($i = 0; $i < strlen(self::$buffer) - 1; $i++){
+            if ($i >= 1 && (self::$buffer[$i] == "i" ||
+                           self::$buffer[$i] == "u")){
+                if (self::isVowel(self::$buffer[$i-1]) &&
+                   self::isVowel(self::$buffer[$i+1]) &&
+                   self::$buffer[$i+1] !== '`')
+                    self::$buffer[$i] = strtoupper(self::$buffer[$i]);
+            }
+        }
+    }
+    /**
+     * Handles attached pronoun
+     */
+    private static function step0()
+    {
+        $max = 0;
+        $suffixes = ["ci","gli","la","le","li","lo",
+            "mi","ne","si","ti","vi","sene",
+            "gliela","gliele","glieli","glielo",
+            "gliene","mela","mele","meli","melo",
+            "mene","tela","tele","teli","telo",
+            "tene","cela","cele","celi","celo",
+            "cene","vela","vele","veli","velo","vene"];
+        $phrases = ["ando","endo","ar","er","ir"];
+        //Get R1, R2, RV
+        self::getRegions();
+        //Find the maximum length suffix in the string
+        $max_suffix = self::maxSuffix(self::$rv_string,$suffixes);
+        if ($max_suffix != null){
+            $sub_string = substr(self::$rv_string,0,-strlen($max_suffix));
+            foreach ($phrases as $phrase){
+                if (self::checkForSuffix($sub_string,$phrase) !== false){
+                    switch ($phrase) {
+                        case "ando": case "endo":
+                            self::$buffer = substr_replace(self::$buffer,"",
+                                self::$rv_start + self::$max_suffix_pos,
+                                strlen($max_suffix));
+                            break;
+                        case "ar": case "er": case "ir":
+                            self::$buffer = substr_replace(self::$buffer,"e",
+                                self::$rv_start + self::$max_suffix_pos,
+                                strlen($max_suffix));
+                            break;
+                    }
+                }
+            }
+        }
+    }
+    /**
+     * Handles standard suffixes
+     */
+    private static function step1()
+    {
+        $suffixes = ["anza","anze","ico","ici","ica",
+            "ice","iche","ichi","ismo","ismi",
+            "abile","abili","ibile","ibili","ista",
+            "iste","isti","ista`","iste`","isti`",
+            "oso","osi","osa","ose","mente","atrice",
+            "atrici","ante","anti","azione","azioni",
+            "atore","atori","logia","logie","uzione",
+            "uzioni","usione","usioni","enza","enze",
+            "amento","amenti","imento","imenti","amente",
+            "ita`","ivo","ivi","iva","ive"];
+        //Get R1,R2 and RV
+        self::getRegions();
+        //Find the longest suffix
+        $max_suffix = self::maxSuffix(self::$buffer,$suffixes);
+        //Handle suffix according
+        switch ($max_suffix) {
+            case "anza":
+                // no break
+            case "anze": case "ico": case "ici": case "ica":
+            case "ice": case "iche": case "ichi": case "ismo": case "ismi":
+            case "abile": case "abili": case "ibile": case "ibili":
+            case "ista": case "iste": case "isti": case "ista`": case "iste`":
+            case "isti`": case "oso": case"osi": case "osa": case "ose":
+            case "mente": case "atrice": case "atrici": case "ante":
+            case "anti":
+                //Delete if in R2
+                if (self::in(self::$r2_string,$max_suffix)){
+                    self::$buffer = substr_replace(self::$buffer,"",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                break;
+            case "azione":
+                // no break
+            case "azioni": case "atore": case "atori":
+                //Delete if in R2
+                if (self::in(self::$r2_string,$max_suffix)){
+                    self::$buffer = substr_replace(self::$buffer,"",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                self::getRegions();
+                //If preceded by ic, delete if in R2
+                if (self::checkForSuffix(self::$buffer,"ic")) {
+                    if (self::in(self::$r2_string,"ic")){
+                        self::$buffer = str_replace("ic","",self::$buffer);
+                        self::$step1_changes = true;
+                    }
+                }
+                break;
+            case "logia":
+                // no break
+            case "logie":
+                //Replace with log if in R2
+                if (self::in(self::$r2_string,$max_suffix)) {
+                    self::$buffer = substr_replace(self::$buffer,"log",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                break;
+            case "uzione":
+                // no break
+            case "uzioni": case "usione": case "usioni":
+                //Replace with u if in R2
+                if (self::in(self::$r2_string,$max_suffix)) {
+                    self::$buffer = substr_replace(self::$buffer,"u",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                break;
+            case "enza":
+                // no break;
+            case "enze":
+                //Replace with ente if in R2
+                if (self::in(self::$r2_string,$max_suffix)) {
+                    self::$buffer = substr_replace(self::$buffer,"ente",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                break;
+            case "amento":
+                // no break
+            case "amenti": case "imento": case "imenti":
+                //Delete if in RV
+                if (self::in(self::$rv_string,$max_suffix)){
+                    self::$buffer = substr_replace(self::$buffer,"",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                break;
+            case "amente":
+                //Delete if in R1
+                if (self::in(self::$r1_string,$max_suffix)){
+                    self::$buffer = substr_replace(self::$buffer,"",
+                                    self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                self::getRegions();
+                //Check if preceded by iv, if yes, delete if in R2
+                if (self::checkForSuffix(self::$buffer,"iv")){
+                    if (self::in(self::$r2_string,"iv")){
+                        self::$buffer = str_replace("iv","",self::$buffer);
+                        self::$step1_changes = true;
+                        if (self::checkForSuffix(self::$buffer,"at")){
+                            if (self::in(self::$r2_string,"at")){
+                                self::$buffer = str_replace("at","",
+                                    self::$buffer);
+                                self::$step1_changes = true;
+                            }
+                        }
+                    }
+                } else {
+                    /**
+                     * Otherwise check if preceded by os,ic or abil, if yes,
+                     * delete if in r2
+                     */
+                    self::getRegions();
+                    $further = ["os","ic","abil"];
+                    foreach ($further as $suffix){
+                        $pos = self::checkForSuffix(self::$buffer,$suffix);
+                        if ($pos !== false){
+                            if (self::in(self::$r2_string,$suffix)){
+                                self::$buffer = substr_replace(self::$buffer,
+                                    "",$pos);
+                                self::$step1_changes = true;
+                            }
+                        }
+                    }
+                }
+                break;
+            case "ita`":
+                //Delete if in R2
+                if (self::in(self::$r2_string,$max_suffix)){
+                    self::$buffer = substr_replace(self::$buffer,"",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                //If further preceded by abil,ic or iv, delete if in R2
+                self::getRegions();
+                $further = ["abil","ic","iv"];
+                foreach ($further as $suffix){
+                    if (self::checkForSuffix(self::$buffer,$suffix)){
+                        if (self::in(self::$r2_string,$suffix)){
+                            self::$buffer = str_replace($suffix,"",
+                                self::$buffer);
+                            self::$step1_changes = true;
+                        }
+                    }
+                }
+                // no break
+            case "ivo":
+                // no break
+            case "ivi": case "iva": case "ive":
+                //Delete if in R2
+                if (self::in(self::$r2_string,$max_suffix)){
+                    self::$buffer = substr_replace(self::$buffer,"",
+                        self::$max_suffix_pos,strlen($max_suffix));
+                    self::$step1_changes = true;
+                }
+                //If preceded by at, delete if in R2
+                self::getRegions();
+                $pos = self::checkForSuffix(self::$buffer,"at");
+                if ($pos !== false){
+                    if (self::in(self::$r2_string,"at")){
+                        self::$buffer = substr_replace(self::$buffer,"",$pos,2);
+                        self::$step1_changes = true;
+                        //If further preceded by ic, delete if in R2
+                        self::getRegions();
+                        $pos = self::checkForSuffix(self::$buffer,"ic");
+                        if ($pos !== false){
+                            if (self::in(self::$r2_string,"ic")){
+                                self::$buffer = substr_replace(self::$buffer,"",
+                                    $pos,2);
+                                self::$step1_changes = true;
+                            }
+                        }
+                    }
+                }
+        }
+    }
+    /**
+     * Handles verb suffixes
+     */
+    private static function step2()
+    {
+        $verb_suffixes = ["ammo","ando","ano","are","arono","asse",
+            "assero","assi","assimo","ata","ate","ati",
+            "ato","ava","avamo","avano","avate","avi","avo",
+            "emmo","enda","ende","endi","endo","era`",
+            "erai","eranno","ere","erebbe","erebbero",
+            "erei","eremmo","eremo","ereste","eresti",
+            "erete","ero`","erono","essero","ete","eva",
+            "evamo","evano","evate","evi","evo","Yamo",
+            "iamo","immo","ira`","irai","iranno","ire",
+            "irebbe","irebbero","irei","iremmo","iremo",
+            "ireste","iresti","irete","iro`","irono","isca",
+            "iscano","isce","isci","isco","iscono","issero",
+            "ita","ite","iti","ito","iva","ivamo","ivano",
+            "ivate","ivi","ivo","ono","uta","ute","uti",
+            "uto","ar","ir"];
+        /**
+         * If no ending was removed in step1, find the longest suffix from the
+         * above suffixes and delete if in RV
+         */
+        if (!self::$step1_changes){
+            //Get R1,R2 and RV
+            self::getRegions();
+
+            $max_suffix = self::maxSuffix(self::$rv_string,$verb_suffixes);
+            if (self::in(self::$rv_string,$max_suffix))
+                self::$buffer = substr_replace(self::$buffer,"",
+                    self::$rv_start + self::$max_suffix_pos,
+                    strlen($max_suffix));
+        }
+    }
+    /**
+     * Deletes a final a,e,i,o,a`,e`,i`,o` and a preceding i if in RV
+     */
+    private static function step3a()
+    {
+        $vowels = array ("a","e","i","o","a`","e`","i`","o`");
+
+        //Get R1,R2 and RV
+        self::getRegions();
+
+        //If a character from the above is found in RV, delete it
+        foreach ($vowels as $character) {
+            $pos = self::checkForSuffix(self::$buffer,$character);
+            if ($pos !== false){
+                if (self::in(self::$rv_string,$character)){
+                    self::$buffer = substr_replace(self::$buffer, "", $pos,
+                        strlen($character));
+                    break;
+                }
+            }
+        }
+        //If preceded by i, delete if in RV
+        self::getRegions();
+        $pos = self::checkForSuffix(self::$buffer,"i");
+        if ($pos !== false){
+            if (self::in(self::$rv_string,"i"))
+                self::$buffer = substr_replace(self::$buffer,"",$pos,1);
+        }
+    }
+    /**
+     * Replaces a final ch/gh by c/g if in RV
+     */
+    private static function step3b()
+    {
+        //Get R1,R2 and RV
+        self::getRegions();
+        //Replace final ch/gh with c/g if in RV
+        $patterns = ["ch","gh"];
+        foreach ($patterns as $pattern) {
+            switch ($pattern) {
+                case "ch":
+                    $pos = self::checkForSuffix(self::$buffer,$pattern);
+                    if ($pos !== false){
+                        if (self::in(self::$rv_string,$pattern))
+                            self::$buffer = substr_replace(self::$buffer,
+                                "c",$pos);
+                    }
+                    break;
+                case "gh":
+                    $pos = self::checkForSuffix(self::$buffer,$pattern);
+                    if ($pos !== false){
+                        if (self::in(self::$rv_string,$pattern))
+                            self::$buffer = substr_replace(self::$buffer,
+                                "g",$pos);
+                    }
+                    break;
+            }
+        }
+    }
+    /**
+     * Converts U and/or I back to lowercase
+     */
+    private static function postlude()
+    {
+        $pattern_array_1 = ["/U/","/I/"];
+        $replacement_array_1 = ["u","i"];
+        $pattern_array_2 = ["/a`/","/e`/","/i`/","/o`/","/u`/"];
+        $replacement_array_2 = ["à","è","ì","ò","ù"];
+        self::$buffer = preg_replace($pattern_array_1, $replacement_array_1,
+            self::$buffer);
+        self::$buffer = preg_replace($pattern_array_2, $replacement_array_2,
+            self::$buffer);
+    }
+}
diff --git a/locale/ja/resources/Tokenizer.php b/locale/ja/resources/Tokenizer.php
new file mode 100755
index 0000000..8a9a7f9
--- /dev/null
+++ b/locale/ja/resources/Tokenizer.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\ja\resources;
+
+/**
+ * Japanese specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\ja
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 3;
+}
+
diff --git a/locale/kn/resources/Tokenizer.php b/locale/kn/resources/Tokenizer.php
new file mode 100755
index 0000000..bb2d192
--- /dev/null
+++ b/locale/kn/resources/Tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\kn\resources;
+
+/**
+ * Kanada specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\kn
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/ko/resources/Tokenizer.php b/locale/ko/resources/Tokenizer.php
new file mode 100755
index 0000000..7540941
--- /dev/null
+++ b/locale/ko/resources/Tokenizer.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\ko\resources;
+
+use seekquarry\yioop\models\LocaleModel;
+
+/**
+ * Korean specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\ko
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 3;
+}
diff --git a/locale/nl/configure.ini b/locale/nl/configure.ini
new file mode 100755
index 0000000..9c8e91a
--- /dev/null
+++ b/locale/nl/configure.ini
@@ -0,0 +1,4503 @@
+; ***** BEGIN LICENSE BLOCK *****
+;  SeekQuarry/Yioop Open Source Pure PHP Search Engine, Crawler, and Indexer
+;  Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+;
+;  This program is free software: you can redistribute it and/or modify
+;  it under the terms of the GNU General Public License as published by
+;  the Free Software Foundation, either version 3 of the License, or
+;  (at your option) any later version.
+;
+;  This program is distributed in the hope that it will be useful,
+;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;  GNU General Public License for more details.
+;
+;  You should have received a copy of the GNU General Public License
+;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;  ***** END LICENSE BLOCK *****
+;
+; configure.ini
+;
+; nl configuration file
+;
+[general]
+;
+; Strings to translate on various pages
+;
+[strings]
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers
+;
+; AdminController.php line: 114
+admin_controller_need_cookies = "Cookies die nodig zijn om in te loggen!!"
+;
+; AdminController.php line: 164
+admin_controller_account_not_active = "Account niet actief. Misschien vraag wachtwoord opnieuw in te stellen?"
+;
+; AdminController.php line: 170
+admin_controller_login_successful = "Login Succesvolle!!"
+;
+; AdminController.php line: 189
+admin_controller_no_back_button = "Geen Back Button Tijdens Inloggen!"
+;
+; AdminController.php line: 203
+admin_controller_login_failed = "Gebruikersnaam of wachtwoord onjuist!"
+;
+; AdminController.php line: 209
+admin_controller_login_to_config = "Login om te gaan met de configuratie (standaard: u=wortel, p=)"
+;
+; AdminController.php line: 213
+admin_controller_status_updates_stopped = "Status updates zijn gestopt."
+;
+; AdminController.php line: 367
+admin_controller_account_access = "Toegang tot account"
+;
+; AdminController.php line: 368
+admin_controller_social = "sociaal"
+;
+; AdminController.php line: 369
+admin_controller_crawl_settings = "crawls"
+;
+; AdminController.php line: 370
+admin_controller_system_settings = "Systeeminstellingen"
+;
+; AdminController.php line: 371
+admin_controller_advertisement = ""
+;
+; AdminController.php line: 545
+admin_controller_equal = "is gelijk aan"
+;
+; AdminController.php line: 546
+admin_controller_not_equal = "niet gelijken"
+;
+; AdminController.php line: 547
+admin_controller_contains = "bevat"
+;
+; AdminController.php line: 548
+admin_controller_begins_with = "begint met"
+;
+; AdminController.php line: 549
+admin_controller_ends_with = "eindigt met"
+;
+; AdminController.php line: 552
+admin_controller_equal = "is gelijk aan"
+;
+; AdminController.php line: 553
+admin_controller_not_equal = "niet gelijken"
+;
+; AdminController.php line: 556
+admin_controller_no_sort = "niet sorteren"
+;
+; AdminController.php line: 557
+admin_controller_sort_ascending = "oplopend"
+;
+; AdminController.php line: 558
+admin_controller_sort_descending = "aflopend"
+;
+; MachineController.php line: 193
+machine_controller_nolines = "Geen Lijnen Match Filter!"
+;
+; RegisterController.php line: 249
+register_controller_need_cookies = "Cookies moeten worden ingeschakeld om te registreren of log in om een Yioop!"
+;
+; RegisterController.php line: 315
+register_controller_account_created = "Houdend met succes aangemaakt!!"
+;
+; RegisterController.php line: 333
+register_controller_registration_email_sent = "Registratie e-mail gestuurd!"
+;
+; RegisterController.php line: 335
+register_controller_admin_activation_request = "Yioop gebruiker heeft Gevraagde Activering"
+;
+; RegisterController.php line: 336
+register_controller_admin_email_salutation = "Geachte %s %s,"
+;
+; RegisterController.php line: 338
+register_controller_email_body = "Deze e-mail werd gegeven in een rekeningsverwezenlijking verzoek Yioop. Als u ge&iuml;nteresseerd bent in een Yioop rekening zijn wij u hieronder het adres gebruiken het registratieproces te voltooien."
+;
+; RegisterController.php line: 372
+register_controller_account_request_made = "Account registratie aanvraag is verzonden!"
+;
+; RegisterController.php line: 376
+register_controller_admin_activation_request = "Yioop gebruiker heeft Gevraagde Activering"
+;
+; RegisterController.php line: 377
+register_controller_admin_activation_message = "Gebruiker %s %s met gebruikersnaam %s heeft verzocht de activering van hun rekening."
+;
+; RegisterController.php line: 419
+register_controller_email_verification_error = "E-mail verificatie fout!!"
+;
+; RegisterController.php line: 425
+register_controller_already_activated = "Account is al geactiveerd!"
+;
+; RegisterController.php line: 432
+register_controller_account_activated = "Account succesvol geactiveerd!!"
+;
+; RegisterController.php line: 435
+register_controller_email_verification_error = "E-mail verificatie fout!!"
+;
+; RegisterController.php line: 483
+register_controller_account_recover_fail = "Niet in staat om rekening te herstellen!"
+;
+; RegisterController.php line: 492
+register_controller_account_recover_fail = "Niet in staat om rekening te herstellen!"
+;
+; RegisterController.php line: 496
+register_controller_account_recover_email = "Recover account E Verzonden!!"
+;
+; RegisterController.php line: 500
+register_controller_recover_request = "Yioop Account Recovery Request"
+;
+; RegisterController.php line: 501
+register_controller_admin_email_salutation = "Geachte %s %s,"
+;
+; RegisterController.php line: 503
+register_controller_recover_body = "Een verzoek werd gedaan om uw Yioop wachtwoord te achterhalen. Als dit juist is, dan kunt u plak de onderstaande link in een browser en vul het formulier gepresenteerd."
+;
+; RegisterController.php line: 537
+register_controller_account_recover_fail = "Niet in staat om rekening te herstellen!"
+;
+; RegisterController.php line: 549
+register_controller_account_recover_fail = "Niet in staat om rekening te herstellen!"
+;
+; RegisterController.php line: 562
+register_controller_account_recover_fail = "Niet in staat om rekening te herstellen!"
+;
+; RegisterController.php line: 569
+register_controller_recovered_already = "Recover e-mail al gebruikt!"
+;
+; RegisterController.php line: 573
+register_controller_recovery_expired = "Recover e-mail is verlopen!"
+;
+; RegisterController.php line: 579
+register_controller_password_changed = "Wachtwoord veranderd!"
+;
+; RegisterController.php line: 587
+register_controller_passwords_dont_match = "Wachtwoorden komen niet overeen!"
+;
+; RegisterController.php line: 601
+register_controller_recovered_already = "Recover e-mail al gebruikt!"
+;
+; RegisterController.php line: 605
+register_controller_recovery_expired = "Recover e-mail is verlopen!"
+;
+; RegisterController.php line: 732
+register_controller_invalid_url = "Formaat van URL is ongeldig!"
+;
+; RegisterController.php line: 736
+register_controller_error_fields = "Starred velden moeten correct worden ingevuld!"
+;
+; RegisterController.php line: 749
+register_controller_failed_hashcode = "Hash-code niet overeen!"
+;
+; RegisterController.php line: 759
+register_controller_failed_human = "Kreeg de menselijke controle vragen verkeerd!"
+;
+; RegisterController.php line: 786
+register_controller_failed_graphical_human = "Captcha Mis-aangegaan!"
+;
+; RegisterController.php line: 800
+register_controller_suggest_full = "Suggereren URL buffer vol is! Probeer het later opnieuw!"
+;
+; RegisterController.php line: 804
+register_controller_url_submitted = "Gesuggereerd URL gered!"
+;
+; RegisterController.php line: 1006
+register_controller_need_cookies = "Cookies moeten worden ingeschakeld om te registreren of log in om een Yioop!"
+;
+; RegisterController.php line: 1012
+register_controller_failed_human = "Kreeg de menselijke controle vragen verkeerd!"
+;
+; RegisterController.php line: 1027
+register_controller_failed_graphical_human = "Captcha Mis-aangegaan!"
+;
+; RegisterController.php line: 1038
+register_controller_failed_hashcode = "Hash-code niet overeen!"
+;
+; RegisterController.php line: 1066
+register_controller_error_fields = "Starred velden moeten correct worden ingevuld!"
+;
+; RegisterController.php line: 1069
+register_controller_check_email = "Controleer e-mailadres!"
+;
+; RegisterController.php line: 1076
+register_controller_user_already_exists = "Geen account aangemaakt - Gebruikersnaam al in gebruik!!"
+;
+; SearchController.php line: 280
+search_controller_web = "web"
+;
+; SearchController.php line: 341
+search_controller_logout_successful = "Afmelden Succesvolle!!"
+;
+; SearchController.php line: 549
+search_controller_mix_info = "Met behulp van Crawl Mix: %s"
+;
+; SearchController.php line: 555
+search_controller_crawl_info = "Index: %s - Grootte: %s paginas / %s urls"
+;
+; SearchController.php line: 591
+search_controller_search = "zoeken"
+;
+; SearchController.php line: 695
+search_controller_no_index_set = "Geen zoeken Index Set Voor gebruik!"
+;
+; SearchController.php line: 698
+search_controller_no_index_set = "Geen zoeken Index Set Voor gebruik!"
+;
+; SearchController.php line: 800
+search_controller_get_keyword_ads = ""
+;
+; SearchController.php line: 803
+search_controller_ad_keyword_description = ""
+;
+; SearchController.php line: 1382
+search_controller_download_fetcher = "Download ophalen: %s"
+;
+; SearchController.php line: 1391
+search_controller_no_archive_page = "De website in kwestie heeft verzocht deze pagina niet worden gearchiveerd."
+;
+; SearchController.php line: 1441
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1446
+search_controller_original_page = "Deze afbeelding verscheen op de pagina:"
+;
+; SearchController.php line: 1463
+search_controller_extracted_title = "onttrokken Titel"
+;
+; SearchController.php line: 1465
+search_controller_extracted_description = "Ge&iuml;xtraheerd Beschrijving"
+;
+; SearchController.php line: 1467
+search_controller_extracted_links = "Ge&iuml;xtraheerd Links"
+;
+; SearchController.php line: 1472
+search_controller_extracted_allow_paths = "Ge&iuml;xtraheerd toegestaan te kruipen Paths"
+;
+; SearchController.php line: 1478
+search_controller_extracted_disallow_paths = "Ge&iuml;xtraheerd Verworpen te kruipen Paths"
+;
+; SearchController.php line: 1484
+search_controller_crawl_delay = "YioopBot Crawl Delay"
+;
+; SearchController.php line: 1548
+search_controller_cache_comment = "Yioop Cache Pagina ... Deze pagina is aangepast om een robots richtlijn toe te voegen, maakt links absolute, voeg gewonnen samenvattingen, en om zoektermen te markeren."
+;
+; SearchController.php line: 1559
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1594
+search_controller_cached_version = "Deze cached versie van %s werd verkregen door het Yioop crawler op %s."
+;
+; SearchController.php line: 1689
+search_controller_download_fetcher = "Download ophalen: %s"
+;
+; SearchController.php line: 1707
+search_controller_header_summaries = "Toggle Ge&iuml;xtraheerd Headers en Samenvattingen"
+;
+; SearchController.php line: 1821
+search_controller_history = "toggle Geschiedenis"
+;
+; SearchController.php line: 1991
+search_controller_all_cached = "Alle cache versies - Change Jaar en / of maanden naar links zien"
+;
+; SearchController.php line: 2022
+search_controller_year = "jaar:"
+;
+; SearchController.php line: 2023
+search_controller_month = "maand:"
+;
+; SettingsController.php line: 115
+settings_controller_crawl_mix = "crawl mix"
+;
+; SettingsController.php line: 130
+settings_controller_settings_saved = "Instellingen Opgeslagen!"
+;
+; StaticController.php line: 68
+static_controller_logout_successful = "Afmelden Succesvolle"
+;
+; StaticController.php line: 146
+static_controller_complete_title = "Yioop! -%S"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers/components
+;
+; AccountaccessComponent.php line: 155
+accountaccess_component_no_posts_yet = "Geen berichten Toch"
+;
+; AccountaccessComponent.php line: 171
+accountaccess_component_passwords_too_long = "Wachtwoord is te lang!"
+;
+; AccountaccessComponent.php line: 181
+accountaccess_component_passwords_dont_match = "Getypte wachtwoorden komen niet overeen."
+;
+; AccountaccessComponent.php line: 188
+accountaccess_component_invalid_password = "Ongeldig Wachtwoord!"
+;
+; AccountaccessComponent.php line: 230
+accountaccess_component_unknown_imagetype = "Onbekend Image File Type!"
+;
+; AccountaccessComponent.php line: 235
+accountaccess_component_icon_too_big = "Pictogram Bestand te groot!"
+;
+; AccountaccessComponent.php line: 244
+accountaccess_component_no_user_folder = "Gebruiker map kon niet worden aangemaakt!"
+;
+; AccountaccessComponent.php line: 253
+accountaccess_component_user_updated = "gebruiker Bijgewerkt"
+;
+; AccountaccessComponent.php line: 294
+accountaccess_component_active_status = "actief"
+;
+; AccountaccessComponent.php line: 295
+accountaccess_component_inactive_status = "inactief"
+;
+; AccountaccessComponent.php line: 297
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 300
+accountaccess_component_request_join = "in afwachting van"
+;
+; AccountaccessComponent.php line: 301
+accountaccess_component_invited = "uitgenodigd"
+;
+; AccountaccessComponent.php line: 302
+accountaccess_component_active_status = "actief"
+;
+; AccountaccessComponent.php line: 304
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 352
+accountaccess_component_passwords_too_long = "Wachtwoord is te lang!"
+;
+; AccountaccessComponent.php line: 357
+accountaccess_component_passwords_dont_match = "Getypte wachtwoorden komen niet overeen."
+;
+; AccountaccessComponent.php line: 361
+accountaccess_component_invalid_username = "Ongeldige gebruikersnaam!"
+;
+; AccountaccessComponent.php line: 365
+accountaccess_component_user_exists = "Gebruiker Bestaat Al!"
+;
+; AccountaccessComponent.php line: 394
+accountaccess_component_user_added = "gebruiker Toegevoegd"
+;
+; AccountaccessComponent.php line: 403
+accountaccess_component_user_doesnt_exist = "Kan niet bewerken - dat sername bestaat niet!"
+;
+; AccountaccessComponent.php line: 410
+accountaccess_component_cant_edit_public_user = "Kan Public User niet bewerken!"
+;
+; AccountaccessComponent.php line: 452
+accountaccess_component_passwords_dont_match = "Getypte wachtwoorden komen niet overeen."
+;
+; AccountaccessComponent.php line: 458
+accountaccess_component_user_updated = "gebruiker Bijgewerkt"
+;
+; AccountaccessComponent.php line: 464
+accountaccess_component_user_filter_group = "Filtering door Group!"
+;
+; AccountaccessComponent.php line: 468
+accountaccess_component_user_filter_role = "Filtering door Rol!"
+;
+; AccountaccessComponent.php line: 479
+accountaccess_component_username_doesnt_exists = "Gebruikersnaam is niet bekend"
+;
+; AccountaccessComponent.php line: 484
+accountaccess_component_cant_delete_builtin = "Kan niet verwijderen Ingebouwde gebruiker!"
+;
+; AccountaccessComponent.php line: 489
+accountaccess_component_user_deleted = "gebruiker Verwijderde"
+;
+; AccountaccessComponent.php line: 498
+accountaccess_component_username_doesnt_exists = "Gebruikersnaam is niet bekend"
+;
+; AccountaccessComponent.php line: 503
+accountaccess_component_rolename_doesnt_exists = "Rol bestaat niet"
+;
+; AccountaccessComponent.php line: 509
+accountaccess_component_rolename_already_added = "Rolnaam Reeds Toegevoegd!"
+;
+; AccountaccessComponent.php line: 515
+accountaccess_component_rolename_added = "Rolnaam Toegevoegd"
+;
+; AccountaccessComponent.php line: 525
+accountaccess_component_username_doesnt_exists = "Gebruikersnaam is niet bekend"
+;
+; AccountaccessComponent.php line: 530
+accountaccess_component_groupname_doesnt_exists = "Groep Naam bestaat niet"
+;
+; AccountaccessComponent.php line: 536
+accountaccess_component_groupname_already_added = "Groep Naam Reeds Toegevoegd!"
+;
+; AccountaccessComponent.php line: 544
+accountaccess_component_groupname_added = "Groep Naam Toegevoegd"
+;
+; AccountaccessComponent.php line: 554
+accountaccess_component_username_doesnt_exists = "Gebruikersnaam is niet bekend"
+;
+; AccountaccessComponent.php line: 559
+accountaccess_component_rolename_doesnt_exists = "Rol bestaat niet"
+;
+; AccountaccessComponent.php line: 568
+accountaccess_component_rolename_deleted = "Rolnaam Verwijderde"
+;
+; AccountaccessComponent.php line: 578
+accountaccess_component_username_doesnt_exists = "Gebruikersnaam is niet bekend"
+;
+; AccountaccessComponent.php line: 583
+accountaccess_component_groupname_doesnt_exists = "Groep Naam bestaat niet"
+;
+; AccountaccessComponent.php line: 592
+accountaccess_component_group_deleted = "groep Deleted"
+;
+; AccountaccessComponent.php line: 609
+accountaccess_component_username_doesnt_exists = "Gebruikersnaam is niet bekend"
+;
+; AccountaccessComponent.php line: 615
+accountaccess_component_userstatus_updated = "Gebruiker Status Bijgewerkt"
+;
+; AccountaccessComponent.php line: 778
+accountaccess_component_select_activityname = "Kies een activiteit"
+;
+; AccountaccessComponent.php line: 803
+accountaccess_component_rolename_doesnt_exists = "Rol bestaat niet"
+;
+; AccountaccessComponent.php line: 819
+accountaccess_component_activity_added = "activiteit Toegevoegd"
+;
+; AccountaccessComponent.php line: 828
+accountaccess_component_rolename_exists = "Rol naam bestaat"
+;
+; AccountaccessComponent.php line: 834
+accountaccess_component_rolename_added = "Rolnaam Toegevoegd"
+;
+; AccountaccessComponent.php line: 838
+accountaccess_component_rolename_blank = "Rol Naam Blanco!"
+;
+; AccountaccessComponent.php line: 847
+accountaccess_component_rolename_doesnt_exists = "Rol bestaat niet"
+;
+; AccountaccessComponent.php line: 865
+accountaccess_component_activity_deleted = "activiteit Verwijderde"
+;
+; AccountaccessComponent.php line: 873
+accountaccess_component_rolename_doesnt_exists = "Rol bestaat niet"
+;
+; AccountaccessComponent.php line: 878
+accountaccess_component_rolename_deleted = "Rolnaam Verwijderde"
+;
+; AccountaccessComponent.php line: 910
+accountaccess_component_role_updated = "Rol op de hoogte!"
+;
+; AdvertisementComponent.php line: 55
+advertisement_component_num_days = ""
+;
+; AdvertisementComponent.php line: 56
+advertisement_component_one_day = ""
+;
+; AdvertisementComponent.php line: 57
+advertisement_component_seven_days = ""
+;
+; AdvertisementComponent.php line: 58
+advertisement_component_thirty_days = ""
+;
+; AdvertisementComponent.php line: 59
+advertisement_component_ninety_days = ""
+;
+; AdvertisementComponent.php line: 60
+advertisement_component_one_eighty_days = ""
+;
+; AdvertisementComponent.php line: 69
+advertisement_component_month = ""
+;
+; AdvertisementComponent.php line: 76
+advertisement_component_year = ""
+;
+; AdvertisementComponent.php line: 100
+advertisement_component_fields_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 105
+advertisement_component_duration_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 110
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 157
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 163
+advertisement_component_bid_too_low = ""
+;
+; AdvertisementComponent.php line: 171
+advertisement_component_processing_error = ""
+;
+; AdvertisementComponent.php line: 178
+advertisement_component_ad_created = ""
+;
+; AdvertisementComponent.php line: 206
+advertisement_component_status_changed = ""
+;
+; AdvertisementComponent.php line: 252
+advertisement_component_ad_updated = ""
+;
+; CrawlComponent.php line: 92
+crawl_component_starting_new_crawl = "Vanaf Nieuw Crawl!"
+;
+; CrawlComponent.php line: 107
+crawl_component_stop_crawl = "Stoppen kruipen. . .Dit Zal even duren om te vernieuwen."
+;
+; CrawlComponent.php line: 135
+crawl_component_resume_crawl = "Hervatten kruipen. . .Dit Zal even duren om te vernieuwen."
+;
+; CrawlComponent.php line: 143
+crawl_component_delete_crawl_success = "Verwijderen Crawl. . .Dit Zal even duren om te vernieuwen."
+;
+; CrawlComponent.php line: 147
+crawl_component_delete_crawl_fail = "Wis Crawl!! mislukt"
+;
+; CrawlComponent.php line: 156
+crawl_component_set_index = "Instellen Crawl om te gebruiken als Index"
+;
+; CrawlComponent.php line: 188
+crawl_component_no_description = "Geen beschrijving voor Crawl"
+;
+; CrawlComponent.php line: 336
+crawl_component_use_below = "Gebruik onderstaande opties"
+;
+; CrawlComponent.php line: 337
+crawl_component_use_defaults = "Gebruik Yioop! defaults"
+;
+; CrawlComponent.php line: 340
+crawl_component_use_below = "Gebruik onderstaande opties"
+;
+; CrawlComponent.php line: 344
+crawl_component_previous_crawl = "Vorige Crawl:"
+;
+; CrawlComponent.php line: 415
+crawl_component_added_urls = "Urls ge&iuml;njecteerd op %s."
+;
+; CrawlComponent.php line: 429
+crawl_component_add_suggest = "Gebruiker gesuggereerd URLs toegevoegd!"
+;
+; CrawlComponent.php line: 433
+crawl_component_no_new_suggests = "Geen nieuwe urls in gegevens suggereren"
+;
+; CrawlComponent.php line: 479
+crawl_component_breadth_first = "breedte eerste"
+;
+; CrawlComponent.php line: 481
+crawl_component_page_importance = "pagina Belang"
+;
+; CrawlComponent.php line: 545
+crawl_component_added_urls = "Urls ge&iuml;njecteerd op %s."
+;
+; CrawlComponent.php line: 555
+crawl_component_urls_injected = "Urls Injected!"
+;
+; CrawlComponent.php line: 565
+crawl_component_update_seed_info = "Updating Seed Site Info!"
+;
+; CrawlComponent.php line: 619
+crawl_component_new_classifier = "Nieuwe classifier gemaakt."
+;
+; CrawlComponent.php line: 623
+crawl_component_classifier_exists = "Een classifier met die naam al bestaat."
+;
+; CrawlComponent.php line: 646
+crawl_component_classifier_deleted = "Classifier verwijderd."
+;
+; CrawlComponent.php line: 650
+crawl_component_no_classifier = "Geen classifier met die naam."
+;
+; CrawlComponent.php line: 661
+crawl_component_no_classifier = "Geen classifier met die naam."
+;
+; CrawlComponent.php line: 679
+crawl_component_finalizing_classifier = "Finaliseren classifier."
+;
+; CrawlComponent.php line: 705
+crawl_component_finalizing_classifier = "Finaliseren classifier."
+;
+; CrawlComponent.php line: 751
+crawl_component_classifier_exists = "Een classifier met die naam al bestaat."
+;
+; CrawlComponent.php line: 760
+crawl_component_load_failed = "Verzuimd om documenten te laden"
+;
+; CrawlComponent.php line: 762
+crawl_component_loading = "het laden"
+;
+; CrawlComponent.php line: 764
+crawl_component_added_examples = "Toegevoegd {1} {2} voorbeelden"
+;
+; CrawlComponent.php line: 766
+crawl_component_label_update_failed = "Nagelaten om labels te werken."
+;
+; CrawlComponent.php line: 768
+crawl_component_updating = "updating"
+;
+; CrawlComponent.php line: 770
+crawl_component_acc_update_failed = "Nagelaten om de nauwkeurigheid te werken"
+;
+; CrawlComponent.php line: 772
+crawl_component_na = "N / A"
+;
+; CrawlComponent.php line: 774
+crawl_component_no_docs = "geen documenten"
+;
+; CrawlComponent.php line: 776
+crawl_component_num_docs = "{1} {2} documenten"
+;
+; CrawlComponent.php line: 778
+crawl_component_in_class = "in klasse"
+;
+; CrawlComponent.php line: 780
+crawl_component_not_in_class = "Niet In Klasse"
+;
+; CrawlComponent.php line: 782
+crawl_component_skip = "overslaan"
+;
+; CrawlComponent.php line: 784
+crawl_component_prediction = "Voorspelling: {1}"
+;
+; CrawlComponent.php line: 786
+crawl_component_scores = "{1} %% vertrouwen, {2} %% onenigheid"
+;
+; CrawlComponent.php line: 823
+crawl_component_use_below = "Gebruik onderstaande opties"
+;
+; CrawlComponent.php line: 824
+crawl_component_use_defaults = "Gebruik Yioop! defaults"
+;
+; CrawlComponent.php line: 826
+crawl_component_use_below = "Gebruik onderstaande opties"
+;
+; CrawlComponent.php line: 834
+crawl_component_recrawl_never = "nooit"
+;
+; CrawlComponent.php line: 835
+crawl_component_recrawl_1day = "1 dagen"
+;
+; CrawlComponent.php line: 836
+crawl_component_recrawl_2day = "2 dagen"
+;
+; CrawlComponent.php line: 837
+crawl_component_recrawl_3day = "3 dagen"
+;
+; CrawlComponent.php line: 838
+crawl_component_recrawl_7day = "7 dagen"
+;
+; CrawlComponent.php line: 839
+crawl_component_recrawl_14day = "14 dagen"
+;
+; CrawlComponent.php line: 847
+crawl_component_basic = "fundamenteel"
+;
+; CrawlComponent.php line: 848
+crawl_component_centroid = "zwaartepunt"
+;
+; CrawlComponent.php line: 849
+crawl_component_graph_based = ""
+;
+; CrawlComponent.php line: 1137
+crawl_component_page_options_updated = "Opties voor de pagina Bijgewerkt!"
+;
+; CrawlComponent.php line: 1165
+crawl_component_page_options_running_tests = "Uitvoeren van tests!"
+;
+; CrawlComponent.php line: 1346
+crawl_component_results_editor_update = "Filter Paginas Bijgewerkt!"
+;
+; CrawlComponent.php line: 1361
+crawl_component_edited_pages = "Selecteer een Eerder Bewerkt URL"
+;
+; CrawlComponent.php line: 1374
+crawl_component_results_editor_need_url = "Resultaat Pagina update nodig heeft om de URL opgeven!"
+;
+; CrawlComponent.php line: 1380
+crawl_component_results_editor_page_updated = "Resultaat Pagina bijgewerkt!"
+;
+; CrawlComponent.php line: 1393
+crawl_component_results_editor_page_loaded = "Page Loaded!"
+;
+; CrawlComponent.php line: 1424
+crawl_component_media_kind = "media Kind"
+;
+; CrawlComponent.php line: 1425
+crawl_component_video = "video"
+;
+; CrawlComponent.php line: 1426
+crawl_component_rss_feed = "RSS"
+;
+; CrawlComponent.php line: 1427
+crawl_component_html_feed = "Html Feed"
+;
+; CrawlComponent.php line: 1441
+crawl_component_sources_indexes = "Index / Mix te gebruiken"
+;
+; CrawlComponent.php line: 1496
+crawl_component_no_source_type = "Type Bron onbekend!"
+;
+; CrawlComponent.php line: 1510
+crawl_component_missing_type = "Moet mediatype ingesteld!"
+;
+; CrawlComponent.php line: 1524
+crawl_component_invalid_url = "Ongeldige URL!"
+;
+; CrawlComponent.php line: 1531
+crawl_component_missing_fields = "Alle velden moeten worden ingevuld!"
+;
+; CrawlComponent.php line: 1548
+crawl_component_media_source_added = "Media Source toegevoegd!"
+;
+; CrawlComponent.php line: 1561
+crawl_component_missing_fields = "Alle velden moeten worden ingevuld!"
+;
+; CrawlComponent.php line: 1569
+crawl_component_subsearch_added = "Subsearch toegevoegd!"
+;
+; CrawlComponent.php line: 1575
+crawl_component_no_delete_source = "Bron niet is verdwenen!"
+;
+; CrawlComponent.php line: 1581
+crawl_component_media_source_deleted = "Media Source Deleted!"
+;
+; CrawlComponent.php line: 1588
+crawl_component_no_delete_source = "Bron niet is verdwenen!"
+;
+; CrawlComponent.php line: 1595
+crawl_component_subsearch_deleted = "Subsearch Deleted!"
+;
+; CrawlComponent.php line: 1630
+crawl_component_subsearch_updated = "Subsearch Bijgewerkt!"
+;
+; CrawlComponent.php line: 1705
+crawl_component_media_source_updated = "Media Source Bijgewerkt!"
+;
+; SocialComponent.php line: 92
+social_component_request_join = "verzoek wil aansluiten"
+;
+; SocialComponent.php line: 93
+social_component_invited = "uitgenodigd"
+;
+; SocialComponent.php line: 94
+social_component_active_status = "actief"
+;
+; SocialComponent.php line: 95
+social_component_suspended_status = ""
+;
+; SocialComponent.php line: 98
+social_component_no_join = "niemand"
+;
+; SocialComponent.php line: 99
+social_component_by_request = "Op verzoek"
+;
+; SocialComponent.php line: 101
+social_component_public_request = "openbare Request"
+;
+; SocialComponent.php line: 102
+social_component_public_join = "iedereen"
+;
+; SocialComponent.php line: 105
+social_component_private = "geen lezen"
+;
+; SocialComponent.php line: 106
+social_component_read = "lezen"
+;
+; SocialComponent.php line: 107
+social_component_read_comment = "Lees Comment"
+;
+; SocialComponent.php line: 108
+social_component_read_write = "Lees Schrijf"
+;
+; SocialComponent.php line: 109
+social_component_read_wiki = "Lees Schrijf Wiki"
+;
+; SocialComponent.php line: 112
+social_component_no_voting = "geen Stemmen"
+;
+; SocialComponent.php line: 113
+social_component_up_voting = "#NAME?"
+;
+; SocialComponent.php line: 114
+social_component_up_down_voting = "+/- Voting"
+;
+; SocialComponent.php line: 117
+social_component_forever = "nooit verloopt"
+;
+; SocialComponent.php line: 118
+social_component_one_hour = "een Uur"
+;
+; SocialComponent.php line: 119
+social_component_one_day = "Op Een Dag"
+;
+; SocialComponent.php line: 120
+social_component_one_month = "een Maand"
+;
+; SocialComponent.php line: 192
+accountaccess_component_user_activated = "Gebruiker geactiveerd!"
+;
+; SocialComponent.php line: 197
+accountaccess_component_no_user_activated = "Gebruiker is niet geactiveerd!"
+;
+; SocialComponent.php line: 216
+social_component_joined = "Groep geworden!"
+;
+; SocialComponent.php line: 220
+social_component_groupname_unavailable = "Groepsnaam niet beschikbaar!"
+;
+; SocialComponent.php line: 226
+social_component_name_available = "Groepsnaam beschikbaar!"
+;
+; SocialComponent.php line: 243
+social_component_user_banned = "Gebruiker verboden!"
+;
+; SocialComponent.php line: 248
+social_component_no_user_banned = "Gebruiker is niet verboden!"
+;
+; SocialComponent.php line: 269
+social_component_owner_changed = "Eigenaar veranderd!"
+;
+; SocialComponent.php line: 274
+social_component_not_in_group = "Gebruiker niet in groep!"
+;
+; SocialComponent.php line: 280
+social_component_not_a_user = "Gebruikersnaam bestaat niet!"
+;
+; SocialComponent.php line: 296
+social_component_groupname_exists = "Groep naam bestaat"
+;
+; SocialComponent.php line: 320
+social_component_groupname_added = "Groep Naam Toegevoegd"
+;
+; SocialComponent.php line: 329
+social_component_groupname_doesnt_exists = "Groep Naam bestaat niet"
+;
+; SocialComponent.php line: 336
+social_component_group_deleted = "groep Deleted"
+;
+; SocialComponent.php line: 339
+social_component_no_delete_group = "Kan niet Groep verwijderen"
+;
+; SocialComponent.php line: 352
+social_component_user_deleted = "gebruiker Verwijderde"
+;
+; SocialComponent.php line: 357
+social_component_no_delete_user_group = "Kan gebruiker niet verwijderen uit Groep."
+;
+; SocialComponent.php line: 406
+social_component_users_invited = "Gebruikers uitgenodigd!"
+;
+; SocialComponent.php line: 411
+social_component_no_users_invited = "Geen Gebruikers Uitgenodigd!!"
+;
+; SocialComponent.php line: 427
+social_component_joined = "Groep geworden!"
+;
+; SocialComponent.php line: 430
+social_component_no_unsubscribe = "Kon niet Uitschrijven!"
+;
+; SocialComponent.php line: 471
+social_component_user_reinstated = "Gebruiker hersteld!"
+;
+; SocialComponent.php line: 476
+social_component_no_user_reinstated = "Gebruiker is niet hersteld!"
+;
+; SocialComponent.php line: 483
+social_component_request_join = "verzoek wil aansluiten"
+;
+; SocialComponent.php line: 485
+social_component_invited = "uitgenodigd"
+;
+; SocialComponent.php line: 487
+social_component_banned_status = "Banned"
+;
+; SocialComponent.php line: 504
+social_component_unsubscribe = "Succes Uitgeschreven!"
+;
+; SocialComponent.php line: 508
+social_component_no_unsubscribe = "Kon niet Uitschrijven!"
+;
+; SocialComponent.php line: 556
+social_component_group_joined = "Groep geworden!"
+;
+; SocialComponent.php line: 558
+social_component_group_request_join = "Lid worden van groep verzoek!"
+;
+; SocialComponent.php line: 573
+social_component_activate_group = "Yioop Groep %s Activation Request"
+;
+; SocialComponent.php line: 580
+social_component_activate_body = "De gebruiker %s heeft verzocht om de groep %s aan te sluiten. De onderstaande verbinding kan worden gebruikt om deze gebruiker te beheren."
+;
+; SocialComponent.php line: 584
+social_component_notify_closing = "Vriendelijke groeten,"
+;
+; SocialComponent.php line: 585
+social_component_notify_signature = "Yioop Software"
+;
+; SocialComponent.php line: 656
+social_component_no_permission = "Onvoldoende toegang!"
+;
+; SocialComponent.php line: 669
+social_component_group_updated = "Groep op de hoogte!"
+;
+; SocialComponent.php line: 677
+social_component_unknown_access = "Poging om toegang te veranderen om onbekende waarde!"
+;
+; SocialComponent.php line: 685
+social_component_group_filter_users = "Filteren van gebruikers!"
+;
+; SocialComponent.php line: 776
+social_component_comment_error = "Fout in commentaar data!"
+;
+; SocialComponent.php line: 780
+social_component_no_comment = "Kan niet posten leeg reactie!"
+;
+; SocialComponent.php line: 792
+social_component_no_post_access = "Kan niet posten naar die groep!"
+;
+; SocialComponent.php line: 798
+social_component_no_post_access = "Kan niet posten naar die groep!"
+;
+; SocialComponent.php line: 802
+social_component_join_group = " %s toegetreden tot %s!"
+;
+; SocialComponent.php line: 805
+social_component_join_group_detail = "Op %s, die u bij de groep %s."
+;
+; SocialComponent.php line: 820
+social_component_upload_error = "Upload Fout!"
+;
+; SocialComponent.php line: 833
+social_component_thread_notification = "Nieuwe Post naar Discussie: %s"
+;
+; SocialComponent.php line: 835
+social_component_notify_body = "We dachten dat je ge&iuml;nteresseerd bent in een nieuwe post aan de draad zou zijn:"
+;
+; SocialComponent.php line: 838
+social_component_notify_closing = "Vriendelijke groeten,"
+;
+; SocialComponent.php line: 839
+social_component_notify_signature = "Yioop Software"
+;
+; SocialComponent.php line: 841
+social_component_notify_salutation = "Beste %s,"
+;
+; SocialComponent.php line: 848
+social_component_comment_added = "Reactie toegevoegd!"
+;
+; SocialComponent.php line: 859
+social_component_groupname_cant_add = "Kunt geselecteerde groep niet toe te voegen!"
+;
+; SocialComponent.php line: 865
+social_component_delete_error = "Fout bij het verwijderen Item"
+;
+; SocialComponent.php line: 885
+social_component_item_deleted = "Item Deleted!"
+;
+; SocialComponent.php line: 888
+social_component_no_item_deleted = "Nee Item Deleted!"
+;
+; SocialComponent.php line: 896
+social_component_vote_error = "Stemming Fout!"
+;
+; SocialComponent.php line: 905
+social_component_no_vote_access = "Geen stem toegang tot die post!"
+;
+; SocialComponent.php line: 910
+social_component_no_post_access = "Kan niet posten naar die groep!"
+;
+; SocialComponent.php line: 914
+social_component_already_voted = "Al gestemd!"
+;
+; SocialComponent.php line: 918
+social_component_vote_recorded = "Stem Opgenomen!"
+;
+; SocialComponent.php line: 924
+social_component_comment_error = "Fout in commentaar data!"
+;
+; SocialComponent.php line: 929
+social_component_need_title_description = "Moeten zowel titel en beschrijving!"
+;
+; SocialComponent.php line: 940
+social_component_no_post_access = "Kan niet posten naar die groep!"
+;
+; SocialComponent.php line: 948
+social_component_upload_error = "Upload Fout!"
+;
+; SocialComponent.php line: 961
+social_component_new_thread_mail = "Nieuwe thread in groep %s"
+;
+; SocialComponent.php line: 965
+social_component_new_thread_body = "Als eigenaar van %s we dachten dat je zou willen weten van de volgende thread onlangs in uw groep:"
+;
+; SocialComponent.php line: 969
+social_component_notify_closing = "Vriendelijke groeten,"
+;
+; SocialComponent.php line: 970
+social_component_notify_signature = "Yioop Software"
+;
+; SocialComponent.php line: 975
+social_component_notify_salutation = "Beste %s,"
+;
+; SocialComponent.php line: 983
+social_component_thread_created = "Draad Gemaakt!"
+;
+; SocialComponent.php line: 991
+social_component_comment_error = "Fout in commentaar data!"
+;
+; SocialComponent.php line: 995
+social_component_need_title_description = "Moeten zowel titel en beschrijving!"
+;
+; SocialComponent.php line: 1001
+social_component_post_edited_elsewhere = "Bericht was gewoon elders bewerkt (een ander tabblad?)"
+;
+; SocialComponent.php line: 1009
+social_component_no_update_access = "Kan niet bijwerken Post!"
+;
+; SocialComponent.php line: 1022
+social_component_no_update_access = "Kan niet bijwerken Post!"
+;
+; SocialComponent.php line: 1031
+social_component_upload_error = "Upload Fout!"
+;
+; SocialComponent.php line: 1034
+social_component_post_updated = "Bericht Bijgewerkt!"
+;
+; SocialComponent.php line: 1041
+social_component_vote_error = "Stemming Fout!"
+;
+; SocialComponent.php line: 1050
+social_component_no_vote_access = "Geen stem toegang tot die post!"
+;
+; SocialComponent.php line: 1055
+social_component_no_post_access = "Kan niet posten naar die groep!"
+;
+; SocialComponent.php line: 1059
+social_component_already_voted = "Al gestemd!"
+;
+; SocialComponent.php line: 1063
+social_component_vote_recorded = "Stem Opgenomen!"
+;
+; SocialComponent.php line: 1094
+social_component_join_group = " %s toegetreden tot %s!"
+;
+; SocialComponent.php line: 1097
+social_component_join_group_detail = "Op %s, die u bij de groep %s."
+;
+; SocialComponent.php line: 1373
+accountaccess_component_no_posts_yet = "Geen berichten Toch"
+;
+; SocialComponent.php line: 1416
+social_component_search = "zoeken"
+;
+; SocialComponent.php line: 1503
+social_component_no_group_access = "Geen lid is of kan die groep niet lezen. Overschakelen op openbare groep!"
+;
+; SocialComponent.php line: 1506
+social_component_no_group_access = "Geen lid is of kan die groep niet lezen. Overschakelen op openbare groep!"
+;
+; SocialComponent.php line: 1530
+social_component_standard_page = "standaard"
+;
+; SocialComponent.php line: 1531
+social_component_page_alias = "pagina Alias"
+;
+; SocialComponent.php line: 1532
+social_component_media_list = "Lijst media"
+;
+; SocialComponent.php line: 1533
+social_component_presentation = "presentatie"
+;
+; SocialComponent.php line: 1536
+social_component_solid = "solide"
+;
+; SocialComponent.php line: 1537
+social_component_dashed = "Binnen"
+;
+; SocialComponent.php line: 1538
+social_component_none = "geen"
+;
+; SocialComponent.php line: 1577
+social_component_missing_fields = "Ontbrekende velden!"
+;
+; SocialComponent.php line: 1583
+social_component_wiki_edited_elsewhere = "Wiki pagina is bewerkt Sinds Uw versie. Laden Changed versie!"
+;
+; SocialComponent.php line: 1633
+social_component_page_created = " %s Wiki pagina gemaakt!"
+;
+; SocialComponent.php line: 1634
+social_component_page_discuss_here = "Bespreek de pagina in deze thread!"
+;
+; SocialComponent.php line: 1639
+social_component_page_saved = "Opgeslagen!"
+;
+; SocialComponent.php line: 1651
+social_component_resource_deleted = "Resource Deleted!"
+;
+; SocialComponent.php line: 1656
+social_component_resource_not_deleted = "Resource niet verwijderd!"
+;
+; SocialComponent.php line: 1673
+social_component_resource_renamed = "Resource Omgedoopt!"
+;
+; SocialComponent.php line: 1678
+social_component_resource_not_renamed = "Bron niet Omgedoopt!"
+;
+; SocialComponent.php line: 1688
+social_component_resource_save_first = "Moeten Pagina opslaan Voordat gebruik van middelen!"
+;
+; SocialComponent.php line: 1700
+social_component_page_created = " %s Wiki pagina gemaakt!"
+;
+; SocialComponent.php line: 1702
+social_component_page_discuss_here = "Bespreek de pagina in deze thread!"
+;
+; SocialComponent.php line: 1706
+social_component_resource_uploaded = "Resource geupload!"
+;
+; SocialComponent.php line: 1711
+social_component_upload_error = "Upload Fout!"
+;
+; SocialComponent.php line: 1758
+social_component_back = "terug"
+;
+; SocialComponent.php line: 1759
+social_component_history_page = "Historische versie van %s van %s."
+;
+; SocialComponent.php line: 1794
+social_component_back = "terug"
+;
+; SocialComponent.php line: 1795
+social_component_diff_page = " %s lijn verschillen tussen %s en %s."
+;
+; SocialComponent.php line: 1809
+social_component_wiki_edited_elsewhere = "Wiki pagina is bewerkt Sinds Uw versie. Laden Changed versie!"
+;
+; SocialComponent.php line: 1817
+social_component_page_revert_to = "Terugkeren naar %s."
+;
+; SocialComponent.php line: 1821
+social_component_page_reverted = "Pagina bekeerd!"
+;
+; SocialComponent.php line: 1825
+social_component_revert_error = "Fout terugzet pagina!"
+;
+; SocialComponent.php line: 1896
+social_component_main = "hoofd-"
+;
+; SocialComponent.php line: 2142
+wiki_js_small = "klein"
+;
+; SocialComponent.php line: 2143
+wiki_js_medium = "medium"
+;
+; SocialComponent.php line: 2144
+wiki_js_large = "groot"
+;
+; SocialComponent.php line: 2145
+wiki_js_search_size = "grootte"
+;
+; SocialComponent.php line: 2146
+wiki_js_prompt_heading = "Kopregel:"
+;
+; SocialComponent.php line: 2147
+wiki_js_example = "voorbeeld"
+;
+; SocialComponent.php line: 2148
+wiki_js_table_title = "tabel Titel"
+;
+; SocialComponent.php line: 2149
+wiki_js_submit = "voorleggen"
+;
+; SocialComponent.php line: 2150
+wiki_js_cancel = "annuleren"
+;
+; SocialComponent.php line: 2151
+wiki_js_bold = "Vette tekst"
+;
+; SocialComponent.php line: 2152
+wiki_js_italic = "cursieve tekst"
+;
+; SocialComponent.php line: 2153
+wiki_js_underline = "onderstreepte tekst"
+;
+; SocialComponent.php line: 2154
+wiki_js_strike = "doorgehaalde tekst"
+;
+; SocialComponent.php line: 2155
+wiki_js_heading = "titel"
+;
+; SocialComponent.php line: 2156
+wiki_js_heading1 = "Rubriek 1"
+;
+; SocialComponent.php line: 2157
+wiki_js_heading2 = "Rubriek 2"
+;
+; SocialComponent.php line: 2158
+wiki_js_heading3 = "Rubriek 3"
+;
+; SocialComponent.php line: 2159
+wiki_js_heading4 = "Rubriek 4"
+;
+; SocialComponent.php line: 2160
+wiki_js_bullet = "Ongeordende lijst object"
+;
+; SocialComponent.php line: 2161
+wiki_js_enum = "Bestelde item in de lijst"
+;
+; SocialComponent.php line: 2162
+wiki_js_nowiki = "Plaats hier de niet-opgemaakte tekst"
+;
+; SocialComponent.php line: 2163
+wiki_js_add_search = "Voeg Search Bar Vorm"
+;
+; SocialComponent.php line: 2164
+wiki_js_search_size = "grootte"
+;
+; SocialComponent.php line: 2165
+wiki_js_add_wiki_table = "Voeg Wiki Tabel"
+;
+; SocialComponent.php line: 2166
+wiki_js_for_table_cols = "Column Count:"
+;
+; SocialComponent.php line: 2167
+wiki_js_for_table_rows = "Rij Count:"
+;
+; SocialComponent.php line: 2168
+wiki_js_add_hyperlink = "Hyperlink toevoegen"
+;
+; SocialComponent.php line: 2169
+wiki_js_link_text = "tekst:"
+;
+; SocialComponent.php line: 2170
+wiki_js_link_url = "URL:"
+;
+; SocialComponent.php line: 2171
+wiki_js_placeholder = "Zoek plaatsaanduidingstekst"
+;
+; SocialComponent.php line: 2172
+wiki_js_centeraligned = "Deze tekst is gecentreerd."
+;
+; SocialComponent.php line: 2173
+wiki_js_rightaligned = "Deze tekst is rechts uitgelijnd."
+;
+; SocialComponent.php line: 2174
+wiki_js_leftaligned = "Deze tekst is links uitgelijnd."
+;
+; SocialComponent.php line: 2176
+wiki_js_definitionlist_item = "item"
+;
+; SocialComponent.php line: 2178
+wiki_js_definitionlist_definition = "definitie"
+;
+; SocialComponent.php line: 2180
+wiki_js_slide_sample_title = "titel"
+;
+; SocialComponent.php line: 2182
+wiki_js_slide_sample_bullet = "slide Item"
+;
+; SocialComponent.php line: 2184
+wiki_js_slide_resource_description = "Resource Description voor"
+;
+; SocialComponent.php line: 2222
+social_component_select_crawl = "Selecteer Crawl"
+;
+; SocialComponent.php line: 2223
+social_component_default_crawl = "standaard Crawl"
+;
+; SocialComponent.php line: 2225
+social_component_select_crawl = "Selecteer Crawl"
+;
+; SocialComponent.php line: 2227
+social_component_default_crawl = "standaard Crawl"
+;
+; SocialComponent.php line: 2257
+social_component_mix_created = "Crawl Mix Gemaakt!"
+;
+; SocialComponent.php line: 2260
+social_component_invalid_name = "Meng Naam in Use of ongeldig!"
+;
+; SocialComponent.php line: 2268
+social_component_mix_invalid_timestamp = "Ongeldige Timestamp!"
+;
+; SocialComponent.php line: 2272
+social_component_mix_deleted = "Crawl Mix Deleted!"
+;
+; SocialComponent.php line: 2291
+social_component_mix_doesnt_exists = "Mengen om te verwijderen bestaat niet!"
+;
+; SocialComponent.php line: 2299
+social_component_mix_imported = "Meng ge&iuml;mporteerd!"
+;
+; SocialComponent.php line: 2313
+social_component_set_index = "Instellen Crawl om te gebruiken als Index"
+;
+; SocialComponent.php line: 2322
+social_component_comment_error = "Fout in commentaar data!"
+;
+; SocialComponent.php line: 2328
+social_component_invalid_timestamp = "Shared Mix heeft een ongeldige tijdstempel"
+;
+; SocialComponent.php line: 2346
+social_component_no_post_access = "Kan niet posten naar die groep!"
+;
+; SocialComponent.php line: 2350
+social_component_share_title = "Probeer deze crawl mix!"
+;
+; SocialComponent.php line: 2352
+social_component_share_description = " %s is het delen van de crawl mix %s!"
+;
+; SocialComponent.php line: 2357
+social_component_thread_created = "Draad Gemaakt!"
+;
+; SocialComponent.php line: 2408
+social_component_mix_invalid_timestamp = "Ongeldige Timestamp!"
+;
+; SocialComponent.php line: 2413
+social_component_mix_not_owner = "Niet Meng de eigenaar!"
+;
+; SocialComponent.php line: 2423
+social_component_add_crawls = "Voeg Crawls"
+;
+; SocialComponent.php line: 2425
+social_component_num_results = "resultaten getoond"
+;
+; SocialComponent.php line: 2427
+social_component_del_frag = "verwijderen"
+;
+; SocialComponent.php line: 2429
+social_component_weight = "gewicht"
+;
+; SocialComponent.php line: 2430
+social_component_name = "naam"
+;
+; SocialComponent.php line: 2432
+social_component_add_keywords = "trefwoorden"
+;
+; SocialComponent.php line: 2434
+social_component_actions = "acties"
+;
+; SocialComponent.php line: 2436
+social_component_add_query = "Zoekopdracht toevoegen"
+;
+; SocialComponent.php line: 2437
+social_component_delete = "verwijderen"
+;
+; SocialComponent.php line: 2487
+social_component_too_many_fragments = "Too Many Zoekresultaat Fragmenten!"
+;
+; SocialComponent.php line: 2498
+social_component_mix_saved = "Crawl Mix Wijzigingen opgeslagen!"
+;
+; SystemComponent.php line: 82
+system_component_select_machine = "Selecteer Machine"
+;
+; SystemComponent.php line: 143
+system_component_machine_added = "Machine toegevoegd!"
+;
+; SystemComponent.php line: 147
+system_component_machine_exists = "Machine naam bestaat al; Gelieve Verwijder eerst!"
+;
+; SystemComponent.php line: 151
+system_component_machine_incomplete = "Ontbrekende of ongeldige Velden Van Machine Form"
+;
+; SystemComponent.php line: 158
+system_component_machine_doesnt_exists = "Machine Naam bestaat niet!"
+;
+; SystemComponent.php line: 179
+system_component_stop_service_first = "Machine gebruikt. Stop aub de dienst draait op het!"
+;
+; SystemComponent.php line: 185
+system_component_machine_deleted = "Machine verwijderd!"
+;
+; SystemComponent.php line: 200
+system_component_updatemode_toggled = ""
+;
+; SystemComponent.php line: 246
+system_component_no_machine_log = "Geen Log File Found."
+;
+; SystemComponent.php line: 270
+system_component_machine_servers_updated = "Servers machines Bijgewerkt!"
+;
+; SystemComponent.php line: 274
+system_component_machine_no_action = "Niet in staat om actie uit te voeren!"
+;
+; SystemComponent.php line: 310
+system_component_select_mode = "Select Mode"
+;
+; SystemComponent.php line: 351
+system_component_locale_missing_info = "Veldwaarden ontbrekende of ongeldige!"
+;
+; SystemComponent.php line: 358
+system_component_locale_added = "Locale toegevoegd!"
+;
+; SystemComponent.php line: 365
+system_component_localename_doesnt_exists = "Locale bestaat niet!"
+;
+; SystemComponent.php line: 370
+system_component_localename_deleted = "locale Deleted"
+;
+; SystemComponent.php line: 376
+system_component_localename_doesnt_exists = "Locale bestaat niet!"
+;
+; SystemComponent.php line: 405
+system_component_locale_updated = "Locale Informatie Bijgewerkt!"
+;
+; SystemComponent.php line: 435
+system_component_localestrings_updated = "Locale Strings Bijgewerkt!"
+;
+; SystemComponent.php line: 446
+system_component_all_strings = "All Strings"
+;
+; SystemComponent.php line: 447
+system_component_missing_strings = "Ontbrekende Strings"
+;
+; SystemComponent.php line: 566
+system_component_configure_no_change_db = "Probleem bijwerken Database!"
+;
+; SystemComponent.php line: 571
+system_component_configure_profile_change = "Profiel ge&iuml;pdatet!"
+;
+; SystemComponent.php line: 574
+system_component_configure_no_change_profile = "Er was een probleem updaten profiel!"
+;
+; SystemComponent.php line: 607
+system_component_configure_disable_registration = "Uitschakelen Registratie"
+;
+; SystemComponent.php line: 609
+system_component_configure_no_activation = "geen Activering"
+;
+; SystemComponent.php line: 611
+system_component_configure_email_activation = "e-mail Activering"
+;
+; SystemComponent.php line: 613
+system_component_configure_admin_activation = "admin Activering"
+;
+; SystemComponent.php line: 617
+system_component_configure_no_advertisements = ""
+;
+; SystemComponent.php line: 619
+system_component_configure_keyword_advertisements = ""
+;
+; SystemComponent.php line: 621
+system_component_configure_external_advertisements = ""
+;
+; SystemComponent.php line: 704
+captchasettings_element_text_captcha = "tekst Captcha"
+;
+; SystemComponent.php line: 706
+captchasettings_element_hash_captcha = "hash Captcha"
+;
+; SystemComponent.php line: 708
+captchasettings_element_image_captcha = "Captcha image"
+;
+; SystemComponent.php line: 713
+serversettings_element_normal_authentication = "normale Authenticatie"
+;
+; SystemComponent.php line: 715
+serversettings_element_zkp_authentication = "ZKP Authenticatie"
+;
+; SystemComponent.php line: 720
+serversettings_element_normal_authentication = "normale Authenticatie"
+;
+; SystemComponent.php line: 744
+system_component_settings_updated = "Instellingen Bijgewerkt!"
+;
+; SystemComponent.php line: 747
+system_component_no_update_settings = "Geen instellingen werden veranderd!"
+;
+; SystemComponent.php line: 788
+system_component_no_resource_folder = "Geen Resource Folder!"
+;
+; SystemComponent.php line: 802
+system_component_invalid_filetype = "Ongeldige File Type!"
+;
+; SystemComponent.php line: 807
+system_component_file_too_big = "Bestand te groot!"
+;
+; SystemComponent.php line: 822
+system_component_configure_profile_change = "Profiel ge&iuml;pdatet!"
+;
+; SystemComponent.php line: 826
+system_component_configure_no_change_profile = "Er was een probleem updaten profiel!"
+;
+; SystemComponent.php line: 875
+system_component_configure_reset_completed = "Reset voltooid"
+;
+; SystemComponent.php line: 878
+system_component_configure_no_change_profile = "Er was een probleem updaten profiel!"
+;
+; SystemComponent.php line: 957
+system_component_configure_use_absolute_path = "Moet een absoluut pad voor Werk Directory te gebruiken"
+;
+; SystemComponent.php line: 962
+system_component_configure_configure_diff_base_dir = "Werk Directory kan niet worden opgenomen in Yioop folder!"
+;
+; SystemComponent.php line: 993
+system_component_configure_work_dir_set = "Werken Directory Set! Het kan nodig zijn om opnieuw in te loggen!"
+;
+; SystemComponent.php line: 1004
+system_component_name_your_bot = "Gelieve Naam Je robot"
+;
+; SystemComponent.php line: 1029
+system_component_configure_work_profile_made = "Working Directory en Profile Gemaakt!"
+;
+; SystemComponent.php line: 1033
+system_component_configure_no_set_config = "Niet in staat om config.php bestand bij te werken!"
+;
+; SystemComponent.php line: 1040
+system_component_configure_no_create_profile = "Kan geen profiel maak!"
+;
+; SystemComponent.php line: 1047
+system_component_configure_work_dir_invalid = "Werk is ongeldig! Kan profiel niet maken!"
+;
+; SystemComponent.php line: 1054
+system_component_configure_work_dir_invalid = "Werk is ongeldig! Kan profiel niet maken!"
+;
+; SystemComponent.php line: 1083
+system_component_configure_profile_change = "Profiel ge&iuml;pdatet!"
+;
+; SystemComponent.php line: 1087
+system_component_configure_no_change_profile = "Er was een probleem updaten profiel!"
+;
+; SystemComponent.php line: 1107
+system_component_describe_robot = "Beschrijf uw Robot"
+;
+; SystemComponent.php line: 1161
+system_component_php_version = "PHP versie 5.3 of nieuwer"
+;
+; SystemComponent.php line: 1169
+system_component_no_write_config_php = "configs / config.php niet webserver beschrijfbaar."
+;
+; SystemComponent.php line: 1174
+system_component_no_write_work_dir = "Werk map moet beschrijfbaar door web-server te zijn."
+;
+; SystemComponent.php line: 1179
+system_component_post_size_small = "php.ini bestand variabele post_max_size moet minstens 2M"
+;
+; SystemComponent.php line: 1185
+system_component_missing_required = "De volgende benodigde onderdelen ontbraken: %s"
+;
+; SystemComponent.php line: 1209
+system_component_missing_optional = "De volgende optionele onderdelen ontbraken: %s"
+;
+; SystemComponent.php line: 1215
+system_component_check_passed = "Controleer Geslaagd."
+;
+; SystemComponent.php line: 1220
+system_component_using_local_config = "Met behulp van configs / local_config.php dus veranderende werk directory hierboven kan niet werken."
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/controllers
+;
+; MainController.php line: 74
+search_controller_logout_successful = "Afmelden Succesvolle!!"
+;
+; MainController.php line: 98
+main_controller_download = ""
+;
+; MainController.php line: 115
+main_controller_missing_fields = ""
+;
+; MainController.php line: 150
+main_controller_yioop_download = ""
+;
+; MainController.php line: 151
+main_controller_click_download = ""
+;
+; MainController.php line: 164
+main_controller_url_error = ""
+;
+; MainController.php line: 173
+main_controller_expired_url = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views
+;
+; AdminView.php line: 71
+admin_view_admin = "admin"
+;
+; AdminView.php line: 92
+adminview_auto_logout_one_minute = "Automatisch uitloggen in One Minute!!"
+;
+; CrawlstatusView.php line: 57
+crawlstatus_view_currently_processing = "momenteel wordt verwerkt"
+;
+; CrawlstatusView.php line: 58
+crawlstatus_view_description = "beschrijving:"
+;
+; CrawlstatusView.php line: 62
+crawlstatus_view_starting_crawl = "Vanaf New Crawl ..."
+;
+; CrawlstatusView.php line: 66
+managecrawls_element_stop_crawl = "stop Crawl"
+;
+; CrawlstatusView.php line: 70
+crawlstatus_view_resuming_crawl = "hervatten Crawl"
+;
+; CrawlstatusView.php line: 74
+managecrawls_element_stop_crawl = "stop Crawl"
+;
+; CrawlstatusView.php line: 78
+crawlstatus_view_shutdown_queue = "Afsluiten Queue ..."
+;
+; CrawlstatusView.php line: 81
+crawlstatus_view_closing_dict = "Het sluiten van Crawl Woordenboek ..."
+;
+; CrawlstatusView.php line: 84
+crawlstatus_view_run_plugins = "Hardlopen Post Processing Plugins ..."
+;
+; CrawlstatusView.php line: 92
+managecrawls_element_stop_crawl = "stop Crawl"
+;
+; CrawlstatusView.php line: 100
+crawlstatus_view_set_index = "Instellen als Index"
+;
+; CrawlstatusView.php line: 103
+crawlstatus_view_search_index = "zoeken Index"
+;
+; CrawlstatusView.php line: 110
+crawlstatus_view_changeoptions = "Verandering Crawl Opties"
+;
+; CrawlstatusView.php line: 112
+crawlstatus_view_no_description = "Geen actieve crawl"
+;
+; CrawlstatusView.php line: 117
+crawlstatus_view_timestamp = "timestamp:"
+;
+; CrawlstatusView.php line: 119
+crawlstatus_view_time_started = "Tijd begon:"
+;
+; CrawlstatusView.php line: 125
+crawlstatus_view_indexer_memory = "Indexer Peak Geheugen:"
+;
+; CrawlstatusView.php line: 127
+crawlstatus_view_scheduler_memory = "Scheduler Peak Geheugen:"
+;
+; CrawlstatusView.php line: 130
+crawlstatus_view_queue_memory = "Server Peak Geheugen:"
+;
+; CrawlstatusView.php line: 135
+crawlstatus_view_no_mem_data = "Nee Geheugen Gegevens Toch"
+;
+; CrawlstatusView.php line: 139
+crawlstatus_view_fetcher_memory = "Fetcher Peak Geheugen:"
+;
+; CrawlstatusView.php line: 144
+crawlstatus_view_no_mem_data = "Nee Geheugen Gegevens Toch"
+;
+; CrawlstatusView.php line: 147
+crawlstatus_view_webapp_memory = "Web App Peak Memory:"
+;
+; CrawlstatusView.php line: 152
+crawlstatus_view_no_mem_data = "Nee Geheugen Gegevens Toch"
+;
+; CrawlstatusView.php line: 155
+crawlstatus_view_urls_per_hour = "Bezochte URL / uur:"
+;
+; CrawlstatusView.php line: 163
+crawlstatus_view_visited_urls = "Bezochte URL Count:"
+;
+; CrawlstatusView.php line: 167
+crawlstatus_view_total_urls = "Totaal Urls Seen:"
+;
+; CrawlstatusView.php line: 170
+crawlstatus_view_most_recent_fetcher = "Meest recente ophalen:"
+;
+; CrawlstatusView.php line: 179
+crawlstatus_view_no_fetcher = "Geen Fetcher Queries Toch"
+;
+; CrawlstatusView.php line: 183
+crawlstatus_view_most_recent_urls = "Meest recente Urls"
+;
+; CrawlstatusView.php line: 193
+crawlstatus_view_no_recent_urls = "Geen recente URLs (kon betekenen enige link gegevens)"
+;
+; CrawlstatusView.php line: 196
+crawlstatus_view_previous_crawls = "vorige Crawls"
+;
+; CrawlstatusView.php line: 207
+crawlstatus_view_description = "beschrijving:"
+;
+; CrawlstatusView.php line: 210
+crawlstatus_view_timestamp = "timestamp:"
+;
+; CrawlstatusView.php line: 211
+crawlstatus_view_url_counts = "Bezocht / Ge&iuml;xtraheerd Urls:"
+;
+; CrawlstatusView.php line: 215
+crawlstatus_view_actions = "acties"
+;
+; CrawlstatusView.php line: 226
+crawlstatus_view_statistics = "statistiek"
+;
+; CrawlstatusView.php line: 242
+crawlstatus_view_resume = "hervatten"
+;
+; CrawlstatusView.php line: 244
+crawlstatus_view_no_resume = "gesloten"
+;
+; CrawlstatusView.php line: 251
+crawlstatus_view_set_index = "Instellen als Index"
+;
+; CrawlstatusView.php line: 254
+crawlstatus_view_search_index = "zoeken Index"
+;
+; CrawlstatusView.php line: 261
+crawlstatus_view_delete = "verwijderen"
+;
+; CrawlstatusView.php line: 269
+crawlstatus_view_no_previous_crawl = "Geen Vorige Crawls"
+;
+; GroupView.php line: 82
+groupfeed_element_wiki_thread = " %s Wiki Pagina Overleg"
+;
+; GroupView.php line: 96
+group_view_feed = "voeden"
+;
+; GroupView.php line: 104
+group_view_wiki = "wiki"
+;
+; GroupView.php line: 106
+group_view_user = " %s Gebruiker"
+;
+; GroupView.php line: 109
+group_view_myfeeds = "mijn Feeds"
+;
+; GroupView.php line: 145
+adminview_auto_logout_one_minute = "Automatisch uitloggen in One Minute!!"
+;
+; MachinestatusView.php line: 56
+machinestatus_view_no_monitored = "Geen Bewaakte Machines"
+;
+; MachinestatusView.php line: 60
+machinestatus_media_updatemode = ""
+;
+; MachinestatusView.php line: 73
+machinestatus_name_server = "Name Server"
+;
+; MachinestatusView.php line: 75
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 78
+machinestatus_name_server = "Name Server"
+;
+; MachinestatusView.php line: 80
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 85
+machinestatus_name_server = "Name Server"
+;
+; MachinestatusView.php line: 94
+machinestatus_view_media_updater = "media Updater"
+;
+; MachinestatusView.php line: 96
+machinestatus_view_log = "Inloggen"
+;
+; MachinestatusView.php line: 125
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; MachinestatusView.php line: 126
+machinestatus_view_delete = "verwijderen"
+;
+; MachinestatusView.php line: 148
+machinestatus_view_not_configured = "Machine Niet geconfigureerd!"
+;
+; MachinestatusView.php line: 158
+machinestatus_view_mirrors = "Spiegels %s"
+;
+; MachinestatusView.php line: 161
+machinestatus_view_log = "Inloggen"
+;
+; MachinestatusView.php line: 176
+machinestatus_view_queue_server = "Queue Server"
+;
+; MachinestatusView.php line: 179
+machinestatus_view_log = "Inloggen"
+;
+; MachinestatusView.php line: 191
+machinestatus_view_queue_server = "Queue Server"
+;
+; MachinestatusView.php line: 193
+machinestatus_view_no_queue_server = "Machine heeft geen wachtrij server"
+;
+; MachinestatusView.php line: 204
+machinestatus_view_media_updater = "media Updater"
+;
+; MachinestatusView.php line: 207
+machinestatus_view_log = "Inloggen"
+;
+; MachinestatusView.php line: 229
+machinestatus_view_no_fetchers = "Machine heeft geen fetchers"
+;
+; MachinestatusView.php line: 241
+machinestatus_view_fetchers = "Fetchers"
+;
+; MachinestatusView.php line: 248
+machinestatus_view_log = "Inloggen"
+;
+; NocacheView.php line: 54
+nocache_view_no_cache = "Had geen cache van opgevraagde item."
+;
+; NocacheView.php line: 59
+nocache_view_summary_contents = "Samenvatting De gegevens die zijn opgeslagen in Yioop voor post"
+;
+; RecoverView.php line: 71
+recover_view_recover_password = "Recover account"
+;
+; RecoverView.php line: 104
+register_view_new_password = "nieuw Wachtwoord"
+;
+; RecoverView.php line: 116
+register_view_retypepassword = "Typ het wachtwoord opnieuw:"
+;
+; RecoverView.php line: 131
+recover_view_username = "gebruikersnaam:"
+;
+; RecoverView.php line: 146
+register_view_account_recovery = "Herstel Info:"
+;
+; RecoverView.php line: 153
+register_view_human_check = "Human Check:"
+;
+; RecoverView.php line: 185
+register_view_human_check = "Human Check:"
+;
+; RecoverView.php line: 202
+recover_view_recover_password = "Recover account"
+;
+; RecoverView.php line: 211
+recover_view_return = ""
+;
+; RegisterView.php line: 76
+register_view_question0_most = "Die woont of duurt het langst?"
+;
+; RegisterView.php line: 77
+register_view_question0_least = "Die woont of duurt het kortste?"
+;
+; RegisterView.php line: 78
+register_view_question0_choices = "bliksem, bacteriïn, mier, hond, paard, persoon, eik, planeet, ster, melkweg"
+;
+; RegisterView.php line: 79
+register_view_question1_most = "Dat is meer overvloedig?"
+;
+; RegisterView.php line: 80
+register_view_question1_least = "Dat is minder overvloedig?"
+;
+; RegisterView.php line: 81
+register_view_question1_choices = "continenten, landen, metros, steden, artsen, mensen, handen, tanden, haar, cellen, moleculen, atomen, protonen"
+;
+; RegisterView.php line: 82
+register_view_question2_most = "Dat is meestal meer prijzig?"
+;
+; RegisterView.php line: 83
+register_view_question2_least = "Dat is meestal minder prijzig?"
+;
+; RegisterView.php line: 84
+register_view_question2_choices = "een postzegel, een kop koffie, bioscoopkaartje, schoenen, fietsen, een maand huur, auto, huis, een elektriciteitscentrale"
+;
+; RegisterView.php line: 85
+register_view_question3_most = "Dat is meer rond?"
+;
+; RegisterView.php line: 86
+register_view_question3_least = "Dat is minder ronde?"
+;
+; RegisterView.php line: 87
+register_view_question3_choices = "een stoel, de letter T, een banaan, een peer, een appel, een sinaasappel, een bol"
+;
+; RegisterView.php line: 88
+register_view_question4_most = "Die is meestal de grootste?"
+;
+; RegisterView.php line: 89
+register_view_question4_least = "Dat is meestal de kleinste?"
+;
+; RegisterView.php line: 90
+register_view_question4_choices = "een munt, een honkbal, een melk gallon, winkelwagentje, koelkast, giraf, huis, vulkaan, de Maan, de Aarde"
+;
+; RegisterView.php line: 91
+register_view_question5_most = "Welke is groter?"
+;
+; RegisterView.php line: 92
+register_view_question5_least = "Die korter is?"
+;
+; RegisterView.php line: 93
+register_view_question5_choices = "lieveheersbeestje, muis, kat, peuter, man, paard, olifant, giraf, hoog gebouw, berg"
+;
+; RegisterView.php line: 94
+register_view_question6_most = "Die langer duurt?"
+;
+; RegisterView.php line: 95
+register_view_question6_least = "Die kost minder tijd?"
+;
+; RegisterView.php line: 96
+register_view_question6_choices = "knipperen, lik envelop, kam het haar, make-up toe te passen, een film kijken, lopen marathon, olympics, de zomer vakantie, jaar"
+;
+; RegisterView.php line: 97
+register_view_question7_most = "Die is heter klinkende?"
+;
+; RegisterView.php line: 98
+register_view_question7_least = "Dat is kouder klinkende?"
+;
+; RegisterView.php line: 99
+register_view_question7_choices = "Pluto, polaire verkennen, schaatsen, zwembad, thee, stoom, gesmolten ijzer, zon"
+;
+; RegisterView.php line: 100
+register_view_question8_most = "Dat is de oudste?"
+;
+; RegisterView.php line: 101
+register_view_question8_least = "Welke is de nieuwste?"
+;
+; RegisterView.php line: 102
+register_view_question8_choices = "verse melk, de huidige president, je grootouders, vlucht bij Kitty Hawk, de Zwarte Dood, Egyptische piramiden, schrijven, grotschilderingen, dinosaurussen"
+;
+; RegisterView.php line: 103
+register_view_question9_most = "Die heeft meer?"
+;
+; RegisterView.php line: 104
+register_view_question9_least = "Die houdt minder?"
+;
+; RegisterView.php line: 105
+register_view_question9_choices = "theelepel, schotel, beker, kom, theepot, wastafel, vat, pick-up truck, verhuiswagen, olietanker"
+;
+; RegisterView.php line: 108
+register_view_recovery1_more = "Dier je wilt de beste:"
+;
+; RegisterView.php line: 109
+register_view_recovery1_less = "Dier je het minst:"
+;
+; RegisterView.php line: 110
+register_view_recovery1_choices = "mier, konijntje, kat, kakkerlak, hond, goudvis, hamster, paard, slang, spin, tijger, walvis"
+;
+; RegisterView.php line: 111
+register_view_recovery2_more = "Kleur je het meest:"
+;
+; RegisterView.php line: 112
+register_view_recovery2_less = "Kleur je wilt het minst:"
+;
+; RegisterView.php line: 113
+register_view_recovery2_choices = "geen kleur, aquamarijn, blauw, bruin, goud, groen, grijs, paars, roze, maagdenpalm, paars, rood, zilver, turkoois, geel"
+;
+; RegisterView.php line: 114
+register_view_recovery3_more = "Voedsel dat je het liefst:"
+;
+; RegisterView.php line: 115
+register_view_recovery3_less = "Voedsel dat je graag het minst:"
+;
+; RegisterView.php line: 116
+register_view_recovery3_choices = "appel, banaan, kip, vis, lamsvlees, noten, oranje, varkensvlees, aardappel, tomaat, steak"
+;
+; RegisterView.php line: 117
+register_view_recovery4_more = "Drink je het meest:"
+;
+; RegisterView.php line: 118
+register_view_recovery4_less = "Drink je het minst:"
+;
+; RegisterView.php line: 119
+register_view_recovery4_choices = "appelsap, bier, koffie, warme thee, ice tea, limonade, fruitsap, frisdrank, bruisend water, stilstaand water, wijn"
+;
+; RegisterView.php line: 120
+register_view_recovery5_more = "Spel je het meest:"
+;
+; RegisterView.php line: 121
+register_view_recovery5_less = "Spel je het minst:"
+;
+; RegisterView.php line: 122
+register_view_recovery5_choices = "basketbal, backgammon, dammen, schaken, voetbal, hockey, schaatsen, skiïn, tennis, volleybal"
+;
+; RegisterView.php line: 123
+register_view_recovery6_more = "Geluid dat u het liefst:"
+;
+; RegisterView.php line: 124
+register_view_recovery6_less = "Klinkt als het minst:"
+;
+; RegisterView.php line: 125
+register_view_recovery6_choices = "accordeon, trommel, fluit, gitaar, harmonica, harp, hoorn, hobo, piano, driehoek, trompet, viool, fluit, xylofoon"
+;
+; RegisterView.php line: 153
+register_view_create_account = "Maak Een Account Aan"
+;
+; RegisterView.php line: 190
+register_view_firstname = "Voornaam:"
+;
+; RegisterView.php line: 205
+register_view_lastname = "Achternaam:"
+;
+; RegisterView.php line: 219
+register_view_username = "gebruikersnaam:"
+;
+; RegisterView.php line: 232
+register_view_email = "e-mail:"
+;
+; RegisterView.php line: 246
+register_view_password = "wachtwoord:"
+;
+; RegisterView.php line: 261
+register_view_retypepassword = "Typ het wachtwoord opnieuw:"
+;
+; RegisterView.php line: 277
+register_view_account_recovery = "Herstel Info:"
+;
+; RegisterView.php line: 281
+register_view_human_check = "Human Check:"
+;
+; RegisterView.php line: 283
+register_view_account_recovery = "Herstel Info:"
+;
+; RegisterView.php line: 315
+register_view_human_check = "Human Check:"
+;
+; RegisterView.php line: 329
+register_view_i_agree = "Door te klikken op Account, ik ga akkoord met de"
+;
+; RegisterView.php line: 331
+register_view_terms = "Yioop Voorwaarden"
+;
+; RegisterView.php line: 333
+register_view_and = "en"
+;
+; RegisterView.php line: 335
+register_view_privacy = "Privacybeleid"
+;
+; RegisterView.php line: 336
+register_view_period = "."
+;
+; RegisterView.php line: 346
+register_view_create_account = "Maak Een Account Aan"
+;
+; RegisterView.php line: 355
+register_view_return = ""
+;
+; SearchView.php line: 92
+search_view_title = "Yioop! PHP Zoekmachine"
+;
+; SearchView.php line: 119
+search_view_input_label = "Voer de voorwaarden zou u willen het web zoeken"
+;
+; SearchView.php line: 123
+search_view_input_placeholder = "Typ wat te vinden"
+;
+; SearchView.php line: 126
+search_view_search = "zoeken"
+;
+; SearchView.php line: 155
+search_view_no_index_set = "Geen Standaard Index Set"
+;
+; SearchView.php line: 164
+search_view_more_statistics = "meer Statistiek"
+;
+; SearchView.php line: 201
+search_view_calculated = " %s seconden."
+;
+; SearchView.php line: 203
+search_view_results = "Toont %s - %s van %s"
+;
+; SearchView.php line: 229
+search_view_thesaurus_results = "thesaurus Resultaten"
+;
+; SearchView.php line: 339
+search_view_word_cloud = "woorden:"
+;
+; SearchView.php line: 380
+search_view_cache = "gecached"
+;
+; SearchView.php line: 382
+search_view_as_text = "Bekijk & nbsp; als & nbsp; tekst"
+;
+; SearchView.php line: 393
+search_view_similar = "soortgelijk"
+;
+; SearchView.php line: 402
+search_view_inlink = "inlinks"
+;
+; SearchView.php line: 419
+search_view_rank = "Rang: %s"
+;
+; SearchView.php line: 421
+search_view_relevancy = "Rel: %s"
+;
+; SearchView.php line: 423
+search_view_proximity = "Prox: %s"
+;
+; SearchView.php line: 427
+search_view_thesaurus_score = "Thesaurus: %s"
+;
+; SearchView.php line: 436
+search_view_score = "Score: %s"
+;
+; SettingsView.php line: 66
+settings_view_settings = "instellingen"
+;
+; SettingsView.php line: 73
+settings_view_results_per_page = "Resultaten / Pagina:"
+;
+; SettingsView.php line: 79
+settings_view_open_in_tabs = "Openen in tabbladen:"
+;
+; SettingsView.php line: 86
+settings_view_search_index = "Zoek Index:"
+;
+; SettingsView.php line: 92
+settings_view_language_label = "taal:"
+;
+; SettingsView.php line: 106
+settings_view_return = ""
+;
+; SettingsView.php line: 109
+settings_view_save = "Instellingen opslaan"
+;
+; SettingsView.php line: 116
+settings_install_search_plugin = "Installeer Yioop! Open Search Plugin"
+;
+; SigninView.php line: 68
+signin_view_signin = "Aanmelden"
+;
+; SigninView.php line: 81
+sigin_view_signing_in = "aanmelden"
+;
+; SigninView.php line: 84
+sigin_view_login_failed = "Inloggen Mislukt!"
+;
+; SigninView.php line: 92
+signin_view_username = "gebruikersnaam"
+;
+; SigninView.php line: 99
+signin_view_password = "wachtwoord"
+;
+; SigninView.php line: 109
+signin_view_login = "Log In"
+;
+; SigninView.php line: 124
+signin_view_recover_password = "Wachtwoord Vergeten?"
+;
+; SigninView.php line: 129
+signin_view_create_account = "Maak Een Account Aan"
+;
+; SigninView.php line: 133
+signin_view_return = ""
+;
+; StaticView.php line: 68
+static_view_title = "PHP Search Engine - Yioop!"
+;
+; StatisticsView.php line: 75
+statistics_view_statistics = "statistiek"
+;
+; StatisticsView.php line: 80
+statistics_view_calculating = "Berekenen ... Even geduld aub."
+;
+; StatisticsView.php line: 94
+statistics_view_error_codes = "Foutcodes Seen"
+;
+; StatisticsView.php line: 95
+statistics_view_sizes = "Bestandsgrootte Gedownloade"
+;
+; StatisticsView.php line: 96
+statistics_view_links_per_page = "Gemiddeld links per pagina"
+;
+; StatisticsView.php line: 97
+statistics_view_page_date = "Pagina gewijzigd op Dates"
+;
+; StatisticsView.php line: 98
+statistics_view_dns_time = "DNS Lookup Tijd"
+;
+; StatisticsView.php line: 99
+statistics_view_download_time = "Pagina Download Tijd"
+;
+; StatisticsView.php line: 100
+statistics_view_top_level_domain = "Top Level Domains"
+;
+; StatisticsView.php line: 101
+statistics_view_file_extension = "file Extension"
+;
+; StatisticsView.php line: 102
+statistics_view_media_type = "Mediatype"
+;
+; StatisticsView.php line: 103
+statistics_view_language = "Taal voor webpaginas"
+;
+; StatisticsView.php line: 104
+statistics_view_server = "web Server"
+;
+; StatisticsView.php line: 105
+statistics_view_os = "Besturingssysteem (indien gedetecteerd)"
+;
+; StatisticsView.php line: 108
+statistics_view_general_info = "General Index Info"
+;
+; StatisticsView.php line: 109
+statistics_view_description = "index Beschrijving"
+;
+; StatisticsView.php line: 111
+statistics_view_timestamp = "timestamp"
+;
+; StatisticsView.php line: 113
+statistics_view_crawl_date = "Crawl Starttijd"
+;
+; StatisticsView.php line: 115
+statistics_view_pages = "gedownloade Pages"
+;
+; StatisticsView.php line: 117
+statistics_view_url = "gezien Urls"
+;
+; StatisticsView.php line: 120
+statistics_view_number_hosts = "hostnames Seen"
+;
+; SuggestView.php line: 69
+suggest_view_suggest_url = "Suggereren Een URL"
+;
+; SuggestView.php line: 71
+suggest_view_instructions = "Suggereer een site voor de volgende web crawl. Tot tien plaatsen per dag kan worden aanvaard."
+;
+; SuggestView.php line: 95
+suggest_view_url = "URL:"
+;
+; SuggestView.php line: 109
+register_view_human_check = "Human Check:"
+;
+; SuggestView.php line: 143
+suggest_view_human_check = "Human Check:"
+;
+; SuggestView.php line: 164
+suggest_view_submit_url = "voorleggen"
+;
+; SuggestView.php line: 173
+suggest_view_return = ""
+;
+; View.php line: 61
+view_locale_version14 = ""
+;
+; View.php line: 93
+view_logo_alt_text = "Yioop"
+;
+; WikiView.php line: 86
+wiki_view_read = "lezen"
+;
+; WikiView.php line: 87
+wiki_view_edit = "uitgeven"
+;
+; WikiView.php line: 90
+wiki_view_pages = "paginas"
+;
+; WikiView.php line: 135
+wiki_view_feed = "voeden"
+;
+; WikiView.php line: 136
+wiki_view_wiki = "wiki"
+;
+; WikiView.php line: 160
+adminview_auto_logout_one_minute = "Automatisch uitloggen in One Minute!!"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/elements
+;
+; ActivityElement.php line: 56
+activity_element_activities = "activiteiten"
+;
+; AppearanceElement.php line: 71
+appearance_element_use_wiki_landing = "Gebruik Wiki Openbare hoofdpagina als Landing Pagina:"
+;
+; AppearanceElement.php line: 77
+appearance_element_background_color = "Achtergrondkleur:"
+;
+; AppearanceElement.php line: 84
+appearance_element_background_image = "Achtergrond Afbeelding:"
+;
+; AppearanceElement.php line: 91
+appearance_element_background_image = "Achtergrond Afbeelding:"
+;
+; AppearanceElement.php line: 99
+appearance_element_foreground_color = "Voorgrondkleur:"
+;
+; AppearanceElement.php line: 104
+appearance_element_topbar_color = "Top Bar Kleur:"
+;
+; AppearanceElement.php line: 109
+appearance_element_sidebar_color = "Side bar Kleur:"
+;
+; AppearanceElement.php line: 115
+appearance_element_site_logo = "Site Logo:"
+;
+; AppearanceElement.php line: 122
+appearance_element_site_logo = "Site Logo:"
+;
+; AppearanceElement.php line: 132
+appearance_element_mobile_logo = "Mobile Logo:"
+;
+; AppearanceElement.php line: 139
+appearance_element_mobile_logo = "Mobile Logo:"
+;
+; AppearanceElement.php line: 148
+appearance_element_favicon = "favicon:"
+;
+; AppearanceElement.php line: 155
+appearance_element_favicon = "favicon:"
+;
+; AppearanceElement.php line: 163
+appearance_element_toolbar = "Zoek Toolbar:"
+;
+; AppearanceElement.php line: 174
+appearance_element_site_timezone = "tijdzone:"
+;
+; AppearanceElement.php line: 179
+appearance_element_cookie_name = "Web Cookie Naam:"
+;
+; AppearanceElement.php line: 184
+appearance_element_token_name = "Web Token Naam:"
+;
+; AppearanceElement.php line: 189
+appearance_element_auxiliary_css = "Auxiliary richtlijnen Stijl"
+;
+; AppearanceElement.php line: 194
+appearance_element_reset_customizations = "Reset Aanpassingen"
+;
+; AppearanceElement.php line: 199
+appearance_element_save = ""
+;
+; ConfigureElement.php line: 72
+configure_element_work_directory = "Zoekmachine Werk Directory"
+;
+; ConfigureElement.php line: 76
+configure_element_load_or_create = "Laden of aanmaken"
+;
+; ConfigureElement.php line: 92
+configure_element_component_check = "component Controle"
+;
+; ConfigureElement.php line: 96
+configure_element_profile_settings = "profiel Instellingen"
+;
+; ConfigureElement.php line: 101
+configure_element_default_language = "Standaard Taal:"
+;
+; ConfigureElement.php line: 108
+configure_element_debug_display = "debug Weergave"
+;
+; ConfigureElement.php line: 114
+configure_element_error_info = "fout Info"
+;
+; ConfigureElement.php line: 120
+configure_element_query_info = "query-Info"
+;
+; ConfigureElement.php line: 126
+configure_element_test_info = "Test Info"
+;
+; ConfigureElement.php line: 131
+configure_element_site_access = "zoeken Access"
+;
+; ConfigureElement.php line: 136
+configure_element_web_access = "web"
+;
+; ConfigureElement.php line: 141
+configure_element_rss_access = "RSS"
+;
+; ConfigureElement.php line: 146
+configure_element_api_access = "API"
+;
+; ConfigureElement.php line: 150
+configure_element_crawl_robot = "Crawl Robot Set-up"
+;
+; ConfigureElement.php line: 152
+configure_element_robot_name = "Crawl Robot Naam:"
+;
+; ConfigureElement.php line: 160
+configure_element_robot_instance = "Robot aanleg:"
+;
+; ConfigureElement.php line: 166
+configure_element_robot_description = "robot Beschrijving"
+;
+; ConfigureElement.php line: 175
+serversettings_element_save = ""
+;
+; CrawloptionsElement.php line: 59
+crawloptions_element_back_to_manage = "terug"
+;
+; CrawloptionsElement.php line: 62
+crawloptions_element_modify_active_crawl = "Wijzigen Actief Crawl"
+;
+; CrawloptionsElement.php line: 64
+crawloptions_element_edit_crawl_options = "Bewerk Crawl Opties"
+;
+; CrawloptionsElement.php line: 87
+crawloptions_element_web_crawl = "web Crawl"
+;
+; CrawloptionsElement.php line: 97
+crawloptions_element_archive_crawl = "archief Crawl"
+;
+; CrawloptionsElement.php line: 104
+crawloptions_element_load_options = "Krijg Crawl Opties Van:"
+;
+; CrawloptionsElement.php line: 109
+crawloptions_element_crawl_order = "Crawl Order:"
+;
+; CrawloptionsElement.php line: 118
+crawloptions_element_restrict_by_url = "Beperken Sites Door Url:"
+;
+; CrawloptionsElement.php line: 126
+crawloptions_element_allowed_to_crawl = "Toegestaan te kruipen sites"
+;
+; CrawloptionsElement.php line: 132
+crawloptions_element_disallowed_and_quota_sites = "Afgekeurd sites / locaties met quota"
+;
+; CrawloptionsElement.php line: 141
+crawloptions_element_seed_sites = "zaad sites"
+;
+; CrawloptionsElement.php line: 145
+crawloptions_element_add_suggest_urls = "Gebruiker toevoegen Suggestie gegevens"
+;
+; CrawloptionsElement.php line: 156
+crawloptions_element_inject_sites = "Sites om te injecteren op Huidige Crawl"
+;
+; CrawloptionsElement.php line: 160
+crawloptions_element_add_suggest_urls = "Gebruiker toevoegen Suggestie gegevens"
+;
+; CrawloptionsElement.php line: 177
+crawloptions_element_reindex_crawl = "Kruipen of Arc Map om Re-index:"
+;
+; CrawloptionsElement.php line: 185
+crawloptions_element_need_api_for_mix = "Yioop API-toegang nodig voor mix archief kruipt"
+;
+; CrawloptionsElement.php line: 193
+crawloptions_element_save_options = "Opties voor opslaan"
+;
+; EditclassifierElement.php line: 62
+editclassifier_back = "terug"
+;
+; EditclassifierElement.php line: 64
+editclassifier_edit_classifier = "bewerk Classificator"
+;
+; EditclassifierElement.php line: 76
+editclassifier_classifier_label = "Classifier Label:"
+;
+; EditclassifierElement.php line: 81
+editclassifier_change = "verandering"
+;
+; EditclassifierElement.php line: 86
+editclassifier_statistics = "statistiek"
+;
+; EditclassifierElement.php line: 87
+editclassifier_positive_examples = "Positieve voorbeelden:"
+;
+; EditclassifierElement.php line: 90
+editclassifier_negative_examples = "Negatieve Voorbeelden:"
+;
+; EditclassifierElement.php line: 93
+editclassifier_accuracy = "nauwkeurigheid:"
+;
+; EditclassifierElement.php line: 98
+crawl_component_na = "N / A"
+;
+; EditclassifierElement.php line: 103
+editclassifier_update = "-update"
+;
+; EditclassifierElement.php line: 104
+editclassifier_add_examples = "Voorbeelden voegen"
+;
+; EditclassifierElement.php line: 113
+editclassifier_source = "bron:"
+;
+; EditclassifierElement.php line: 117
+editclassifier_default_crawl = "standaard Crawl"
+;
+; EditclassifierElement.php line: 127
+editclassifier_label_by_hand = "Label Door Hand"
+;
+; EditclassifierElement.php line: 129
+editclassifier_all_in_class = "All In Klasse"
+;
+; EditclassifierElement.php line: 131
+editclassifier_none_in_class = "Geen In Klasse"
+;
+; EditclassifierElement.php line: 136
+editclassifier_keywords = "trefwoorden:"
+;
+; EditclassifierElement.php line: 145
+editclassifier_load = "belasting"
+;
+; EditclassifierElement.php line: 151
+editclassifier_finalize = "afronden"
+;
+; EditclassifierElement.php line: 159
+editclassifier_no_documents = "geen documenten"
+;
+; EditlocalesElement.php line: 62
+editlocales_element_back_to_manage = "terug"
+;
+; EditlocalesElement.php line: 64
+editlocales_element_edit_locale = "Bewerken Landinstelling: %s"
+;
+; EditlocalesElement.php line: 78
+editlocales_element_show = "Toon:"
+;
+; EditlocalesElement.php line: 82
+editlocales_element_filter = "filter:"
+;
+; EditlocalesElement.php line: 87
+editlocales_element_go = "gaan"
+;
+; EditlocalesElement.php line: 91
+editlocales_element_no_matching = "Geen Matching Strings Left To Translate!"
+;
+; EditlocalesElement.php line: 127
+editlocales_element_save = ""
+;
+; EditmixElement.php line: 57
+editmix_element_back_to_mix = "terug"
+;
+; EditmixElement.php line: 59
+mixcrawls_element_edit_mix = "Bewerk Crawl Mix"
+;
+; EditmixElement.php line: 70
+mixcrawls_element_mix_name = "mix Naam"
+;
+; EditmixElement.php line: 76
+mixcrawls_element_mix_components = "mix Components"
+;
+; EditmixElement.php line: 82
+mixcrawls_element_too_many = "Op Maximum aantal Zoeken Fragmenten!"
+;
+; EditmixElement.php line: 83
+mixcrawls_element_add_fragment = "Voeg Zoekresultaat Fragment"
+;
+; EditmixElement.php line: 88
+mixcrawls_element_save_button = "Opslaan"
+;
+; FooterElement.php line: 58
+footer_element_blog = "blog"
+;
+; FooterElement.php line: 60
+footer_element_privacy = "Privacy"
+;
+; FooterElement.php line: 62
+footer_element_terms = "Voorwaarden"
+;
+; FooterElement.php line: 64
+footer_element_tools = "gereedschap"
+;
+; FooterElement.php line: 66
+footer_element_bot = "YioopBot"
+;
+; FooterElement.php line: 71
+footer_element_developed_seek_quarry = "Ontwikkeld op SeekQuarry"
+;
+; FooterElement.php line: 74
+footer_element_copyright_site = ""
+;
+; FooterElement.php line: 76
+footer_element_this_search_engine = ""
+;
+; GroupfeedElement.php line: 86
+groupfeed_element_add_group = "Groep toevoegen"
+;
+; GroupfeedElement.php line: 90
+groupfeed_element_request_add = "Verzoek Groep toevoegen"
+;
+; GroupfeedElement.php line: 116
+groupfeed_element_wiki_page = "Pagina bewerken"
+;
+; GroupfeedElement.php line: 118
+groupfeed_element_back = "Mijn Groep Feeds"
+;
+; GroupfeedElement.php line: 121
+groupfeed_element_back = "Mijn Groep Feeds"
+;
+; GroupfeedElement.php line: 131
+groupfeed_element_group_activity = "Group Activity"
+;
+; GroupfeedElement.php line: 135
+groupfeed_element_wiki_thread = " %s Wiki Pagina Overleg"
+;
+; GroupfeedElement.php line: 154
+groupfeed_element_feed = "voeden"
+;
+; GroupfeedElement.php line: 159
+group_view_wiki = "wiki"
+;
+; GroupfeedElement.php line: 161
+groupfeed_element_user = " %s Gebruiker Feed"
+;
+; GroupfeedElement.php line: 205
+groupfeed_element_comment = "commentaar"
+;
+; GroupfeedElement.php line: 240
+manageaccount_element_group_wiki = "wiki"
+;
+; GroupfeedElement.php line: 241
+manageaccount_element_group_stats = " %s berichten, %s discussies"
+;
+; GroupfeedElement.php line: 246
+manageaccount_element_last_post = "Laatste bericht:"
+;
+; GroupfeedElement.php line: 290
+groupfeed_element_comment = "commentaar"
+;
+; GroupfeedElement.php line: 300
+groupfeed_element_start_thread = "Start nieuw onderwerp"
+;
+; GroupfeedElement.php line: 313
+groupfeed_element_start_thread = "Start nieuw onderwerp"
+;
+; GroupfeedElement.php line: 319
+groupfeed_element_no_posts_yet = "Deze groep heeft nog geen berichten!"
+;
+; GroupfeedElement.php line: 324
+groupfeed_element_thread_no_exist = "Draad bestaat niet! Misschien was verwijderd?"
+;
+; GroupfeedElement.php line: 357
+groupfeed_element_edit = "uitgeven"
+;
+; GroupfeedElement.php line: 362
+groupfeed_element_delete = "verwijderen"
+;
+; GroupfeedElement.php line: 384
+groupfeed_element_num_posts = " %s berichten"
+;
+; GroupfeedElement.php line: 394
+groupfeed_element_num_views = "uitzicht %s"
+;
+; GroupfeedElement.php line: 419
+groupfeed_element_start_thread_in_group = "Start nieuw onderwerp in %s"
+;
+; GroupfeedElement.php line: 421
+groupfeed_element_start_thread_in_group = "Start nieuw onderwerp in %s"
+;
+; GroupfeedElement.php line: 437
+groupfeed_element_last_edited = "Laatst gewijzigd: %s"
+;
+; GroupfeedElement.php line: 453
+groupfeed_element_post_vote = "stem:"
+;
+; GroupfeedElement.php line: 480
+groupfeed_element_last_post_info = "Laatste bericht:"
+;
+; GroupfeedElement.php line: 496
+groupfeed_element_comment = "commentaar"
+;
+; GroupfeedElement.php line: 550
+fileupload_helper_drag_textarea = "Sleep items in het tekstveld om ze toe te voegen ..."
+;
+; GroupfeedElement.php line: 551
+fileupload_helper_click_textarea = "of klik om ze te selecteren."
+;
+; GroupfeedElement.php line: 575
+groupfeed_element_add_comment = "Voeg een reactie toe"
+;
+; GroupfeedElement.php line: 589
+groupfeed_element_save = "Opslaan"
+;
+; GroupfeedElement.php line: 627
+groupfeed_element_subject = "onderwerp"
+;
+; GroupfeedElement.php line: 634
+groupfeed_element_post = "post"
+;
+; GroupfeedElement.php line: 647
+groupfeed_element_save = "Opslaan"
+;
+; GroupfeedElement.php line: 682
+groupfeed_element_edit_post = "Bericht wijzigen"
+;
+; GroupfeedElement.php line: 685
+groupfeed_element_subject = "onderwerp"
+;
+; GroupfeedElement.php line: 690
+groupfeed_element_post = "post"
+;
+; GroupfeedElement.php line: 703
+groupfeed_element_save = "Opslaan"
+;
+; GroupfeedElement.php line: 731
+groupfeed_element_no_longer_update = "Groep feeds niet meer updaten!"
+;
+; MachinelogElement.php line: 57
+machinelog_element_back_to_manage = "terug"
+;
+; MachinelogElement.php line: 62
+machinelog_element_filter = "filter:"
+;
+; MachinelogElement.php line: 69
+machinelog_element_log_file = " %s Logbestand"
+;
+; MachinelogElement.php line: 74
+machinelog_element_refresh_off = "Schakel automatisch vernieuwen Off"
+;
+; MachinelogElement.php line: 78
+machinelog_element_refresh_on = "Schakel automatisch vernieuwen On"
+;
+; ManageaccountElement.php line: 64
+manageaccount_element_edit_or_no_text = "Knevel of de rekeningsinformatie editable is"
+;
+; ManageaccountElement.php line: 73
+manageaccount_element_welcome = "Welkom, %s!"
+;
+; ManageaccountElement.php line: 75
+manageaccount_element_what_can_do = "Vanaf deze pagina kunt u toegang tot en controle aspecten van uw account."
+;
+; ManageaccountElement.php line: 76
+manageaccount_element_account_details = "account Details"
+;
+; ManageaccountElement.php line: 107
+manageaccounts_element_icon = "user Icon"
+;
+; ManageaccountElement.php line: 117
+manageusers_element_username = "gebruikersnaam"
+;
+; ManageaccountElement.php line: 124
+manageusers_element_firstname = "Voornaam"
+;
+; ManageaccountElement.php line: 130
+manageusers_element_lastname = "achternaam"
+;
+; ManageaccountElement.php line: 136
+manageusers_element_email = "e-mail"
+;
+; ManageaccountElement.php line: 146
+manageaccount_element_is_advertiser = ""
+;
+; ManageaccountElement.php line: 159
+manageaccount_element_password = "wachtwoord:"
+;
+; ManageaccountElement.php line: 166
+manageaccount_element_new_password = "Nieuw Wachtwoord:"
+;
+; ManageaccountElement.php line: 172
+manageaccount_element_retype_password = "overtypen:"
+;
+; ManageaccountElement.php line: 184
+manageaccount_element_save = "Opslaan"
+;
+; ManageaccountElement.php line: 190
+manageaccount_element_search_lang_settings = "Taal en zoeken Instellingen"
+;
+; ManageaccountElement.php line: 195
+manageaccount_element_crawl_and_index = "Kruipt en indexen"
+;
+; ManageaccountElement.php line: 196
+manageaccount_element_crawl_info = "Crawlen en indexeren van de webpagina of een bestaand archief en het cre&iuml;ren van een doorzoekbare index."
+;
+; ManageaccountElement.php line: 197
+manageaccount_element_num_crawls = "Je hebt %s actief kruipt, %s vorige kruipen indexen."
+;
+; ManageaccountElement.php line: 200
+manageaccount_element_manage_crawls = "Beheer Crawls en indexen"
+;
+; ManageaccountElement.php line: 205
+manageaccount_element_groups_and_feeds = "Groepen en Feeds"
+;
+; ManageaccountElement.php line: 206
+manageaccount_element_group_info = "Maken of zich abonneren op groepen om te communiceren met vrienden."
+;
+; ManageaccountElement.php line: 208
+manageaccount_element_num_groups = "U behoort tot %s groepen."
+;
+; ManageaccountElement.php line: 211
+manageaccount_element_num_group = "U behoort tot 1 groep."
+;
+; ManageaccountElement.php line: 224
+manageaccount_element_group_wiki = "wiki"
+;
+; ManageaccountElement.php line: 225
+manageaccount_element_group_stats = " %s berichten, %s discussies"
+;
+; ManageaccountElement.php line: 229
+manageaccount_element_last_post = "Laatste bericht:"
+;
+; ManageaccountElement.php line: 239
+manageaccount_element_manage_all_groups = "Join / beheren Alle groepen"
+;
+; ManageaccountElement.php line: 241
+manageaccount_element_go_to_group_feed = "Zie Gecombineerde Groep Feeds"
+;
+; ManageaccountElement.php line: 242
+manageaccount_element_crawl_mixes = "crawl Mixes"
+;
+; ManageaccountElement.php line: 243
+manageaccount_element_mixes_info = "Aanwezig zoekresultaten van meerdere indexen in de volgorde van uw voorkeur. Deel uw zoekopdracht creaties met een groep vrienden."
+;
+; ManageaccountElement.php line: 245
+manageaccount_element_num_mixes = "Je hebt %s kruipen mixen."
+;
+; ManageaccountElement.php line: 248
+manageaccount_element_num_mix = "Je hebt %s kruipen mix."
+;
+; ManageaccountElement.php line: 252
+manageaccount_element_manage_mixes = "Maak / beheren Crawl Mixes"
+;
+; ManageadvertisementsElement.php line: 58
+manageadvertisements_element_list = ""
+;
+; ManageadvertisementsElement.php line: 65
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 70
+manageadvertisements_element_username = ""
+;
+; ManageadvertisementsElement.php line: 73
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 75
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 76
+manageadvertisements_element_dates = ""
+;
+; ManageadvertisementsElement.php line: 77
+manageadvertisements_element_viewclicks = ""
+;
+; ManageadvertisementsElement.php line: 80
+manageadvertisements_element_status = ""
+;
+; ManageadvertisementsElement.php line: 82
+manageadvertisements_element_actions = ""
+;
+; ManageadvertisementsElement.php line: 111
+manageadvertisements_element_active = ""
+;
+; ManageadvertisementsElement.php line: 113
+manageadvertisements_element_deactivated = ""
+;
+; ManageadvertisementsElement.php line: 115
+manageadvertisements_element_suspended = ""
+;
+; ManageadvertisementsElement.php line: 117
+manageadvertisements_element_completed = ""
+;
+; ManageadvertisementsElement.php line: 144
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 147
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 157
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 161
+manageadvertisements_element_deactivate = ""
+;
+; ManageadvertisementsElement.php line: 166
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 170
+manageadvertisements_element_suspend = ""
+;
+; ManageadvertisementsElement.php line: 176
+manageadvertisements_element_reconfirm = ""
+;
+; ManageadvertisementsElement.php line: 180
+manageadvertisements_element_reactivate = ""
+;
+; ManageadvertisementsElement.php line: 225
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 227
+manageadvertisement_element_ad_info = ""
+;
+; ManageadvertisementsElement.php line: 231
+manageadvertisement_element_purchase_ad = ""
+;
+; ManageadvertisementsElement.php line: 250
+manageadvertisement_element_ad_user = ""
+;
+; ManageadvertisementsElement.php line: 263
+manageadvertisement_element_displayname = ""
+;
+; ManageadvertisementsElement.php line: 282
+manageadvertisement_element_text = ""
+;
+; ManageadvertisementsElement.php line: 302
+manageadvertisement_element_ad_url = ""
+;
+; ManageadvertisementsElement.php line: 323
+manageeadvertisement_element_ad_duration = ""
+;
+; ManageadvertisementsElement.php line: 339
+manageeadvertisement_element_start_day = ""
+;
+; ManageadvertisementsElement.php line: 344
+manageeadvertisement_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 349
+manageadvertisement_element_keyword_help = ""
+;
+; ManageadvertisementsElement.php line: 363
+manageadvertisement_element_keyword_bid_amount = ""
+;
+; ManageadvertisementsElement.php line: 370
+manageadvertisement_element_expensive_word = ""
+;
+; ManageadvertisementsElement.php line: 387
+manageadvertisement_element_calculate_bid = ""
+;
+; ManageadvertisementsElement.php line: 407
+manageadvertisement_element_update = ""
+;
+; ManageadvertisementsElement.php line: 416
+manageadvertisement_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 427
+manageadvertisement_element_card_number = ""
+;
+; ManageadvertisementsElement.php line: 438
+manageadvertisement_element_cvc = ""
+;
+; ManageadvertisementsElement.php line: 447
+manageadvertisement_element_expiration = ""
+;
+; ManageadvertisementsElement.php line: 465
+manageadvertisement_element_charge_warning = ""
+;
+; ManageadvertisementsElement.php line: 468
+manageadvertisement_element_program_terms = ""
+;
+; ManageadvertisementsElement.php line: 475
+manageadvertisement_element_edit_ad = ""
+;
+; ManageadvertisementsElement.php line: 479
+manageadvertisement_element_purchase = ""
+;
+; ManageadvertisementsElement.php line: 500
+manageadvertisement_element_preview = ""
+;
+; ManageadvertisementsElement.php line: 538
+manageadvertisements_element_search_advertisement = ""
+;
+; ManageadvertisementsElement.php line: 540
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 542
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 543
+manageadvertisements_element_description = ""
+;
+; ManageadvertisementsElement.php line: 544
+manageadvertisements_element_destination_url = ""
+;
+; ManageadvertisementsElement.php line: 545
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 546
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 547
+manageadvertisements_element_start_date = ""
+;
+; ManageadvertisementsElement.php line: 548
+manageadvertisements_element_end_date = ""
+;
+; ManageclassifiersElement.php line: 66
+manageclassifiers_available_classifiers = "beschikbaar Classifiers"
+;
+; ManageclassifiersElement.php line: 74
+manageclassifiers_label_col = "label"
+;
+; ManageclassifiersElement.php line: 77
+manageclassifiers_positive_col = "positief"
+;
+; ManageclassifiersElement.php line: 78
+manageclassifiers_negative_col = "negatief"
+;
+; ManageclassifiersElement.php line: 82
+manageclassifiers_actions_col = "acties"
+;
+; ManageclassifiersElement.php line: 100
+manageclassifiers_edit = "uitgeven"
+;
+; ManageclassifiersElement.php line: 103
+manageclassifiers_finalized = "afgerond"
+;
+; ManageclassifiersElement.php line: 109
+manageclassifiers_finalize = "afronden"
+;
+; ManageclassifiersElement.php line: 111
+manageclassifiers_finalize = "afronden"
+;
+; ManageclassifiersElement.php line: 116
+manageclassifiers_finalizing = "finaliseren"
+;
+; ManageclassifiersElement.php line: 120
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; ManageclassifiersElement.php line: 123
+manageclassifiers_delete = "verwijderen"
+;
+; ManageclassifiersElement.php line: 155
+manageclassifiers_manage_classifiers = "Beheer Classifiers"
+;
+; ManageclassifiersElement.php line: 165
+manageclassifiers_classifier_name = "naam"
+;
+; ManageclassifiersElement.php line: 170
+manageclassifiers_create_button = "cre&iuml;ren"
+;
+; ManageclassifiersElement.php line: 185
+manageclassifiers_element_search = "zoeken"
+;
+; ManageclassifiersElement.php line: 186
+manageclassifiers_element_create_form = "Maak Classificator Form"
+;
+; ManageclassifiersElement.php line: 187
+manageclassifiers_classifier_name = "naam"
+;
+; ManagecrawlsElement.php line: 51
+managecrawls_element_create_crawl = "Maak Crawl"
+;
+; ManagecrawlsElement.php line: 60
+managecrawls_element_description = "naam"
+;
+; ManagecrawlsElement.php line: 67
+managecrawls_element_start_new_crawl = "begin"
+;
+; ManagecrawlsElement.php line: 71
+managecrawls_element_options = "opties"
+;
+; ManagecrawlsElement.php line: 77
+managecrawls_element_awaiting_status = "In afwachting van Crawlstatus"
+;
+; ManagecrawlsElement.php line: 95
+managecrawls_element_up_longer_update = "Crawlstatus niet meer updaten"
+;
+; ManagegroupsElement.php line: 71
+managegroups_element_not_my_groups = "Geen abonnement op Groepen"
+;
+; ManagegroupsElement.php line: 73
+managegroups_element_groups = "geabonneerd Groepen"
+;
+; ManagegroupsElement.php line: 82
+managegroups_element_groupname = "naam"
+;
+; ManagegroupsElement.php line: 83
+managegroups_element_groupowner = "eigenaar"
+;
+; ManagegroupsElement.php line: 85
+managegroups_element_registertype = "Registreer"
+;
+; ManagegroupsElement.php line: 86
+managegroups_element_memberaccess = "toegang"
+;
+; ManagegroupsElement.php line: 87
+managegroups_element_voting = "stemming"
+;
+; ManagegroupsElement.php line: 88
+managegroups_element_post_lifetime = "bericht Lifetime"
+;
+; ManagegroupsElement.php line: 90
+managegroups_element_actions = "acties"
+;
+; ManagegroupsElement.php line: 196
+managegroups_element_num_users = " %s gebruikers"
+;
+; ManagegroupsElement.php line: 200
+managegroups_element_num_users = " %s gebruikers"
+;
+; ManagegroupsElement.php line: 214
+manageaccount_element_group_wiki = "wiki"
+;
+; ManagegroupsElement.php line: 229
+managegroups_element_join = "toetreden"
+;
+; ManagegroupsElement.php line: 233
+managegroups_element_edit = "uitgeven"
+;
+; ManagegroupsElement.php line: 238
+managegroups_element_edit = "uitgeven"
+;
+; ManagegroupsElement.php line: 243
+managegroups_element_delete = "verwijderen"
+;
+; ManagegroupsElement.php line: 249
+managegroups_element_join = "toetreden"
+;
+; ManagegroupsElement.php line: 254
+managegroups_element_join = "toetreden"
+;
+; ManagegroupsElement.php line: 263
+managegroups_element_decline = "achteruitgang"
+;
+; ManagegroupsElement.php line: 265
+managegroups_element_unsubscribe = "Uitschrijven"
+;
+; ManagegroupsElement.php line: 270
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; ManagegroupsElement.php line: 273
+managegroups_element_delete = "verwijderen"
+;
+; ManagegroupsElement.php line: 303
+managegroups_element_addgroup_form = "Cre&iuml;er / Lid worden van groep"
+;
+; ManagegroupsElement.php line: 304
+managegroups_element_group_info = "Groep bewerken"
+;
+; ManagegroupsElement.php line: 306
+managegroups_element_create_group = "Groep maken"
+;
+; ManagegroupsElement.php line: 310
+managegroups_element_add_group = "Cre&iuml;er / Lid worden van groep"
+;
+; ManagegroupsElement.php line: 327
+managegroups_element_groupname = "naam"
+;
+; ManagegroupsElement.php line: 338
+managegroups_element_browse = "Blader"
+;
+; ManagegroupsElement.php line: 348
+managegroups_element_register = "Registreer"
+;
+; ManagegroupsElement.php line: 355
+managegroups_element_memberaccess = "toegang"
+;
+; ManagegroupsElement.php line: 362
+managegroups_element_voting = "stemming"
+;
+; ManagegroupsElement.php line: 369
+managegroups_element_post_lifetime = "bericht Lifetime"
+;
+; ManagegroupsElement.php line: 381
+managegroups_element_group_users = "leden"
+;
+; ManagegroupsElement.php line: 385
+managegroups_element_num_users = " %s gebruikers"
+;
+; ManagegroupsElement.php line: 412
+managegroups_element_groupowner = "eigenaar"
+;
+; ManagegroupsElement.php line: 414
+managegroups_element_delete = "verwijderen"
+;
+; ManagegroupsElement.php line: 423
+managegroups_element_activate = "activeren"
+;
+; ManagegroupsElement.php line: 429
+managegroups_element_ban = "ban"
+;
+; ManagegroupsElement.php line: 435
+managegroups_element_unban = "herstellen"
+;
+; ManagegroupsElement.php line: 443
+managegroups_element_delete = "verwijderen"
+;
+; ManagegroupsElement.php line: 471
+managegroups_element_filter = "filter"
+;
+; ManagegroupsElement.php line: 492
+managegroups_element_invite = "Nodigen Meer Gebruikers"
+;
+; ManagegroupsElement.php line: 503
+managegroups_element_save = "Opslaan"
+;
+; ManagegroupsElement.php line: 533
+managegroups_element_group_info = "Groep bewerken"
+;
+; ManagegroupsElement.php line: 534
+managegroups_element_invite_users_group = "Nodig Gebruikers Groep"
+;
+; ManagegroupsElement.php line: 546
+managegroups_element_groupname = "naam"
+;
+; ManagegroupsElement.php line: 554
+managegroups_element_usernames = "Gebruikersnamen (spatie / kommas gescheiden)"
+;
+; ManagegroupsElement.php line: 561
+managegroups_element_invite = "Nodigen Meer Gebruikers"
+;
+; ManagegroupsElement.php line: 580
+managegroups_element_addgroup_form = "Cre&iuml;er / Lid worden van groep"
+;
+; ManagegroupsElement.php line: 581
+managegroups_element_transfer_group_owner = "Transfer Group eigenaar"
+;
+; ManagegroupsElement.php line: 593
+managegroups_element_groupname = "naam"
+;
+; ManagegroupsElement.php line: 601
+managegroups_element_new_group_owner = "nieuwe eigenaar"
+;
+; ManagegroupsElement.php line: 608
+managegroups_element_change_owner = "eigenaar wijzigen"
+;
+; ManagegroupsElement.php line: 627
+managegroups_element_discover_groups = "Ontdek Groepen"
+;
+; ManagegroupsElement.php line: 631
+managegroups_element_search_group = "Zoeken Geplaatst Groepen"
+;
+; ManagegroupsElement.php line: 633
+managegroups_element_addgroup_form = "Cre&iuml;er / Lid worden van groep"
+;
+; ManagegroupsElement.php line: 635
+managegroups_element_groupname = "naam"
+;
+; ManagegroupsElement.php line: 636
+managegroups_element_groupowner = "eigenaar"
+;
+; ManagegroupsElement.php line: 637
+managegroups_element_registertype = "Registreer"
+;
+; ManagegroupsElement.php line: 639
+managegroups_element_memberaccess = "toegang"
+;
+; ManagegroupsElement.php line: 641
+managegroups_element_post_lifetime = "bericht Lifetime"
+;
+; ManagelocalesElement.php line: 62
+managelocales_element_locale_list = "locale Lijst"
+;
+; ManagelocalesElement.php line: 72
+managelocales_element_localename = "naam"
+;
+; ManagelocalesElement.php line: 75
+managelocales_element_localetag = "label"
+;
+; ManagelocalesElement.php line: 76
+managelocales_element_writingmode = "mode"
+;
+; ManagelocalesElement.php line: 77
+managelocales_element_enabled = "ingeschakeld"
+;
+; ManagelocalesElement.php line: 81
+managelocales_element_percenttranslated = "procent"
+;
+; ManagelocalesElement.php line: 82
+managelocales_element_actions = "acties"
+;
+; ManagelocalesElement.php line: 102
+managelocales_element_true = "TRUE"
+;
+; ManagelocalesElement.php line: 103
+managelocales_element_false = "VALSE"
+;
+; ManagelocalesElement.php line: 110
+managelocales_element_edit = "uitgeven"
+;
+; ManagelocalesElement.php line: 115
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; ManagelocalesElement.php line: 116
+managelocales_element_delete = "verwijderen"
+;
+; ManagelocalesElement.php line: 137
+manageloecales_element_add_locale_form = "Voeg Locale Form"
+;
+; ManagelocalesElement.php line: 138
+managelocales_element_locale_info = "bewerk Locale"
+;
+; ManagelocalesElement.php line: 140
+managelocales_element_add_locale = "Voeg Locale"
+;
+; ManagelocalesElement.php line: 161
+managelocales_element_localenamelabel = "Locale Naam:"
+;
+; ManagelocalesElement.php line: 174
+managelocales_element_localetaglabel = "Locale tag:"
+;
+; ManagelocalesElement.php line: 180
+managelocales_element_writingmodelabel = "Schrijven Mode:"
+;
+; ManagelocalesElement.php line: 190
+managelocales_element_localeenabled = "Locale Ingeschakeld:"
+;
+; ManagelocalesElement.php line: 201
+managelocales_element_submit = "voorleggen"
+;
+; ManagelocalesElement.php line: 219
+managelocales_element_search_locales = "Zoek varianten"
+;
+; ManagelocalesElement.php line: 220
+managelocales_element_addlocale_form = "Voeg Locale Form"
+;
+; ManagelocalesElement.php line: 222
+managelocales_element_localename = "naam"
+;
+; ManagelocalesElement.php line: 223
+managelocales_element_localetag = "label"
+;
+; ManagelocalesElement.php line: 224
+managelocales_element_writingmode = "mode"
+;
+; ManagelocalesElement.php line: 225
+managelocales_element_enabled = "ingeschakeld"
+;
+; ManagelocalesElement.php line: 231
+managelocales_element_true = "TRUE"
+;
+; ManagelocalesElement.php line: 232
+managelocales_element_false = "VALSE"
+;
+; ManagemachinesElement.php line: 56
+managemachines_element_add_machine = "Voeg Machine"
+;
+; ManagemachinesElement.php line: 67
+managemachines_element_machine_name = "Machine Naam:"
+;
+; ManagemachinesElement.php line: 72
+managemachines_element_machineurl = "Machine Url:"
+;
+; ManagemachinesElement.php line: 76
+managemachines_element_is_mirror = "Is Mirror:"
+;
+; ManagemachinesElement.php line: 81
+managemachines_element_parent_name = "Ouder Naam:"
+;
+; ManagemachinesElement.php line: 87
+managemachines_element_has_queueserver = "Heeft Queue Server:"
+;
+; ManagemachinesElement.php line: 91
+managemachines_element_num_fetchers = "Aantal Fetchers:"
+;
+; ManagemachinesElement.php line: 96
+managemachines_element_submit = "voorleggen"
+;
+; ManagemachinesElement.php line: 101
+managemachines_element_machine_info = "Informatie over de machine"
+;
+; ManagemachinesElement.php line: 105
+managemachines_element_awaiting_status = "In afwachting van statussen van machines ..."
+;
+; ManagemachinesElement.php line: 123
+managemachines_element_no_longer_update = "Status van de machine niet meer updaten ..."
+;
+; ManagerolesElement.php line: 59
+manageroles_element_roles = "rol Lijst"
+;
+; ManagerolesElement.php line: 67
+manageroles_element_rolename = "naam"
+;
+; ManagerolesElement.php line: 68
+manageroles_element_actions = "acties"
+;
+; ManagerolesElement.php line: 94
+manageroles_element_edit = "uitgeven"
+;
+; ManagerolesElement.php line: 99
+manageroles_element_delete = "verwijderen"
+;
+; ManagerolesElement.php line: 103
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; ManagerolesElement.php line: 106
+manageroles_element_delete = "verwijderen"
+;
+; ManagerolesElement.php line: 140
+manageroles_element_addrole_form = "Voeg Rol Form"
+;
+; ManagerolesElement.php line: 141
+manageroles_element_role_info = "rol Informatie"
+;
+; ManagerolesElement.php line: 143
+manageroles_element_add_role = "Rol toevoegen"
+;
+; ManagerolesElement.php line: 154
+manageroles_element_rolename = "naam"
+;
+; ManagerolesElement.php line: 167
+manageroles_element_role_activities = "activiteiten"
+;
+; ManagerolesElement.php line: 175
+manageroles_element_delete = "verwijderen"
+;
+; ManagerolesElement.php line: 183
+manageroles_element_delete = "verwijderen"
+;
+; ManagerolesElement.php line: 203
+manageroles_element_save = "Opslaan"
+;
+; ManagerolesElement.php line: 220
+manageroles_element_search_role = "zoeken"
+;
+; ManagerolesElement.php line: 221
+manageroles_element_addrole_form = "Voeg Rol Form"
+;
+; ManagerolesElement.php line: 223
+manageroles_element_rolename = "naam"
+;
+; ManageusersElement.php line: 59
+manageusers_element_users = "Gebruikers Lijst"
+;
+; ManageusersElement.php line: 68
+manageusers_element_username = "gebruikersnaam"
+;
+; ManageusersElement.php line: 70
+manageusers_element_firstname = "Voornaam"
+;
+; ManageusersElement.php line: 71
+manageusers_element_lastname = "achternaam"
+;
+; ManageusersElement.php line: 72
+manageusers_element_email = "e-mail"
+;
+; ManageusersElement.php line: 73
+manageusers_element_groups = "groepen"
+;
+; ManageusersElement.php line: 75
+manageusers_element_status = "toestand"
+;
+; ManageusersElement.php line: 76
+manageusers_element_actions = "acties"
+;
+; ManageusersElement.php line: 141
+manageusers_element_edit = "uitgeven"
+;
+; ManageusersElement.php line: 145
+manageusers_element_edit = "uitgeven"
+;
+; ManageusersElement.php line: 151
+manageusers_element_delete = "verwijderen"
+;
+; ManageusersElement.php line: 155
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; ManageusersElement.php line: 158
+manageusers_element_delete = "verwijderen"
+;
+; ManageusersElement.php line: 200
+manageusers_element_adduser_form = "Gebruiker toevoegen Form"
+;
+; ManageusersElement.php line: 201
+manageusers_element_user_info = "Informatie voor de gebruiker"
+;
+; ManageusersElement.php line: 203
+manageusers_element_add_user = "Gebruiker toevoegen"
+;
+; ManageusersElement.php line: 228
+manageusers_element_username = "gebruikersnaam"
+;
+; ManageusersElement.php line: 238
+manageusers_element_firstname = "Voornaam"
+;
+; ManageusersElement.php line: 244
+manageusers_element_lastname = "achternaam"
+;
+; ManageusersElement.php line: 250
+manageusers_element_email = "e-mail"
+;
+; ManageusersElement.php line: 257
+manageusers_element_status = "toestand"
+;
+; ManageusersElement.php line: 274
+manageusers_element_roles = "Rollen"
+;
+; ManageusersElement.php line: 278
+manageusers_element_num_roles = " %s rollen"
+;
+; ManageusersElement.php line: 293
+manageusers_element_delete = "verwijderen"
+;
+; ManageusersElement.php line: 303
+manageusers_element_delete = "verwijderen"
+;
+; ManageusersElement.php line: 344
+manageusers_element_filter = "filter"
+;
+; ManageusersElement.php line: 357
+manageusers_element_add_role = "toevoegen"
+;
+; ManageusersElement.php line: 367
+manageusers_element_groups = "groepen"
+;
+; ManageusersElement.php line: 371
+manageusers_element_num_groups = " %s groepen"
+;
+; ManageusersElement.php line: 392
+manageusers_element_delete = "verwijderen"
+;
+; ManageusersElement.php line: 431
+manageusers_element_filter = "filter"
+;
+; ManageusersElement.php line: 443
+manageusers_element_add_group = "toevoegen"
+;
+; ManageusersElement.php line: 456
+manageusers_element_password = "wachtwoord"
+;
+; ManageusersElement.php line: 462
+manageusers_element_retype_password = "Herhaal wachtwoord"
+;
+; ManageusersElement.php line: 469
+manageusers_element_save = "Opslaan"
+;
+; ManageusersElement.php line: 496
+manageusers_element_search_user = "zoeken"
+;
+; ManageusersElement.php line: 497
+manageusers_element_adduser_form = "Gebruiker toevoegen Form"
+;
+; ManageusersElement.php line: 499
+manageusers_element_username = "gebruikersnaam"
+;
+; ManageusersElement.php line: 500
+manageusers_element_firstname = "Voornaam"
+;
+; ManageusersElement.php line: 501
+manageusers_element_lastname = "achternaam"
+;
+; ManageusersElement.php line: 502
+manageusers_element_email = "e-mail"
+;
+; ManageusersElement.php line: 503
+manageusers_element_status = "toestand"
+;
+; MixcrawlsElement.php line: 65
+mixcrawls_element_available_mixes = "beschikbaar Mixes"
+;
+; MixcrawlsElement.php line: 72
+mixcrawls_view_name = "naam"
+;
+; MixcrawlsElement.php line: 74
+mixcrawls_view_definition = "definitie"
+;
+; MixcrawlsElement.php line: 78
+mixcrawls_view_actions = "acties"
+;
+; MixcrawlsElement.php line: 112
+mixcrawls_view_no_components = "Mix heeft nog geen componenten"
+;
+; MixcrawlsElement.php line: 118
+mixcrawls_view_share = "aandeel"
+;
+; MixcrawlsElement.php line: 120
+mixcrawls_view_edit = "uitgeven"
+;
+; MixcrawlsElement.php line: 125
+mixcrawls_set_index = "Instellen als Index"
+;
+; MixcrawlsElement.php line: 128
+mixcrawl_search_index = "zoeken Index"
+;
+; MixcrawlsElement.php line: 134
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; MixcrawlsElement.php line: 136
+mixcrawls_view_delete = "verwijderen"
+;
+; MixcrawlsElement.php line: 146
+mixcrawls_view_back = "terug"
+;
+; MixcrawlsElement.php line: 147
+mixcrawls_element_share_mix_group = "Delen Mix met een groep"
+;
+; MixcrawlsElement.php line: 157
+mixcrawls_element_mixname = "mix Naam"
+;
+; MixcrawlsElement.php line: 163
+mixcrawls_element_group = "groep:"
+;
+; MixcrawlsElement.php line: 169
+mixcrawls_element_share = "aandeel"
+;
+; MixcrawlsElement.php line: 193
+mixcrawls_element_make_mix = "Maak een Crawl Mix"
+;
+; MixcrawlsElement.php line: 203
+mixcrawls_element_mix_name = "mix Naam"
+;
+; MixcrawlsElement.php line: 208
+mixcrawls_element_create_button = "cre&iuml;ren"
+;
+; MixcrawlsElement.php line: 224
+mixcrawls_element_search_mix = "zoeken"
+;
+; MixcrawlsElement.php line: 225
+mixcrawls_element_createmix_form = "Maak een Mix Vorm"
+;
+; MixcrawlsElement.php line: 227
+mixcrawls_element_mixname = "mix Naam"
+;
+; MoreoptionsElement.php line: 82
+moreoptions_element_other_searches = "andere zoekopdrachten"
+;
+; MoreoptionsElement.php line: 119
+moreoptions_element_previous = "vorig"
+;
+; MoreoptionsElement.php line: 125
+moreoptions_element_next = "volgende"
+;
+; MoreoptionsElement.php line: 137
+moreoptions_element_my_accounts = "mijn accounts"
+;
+; MoreoptionsElement.php line: 142
+signin_element_settings = "instellingen"
+;
+; MoreoptionsElement.php line: 151
+signin_element_signin = "Aanmelden"
+;
+; MoreoptionsElement.php line: 154
+signin_element_admin = "rekening"
+;
+; MoreoptionsElement.php line: 167
+signin_view_create_account = "Maak Een Account Aan"
+;
+; MoreoptionsElement.php line: 186
+moreoptions_element_suggest = "Suggereren een URL"
+;
+; MoreoptionsElement.php line: 188
+moreoptions_element_wiki_pages = "Paginas"
+;
+; MoreoptionsElement.php line: 199
+moreoptions_element_tools = "gereedschap"
+;
+; PageoptionsElement.php line: 59
+pageoptions_element_crawl_time = "crawl Tijd"
+;
+; PageoptionsElement.php line: 64
+pageoptions_element_search_time = "Zoek Tijd"
+;
+; PageoptionsElement.php line: 69
+pageoptions_element_test_options = "Test Opties"
+;
+; PageoptionsElement.php line: 81
+pageoptions_element_load_options = "Krijg Pagina opties van:"
+;
+; PageoptionsElement.php line: 86
+pageoptions_element_page_range = "Byte Range te downloaden (0 - Waarde):"
+;
+; PageoptionsElement.php line: 92
+pageoptions_element_summarizer = "Summarizer:"
+;
+; PageoptionsElement.php line: 101
+pageoptions_element_max_description = "Max Pagina Samenvatting Lengte in Bytes:"
+;
+; PageoptionsElement.php line: 107
+pageoptions_element_save_cache = "Cache hele kroop paginas:"
+;
+; PageoptionsElement.php line: 117
+pageoptions_element_allow_recrawl = "Toestaan pagina opnieuw crawlen Na:"
+;
+; PageoptionsElement.php line: 124
+pageoptions_element_file_types = "Pagina Bestandstypen te kruipen:"
+;
+; PageoptionsElement.php line: 153
+pageoptions_element_classifiers_rankers = "Classifiers en Rankers"
+;
+; PageoptionsElement.php line: 169
+pageoptions_element_use_classify = "Gebruiken om te classificeren"
+;
+; PageoptionsElement.php line: 170
+pageoptions_element_use_rank = "Gebruiken om Rank"
+;
+; PageoptionsElement.php line: 197
+pageoptions_element_no_classifiers = "Geen classificatoren."
+;
+; PageoptionsElement.php line: 200
+pageoptions_element_indexing_plugins = "indexering Plugins"
+;
+; PageoptionsElement.php line: 206
+pageoptions_element_plugin = "Inpluggen"
+;
+; PageoptionsElement.php line: 207
+pageoptions_element_plugin_include = "Gebruik in Crawl"
+;
+; PageoptionsElement.php line: 223
+pageoptions_element_configure = "configureren"
+;
+; PageoptionsElement.php line: 235
+pageoptions_element_no_compatible_plugins = "Geen compatibele indexeren plugins gevonden!"
+;
+; PageoptionsElement.php line: 238
+pageoptions_element_page_rules = "Page Field Extraction Regels"
+;
+; PageoptionsElement.php line: 247
+page_element_search_page = "Zoek Pagina-elementen en Links"
+;
+; PageoptionsElement.php line: 254
+pageoptions_element_wd_suggest = "Word Suggestie"
+;
+; PageoptionsElement.php line: 262
+pageoptions_element_subsearch_link = "Subsearch"
+;
+; PageoptionsElement.php line: 271
+pageoptions_element_signin_link = "Aanmelden"
+;
+; PageoptionsElement.php line: 279
+pageoptions_element_cache_link = "cache"
+;
+; PageoptionsElement.php line: 288
+pageoptions_element_similar_link = "soortgelijk"
+;
+; PageoptionsElement.php line: 297
+pageoptions_element_in_link = "inlinks"
+;
+; PageoptionsElement.php line: 304
+pageoptions_element_ip_link = "IP adres"
+;
+; PageoptionsElement.php line: 313
+pageoptions_element_ranking_factors = "Zoek Ranking Factors"
+;
+; PageoptionsElement.php line: 318
+pageoptions_element_title_weight = "Titel Gewicht:"
+;
+; PageoptionsElement.php line: 323
+pageoptions_element_description_weight = "Beschrijving Gewicht:"
+;
+; PageoptionsElement.php line: 328
+pageoptions_element_link_weight = "Link Gewicht:"
+;
+; PageoptionsElement.php line: 333
+pageoptions_element_results_grouping_options = "Zoekresultaten Groepering"
+;
+; PageoptionsElement.php line: 338
+pageoptions_element_min_results_to_group = "Minimum Resultaten Groep:"
+;
+; PageoptionsElement.php line: 344
+pageoptions_element_server_alpha = "Server Alpha:"
+;
+; PageoptionsElement.php line: 352
+pageoptions_element_test_page = "testpagina"
+;
+; PageoptionsElement.php line: 356
+pageoptions_element_page_type = "Type:"
+;
+; PageoptionsElement.php line: 372
+pageoptions_element_save_options = "Opslaan"
+;
+; PageoptionsElement.php line: 374
+pageoptions_element_run_tests = "Test Process Pagina"
+;
+; PageoptionsElement.php line: 380
+pageoptions_element_test_results = "testresultaten"
+;
+; PageoptionsElement.php line: 383
+pageoptions_element_page_truncated = "Pagina afgekapt van %s naar %s bytes."
+;
+; PageoptionsElement.php line: 388
+pageoptions_element_after_process = "Na pagina processor haalt samenvatting"
+;
+; PageoptionsElement.php line: 392
+pageoptions_element_after_rules = "Na pagina regels toegepast"
+;
+; PageoptionsElement.php line: 396
+pageoptions_element_extracted_words = "Woorden en posities uitgepakt index samenvatting"
+;
+; PageoptionsElement.php line: 400
+pageoptions_element_extracted_metas = "Onttrokken meta woorden"
+;
+; PageoptionsElement.php line: 417
+page_element_plugin_back = "terug"
+;
+; PageoptionsElement.php line: 454
+pageoptions_element_run_tests = "Test Process Pagina"
+;
+; PageoptionsElement.php line: 458
+pageoptions_element_save_options = "Opslaan"
+;
+; ResultseditorElement.php line: 52
+resultseditor_element_edit_page = "Resultaat Pagina bewerken"
+;
+; ResultseditorElement.php line: 57
+resultseditor_element_edited_pages = "Bewerkt Urls:"
+;
+; ResultseditorElement.php line: 66
+resultseditor_element_url_list = "Selecteer een eerder bewerkte samenvatting"
+;
+; ResultseditorElement.php line: 68
+resultseditor_element_load_page = "belasting"
+;
+; ResultseditorElement.php line: 81
+resultseditor_element_page_url = "URL:"
+;
+; ResultseditorElement.php line: 87
+resultseditor_element_page_title = "Titel:"
+;
+; ResultseditorElement.php line: 93
+resultseditor_element_description = "beschrijving"
+;
+; ResultseditorElement.php line: 97
+resultseditor_element_reset = "Reset"
+;
+; ResultseditorElement.php line: 99
+resultseditor_element_save_page = "Pagina opslaan"
+;
+; ResultseditorElement.php line: 102
+resultseditor_element_filter_websites = "Filter Websites van resultaten"
+;
+; ResultseditorElement.php line: 114
+resultseditor_element_sites_to_filter = "Sites te filteren"
+;
+; ResultseditorElement.php line: 119
+resultseditor_element_save_filter = "opslaan Filter"
+;
+; SearchsourcesElement.php line: 62
+searchsources_element_addsource_form = "Bron Vorm toevoegen"
+;
+; SearchsourcesElement.php line: 63
+searchsources_element_edit_media_source = "Media bewerken Bron"
+;
+; SearchsourcesElement.php line: 67
+searchsources_element_add_media_source = "Voeg Media Source"
+;
+; SearchsourcesElement.php line: 90
+searchsources_element_sourcetype = "Type:"
+;
+; SearchsourcesElement.php line: 95
+searchsources_element_sourcename = "naam:"
+;
+; SearchsourcesElement.php line: 104
+searchsources_element_url = "URL:"
+;
+; SearchsourcesElement.php line: 110
+searchsources_element_locale_tag = "taal:"
+;
+; SearchsourcesElement.php line: 115
+searchsources_element_thumbnail = "thumb:"
+;
+; SearchsourcesElement.php line: 125
+searchsources_element_feed_instruct = "Bieden xpaths naar nieuwsfeed onderdelen hieronder:"
+;
+; SearchsourcesElement.php line: 128
+searchsources_element_channelpath = "kanaal:"
+;
+; SearchsourcesElement.php line: 134
+searchsources_element_itempath = "Item:"
+;
+; SearchsourcesElement.php line: 140
+searchsources_element_titlepath = "Titel:"
+;
+; SearchsourcesElement.php line: 146
+searchsources_element_descpath = "beschrijving:"
+;
+; SearchsourcesElement.php line: 152
+searchsources_element_linkpath = "Link:"
+;
+; SearchsourcesElement.php line: 158
+searchsources_element_image_xpath = "Afbeelding XPath:"
+;
+; SearchsourcesElement.php line: 164
+searchsources_element_submit = "voorleggen"
+;
+; SearchsourcesElement.php line: 170
+searchsources_element_media_sources = "media Bronnen"
+;
+; SearchsourcesElement.php line: 193
+searchsources_element_medianame = "naam"
+;
+; SearchsourcesElement.php line: 194
+searchsources_element_mediatype = "type"
+;
+; SearchsourcesElement.php line: 196
+searchsources_element_mediaurls = "urls"
+;
+; SearchsourcesElement.php line: 199
+searchsources_element_action = "actie"
+;
+; SearchsourcesElement.php line: 227
+searchsources_element_editmedia = "uitgeven"
+;
+; SearchsourcesElement.php line: 230
+confirm_delete_operation = "Weet u zeker dat u wilt verwijderen?"
+;
+; SearchsourcesElement.php line: 233
+searchsources_element_deletemedia = "verwijderen"
+;
+; SearchsourcesElement.php line: 242
+searchsources_element_addsearch_form = "Voeg Subsearch Form"
+;
+; SearchsourcesElement.php line: 244
+searchsources_element_edit_subsearch = "bewerk Subsearch"
+;
+; SearchsourcesElement.php line: 249
+searchsources_element_add_subsearch = "Voeg een Subsearch"
+;
+; SearchsourcesElement.php line: 264
+searchsources_element_foldername = "Mapnaam:"
+;
+; SearchsourcesElement.php line: 274
+searchsources_element_indexsource = "Index Bron:"
+;
+; SearchsourcesElement.php line: 280
+searchsources_element_per_page = "Resultaten per pagina:"
+;
+; SearchsourcesElement.php line: 286
+searchsources_element_submit = "voorleggen"
+;
+; SearchsourcesElement.php line: 292
+searchsources_element_subsearches = "huidige Subsearches"
+;
+; SearchsourcesElement.php line: 302
+searchsources_element_dirname = "mapnaam"
+;
+; SearchsourcesElement.php line: 303
+searchsources_element_index = "index"
+;
+; SearchsourcesElement.php line: 306
+searchsources_element_localestring = "lokalisatie Identifier"
+;
+; SearchsourcesElement.php line: 307
+searchsources_element_perpage = "Resultaten / pagina"
+;
+; SearchsourcesElement.php line: 311
+searchsources_element_actions = "acties"
+;
+; SearchsourcesElement.php line: 327
+searchsources_element_editsource = "uitgeven"
+;
+; SearchsourcesElement.php line: 333
+searchsources_element_localize = "lokaliseren"
+;
+; SearchsourcesElement.php line: 335
+searchsources_element_localize = "lokaliseren"
+;
+; SearchsourcesElement.php line: 342
+searchsources_element_deletesubsearch = "verwijderen"
+;
+; SecurityElement.php line: 58
+security_element_auth_captcha = "Authenticatie en Captcha Soorten"
+;
+; SecurityElement.php line: 69
+security_element_authentication_type = "Verificatietype"
+;
+; SecurityElement.php line: 81
+security_element_zero_unavailable = "BC Math Nnul Kennis Authentication Needs OpenSSL of BC Math!"
+;
+; SecurityElement.php line: 90
+security_element_captcha_type = "captcha Type"
+;
+; SecurityElement.php line: 103
+security_element_save = "Opslaan"
+;
+; SecurityElement.php line: 107
+security_element_captcha_recovery_questions = "Captcha and Recovery Vragen"
+;
+; SecurityElement.php line: 113
+security_element_edit_recovery = "Wijzig Account Recovery Vragen"
+;
+; SecurityElement.php line: 118
+security_element_edit_captcha = "Tekst bewerken Captcha Vragen"
+;
+; SecurityElement.php line: 123
+security_element_edit_recovery = "Wijzig Account Recovery Vragen"
+;
+; SecurityElement.php line: 126
+security_element_edit_captcha = "Tekst bewerken Captcha Vragen"
+;
+; ServersettingsElement.php line: 59
+serversettings_element_server_settings = "Servers en Registratie"
+;
+; ServersettingsElement.php line: 62
+serversettings_element_name_server = "Name Server Set-up"
+;
+; ServersettingsElement.php line: 66
+serversettings_element_name_server_key = "Server Key:"
+;
+; ServersettingsElement.php line: 73
+serversettings_element_name_server_url = "Name Server URL:"
+;
+; ServersettingsElement.php line: 81
+serversettings_element_use_memcache = "Gebruik Memcache:"
+;
+; ServersettingsElement.php line: 89
+serversettings_element_memcache_servers = "memcache Servers"
+;
+; ServersettingsElement.php line: 100
+serversettings_element_use_filecache = "Gebruik Filecache:"
+;
+; ServersettingsElement.php line: 110
+configure_element_database_setup = "Database Set-up"
+;
+; ServersettingsElement.php line: 115
+serversettings_element_database_system = "Database System:"
+;
+; ServersettingsElement.php line: 123
+serversettings_element_databasename = "Database Naam:"
+;
+; ServersettingsElement.php line: 130
+serversettings_element_databasehost = "hostname:"
+;
+; ServersettingsElement.php line: 137
+serversettings_element_databaseuser = "Database User:"
+;
+; ServersettingsElement.php line: 145
+serversettings_element_databasepassword = "Database wachtwoord:"
+;
+; ServersettingsElement.php line: 158
+serversettings_element_account_registration = "account Registratie"
+;
+; ServersettingsElement.php line: 169
+serversettings_element_mail_sender = "Afzender E-mail:"
+;
+; ServersettingsElement.php line: 175
+serversettings_element_send_media_updater = ""
+;
+; ServersettingsElement.php line: 185
+serversettings_element_use_php_mail = "Gebruik PHP mail () functie"
+;
+; ServersettingsElement.php line: 192
+serversettings_element_mail_server = "SMTP-server:"
+;
+; ServersettingsElement.php line: 198
+serversettings_element_mail_serverport = "Server Port:"
+;
+; ServersettingsElement.php line: 205
+serversettings_element_mail_username = "Mail Gebruikersnaam:"
+;
+; ServersettingsElement.php line: 211
+serversettings_element_mail_password = "Mail Wachtwoord:"
+;
+; ServersettingsElement.php line: 218
+serversettings_element_mail_security = "Mail Security:"
+;
+; ServersettingsElement.php line: 228
+serversettings_element_proxy_title = "proxy Servers"
+;
+; ServersettingsElement.php line: 232
+serversettings_element_tor_proxy = "Tor Proxy (.onion urls alleen):"
+;
+; ServersettingsElement.php line: 238
+serversettings_element_use_proxy_servers = "Crawl via Proxies"
+;
+; ServersettingsElement.php line: 247
+serversettings_element_proxy_servers = "Proxy servers (&iuml;&iuml;n per regel Format:. Adres: port of adres: poort: proxyType)"
+;
+; ServersettingsElement.php line: 256
+serversettings_element_adserver_configuration = "Ad Server Configuration"
+;
+; ServersettingsElement.php line: 261
+serversettings_element_advertising_source = ""
+;
+; ServersettingsElement.php line: 273
+serversettings_element_no_payment_processing = ""
+;
+; ServersettingsElement.php line: 275
+serversettings_element_purchase_processing = ""
+;
+; ServersettingsElement.php line: 282
+serversettings_element_ad_location = "ad Locatie"
+;
+; ServersettingsElement.php line: 287
+serversettings_element_top = "top"
+;
+; ServersettingsElement.php line: 292
+serversettings_element_side = "kant"
+;
+; ServersettingsElement.php line: 297
+serversettings_element_both = "beide"
+;
+; ServersettingsElement.php line: 302
+serversettings_element_none = "geen"
+;
+; ServersettingsElement.php line: 305
+serversettings_element_global_adscript = "Global Ad Script"
+;
+; ServersettingsElement.php line: 312
+serversettings_element_top_adscript = "Top Ad Script"
+;
+; ServersettingsElement.php line: 319
+serversettings_element_side_adscript = "Side Ad Script"
+;
+; ServersettingsElement.php line: 329
+serversettings_element_save = ""
+;
+; SigninElement.php line: 73
+signin_element_settings = "instellingen"
+;
+; SigninElement.php line: 77
+signin_element_signin = "Aanmelden"
+;
+; SigninElement.php line: 81
+signin_element_signout = "uitloggen"
+;
+; SubsearchElement.php line: 69
+subsearch_element_more = "meer"
+;
+; WikiElement.php line: 121
+wiki_view_back = "terug"
+;
+; WikiElement.php line: 139
+groupfeed_element_feed = "voeden"
+;
+; WikiElement.php line: 140
+wiki_view_wiki = "wiki"
+;
+; WikiElement.php line: 144
+wiki_view_page = " %s Pagina"
+;
+; WikiElement.php line: 148
+wiki_view_read = "lezen"
+;
+; WikiElement.php line: 149
+wiki_view_edit = "uitgeven"
+;
+; WikiElement.php line: 152
+wiki_view_pages = "paginas"
+;
+; WikiElement.php line: 237
+wiki_element_redirect_to = "Verwijst door naar:"
+;
+; WikiElement.php line: 245
+wiki_view_page_no_exist = " %s pagina bestaat niet."
+;
+; WikiElement.php line: 246
+wiki_view_create_edit = "U kunt deze pagina te sturen door te klikken op de bewerken link hierboven."
+;
+; WikiElement.php line: 247
+wiki_view_use_form_below = "Of u kunt het onderstaande formulier gebruiken om een andere pagina te maken of te bewerken."
+;
+; WikiElement.php line: 259
+wiki_element_submit = "voorleggen"
+;
+; WikiElement.php line: 265
+wiki_view_syntax_summary = "Wiki Syntax Gids"
+;
+; WikiElement.php line: 268
+wiki_view_page_no_exist = " %s pagina bestaat niet."
+;
+; WikiElement.php line: 270
+wiki_view_signin_edit = "Als u voldoende toegangsrechten hebt u misschien in staat zijn om de pagina te maken door in te loggen en het navigeren hier terug."
+;
+; WikiElement.php line: 272
+wiki_view_page_no_exist = " %s pagina bestaat niet."
+;
+; WikiElement.php line: 302
+wiki_element_history = "geschiedenis"
+;
+; WikiElement.php line: 306
+wiki_element_discuss = "bespreken"
+;
+; WikiElement.php line: 342
+wiki_element_locale_name = "Locale: %s"
+;
+; WikiElement.php line: 346
+wiki_element_page = "Pagina: %s"
+;
+; WikiElement.php line: 349
+configure_element_toggle_page_settings = "instellingen"
+;
+; WikiElement.php line: 353
+wiki_element_page_type = "Pagina Type:"
+;
+; WikiElement.php line: 361
+wiki_element_page_alias = "Alias pagina Aan:"
+;
+; WikiElement.php line: 369
+wiki_element_page_border = "Pagina Border:"
+;
+; WikiElement.php line: 376
+wiki_element_table_of_contents = "Inhoudsopgave:"
+;
+; WikiElement.php line: 385
+wiki_element_title = "Titel:"
+;
+; WikiElement.php line: 391
+wiki_element_meta_author = "auteur:"
+;
+; WikiElement.php line: 397
+wiki_element_meta_robots = "Meta Robots:"
+;
+; WikiElement.php line: 404
+wiki_element_meta_description = "Meta Description:"
+;
+; WikiElement.php line: 411
+wiki_element_page_header = "Header Pagina Naam:"
+;
+; WikiElement.php line: 417
+wiki_element_page_footer = "Footer Pagina Naam:"
+;
+; WikiElement.php line: 440
+wiki_element_archive_info = "Om een pagina te archiveren, zodat het niet zal verschijnen in de zoekresultaten van de tekst te verwijderen en op te slaan."
+;
+; WikiElement.php line: 443
+wiki_element_edit_reason = "Reden Edit:"
+;
+; WikiElement.php line: 450
+wiki_element_savebutton = "Opslaan"
+;
+; WikiElement.php line: 454
+wiki_element_media_list = "Media Lijst Pagina"
+;
+; WikiElement.php line: 455
+wiki_element_ml_description = "De ge&iuml;ploade items hieronder alle verschijnen wanneer deze pagina wordt gelezen als een galerie of media-lijst."
+;
+; WikiElement.php line: 458
+wiki_view_page_resources = "Bronnen pagina"
+;
+; WikiElement.php line: 493
+wiki_view_upload = "uploaden"
+;
+; WikiElement.php line: 497
+wiki_element_resources_info = "Middelen zijn afbeeldingen, videos of bestanden die verband houden met deze pagina."
+;
+; WikiElement.php line: 512
+wiki_element_rename_failed = "Hernoemen mislukt!"
+;
+; WikiElement.php line: 578
+wiki_element_rename = "andere naam geven"
+;
+; WikiElement.php line: 582
+wiki_element_add_to_page = "Toevoegen aan pagina"
+;
+; WikiElement.php line: 602
+wiki_element_no_resources = "Geen middelen zijn nog naar deze pagina opgeslagen."
+;
+; WikiElement.php line: 624
+wiki_view_wiki_page_list = " %s Groep Wiki Pagina Lijst"
+;
+; WikiElement.php line: 637
+wiki_view_filter_or_create = "Zoek groep paginatitels"
+;
+; WikiElement.php line: 639
+wiki_element_go = "gaan"
+;
+; WikiElement.php line: 644
+wiki_view_create_page = "Pagina aanmaken: %s"
+;
+; WikiElement.php line: 655
+wiki_element_redirect_to = "Verwijst door naar:"
+;
+; WikiElement.php line: 677
+wiki_view_no_pages = "Deze groep heeft nog geen paginas voor de %s locale. Zoeken naar een nonexistant pagina en klik op Bewerken om het te maken."
+;
+; WikiElement.php line: 700
+wiki_view_back = "terug"
+;
+; WikiElement.php line: 716
+wiki_view_difference = "verschil:"
+;
+; WikiElement.php line: 722
+wiki_view_go = "gaan"
+;
+; WikiElement.php line: 741
+wiki_view_diff_first = "eerste"
+;
+; WikiElement.php line: 743
+wiki_view_diff_second = "tweede"
+;
+; WikiElement.php line: 747
+wiki_view_diff_first = "eerste"
+;
+; WikiElement.php line: 748
+wiki_view_diff_second = "tweede"
+;
+; WikiElement.php line: 754
+wiki_view_edited_by = "Bewerkt door %s."
+;
+; WikiElement.php line: 758
+wiki_view_page_len = "( %s bytes)."
+;
+; WikiElement.php line: 760
+wiki_view_revert = "terugkeren"
+;
+; WikiElement.php line: 763
+wiki_view_revert = "terugkeren"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/helpers
+;
+; FeedsHelper.php line: 70
+feeds_helper_view_feed_results = "Nieuws Resultaten voor %s"
+;
+; FeedsHelper.php line: 164
+feeds_helper_view_onehour = "1 uur geleden"
+;
+; FeedsHelper.php line: 169
+feeds_helper_view_minsecs = " %s m %s s geleden"
+;
+; FeedsHelper.php line: 174
+feeds_helper_view_hourdate = " %s uur geleden"
+;
+; FileuploadHelper.php line: 72
+fileupload_helper_drag_textarea = "Sleep items in het tekstveld om ze toe te voegen ..."
+;
+; FileuploadHelper.php line: 73
+fileupload_helper_click_textarea = "of klik om ze te selecteren."
+;
+; FileuploadHelper.php line: 75
+fileupload_helper_drag_above = "Slepen of ..."
+;
+; FileuploadHelper.php line: 76
+fileupload_helper_click_upload = "kiezen."
+;
+; FileuploadHelper.php line: 117
+basic_js_invalid_filetype = "Ongeldige Filetype!"
+;
+; FileuploadHelper.php line: 119
+basic_js_file_too_big = "Bestand te groot is!"
+;
+; FileuploadHelper.php line: 121
+basic_js_upload_progress = "Upload Voortgang:"
+;
+; FileuploadHelper.php line: 123
+basic_js_progress_meter_disabled = "Upload voortgangsbalk handicap"
+;
+; FileuploadHelper.php line: 125
+basic_js_upload_error = "Upload Fout!"
+;
+; FileuploadHelper.php line: 127
+basic_js_upload_cancelled = "Uploaden afgelast!"
+;
+; FileuploadHelper.php line: 129
+basic_js_too_many_files = "Proberen om te veel bestanden toe te voegen!"
+;
+; HelpbuttonHelper.php line: 106
+wiki_question_mark = "?"
+;
+; HelpbuttonHelper.php line: 138
+wiki_view_edit = "uitgeven"
+;
+; HelpbuttonHelper.php line: 139
+wiki_view_not_available = "Niet in staat om Help-artikel laden!"
+;
+; HelpbuttonHelper.php line: 141
+wiki_view_create_edit = "U kunt deze pagina te sturen door te klikken op de bewerken link hierboven."
+;
+; HelpbuttonHelper.php line: 143
+wiki_view_page_no_exist = " %s pagina bestaat niet."
+;
+; HelpbuttonHelper.php line: 145
+wiki_view_read = "lezen"
+;
+; ImagesHelper.php line: 55
+images_helper_view_image_results = "Bekijk Meer Afbeelding Results ..."
+;
+; PaginationHelper.php line: 97
+pagination_helper_previous = "prev"
+;
+; PaginationHelper.php line: 121
+pagination_helper_next = "volgende"
+;
+; PagingtableHelper.php line: 103
+pagingtable_helper_search = "zoeken"
+;
+; PagingtableHelper.php line: 125
+pagingtable_helper_show = "tonen"
+;
+; PagingtableHelper.php line: 138
+pagingtable_helper_row_range = "Rij %s naar %s van %s"
+;
+; PagingtableHelper.php line: 215
+pagingtable_helper_row_range = "Rij %s naar %s van %s"
+;
+; PagingtableHelper.php line: 233
+pagingtable_helper_show = "tonen"
+;
+; PagingtableHelper.php line: 241
+pagingtable_helper_search = "zoeken"
+;
+; SearchformHelper.php line: 119
+searchform_helper_any = "ieder"
+;
+; SearchformHelper.php line: 148
+searchform_helper_search = "zoeken"
+;
+; ToggleHelper.php line: 59
+toggle_helper_on = "op"
+;
+; ToggleHelper.php line: 61
+toggle_helper_off = "af"
+;
+; ToggleHelper.php line: 65
+toggle_helper_on = "op"
+;
+; ToggleHelper.php line: 67
+toggle_helper_off = "af"
+;
+; ToggleHelper.php line: 71
+toggle_helper_on = "op"
+;
+; ToggleHelper.php line: 73
+toggle_helper_off = "af"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/layouts
+;
+; RssLayout.php line: 62
+rss_layout_title = "PHP Search Engine - Yioop! :%S"
+;
+; RssLayout.php line: 69
+rss_layout_description = "Zoek resultaten voor: %s"
+;
+; WebLayout.php line: 63
+web_layout_title = "PHP Search Engine - Yioop!"
+;
+; WebLayout.php line: 73
+web_layout_description = "PHP Crawler en Search Engine Software"
+;
+; WebLayout.php line: 75
+web_layout_site_author = "Chris Pollett"
+;
+; WebLayout.php line: 219
+web_layout_query_statistics = "vraag Statistieken"
+;
+; WebLayout.php line: 223
+web_layout_total_elapsed_time = "Totale verstreken tijd voor Queries: %s seconden."
+;
+; WebLayout.php line: 228
+web_layout_query_time = "Tijd: %s seconden."
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/views
+;
+; DownloadView.php line: 65
+download_view_form = ""
+;
+; DownloadView.php line: 74
+download_view_thank_you = ""
+;
+; DownloadView.php line: 76
+download_view_full_name = ""
+;
+; DownloadView.php line: 81
+download_view_email = ""
+;
+; DownloadView.php line: 85
+download_view_business = ""
+;
+; DownloadView.php line: 90
+download_view_interest = ""
+;
+; DownloadView.php line: 96
+download_view_get_email = ""
+;
+; DownloadView.php line: 102
+download_view_return_main = ""
+;
+; DownloadView.php line: 115
+download_view_required_fields = ""
+;
+; DownloadView.php line: 119
+download_view_name_required = ""
+;
+; DownloadView.php line: 123
+download_view_valid_email = ""
+;
+; StoreView.php line: 65
+download_view_form = ""
+;
+; StoreView.php line: 74
+download_view_thank_you = ""
+;
+; StoreView.php line: 76
+download_view_full_name = ""
+;
+; StoreView.php line: 81
+download_view_email = ""
+;
+; StoreView.php line: 85
+download_view_business = ""
+;
+; StoreView.php line: 90
+download_view_interest = ""
+;
+; StoreView.php line: 96
+download_view_get_email = ""
+;
+; StoreView.php line: 102
+download_view_return_main = ""
+;
+; StoreView.php line: 115
+download_view_required_fields = ""
+;
+; StoreView.php line: 119
+download_view_name_required = ""
+;
+; StoreView.php line: 123
+download_view_valid_email = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/library/indexing_plugins
+;
+; WordfilterPlugin.php line: 355
+wordfilter_plugin_settings_saved = "Instellingen woord Filter Opgeslagen!"
+;
+; WordfilterPlugin.php line: 364
+wordfilter_plugin_defaults_restored = "Standaardinstellingen hersteld!"
+;
+; WordfilterPlugin.php line: 469
+wordfilter_plugin_preferences = "Voorkeur woord Filter"
+;
+; WordfilterPlugin.php line: 473
+wordfilter_plugin_factory_settings = "fabrieksinstellingen"
+;
+; WordfilterPlugin.php line: 485
+wordfilter_plugin_save = "Opslaan"
diff --git a/locale/nl/resources/Tokenizer.php b/locale/nl/resources/Tokenizer.php
new file mode 100755
index 0000000..7db891f
--- /dev/null
+++ b/locale/nl/resources/Tokenizer.php
@@ -0,0 +1,428 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\nl\resources;
+
+/**
+ * This class has a collection of methods for Dutch locale specific
+ * tokenization. In particular, it has a stemmer, .
+ *
+ * @author Charles Bocage
+ * @package seek_quarry\locale\nl
+ */
+class Tokenizer
+{
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = [
+        "abs", "ahs", "aken", "àlle", "als", "are",
+        "allèen", "ate", "aten", "azen", "bse", "cfce", "curaçao",
+        "dègelijk", "dme", "ede", "eden", "eds", "ehs", "ems", "ene", "epe",
+        "eps", "ers", "eten", "ets", "even", "fme", "gedaçht", "ghe", "gve",
+        "hdpe", "hôte", "hpe", "hse", "ibs", "ics", "ile", "ims", "jònge",
+        "kwe", "ldpe", "lldpe", "lme", "lze", "maitres", "mwe", "nme", "ode",
+        "ogen", "oke", "ole", "ons", "ònze", "open", "ops", "oren", "ors",
+        "oss", "oven", "ows", "pre", "pve", "rhône", "ròme", "rwe", "ske",
+        "sme", "spe", "ste", "the", "tje", "uce", "uden", "uien", "uren",
+        "use", "uwe", "vse", "ype"
+    ];
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * boolean that tells the code if the e suffix was removed in step2 or not
+     * @var array
+     */
+    static $removed_e_suffix = false;
+    /**
+     * Computes the stem of a Dutch word
+     *
+     * For example, lichamelijk, lichamelijke, lichamelijkheden and lichamen,
+     * all have licham as a stem
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $words
+     */
+    public static function stem($word)
+    {
+        self::$removed_e_suffix = false;
+        $result = $word;
+        if (isset($word) && !empty($word)) {
+            $result = self::removeAllUmlautAndAcuteAccents($word);
+            $result = trim(mb_strtolower($result));
+            $result = self::substituteIAndY($result);
+            $R1 = self::getRIndex($result, 1);
+            $R2 = self::getRIndex($result, $R1);
+            $result = self::step1($result, $R1);
+            $result = self::step2($result);
+            $result = self::step3a($result, $R2);
+            $result = self::step3b($result, $R2);
+            $result = self::step4($result);
+            $result = mb_strtolower($result);
+        }
+        return $result;
+    }
+    /**
+     * Remove all umlaut and acute accents that need to be removed.
+     *
+     * @param string $word the string to remove the umlauts and accents from
+     * @return string the string with the umlauts and accents removed
+     */
+    private static function removeAllUmlautAndAcuteAccents($word)
+    {
+        $result = preg_replace("/\é|\ë/", "e", $word);
+        $result = preg_replace("/\á|ä/", "a", $result);
+        $result = preg_replace("/\ó|ö/", "o", $result);
+        $result = preg_replace("/\ï/", "i", $result);
+        $result = preg_replace("/\ü|\ú/", "u", $result);
+        return $result;
+    }
+    /**
+     * Put initial y, y after a vowel, and i between vowels into upper case.
+     *
+     * @param string $word the string to put initial y, y after a vowel, and
+     * i between vowels into upper case.
+     * @return string the string with an initial y, y after a vowel, and i
+     * between vowels into upper case.
+     */
+    private static function substituteIAndY($word)
+    {
+        $word_split = preg_split('/(?!^)(?=.)/u', $word);
+        for ($i = 0; $i < count($word_split); $i++) {
+            if ($i == 0) {
+                if ($word_split[$i] == 'y') {
+                    $word_split[$i] = 'Y';
+                }
+            } else {
+                if ($word_split[$i] == 'i') {
+                    if (count($word_split) > ($i + 1)) {
+                        if (self::isVowel($word_split[$i - 1]) &&
+                            self::isVowel($word_split[$i + 1])) {
+                            $word_split[$i] = 'I';
+                        }
+                    }
+                } elseif ($word_split[$i] == 'y') {
+                    if (self::isVowel($word_split[$i - 1])) {
+                        $word_split[$i] = 'Y';
+                    }
+                }
+            }
+        }
+        return implode('', $word_split);
+    }
+    /**
+     * Check that the letter is a vowel
+     *
+     * @param string $letter the character to check
+     * @return boolean true if it is a vowel, otherwise false
+     */
+    private static function isVowel($letter)
+    {
+        $result = false;
+        switch ($letter) {
+            case 'e':
+                // no break
+            case 'a':
+            case 'o':
+            case 'i':
+            case 'u':
+            case 'y':
+            case 'è':
+                $result = true;
+        }
+        return $result;
+    }
+    /**
+     * Get the R index.  The R index is the first consonent that follows a
+     * vowel after the $start index
+     *
+     * @param string $word the string to search for the R index
+     * @param int $start the index to start searching for the R index in the
+     * string
+     * @return int the R index if found, otherwise -1
+     */
+    private static function getRIndex($word, $start)
+    {
+        $result = -1;
+        $word_split = preg_split('/(?!^)(?=.)/u', $word);
+        for ($i = $start <= 0 ? 1 : $start; $i < count($word_split); $i++) {
+            if (!self::isVowel($word_split[$i]) &&
+                self::isVowel($word_split[$i - 1])) {
+                $result = ($i + 1);
+                break;
+            }
+        }
+        return $result;
+    }
+    /**
+     * Define a valid en-ending as a non-vowel, and not gem and remove it
+     *
+     * @param string $word the string to stem
+     * @param int $R1 the int that represents the R index
+     * @return string the string with the valid en-ending as a non-vowel, and
+     * not gem ending removed
+     */
+    private static function step1($word, $R1)
+    {
+        $result = $word;
+        if ($R1 > -1) {
+            $wordLength = strlen($word);
+            if ($wordLength > 2 && $R1 < $wordLength) {
+                if (self::endsWith($word, "heden")) {
+                    $result = self::replace($word, '/heden$/', 'heid', $R1);
+                } else {
+                    if (preg_match("/(?<![aeioèuy]|gem)(ene?)$/", $word,
+                        $matches, 0, $R1) && $word != "eten" &&
+                        $word != "even" && $word != "opene") {
+                        $result = self::undouble(self::replace($word,
+                            '/ene$/', '', $R1));
+                        $result = self::undouble(self::replace($result,
+                            '/en$/', '', $R1));
+                    } else {
+                        if (preg_match("/(?<![aeiouyèj])se$/", $word,
+                            $matches, 0, $R1) && $word != "osse") {
+                            $result = self::replace($word,
+                                '/(?<![aeiouyèj])se$/', '', $R1);
+                        } elseif (preg_match("/(?<![aeiouyèj])s$/", $word,
+                            $matches, 0, $R1)) {
+                            $result = self::replace($word,
+                                '/(?<![aeiouyèj])s$/', '', $R1);
+                        }
+                    }
+                }
+            }
+        }
+        return $result;
+    }
+    /**
+     * Delete the suffix e if in R1 and preceded by a non-vowel, and then
+     * undouble the ending
+     *
+     * @param string $word the string to delete the suffix e if in R1 and
+     * preceded by a non-vowel, and then undouble the ending
+     * @return string the string with the suffix e if in R1 and preceded by
+     * a non-vowel deleted, and then undouble the ending
+     */
+    private static function step2($word)
+    {
+        $result = $word;
+        if (self::endsWith($word, "e")
+            && $word != "ene" && $word != "oce" && $word != "ohe" &&
+                $word != "pâte") {
+            $word_split = preg_split('/(?!^)(?=.)/u', $word);
+            $word_split_length = count($word_split);
+            if ($word_split_length > 2 &&
+                !self::isVowel($word_split[$word_split_length - 2])) {
+                $word_split = array_slice($word_split, 0,
+                    $word_split_length - 1);
+                $result = implode('', $word_split);
+                $result = self::undouble($result);
+                self::$removed_e_suffix = true;
+            }
+        }
+        return $result;
+    }
+    /**
+     * Delete the letters heid if in R2 and not preceded by a c, and treat an a
+     * preceding en like in step 1
+     *
+     * @param string $word the string to delete the letters heid if in R2 and
+     * not preceded by a c, and treat an a preceding en like in step 1
+     * @param int $R2 the R index
+     * @return string the string with the letters heid if in R2 and not
+     * preceded by a c deleted, and treated an a preceding en like in step 1
+     */
+    private static function step3a($word, $R2)
+    {
+        $result = $word;
+        if ($R2 > -1) {
+            if (preg_match("/(?<![c])(heid)$/", $word, $matches, 0, $R2)) {
+                $result = self::replace($word, '/(?<![c])(heid)$/', '', $R2);
+                if (preg_match("/(?<![aeiouyè]|gem)(ene?)$/", $result,
+                    $matches, 0, $R2)) {
+                    $result = self::undouble(self::replace($result,
+                        '/(?<![aeiouyè]|gem)(ene?)$/', '', $R2));
+                }
+            }
+        }
+        return $result;
+    }
+    /**
+     * Search for the longest among the following suffixes, and perform the
+     * action indicated.
+     * If in R2 and ends with eigend, eigingm igend or iging remove it
+     * If in R2 and ends with ig preceded by an e remove it
+     * If in R2 and ends with lijk, baar or bar then remove it
+     *
+     * @param string $word the string to stem
+     * @param int $R2 the R index
+     * @return string the string with the various endings removed if they exist
+     */
+    public static function step3b($word, $R2)
+    {
+        $result = $word;
+        $word_split = preg_split('/(?!^)(?=.)/u', $word);
+        if (count($word_split) > 2) {
+            if ($R2 > -1) {
+                if (preg_match('/(end|ing)$/', $word, $matches, 0, $R2)) {
+                    if (preg_match('/eig(end|ing)$/', $word, $matches, 0,
+                        $R2)) {
+                        $result = self::replace($word, '/(end|ing)$/', '',
+                            $R2);
+                    }
+                    elseif (preg_match('/ig(end|ing)$/', $word, $matches, 0,
+                        $R2)) {
+                        $result = self::replace($word, '/(igend|iging)$/', '',
+                            $R2);
+                        $result = self::undouble($result);
+                    }
+                    else {
+                        $result = self::replace($word, '/(end|ing)$/', '',
+                            $R2);
+                        $result = self::undouble($result);
+                    }
+                }
+                elseif (preg_match("/(?<![e])ig$/", $word, $matches, 0, $R2)) {
+                    $result = self::replace($word, '/(?<![e])ig$/', '', $R2);
+                }
+                elseif (preg_match("/lijk$/", $word, $matches, 0, $R2)) {
+                    $result = self::replace($word, '/lijk$/', '', $R2);
+                    $result = self::step2($result);
+                }
+                elseif (preg_match("/baar$/", $word, $matches, 0, $R2)) {
+                    $result = self::replace($word, '/baar$/', '', $R2);
+                }
+                elseif (preg_match("/bar$/", $word, $matches, 0, $R2) &&
+                    self::$removed_e_suffix) {
+                    $result = self::replace($word, '/bar$/', '', $R2);
+                }
+            }
+        }
+        return $result;
+    }
+    /**
+     * If the words ends CVD, where C is a non-vowel, D is a non-vowel
+     * other than I, and V is double a, e, o or u, remove one of the
+     * vowels from V (for example, moom -> mon, weed -> wed).
+     *
+     * @param string $word the string to check for the CVD combination
+     * @return string the string with the CVD combination removed otherwise
+     * the original string
+     */
+    private static function step4($word)
+    {
+        $result = $word;
+        $word_split = preg_split('/(?!^)(?=.)/u', $word);
+        $numberOfLetters = count($word_split);
+        if ($numberOfLetters > 3) {
+            $c = $word_split[$numberOfLetters - 4];
+            $v1 = $word_split[$numberOfLetters - 3];
+            $v2 = $word_split[$numberOfLetters - 2];
+            $d = $word_split[$numberOfLetters - 1];
+            if (!self::isVowel($c) &&
+                self::isVowel($v1) &&
+                self::isVowel($v2) &&
+                !self::isVowel($d) &&
+                $v1 == $v2 &&
+                $d != 'I' &&
+                $v1 != 'i') {
+                unset($word_split[$numberOfLetters - 2]);
+                $result = implode('', $word_split);
+            }
+        }
+        return $result;
+    }
+    /**
+     * Replace a string based on a regex expression
+     *
+     * @param string $word the string to search for regex replacement
+     * @param string $reges the regex to use to find and replacement
+     * @param string $replace the string to replace if the pattern is matched
+     * @param int $offset the int to start to look for the regex replacement
+     * @return string the string with the characters replaced if the regex
+     * matches, otherwise the original string
+     */
+    private static function replace($word, $regex, $replace, $offset)
+    {
+        $result = "";
+        if ($offset > 0) {
+            $part1 = substr($word, 0, $offset);
+            $part2 = substr($word, $offset, strlen($word));
+            $part2 = preg_replace($regex, $replace, $part2);
+            $result = $part1 . "" . $part2;
+        } else {
+            $result = preg_replace($regex, $replace, $word);
+        }
+        return $result;
+    }
+    /**
+     * Checks to see if a string ends with a certain string
+     *
+     * @param string $haystack the string to check
+     * @param string $needle the string to match at the end
+     * @return boolean true if it ends with $needle, otherwise false
+     */
+    private static function endsWith($haystack, $needle, $case = true)
+    {
+        if ($case) {
+            return (strcmp(substr($haystack,
+                strlen($haystack) - strlen($needle)), $needle) === 0);
+        }
+        return (strcasecmp(substr($haystack,
+            strlen($haystack) - strlen($needle)), $needle) === 0);
+    }
+    /**
+     * undoubles the end of a string.  If the string ends in kk, tt, dd remove
+     * one of the characters
+     *
+     * @param string $word the string to undouble
+     * @return string the undoubled string, otherwise the original string
+     */
+    private static function undouble($word)
+    {
+        $result = $word;
+        if (self::endsWith($word, "kk") ||
+            self::endsWith($word, "tt") ||
+            self::endsWith($word, "dd")) {
+            $result = substr($word, 0, strlen($word) - 1);
+        }
+        return $result;
+    }
+}
diff --git a/locale/nl/resources/locale.js b/locale/nl/resources/locale.js
new file mode 100755
index 0000000..d3e3cc1
--- /dev/null
+++ b/locale/nl/resources/locale.js
@@ -0,0 +1,45 @@
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Sandhya Vissapragada
+ * @package seek_quarry\locale\en-US
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015s
+ * @filesource
+ */
+/*
+ * The alphabet for this locale
+ */
+var alpha = "abcdefghijklmnopqrstuvwxyzäëïöüáéíóúè";
+/*
+ * Transliteration mapping for this locale
+ */
+var roman_array = {};
+/*
+ * To analyze the query and generate actual input query from the
+ * transliterated query
+ */
+function analyzeQuery()
+{
+}
diff --git a/locale/nl/statistics.txt b/locale/nl/statistics.txt
new file mode 100755
index 0000000..aed3602
--- /dev/null
+++ b/locale/nl/statistics.txt
@@ -0,0 +1 @@
+d:90;
\ No newline at end of file
diff --git a/locale/pl/resources/Tokenizer.php b/locale/pl/resources/Tokenizer.php
new file mode 100755
index 0000000..49880f9
--- /dev/null
+++ b/locale/pl/resources/Tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\pl\resources;
+
+/**
+ * Polish specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\pl
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/pt/resources/Tokenizer.php b/locale/pt/resources/Tokenizer.php
new file mode 100755
index 0000000..fed8407
--- /dev/null
+++ b/locale/pt/resources/Tokenizer.php
@@ -0,0 +1,462 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Niravkumar Patel niravkumar.patel1989@gmail.com
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\pt\resources;
+
+/**
+ * This class has a collection of methods for Portuguese locale specific
+ * tokenization. In particular, it has a stemmer implementing the
+ * Snowball Stemming algorithm presented in
+ * http://snowball.tartarus.org/algorithms/portuguese/stemmer.html
+ *
+ * @author Niravkumar Patel
+ * @package seek_quarry\locale\pt
+ */
+class Tokenizer
+{
+    /**
+     * Phrases we would like yioop to rewrite before performing a query
+     * @var array
+     */
+    public static $semantic_rewrites = [];
+    /**
+     * storage used in computing the stem
+     * @var string
+     */
+    private static $buffer;
+    /**
+     * Index of the current end of the word at the current state of computing
+     * its stem
+     * @var int
+     */
+    private static $k;
+    /**
+     * R1 is the region in the word after the first non-vowel following
+     * a vowel, or is the null region at the end of the word if there
+     * is no such non-vowel
+     * @var string
+     */
+    private static $r1 = "";
+    /**
+     * R2 is the region in the R1 after the first non-vowel following a vowel,
+     * or is the null region at the end of the word if there is no non-vowel
+     * @var string
+     */
+    private static $r2 = "";
+    /**
+     * If the second letter is a consonant, RV is the region after the next
+     * following vowel, or if the first two letters are vowels, RV is the
+     * region after the next consonant, and otherwise (consonant-vowel case)
+     * RV is the region after the third letter.
+     * @var string
+     */
+    private static $rv = "";
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Computes the stem of an Portuguese word
+     * For example, química, químicas, químico, químicos
+     * all have químic as a stem
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $words
+     */
+    public static function stem($word)
+    {
+        self::$buffer = $word;
+        self::$k = strlen($word) - 1;
+        if (self::$k <= 1) { return $word; }
+        $word = str_ireplace("ã", "a~", $word);
+        $word = str_ireplace("õ", "o~", $word);
+        self::$r1 = self::findR1($word);
+        self::$r2 = self::findR1(self::$r1);
+        self::findRV($word);
+        $temp_word = self::step1($word);
+        if ($temp_word == $word){
+            $temp_word = self::step2($word);
+        }
+        if ($temp_word != $word){
+            self::findRV($temp_word);
+            $temp_word = self::step3($temp_word);
+        }else{
+            $temp_word = self::step4($temp_word);
+            self::findRV($temp_word);
+        }
+        $temp_word = self::step5($temp_word);
+        $temp_word = str_ireplace("a~", "ã", $temp_word);
+        $temp_word = str_ireplace("o~", "õ", $temp_word);
+        self::$rv = "";
+        $word = $temp_word;
+        return $word;
+    }
+    /**
+     * Standard Suffix Removal Step
+     * It search for longest suffix from given set and remove
+     * if found
+     *
+     * @param string $word the string to suffix removal
+     * @return processed string
+     */
+    private static function step1($word)
+    {
+        $suffix_set = ['eza','ezas','ico','ica','icos','icas','ismo',
+            'ismos','ável','ível','ista','istas','oso','osa',
+            'osos','osas','amento','amentos','imento','imentos',
+            'adora','ador','aça~o','adoras','adores','aço~es',
+            'ante','antes','ância'];
+        $regex = "/[a-zA-Z~]*(eza|ezas|ico|ica|icos|icas|ismo|ismos|ável|ível
+            |ista|istas|oso|osa|osos|osas|amento|amentos|imento
+            |imentos|adora|ador|aça~o|adoras|adores|aço~es|ante
+            |antes|ância)";
+        foreach ($suffix_set as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r2)) {
+                $word = substr($word,0,-strlen($value));
+                break;
+            }
+        }
+        $special_suffix = ['logía' , 'logías'];
+        foreach ($special_suffix as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r2)){
+                $word = substr($word,0,-strlen($value))."log";
+                break;
+            }
+        }
+        $special_suffix = ['ución','uciones'];
+        foreach ($special_suffix as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r2)) {
+                $word = substr($word,0,-strlen($value))."u";
+                break;
+            }
+        }
+        $special_suffix = ['ência','ências'];
+        foreach ($special_suffix as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r2)){
+                $word = substr($word,0,-strlen($value))."ente";
+                break;
+            }
+        }
+        $special_suffix = ['ativamente','ivamente','osamente','icamente',
+            'adamente','antemente','avelmente','ívelmente'];
+        $is_removed = false;
+        foreach ($special_suffix as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r2)) {
+                $word = substr($word,0,-strlen($value));
+                $is_removed = true;
+                break;
+            }
+        }
+        if (!$is_removed) {
+            $is_removed = false;
+            $value = "amente";
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r1)) {
+                $word = substr($word,0,-strlen($value));
+                $is_removed = true;
+            }
+            if (!$is_removed) {
+                $value = "mente";
+                $regex = "/[a-zA-Z~]*($value)$/";
+                if (preg_match($regex, self::$r2)){
+                    $word = substr($word,0,-strlen($value));
+                    $is_removed = true;
+                }
+            }
+        }
+
+        $special_suffix = ['abilidades','icidades','ividades','abilidade',
+            'icidade','ividade','idades','idade'];
+        foreach ($special_suffix as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r2)) {
+                $word = substr($word,0,-strlen($value));
+                break;
+            }
+        }
+        $special_suffix = ['ativa','ativo','ativas','ativos','iva','ivo',
+            'ivas','ivos'];
+        foreach ($special_suffix as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$r2)){
+                $word = substr($word,0,-strlen($value));
+                break;
+            }
+        }
+        $special_suffix = ['iras','ira'];
+        foreach ($special_suffix as $value) {
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$rv)
+                && preg_match("/[a-zA-Z~]*(eiras|eira)$/",$word)) {
+                $word = substr($word,0,-strlen($value))."ir";
+                break;
+            }
+        }
+        return $word;
+    }
+    /**
+     * Verb Suffix Removal Step
+     * If step 1 does not change anything than this function
+     * will be called
+     *
+     * It will also check for longest suffix from the suffix set
+     * Remove if found
+     *
+     * @param string $word the string to suffix removal
+     * @return processed string
+     */
+    private static function step2($word)
+    {
+        $suffix_set = ["aríamos","eríamos","iríamos","ássemos",
+            "êssemos","íssemos","aríeis","eríeis","iríeis","ásseis",
+            "ésseis","ísseis","áramos","éramos","íramos","ávamos",
+            "aremos","eremos","iremos","ariam","eriam","iriam",
+            "assem","essem","issem","ara~o","era~o","ira~o","arias",
+            "erias","irias","ardes","erdes","irdes","asses","esses",
+            "isses","astes","estes","istes","áreis","areis","éreis",
+            "ereis","íreis","ireis","áveis","íamos","armos","ermos","irmos",
+            "aria","eria","iria","asse","esse","isse","aste","este","iste",
+            "arei","erei","irei","aram","eram","iram","avam","arem","erem",
+            "irem","ando","endo","indo","adas","idas","arás","aras","erás",
+            "eras","irás","avas","ares","eres","ires","íeis","ados","idos",
+            "ámos","amos","emos","imos","iras","ada","ida","ará","ara","erá",
+            "era","irá","ava","iam","ado","ido","ias","ais","eis","ira","ia",
+            "ei","am","em","ar","er","ir","as","es","is","eu","iu","ou"];
+        foreach ($suffix_set as $value){
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, self::$rv)) {
+                $word = substr($word,0,-strlen($value));
+                break;
+            }
+        }
+        return $word;
+    }
+    /**
+     * Delete suffix i if in RV and preceded by c
+     *
+     * @param string $word the string to suffix removal
+     * @return processed string
+     */
+    private static function step3($word)
+    {
+        $regex = "/[a-zA-Z~]*(ci)$/";
+        if (preg_match($regex, $word)) {
+            $regex = "/(i)[a-zA-Z~]*$/";
+            if (preg_match($regex, self::$rv)) {
+                $word = substr($word,0,-1);
+            }
+        }
+        return $word;
+    }
+    /**
+     * Residual suffix
+     * If the word ends with one of [os a i o á í ó]
+     * in RV
+     *
+     * @param string $word the string to suffix removal
+     * @return processed string
+     */
+    private static function step4($word)
+    {
+        $regex = "/[a-zA-Z~]*(os)$/";
+        if (preg_match($regex, self::$rv)){
+            $word = substr($word,0,-2);
+        }else{
+            $regex = "/[a-zA-Z~]*(a|i|o)$/";
+            if (preg_match($regex, self::$rv)){
+                $word = substr($word,0,-1);
+            }else{
+                $regex = "/[a-zA-Z~]*(á|í|ó)$/";
+                if (preg_match($regex, self::$rv)){
+                    $word = substr($word,0,-2);
+                }
+            }
+        }
+        return $word;
+    }
+    /**
+     * Residual suffix
+     * If the word ends with one of [e é ê]
+     * in RV
+     *
+     * @param string $word the string to suffix removal
+     * @return processed string
+     */
+    private static function step5($word)
+    {
+        if (preg_match("/[a-zA-Z~]*(ç)$/", $word)){
+            $word = substr($word,0,-2)."c";
+            return $word;
+        }
+        $special_suffix = ["gue","cie"];
+        foreach ($special_suffix as $value){
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, $word)) {
+                $value = substr($value,1,strlen($value));
+                $regex = "/[a-zA-Z~]*($value)[a-zA-Z~]*$/";
+                if (preg_match($regex, self::$rv)){
+                    $word = substr($word, 0, -2);
+                    return $word;
+                }
+            }
+        }
+        $special_suffix = ["gué","guê","cié","ciê"];
+        foreach ($special_suffix as $value){
+            $regex = "/[a-zA-Z~]*($value)$/";
+            if (preg_match($regex, $word)) {
+                $value = substr($value, 1, strlen($value));
+                $regex = "/[a-zA-Z~]*($value)$/";
+                if (preg_match($regex, self::$rv)){
+                    $word = substr($word, 0, -3);
+                    return $word;
+                }
+            }
+        }
+        if (preg_match("/[a-zA-Z~]*(e)$/", $word)
+            && preg_match("/[a-zA-Z~]*(e)[a-zA-Z~]*$/", self::$rv)){
+            $word = substr($word, 0, -1);
+            return $word;
+        }
+        if (preg_match("/[a-zA-Z~]*(é|ê)$/", $word)
+            && preg_match("/[a-zA-Z~]*(é|ê)[a-zA-Z~]*$/", self::$rv)){
+            $word = substr($word, 0, -2);
+            return $word;
+        }
+        return $word;
+    }
+    /**
+     * This method will find R1 region in the $word
+     * R1 is the region after the first non-vowel following a vowel, or is
+     * the null region at the end of the word if there is no such non-vowel
+     *
+     * @param string $word
+     * @return string $r1 region
+     */
+    private static function findR1($word)
+    {
+        $word_length = mb_strlen($word);
+        $vowel = self::mbStringToArray("aeiouáéíóúâêô");
+        $first_vowel = false;
+        $second_vowel = false;
+        $first_consonent = false;
+        $second_consonent = false;
+        $r1 = "";
+        $word_array = self::mbStringToArray($word);
+        $i=0;
+        for ($i=0; $i<$word_length; $i++) {
+            if (in_array($word_array[$i],$vowel)) {
+                if ($first_vowel) {
+                    if ($first_consonent) {
+                        break;
+                    }
+                }
+                $first_vowel = true;
+
+            } else {
+                if ($first_vowel) {
+                    if ($first_consonent ){
+                        break;
+                    }
+                    $first_consonent = true;
+                }
+            }
+        }
+        return mb_substr($word, $i, mb_strlen($word));
+    }
+    /**
+     * This method will find RV region in the $word
+     * If the second letter is a consonant,
+     * RV is the region after the next following vowel, or
+     * if the first two letters are vowels,
+     * RV is the region after the next consonant,
+     * and otherwise (consonant-vowel case)
+     * RV is the region after the third letter.
+     *
+     * @param string $word
+     * @return string $rv region
+     */
+    private static function findRV($word)
+    {
+        $vowel = self::mbStringToArray("aeiouáéíóúâêô");
+        $word_array = self::mbStringToArray($word);
+        if (!isset($word_array[1])  || !in_array($word_array[1], $vowel)){
+            $word_length = mb_strlen($word);
+            $i = 2;
+            for ($i = 2; $i < $word_length; $i++) {
+                if (in_array($word_array[$i],$vowel)){
+                    $i++;
+                    break;
+                }
+            }
+            self::$rv = mb_substr($word, $i, mb_strlen($word));
+        } else if (in_array($word_array[0], $vowel)
+            && in_array($word_array[1],$vowel)) {
+            $word_length = mb_strlen($word);
+            for ($i = 2; $i < $word_length; $i++){
+                if (!in_array($word_array[$i],$vowel)){
+                    self::$rv = mb_substr($word, $i + 1, mb_strlen($word));
+                    break;
+                }
+            }
+        } else if (!in_array($word_array[0], $vowel)
+            && in_array($word_array[1],$vowel)){
+            self::$rv = mb_substr($word, 3, mb_strlen($word));
+        }
+    }
+    /**
+     * This method will break-up a multibyte string into its individual
+     * characters and generate an array of characters
+     *
+     * @return array of multibyte characters
+     */
+    private static function mbStringToArray($string)
+    {
+        $len = mb_strlen($string);
+        $array = [];
+        while($len) {
+            $array[] = mb_substr($string,0, 1, "UTF-8");
+            $string = mb_substr($string, 1, $len,"UTF-8");
+            $len = mb_strlen($string);
+        }
+        return $array;
+    }
+}
diff --git a/locale/ru/resources/Tokenizer.php b/locale/ru/resources/Tokenizer.php
new file mode 100755
index 0000000..1d3c189
--- /dev/null
+++ b/locale/ru/resources/Tokenizer.php
@@ -0,0 +1,342 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\ru\resources;
+
+/**
+ * This class has a collection of methods for Russian locale specific
+ * tokenization. In particular, it has a stemmer, a stop word remover (for
+ * use mainly in word cloud creation). The stemmer is a modification
+ * (with bug fixes ) of  Dennis Kreminsky's stemmer from:
+ * http://snowball.tartarus.org/otherlangs/russian_php5.txt
+ * Here given a word, its stem is that part of the word that
+ * is common to all its inflected variants. For example,
+ * tall is common to tall, taller, tallest. A stemmer takes
+ * a word and tries to produce its stem.
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\ru
+ */
+class Tokenizer
+{
+    /**
+     * Num bytes of Russian unicode char.
+     */
+    const CHAR_LENGTH = 2;
+    /**
+     * Words we don't want to be stemmed
+     * @var array
+     */
+    public static $no_stem_list = [];
+    /**
+     * Stub function which could be used for a word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string should return string with words separated by space
+     *     in this case does nothing
+     */
+    public static function segment($pre_segment)
+    {
+        return $pre_segment;
+    }
+    /**
+     * Removes the stop words from the page (used for Word Cloud generation)
+     *
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        $stop_words = ["й", "ч", "чп", "ое", "юфп",
+            "по", "об", "с", "у", "уп", "лбл", "б", "фп",
+            "чуе", "поб", "фбл", "езп", "оп", "дб", "фщ",
+            "л", "х", "це", "чщ", "ъб", "вщ", "рп",
+            "фпмшлп", "ее", "ное", "вщмп", "чпф", "пф",
+            "неос", "еэе", "оеф ", "п", "йъ", "енх",
+            "феретш", "лпздб", "дбце", "ох ", "чдтхз",
+            "мй", "еумй", "хце", "ймй", "ой", "вщфш",
+            "вщм", "оезп", "дп", "чбу", "ойвхдш",
+            "прсфш", "хц", "чбн", "улбъбм", "чедш",
+            "фбн", "рпфпн", "уевс", "ойюезп", "ек",
+            "нпцеф", "пой", "фхф", "зде", "еуфш",
+            "обдп", "оек", "дмс", "нщ", "февс",
+            "йи", "юен", "вщмб", "убн", "юфпв", "веъ ",
+            "вхдфп", "юемпчел", "юезп", "тбъ", "фпце",
+            "уеве", "рпд", "цйъош", "вхдеф", "ц",
+            "фпздб", "лфп", "ьфпф", "зпчптйм", "фпзп",
+            "рпфпнх", "ьфпзп", "лблпк", "упчуен",
+            "ойн", "ъдеуш", "ьфпн", "пдйо",
+            "рпюфй", "нпк", "фен", "юфпвщ", "оее",
+            "лбцефус", "уекюбу", "вщмй", "лхдб",
+            "ъбюен", "улбъбфш", "чуеи", "ойлпздб",
+            "уезпдос", "нпцоп", "ртй", "облпоег",
+            "дчб", "пв", "дтхзпк", "ипфш", "рпуме",
+            "обд", "впмшые", "фпф", "юетеъ", "ьфй",
+            "обу", "ртп", "чуезп",  "ойи", "лблбс",
+            "нопзп", "тбъче", "улбъбмб", "фтй",
+            "ьфх", "нпс", "чртпюен", "иптпып",
+            "учпа", "ьфпк", "ретед",  "йопздб",
+            "мхюые", "юхфш", "фпн", "оемшъс",
+            "фблпк", "йн", "впмее", "чуездб",
+            "лпоеюоп", "чуа", "нецдх", 'http', 'https'
+        ];
+        $page = preg_replace('/\b('.implode('|',$stop_words).')\b/u', '',
+            strtolower($page));
+        return $page;
+    }
+    /**
+     * Computes the stem of a Russian word
+     *
+     * @param string $word the string to stem
+     * @return string the stem of $words
+     */
+    public static function stem($word)
+    {
+        $a = self::rv($word);
+        $start = $a[0];
+        $rv = $a[1];
+        $rv = self::step1($rv);
+        $rv = self::step2($rv);
+        $rv = self::step3($rv);
+        $rv = self::step4($rv);
+        return $start . $rv;
+    }
+    /**
+     * Compute the RV region of a word. RV is the region after the first vowel,
+     * or the end of the word if it contains no vowel.
+     *
+     * @param string $word word to compute rv regions for
+     * @return array pair string before rv, string after rv
+     */
+    private static function rv($word)
+    {
+
+        $vowel = 'аеиоуыэюя';
+        $start = $word;
+        $rv = '';
+        preg_match("/[$vowel]/u", $word , $matches,
+            PREG_OFFSET_CAPTURE);
+        $len = strlen($word);
+        $rv_index = isset($matches[0][1]) ? $matches[0][1] +
+            self::CHAR_LENGTH : $len;
+        if ($rv_index != $len) {
+            $start = substr($word, 0, $rv_index);
+            $rv = substr($word, $rv_index);
+        }
+        return [$start, $rv];
+    }
+    /**
+     * Search for a PERFECTIVE GERUND ending. If one is found remove it,
+     * and that is then the end of step 1. Otherwise try and remove a REFLEXIVE
+     * ending, and then search in turn for (1) an ADJECTIVAL, (2) a VERB or
+     * (3) a NOUN ending.
+     * As soon as one of the endings (1) to (3) is found remove it, and
+     * terminate step 1.
+     * @param string $word word to stem
+     * @return string $word after step
+     */
+    private static function step1($word)
+    {
+        $perfective1 = ['в', 'вши', 'вшись'];
+        foreach ($perfective1 as $suffix) {
+            $len = strlen($suffix);
+            if (substr($word, -$len) == $suffix &&
+                (substr($word, -$len - self::CHAR_LENGTH,
+                    self::CHAR_LENGTH) == 'а' ||
+                substr($word, -$len - self::CHAR_LENGTH,
+                    self::CHAR_LENGTH) == 'я')) {
+                return substr($word, 0, -$len);
+            }
+        }
+        $perfective2 = ['ив', 'ивши', 'ившись', 'ыв',
+            'ывши', 'ывшись'];
+        foreach ($perfective2 as $suffix) {
+            $len = strlen($suffix);
+            if (substr($word, -$len) == $suffix) {
+                return substr($word, 0, -$len);
+            }
+        }
+        $reflexive = ['ся', 'сь'];
+        foreach ($reflexive as $suffix) {
+            $len = strlen($suffix);
+            if (substr($word, -$len) == $suffix) {
+                $word = substr($word, 0, -$len);
+            }
+        }
+        $adjective = ['ее', 'ие', 'ые', 'ое', 'ими',
+            'ыми', 'ей', 'ий', 'ый', 'ой', 'ем', 'им', 'ым',
+            'ом', 'его', 'ого', 'ему', 'ому', 'их', 'ых',
+            'ую', 'юю', 'ая', 'яя', 'ою', 'ею'];
+        $participle1 = ['ем', 'нн', 'вш',
+            'ющ', 'щ'];
+        $participle2 = ['ивш', 'ывш',
+            'ующ'];
+        foreach ($adjective as $adj_suffix) {
+            $len = strlen($adj_suffix);
+            if (substr($word, -$len) != $adj_suffix) {
+                continue;
+            }
+            $word = substr($word, 0, -$len);
+            foreach ($participle1 as $suffix) {
+                $len = strlen($suffix);
+                if (substr($word, -$len) == $suffix &&
+                    (substr($word, -$len - self::CHAR_LENGTH,
+                        self::CHAR_LENGTH) =='а' ||
+                    substr($word, -$len - self::CHAR_LENGTH,
+                        self::CHAR_LENGTH) =='я')) {
+                    $word = substr($word, 0, -$len);
+                }
+            }
+            foreach ($participle2 as $suffix) {
+                $len = strlen($suffix);
+                if (substr($word, -$len) == $suffix) {
+                    $word = substr($word, 0, -$len);
+                }
+            }
+            return $word;
+        }
+        $verb1 = ['ла','на','ете','йте','ли','й',
+            'л','ем','н','ло','но', 'ет','ют','ны',
+            'ть','ешь','нно'];
+        foreach ($verb1 as $suffix) {
+            $len = strlen($suffix);
+            if (substr($word,-$len) == $suffix &&
+                (substr($word,-$len - self::CHAR_LENGTH,
+                    self::CHAR_LENGTH) == 'а' ||
+                substr($word, -$len - self::CHAR_LENGTH,
+                    self::CHAR_LENGTH) == 'я')) {
+                return substr($word, 0, -$len);
+            }
+        }
+        $verb2 = ['ила', 'ыла', 'ена', 'ейте',
+            'уйте', 'ите', 'или', 'ыли', 'ей', 'уй',
+            'ил', 'ыл', 'им', 'ым', 'ен', 'ило', 'ыло',
+            'ено', 'ят', 'ует', 'уют', 'ит', 'ыт',
+            'ены', 'ить', 'ыть', 'ишь', 'ую', 'ю'];
+        foreach ($verb2 as $suffix) {
+            $len = strlen($suffix);
+            if (substr($word, -$len) == $suffix) {
+                return substr($word, 0, -$len);
+            }
+        }
+        $noun = ['а', 'ев', 'ов', 'ие', 'ье', 'е',
+            'иями', 'ями', 'ами', 'еи', 'ии', 'и',
+            'ией', 'ей', 'ой', 'ий', 'й', 'иям', 'ям',
+            'ием', 'ем', 'ам', 'ом', 'о', 'у','ах', 'иях',
+            'ях', 'ы', 'ь', 'ию', 'ью', 'ю', 'ия', 'ья', 'я'];
+        foreach ($noun as $suffix) {
+            $len = strlen($suffix);
+            if (substr($word, -$len) == $suffix) {
+                return substr($word, 0, -$len);
+            }
+        }
+        return $word;
+    }
+    /**
+     * If the word ends with и (i), remove it.
+     * @param string $word word to stem
+     * @return string $word after step
+     */
+    private static function step2($word)
+    {
+        if (substr($word, -self::CHAR_LENGTH, self::CHAR_LENGTH) == 'и') {
+            $word = substr($word, 0, -self::CHAR_LENGTH);
+        }
+        return $word;
+    }
+    /**
+     * Search for a DERIVATIONAL ending in R2 (i.e. the entire ending must
+     * lie in R2), and if one is found, remove it.
+     * @param string $word word to stem
+     * @return string $word after step
+     */
+    private static function step3($word)
+    {
+        $vowel = 'аеиоуыэюя';
+        $r1 = '';
+        $r2 = '';
+        preg_match("/[^$vowel]/u", $word , $matches,
+            PREG_OFFSET_CAPTURE);
+        $len = strlen($word);
+        $r1_index = isset($matches[0][1]) ? $matches[0][1] +
+            self::CHAR_LENGTH : $len;
+        if ($r1_index != $len) {
+            $r1 = substr($word , $r1_index);
+        }
+        if ($r1_index != $len) {
+            preg_match("/[$vowel][^$vowel]/u", $r1, $matches,
+                PREG_OFFSET_CAPTURE);
+            $r2_index = isset($matches[0][1]) ? $matches[0][1] +
+                2 * self::CHAR_LENGTH : $len;
+            if ($r2_index != $len) {
+                $r2 = substr($r1, $r2_index);
+            }
+        }
+        $derivational = ['ост', 'ость'];
+        foreach ($derivational as $suffix) {
+            $len = strlen($suffix);
+            if (substr($r2, -$len) == $suffix)
+                $word  = substr($word, 0, -$len);
+        }
+        return $word;
+    }
+    /**
+     * 1) Undouble н (n), or, (2) if the word ends with a SUPERLATIVE ending,
+     * remove it and undouble н (n), or (3) if the word ends ь (') (soft sign)
+     * remove it.
+     * @param string $word word to stem
+     * @return string $word after step
+     */
+    private static function step4($word)
+    {
+        if (substr($word, -self::CHAR_LENGTH * 2) == 'нн') {
+            $word = substr($word, 0,  -self::CHAR_LENGTH);
+        } else {
+            $superlative=array('ейш', 'ейше');
+            foreach ($superlative as $suffix) {
+                $len = strlen($suffix);
+                if (substr($word, -$len) == $suffix) {
+                    $word = substr($word, 0, - $len);
+                }
+            }
+            if (substr($word, -self::CHAR_LENGTH * 2) == 'нн') {
+                $word = substr($word, 0, -self::CHAR_LENGTH);
+            }
+        }
+        /* should there be a guard flag? can't think of a russian word
+         that ends with ейшь or ннь anyways, though the algorithm states
+         this is an "otherwise" case
+        */
+        if (substr($word, -self::CHAR_LENGTH, self::CHAR_LENGTH) == 'ь') {
+            $word = substr($word, 0, strlen($word) - self::CHAR_LENGTH);
+        }
+        return $word;
+    }
+}
diff --git a/locale/te/resources/Tokenizer.php b/locale/te/resources/Tokenizer.php
new file mode 100755
index 0000000..6a97fbb
--- /dev/null
+++ b/locale/te/resources/Tokenizer.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\te\resources;
+
+use seekquarry\yioop\models\LocaleModel;
+
+/**
+ * Telegu specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\te
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/th/resources/Tokenizer.php b/locale/th/resources/Tokenizer.php
new file mode 100755
index 0000000..d983f09
--- /dev/null
+++ b/locale/th/resources/Tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\Locale\th\resources;
+
+/**
+ * Thai specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\th
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/tr/resources/Tokenizer.php b/locale/tr/resources/Tokenizer.php
new file mode 100755
index 0000000..9f0e961
--- /dev/null
+++ b/locale/tr/resources/Tokenizer.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ *
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\tr\resources;
+
+/**
+ * Turkish specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\tr
+ */
+class Tokenizer
+{
+    /**
+     * How many characters in a char gram for this locale
+     * @var int
+     */
+    public static $char_gram_len = 5;
+}
diff --git a/locale/vi_VN/configure.ini b/locale/vi_VN/configure.ini
new file mode 100755
index 0000000..d88c770
--- /dev/null
+++ b/locale/vi_VN/configure.ini
@@ -0,0 +1,4503 @@
+; ***** BEGIN LICENSE BLOCK *****
+;  SeekQuarry/Yioop Open Source Pure PHP Search Engine, Crawler, and Indexer
+;  Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+;
+;  This program is free software: you can redistribute it and/or modify
+;  it under the terms of the GNU General Public License as published by
+;  the Free Software Foundation, either version 3 of the License, or
+;  (at your option) any later version.
+;
+;  This program is distributed in the hope that it will be useful,
+;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;  GNU General Public License for more details.
+;
+;  You should have received a copy of the GNU General Public License
+;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;  ***** END LICENSE BLOCK *****
+;
+; configure.ini
+;
+; vi_VN configuration file
+;
+[general]
+;
+; Strings to translate on various pages
+;
+[strings]
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers
+;
+; AdminController.php line: 114
+admin_controller_need_cookies = ""
+;
+; AdminController.php line: 164
+admin_controller_account_not_active = ""
+;
+; AdminController.php line: 170
+admin_controller_login_successful = "Đăng nhập th&agrave;nh c&ocirc;ng"
+;
+; AdminController.php line: 189
+admin_controller_no_back_button = ""
+;
+; AdminController.php line: 203
+admin_controller_login_failed = "T&ecirc;n đăng nhập họăc khẩu kh&ocirc;ng đ&uacute;ng"
+;
+; AdminController.php line: 209
+admin_controller_login_to_config = "đăng nhập để cấu h&igrave;nh"
+;
+; AdminController.php line: 213
+admin_controller_status_updates_stopped = ""
+;
+; AdminController.php line: 367
+admin_controller_account_access = ""
+;
+; AdminController.php line: 368
+admin_controller_social = ""
+;
+; AdminController.php line: 369
+admin_controller_crawl_settings = ""
+;
+; AdminController.php line: 370
+admin_controller_system_settings = ""
+;
+; AdminController.php line: 371
+admin_controller_advertisement = ""
+;
+; AdminController.php line: 545
+admin_controller_equal = ""
+;
+; AdminController.php line: 546
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 547
+admin_controller_contains = ""
+;
+; AdminController.php line: 548
+admin_controller_begins_with = ""
+;
+; AdminController.php line: 549
+admin_controller_ends_with = ""
+;
+; AdminController.php line: 552
+admin_controller_equal = ""
+;
+; AdminController.php line: 553
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 556
+admin_controller_no_sort = ""
+;
+; AdminController.php line: 557
+admin_controller_sort_ascending = ""
+;
+; AdminController.php line: 558
+admin_controller_sort_descending = ""
+;
+; MachineController.php line: 193
+machine_controller_nolines = ""
+;
+; RegisterController.php line: 249
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 315
+register_controller_account_created = ""
+;
+; RegisterController.php line: 333
+register_controller_registration_email_sent = ""
+;
+; RegisterController.php line: 335
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 336
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 338
+register_controller_email_body = ""
+;
+; RegisterController.php line: 372
+register_controller_account_request_made = ""
+;
+; RegisterController.php line: 376
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 377
+register_controller_admin_activation_message = ""
+;
+; RegisterController.php line: 419
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 425
+register_controller_already_activated = ""
+;
+; RegisterController.php line: 432
+register_controller_account_activated = ""
+;
+; RegisterController.php line: 435
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 483
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 492
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 496
+register_controller_account_recover_email = ""
+;
+; RegisterController.php line: 500
+register_controller_recover_request = ""
+;
+; RegisterController.php line: 501
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 503
+register_controller_recover_body = ""
+;
+; RegisterController.php line: 537
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 549
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 562
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 569
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 573
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 579
+register_controller_password_changed = ""
+;
+; RegisterController.php line: 587
+register_controller_passwords_dont_match = ""
+;
+; RegisterController.php line: 601
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 605
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 732
+register_controller_invalid_url = ""
+;
+; RegisterController.php line: 736
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 749
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 759
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 786
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 800
+register_controller_suggest_full = ""
+;
+; RegisterController.php line: 804
+register_controller_url_submitted = ""
+;
+; RegisterController.php line: 1006
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 1012
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 1027
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 1038
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 1066
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 1069
+register_controller_check_email = ""
+;
+; RegisterController.php line: 1076
+register_controller_user_already_exists = ""
+;
+; SearchController.php line: 280
+search_controller_web = ""
+;
+; SearchController.php line: 341
+search_controller_logout_successful = "Tho&aacute;t th&agrave;nh c&ocirc;ng"
+;
+; SearchController.php line: 549
+search_controller_mix_info = "Bằng c&aacute;ch sử dụng kết hợp thu thập dữ liệu %s"
+;
+; SearchController.php line: 555
+search_controller_crawl_info = "Sử dụng chỉ số %s"
+;
+; SearchController.php line: 591
+search_controller_search = "T&igrave;m Kiếm"
+;
+; SearchController.php line: 695
+search_controller_no_index_set = "Kh&ocirc;ng c&oacute; chỉ mục t&igrave;m kiếm thiết lập để sử dụng"
+;
+; SearchController.php line: 698
+search_controller_no_index_set = "Kh&ocirc;ng c&oacute; chỉ mục t&igrave;m kiếm thiết lập để sử dụng"
+;
+; SearchController.php line: 800
+search_controller_get_keyword_ads = ""
+;
+; SearchController.php line: 803
+search_controller_ad_keyword_description = ""
+;
+; SearchController.php line: 1382
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1391
+search_controller_no_archive_page = ""
+;
+; SearchController.php line: 1441
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1446
+search_controller_original_page = ""
+;
+; SearchController.php line: 1463
+search_controller_extracted_title = ""
+;
+; SearchController.php line: 1465
+search_controller_extracted_description = ""
+;
+; SearchController.php line: 1467
+search_controller_extracted_links = ""
+;
+; SearchController.php line: 1472
+search_controller_extracted_allow_paths = ""
+;
+; SearchController.php line: 1478
+search_controller_extracted_disallow_paths = ""
+;
+; SearchController.php line: 1484
+search_controller_crawl_delay = ""
+;
+; SearchController.php line: 1548
+search_controller_cache_comment = ""
+;
+; SearchController.php line: 1559
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1594
+search_controller_cached_version = "Trang gốc n&agrave;y: %s đ&atilde; t&igrave;m được bởi c&ocirc;ng cụ t&igrave;m kiẽm Yioop v&agrave;o ng&agrave;y %s."
+;
+; SearchController.php line: 1689
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1707
+search_controller_header_summaries = ""
+;
+; SearchController.php line: 1821
+search_controller_history = ""
+;
+; SearchController.php line: 1991
+search_controller_all_cached = ""
+;
+; SearchController.php line: 2022
+search_controller_year = ""
+;
+; SearchController.php line: 2023
+search_controller_month = ""
+;
+; SettingsController.php line: 115
+settings_controller_crawl_mix = "Thu thập th&ocirc;ng tin hỗn hợp"
+;
+; SettingsController.php line: 130
+settings_controller_settings_saved = "Những c&agrave;i đặt đ&atilde; được lưu lại"
+;
+; StaticController.php line: 68
+static_controller_logout_successful = ""
+;
+; StaticController.php line: 146
+static_controller_complete_title = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers/components
+;
+; AccountaccessComponent.php line: 155
+accountaccess_component_no_posts_yet = ""
+;
+; AccountaccessComponent.php line: 171
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 181
+accountaccess_component_passwords_dont_match = "Những mật khẩu đ&atilde; nhập kh&ocirc;ng tr&ugrave;ng nhau"
+;
+; AccountaccessComponent.php line: 188
+accountaccess_component_invalid_password = ""
+;
+; AccountaccessComponent.php line: 230
+accountaccess_component_unknown_imagetype = ""
+;
+; AccountaccessComponent.php line: 235
+accountaccess_component_icon_too_big = ""
+;
+; AccountaccessComponent.php line: 244
+accountaccess_component_no_user_folder = ""
+;
+; AccountaccessComponent.php line: 253
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 294
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 295
+accountaccess_component_inactive_status = ""
+;
+; AccountaccessComponent.php line: 297
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 300
+accountaccess_component_request_join = ""
+;
+; AccountaccessComponent.php line: 301
+accountaccess_component_invited = ""
+;
+; AccountaccessComponent.php line: 302
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 304
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 352
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 357
+accountaccess_component_passwords_dont_match = "Những mật khẩu đ&atilde; nhập kh&ocirc;ng tr&ugrave;ng nhau"
+;
+; AccountaccessComponent.php line: 361
+accountaccess_component_invalid_username = ""
+;
+; AccountaccessComponent.php line: 365
+accountaccess_component_user_exists = ""
+;
+; AccountaccessComponent.php line: 394
+accountaccess_component_user_added = ""
+;
+; AccountaccessComponent.php line: 403
+accountaccess_component_user_doesnt_exist = ""
+;
+; AccountaccessComponent.php line: 410
+accountaccess_component_cant_edit_public_user = ""
+;
+; AccountaccessComponent.php line: 452
+accountaccess_component_passwords_dont_match = "Những mật khẩu đ&atilde; nhập kh&ocirc;ng tr&ugrave;ng nhau"
+;
+; AccountaccessComponent.php line: 458
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 464
+accountaccess_component_user_filter_group = ""
+;
+; AccountaccessComponent.php line: 468
+accountaccess_component_user_filter_role = ""
+;
+; AccountaccessComponent.php line: 479
+accountaccess_component_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 484
+accountaccess_component_cant_delete_builtin = ""
+;
+; AccountaccessComponent.php line: 489
+accountaccess_component_user_deleted = ""
+;
+; AccountaccessComponent.php line: 498
+accountaccess_component_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 503
+accountaccess_component_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 509
+accountaccess_component_rolename_already_added = ""
+;
+; AccountaccessComponent.php line: 515
+accountaccess_component_rolename_added = "Cộng th&ecirc;m chức vụ "
+;
+; AccountaccessComponent.php line: 525
+accountaccess_component_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 530
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 536
+accountaccess_component_groupname_already_added = ""
+;
+; AccountaccessComponent.php line: 544
+accountaccess_component_groupname_added = ""
+;
+; AccountaccessComponent.php line: 554
+accountaccess_component_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 559
+accountaccess_component_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 568
+accountaccess_component_rolename_deleted = "X&oacute;a chức vụ"
+;
+; AccountaccessComponent.php line: 578
+accountaccess_component_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 583
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 592
+accountaccess_component_group_deleted = ""
+;
+; AccountaccessComponent.php line: 609
+accountaccess_component_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 615
+accountaccess_component_userstatus_updated = ""
+;
+; AccountaccessComponent.php line: 778
+accountaccess_component_select_activityname = "Lựa chọn họat động"
+;
+; AccountaccessComponent.php line: 803
+accountaccess_component_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 819
+accountaccess_component_activity_added = "Bổ sung t&ecirc;n hoạt động "
+;
+; AccountaccessComponent.php line: 828
+accountaccess_component_rolename_exists = "Chức vụ đ&atilde; đựơc d&ugrave;ng"
+;
+; AccountaccessComponent.php line: 834
+accountaccess_component_rolename_added = "Cộng th&ecirc;m chức vụ "
+;
+; AccountaccessComponent.php line: 838
+accountaccess_component_rolename_blank = ""
+;
+; AccountaccessComponent.php line: 847
+accountaccess_component_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 865
+accountaccess_component_activity_deleted = "X&oacute;a t&ecirc;n hoạt động"
+;
+; AccountaccessComponent.php line: 873
+accountaccess_component_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
+;
+; AccountaccessComponent.php line: 878
+accountaccess_component_rolename_deleted = "X&oacute;a chức vụ"
+;
+; AccountaccessComponent.php line: 910
+accountaccess_component_role_updated = ""
+;
+; AdvertisementComponent.php line: 55
+advertisement_component_num_days = ""
+;
+; AdvertisementComponent.php line: 56
+advertisement_component_one_day = ""
+;
+; AdvertisementComponent.php line: 57
+advertisement_component_seven_days = ""
+;
+; AdvertisementComponent.php line: 58
+advertisement_component_thirty_days = ""
+;
+; AdvertisementComponent.php line: 59
+advertisement_component_ninety_days = ""
+;
+; AdvertisementComponent.php line: 60
+advertisement_component_one_eighty_days = ""
+;
+; AdvertisementComponent.php line: 69
+advertisement_component_month = ""
+;
+; AdvertisementComponent.php line: 76
+advertisement_component_year = ""
+;
+; AdvertisementComponent.php line: 100
+advertisement_component_fields_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 105
+advertisement_component_duration_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 110
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 157
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 163
+advertisement_component_bid_too_low = ""
+;
+; AdvertisementComponent.php line: 171
+advertisement_component_processing_error = ""
+;
+; AdvertisementComponent.php line: 178
+advertisement_component_ad_created = ""
+;
+; AdvertisementComponent.php line: 206
+advertisement_component_status_changed = ""
+;
+; AdvertisementComponent.php line: 252
+advertisement_component_ad_updated = ""
+;
+; CrawlComponent.php line: 92
+crawl_component_starting_new_crawl = "Bắt đầu sự b&ograve; mới"
+;
+; CrawlComponent.php line: 107
+crawl_component_stop_crawl = "Ngừng thu thập dữ liệu"
+;
+; CrawlComponent.php line: 135
+crawl_component_resume_crawl = "Tiếp tục thu thập dữ liệu"
+;
+; CrawlComponent.php line: 143
+crawl_component_delete_crawl_success = "X&oacute;a thu thập dữ liệu th&agrave;nh c&ocirc;ng"
+;
+; CrawlComponent.php line: 147
+crawl_component_delete_crawl_fail = "X&oacute;a thu thập dữ liệu kh&ocirc;ng th&agrave;nh c&ocirc;ng"
+;
+; CrawlComponent.php line: 156
+crawl_component_set_index = "Thiết lập thu thập dữ liệu để sử dụng l&agrave;m chỉ mục"
+;
+; CrawlComponent.php line: 188
+crawl_component_no_description = "Kh&ocirc;ng c&oacute; sự m&ocirc; tả n&agrave;o"
+;
+; CrawlComponent.php line: 336
+crawl_component_use_below = "Sử dụng dưới đ&acirc;y"
+;
+; CrawlComponent.php line: 337
+crawl_component_use_defaults = "Sử dụng mặc định"
+;
+; CrawlComponent.php line: 340
+crawl_component_use_below = "Sử dụng dưới đ&acirc;y"
+;
+; CrawlComponent.php line: 344
+crawl_component_previous_crawl = "trước thu thập dữ liệu"
+;
+; CrawlComponent.php line: 415
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 429
+crawl_component_add_suggest = ""
+;
+; CrawlComponent.php line: 433
+crawl_component_no_new_suggests = ""
+;
+; CrawlComponent.php line: 479
+crawl_component_breadth_first = "Bề rộng đầu ti&ecirc;n"
+;
+; CrawlComponent.php line: 481
+crawl_component_page_importance = "Trang quan trọng"
+;
+; CrawlComponent.php line: 545
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 555
+crawl_component_urls_injected = ""
+;
+; CrawlComponent.php line: 565
+crawl_component_update_seed_info = "Cập nhật th&ocirc;ng tin trang mạng lươi hạt giống"
+;
+; CrawlComponent.php line: 619
+crawl_component_new_classifier = ""
+;
+; CrawlComponent.php line: 623
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 646
+crawl_component_classifier_deleted = ""
+;
+; CrawlComponent.php line: 650
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 661
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 679
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 705
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 751
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 760
+crawl_component_load_failed = ""
+;
+; CrawlComponent.php line: 762
+crawl_component_loading = ""
+;
+; CrawlComponent.php line: 764
+crawl_component_added_examples = ""
+;
+; CrawlComponent.php line: 766
+crawl_component_label_update_failed = ""
+;
+; CrawlComponent.php line: 768
+crawl_component_updating = ""
+;
+; CrawlComponent.php line: 770
+crawl_component_acc_update_failed = ""
+;
+; CrawlComponent.php line: 772
+crawl_component_na = ""
+;
+; CrawlComponent.php line: 774
+crawl_component_no_docs = ""
+;
+; CrawlComponent.php line: 776
+crawl_component_num_docs = ""
+;
+; CrawlComponent.php line: 778
+crawl_component_in_class = ""
+;
+; CrawlComponent.php line: 780
+crawl_component_not_in_class = ""
+;
+; CrawlComponent.php line: 782
+crawl_component_skip = ""
+;
+; CrawlComponent.php line: 784
+crawl_component_prediction = ""
+;
+; CrawlComponent.php line: 786
+crawl_component_scores = ""
+;
+; CrawlComponent.php line: 823
+crawl_component_use_below = "Sử dụng dưới đ&acirc;y"
+;
+; CrawlComponent.php line: 824
+crawl_component_use_defaults = "Sử dụng mặc định"
+;
+; CrawlComponent.php line: 826
+crawl_component_use_below = "Sử dụng dưới đ&acirc;y"
+;
+; CrawlComponent.php line: 834
+crawl_component_recrawl_never = ""
+;
+; CrawlComponent.php line: 835
+crawl_component_recrawl_1day = ""
+;
+; CrawlComponent.php line: 836
+crawl_component_recrawl_2day = ""
+;
+; CrawlComponent.php line: 837
+crawl_component_recrawl_3day = ""
+;
+; CrawlComponent.php line: 838
+crawl_component_recrawl_7day = ""
+;
+; CrawlComponent.php line: 839
+crawl_component_recrawl_14day = ""
+;
+; CrawlComponent.php line: 847
+crawl_component_basic = ""
+;
+; CrawlComponent.php line: 848
+crawl_component_centroid = ""
+;
+; CrawlComponent.php line: 849
+crawl_component_graph_based = ""
+;
+; CrawlComponent.php line: 1137
+crawl_component_page_options_updated = ""
+;
+; CrawlComponent.php line: 1165
+crawl_component_page_options_running_tests = ""
+;
+; CrawlComponent.php line: 1346
+crawl_component_results_editor_update = ""
+;
+; CrawlComponent.php line: 1361
+crawl_component_edited_pages = ""
+;
+; CrawlComponent.php line: 1374
+crawl_component_results_editor_need_url = ""
+;
+; CrawlComponent.php line: 1380
+crawl_component_results_editor_page_updated = ""
+;
+; CrawlComponent.php line: 1393
+crawl_component_results_editor_page_loaded = ""
+;
+; CrawlComponent.php line: 1424
+crawl_component_media_kind = ""
+;
+; CrawlComponent.php line: 1425
+crawl_component_video = ""
+;
+; CrawlComponent.php line: 1426
+crawl_component_rss_feed = ""
+;
+; CrawlComponent.php line: 1427
+crawl_component_html_feed = ""
+;
+; CrawlComponent.php line: 1441
+crawl_component_sources_indexes = ""
+;
+; CrawlComponent.php line: 1496
+crawl_component_no_source_type = ""
+;
+; CrawlComponent.php line: 1510
+crawl_component_missing_type = ""
+;
+; CrawlComponent.php line: 1524
+crawl_component_invalid_url = ""
+;
+; CrawlComponent.php line: 1531
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1548
+crawl_component_media_source_added = ""
+;
+; CrawlComponent.php line: 1561
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1569
+crawl_component_subsearch_added = ""
+;
+; CrawlComponent.php line: 1575
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1581
+crawl_component_media_source_deleted = ""
+;
+; CrawlComponent.php line: 1588
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1595
+crawl_component_subsearch_deleted = ""
+;
+; CrawlComponent.php line: 1630
+crawl_component_subsearch_updated = ""
+;
+; CrawlComponent.php line: 1705
+crawl_component_media_source_updated = ""
+;
+; SocialComponent.php line: 92
+social_component_request_join = ""
+;
+; SocialComponent.php line: 93
+social_component_invited = ""
+;
+; SocialComponent.php line: 94
+social_component_active_status = ""
+;
+; SocialComponent.php line: 95
+social_component_suspended_status = ""
+;
+; SocialComponent.php line: 98
+social_component_no_join = ""
+;
+; SocialComponent.php line: 99
+social_component_by_request = ""
+;
+; SocialComponent.php line: 101
+social_component_public_request = ""
+;
+; SocialComponent.php line: 102
+social_component_public_join = ""
+;
+; SocialComponent.php line: 105
+social_component_private = ""
+;
+; SocialComponent.php line: 106
+social_component_read = ""
+;
+; SocialComponent.php line: 107
+social_component_read_comment = ""
+;
+; SocialComponent.php line: 108
+social_component_read_write = ""
+;
+; SocialComponent.php line: 109
+social_component_read_wiki = ""
+;
+; SocialComponent.php line: 112
+social_component_no_voting = ""
+;
+; SocialComponent.php line: 113
+social_component_up_voting = ""
+;
+; SocialComponent.php line: 114
+social_component_up_down_voting = ""
+;
+; SocialComponent.php line: 117
+social_component_forever = ""
+;
+; SocialComponent.php line: 118
+social_component_one_hour = ""
+;
+; SocialComponent.php line: 119
+social_component_one_day = ""
+;
+; SocialComponent.php line: 120
+social_component_one_month = ""
+;
+; SocialComponent.php line: 192
+accountaccess_component_user_activated = ""
+;
+; SocialComponent.php line: 197
+accountaccess_component_no_user_activated = ""
+;
+; SocialComponent.php line: 216
+social_component_joined = ""
+;
+; SocialComponent.php line: 220
+social_component_groupname_unavailable = ""
+;
+; SocialComponent.php line: 226
+social_component_name_available = ""
+;
+; SocialComponent.php line: 243
+social_component_user_banned = ""
+;
+; SocialComponent.php line: 248
+social_component_no_user_banned = ""
+;
+; SocialComponent.php line: 269
+social_component_owner_changed = ""
+;
+; SocialComponent.php line: 274
+social_component_not_in_group = ""
+;
+; SocialComponent.php line: 280
+social_component_not_a_user = ""
+;
+; SocialComponent.php line: 296
+social_component_groupname_exists = ""
+;
+; SocialComponent.php line: 320
+social_component_groupname_added = ""
+;
+; SocialComponent.php line: 329
+social_component_groupname_doesnt_exists = ""
+;
+; SocialComponent.php line: 336
+social_component_group_deleted = ""
+;
+; SocialComponent.php line: 339
+social_component_no_delete_group = ""
+;
+; SocialComponent.php line: 352
+social_component_user_deleted = ""
+;
+; SocialComponent.php line: 357
+social_component_no_delete_user_group = ""
+;
+; SocialComponent.php line: 406
+social_component_users_invited = ""
+;
+; SocialComponent.php line: 411
+social_component_no_users_invited = ""
+;
+; SocialComponent.php line: 427
+social_component_joined = ""
+;
+; SocialComponent.php line: 430
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 471
+social_component_user_reinstated = ""
+;
+; SocialComponent.php line: 476
+social_component_no_user_reinstated = ""
+;
+; SocialComponent.php line: 483
+social_component_request_join = ""
+;
+; SocialComponent.php line: 485
+social_component_invited = ""
+;
+; SocialComponent.php line: 487
+social_component_banned_status = ""
+;
+; SocialComponent.php line: 504
+social_component_unsubscribe = ""
+;
+; SocialComponent.php line: 508
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 556
+social_component_group_joined = ""
+;
+; SocialComponent.php line: 558
+social_component_group_request_join = ""
+;
+; SocialComponent.php line: 573
+social_component_activate_group = ""
+;
+; SocialComponent.php line: 580
+social_component_activate_body = ""
+;
+; SocialComponent.php line: 584
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 585
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 656
+social_component_no_permission = ""
+;
+; SocialComponent.php line: 669
+social_component_group_updated = ""
+;
+; SocialComponent.php line: 677
+social_component_unknown_access = ""
+;
+; SocialComponent.php line: 685
+social_component_group_filter_users = ""
+;
+; SocialComponent.php line: 776
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 780
+social_component_no_comment = ""
+;
+; SocialComponent.php line: 792
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 798
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 802
+social_component_join_group = ""
+;
+; SocialComponent.php line: 805
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 820
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 833
+social_component_thread_notification = ""
+;
+; SocialComponent.php line: 835
+social_component_notify_body = ""
+;
+; SocialComponent.php line: 838
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 839
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 841
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 848
+social_component_comment_added = ""
+;
+; SocialComponent.php line: 859
+social_component_groupname_cant_add = ""
+;
+; SocialComponent.php line: 865
+social_component_delete_error = ""
+;
+; SocialComponent.php line: 885
+social_component_item_deleted = ""
+;
+; SocialComponent.php line: 888
+social_component_no_item_deleted = ""
+;
+; SocialComponent.php line: 896
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 905
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 910
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 914
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 918
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 924
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 929
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 940
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 948
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 961
+social_component_new_thread_mail = ""
+;
+; SocialComponent.php line: 965
+social_component_new_thread_body = ""
+;
+; SocialComponent.php line: 969
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 970
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 975
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 983
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 991
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 995
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 1001
+social_component_post_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1009
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1022
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1031
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1034
+social_component_post_updated = ""
+;
+; SocialComponent.php line: 1041
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 1050
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 1055
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 1059
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 1063
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 1094
+social_component_join_group = ""
+;
+; SocialComponent.php line: 1097
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 1373
+accountaccess_component_no_posts_yet = ""
+;
+; SocialComponent.php line: 1416
+social_component_search = ""
+;
+; SocialComponent.php line: 1503
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1506
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1530
+social_component_standard_page = ""
+;
+; SocialComponent.php line: 1531
+social_component_page_alias = ""
+;
+; SocialComponent.php line: 1532
+social_component_media_list = ""
+;
+; SocialComponent.php line: 1533
+social_component_presentation = ""
+;
+; SocialComponent.php line: 1536
+social_component_solid = ""
+;
+; SocialComponent.php line: 1537
+social_component_dashed = ""
+;
+; SocialComponent.php line: 1538
+social_component_none = ""
+;
+; SocialComponent.php line: 1577
+social_component_missing_fields = ""
+;
+; SocialComponent.php line: 1583
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1633
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1634
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1639
+social_component_page_saved = ""
+;
+; SocialComponent.php line: 1651
+social_component_resource_deleted = ""
+;
+; SocialComponent.php line: 1656
+social_component_resource_not_deleted = ""
+;
+; SocialComponent.php line: 1673
+social_component_resource_renamed = ""
+;
+; SocialComponent.php line: 1678
+social_component_resource_not_renamed = ""
+;
+; SocialComponent.php line: 1688
+social_component_resource_save_first = ""
+;
+; SocialComponent.php line: 1700
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1702
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1706
+social_component_resource_uploaded = ""
+;
+; SocialComponent.php line: 1711
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1758
+social_component_back = ""
+;
+; SocialComponent.php line: 1759
+social_component_history_page = ""
+;
+; SocialComponent.php line: 1794
+social_component_back = ""
+;
+; SocialComponent.php line: 1795
+social_component_diff_page = ""
+;
+; SocialComponent.php line: 1809
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1817
+social_component_page_revert_to = ""
+;
+; SocialComponent.php line: 1821
+social_component_page_reverted = ""
+;
+; SocialComponent.php line: 1825
+social_component_revert_error = ""
+;
+; SocialComponent.php line: 1896
+social_component_main = ""
+;
+; SocialComponent.php line: 2142
+wiki_js_small = ""
+;
+; SocialComponent.php line: 2143
+wiki_js_medium = ""
+;
+; SocialComponent.php line: 2144
+wiki_js_large = ""
+;
+; SocialComponent.php line: 2145
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2146
+wiki_js_prompt_heading = ""
+;
+; SocialComponent.php line: 2147
+wiki_js_example = ""
+;
+; SocialComponent.php line: 2148
+wiki_js_table_title = ""
+;
+; SocialComponent.php line: 2149
+wiki_js_submit = ""
+;
+; SocialComponent.php line: 2150
+wiki_js_cancel = ""
+;
+; SocialComponent.php line: 2151
+wiki_js_bold = ""
+;
+; SocialComponent.php line: 2152
+wiki_js_italic = ""
+;
+; SocialComponent.php line: 2153
+wiki_js_underline = ""
+;
+; SocialComponent.php line: 2154
+wiki_js_strike = ""
+;
+; SocialComponent.php line: 2155
+wiki_js_heading = ""
+;
+; SocialComponent.php line: 2156
+wiki_js_heading1 = ""
+;
+; SocialComponent.php line: 2157
+wiki_js_heading2 = ""
+;
+; SocialComponent.php line: 2158
+wiki_js_heading3 = ""
+;
+; SocialComponent.php line: 2159
+wiki_js_heading4 = ""
+;
+; SocialComponent.php line: 2160
+wiki_js_bullet = ""
+;
+; SocialComponent.php line: 2161
+wiki_js_enum = ""
+;
+; SocialComponent.php line: 2162
+wiki_js_nowiki = ""
+;
+; SocialComponent.php line: 2163
+wiki_js_add_search = ""
+;
+; SocialComponent.php line: 2164
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2165
+wiki_js_add_wiki_table = ""
+;
+; SocialComponent.php line: 2166
+wiki_js_for_table_cols = ""
+;
+; SocialComponent.php line: 2167
+wiki_js_for_table_rows = ""
+;
+; SocialComponent.php line: 2168
+wiki_js_add_hyperlink = ""
+;
+; SocialComponent.php line: 2169
+wiki_js_link_text = ""
+;
+; SocialComponent.php line: 2170
+wiki_js_link_url = ""
+;
+; SocialComponent.php line: 2171
+wiki_js_placeholder = ""
+;
+; SocialComponent.php line: 2172
+wiki_js_centeraligned = ""
+;
+; SocialComponent.php line: 2173
+wiki_js_rightaligned = ""
+;
+; SocialComponent.php line: 2174
+wiki_js_leftaligned = ""
+;
+; SocialComponent.php line: 2176
+wiki_js_definitionlist_item = ""
+;
+; SocialComponent.php line: 2178
+wiki_js_definitionlist_definition = ""
+;
+; SocialComponent.php line: 2180
+wiki_js_slide_sample_title = ""
+;
+; SocialComponent.php line: 2182
+wiki_js_slide_sample_bullet = ""
+;
+; SocialComponent.php line: 2184
+wiki_js_slide_resource_description = ""
+;
+; SocialComponent.php line: 2222
+social_component_select_crawl = "Chọn thu thập th&ocirc;ng tin"
+;
+; SocialComponent.php line: 2223
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2225
+social_component_select_crawl = "Chọn thu thập th&ocirc;ng tin"
+;
+; SocialComponent.php line: 2227
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2257
+social_component_mix_created = "Tạo ra hỗn hợp "
+;
+; SocialComponent.php line: 2260
+social_component_invalid_name = ""
+;
+; SocialComponent.php line: 2268
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2272
+social_component_mix_deleted = "X&oacute;a kết hợp "
+;
+; SocialComponent.php line: 2291
+social_component_mix_doesnt_exists = "Kết hợp n&agrave;y kh&ocirc;ng tồn tại"
+;
+; SocialComponent.php line: 2299
+social_component_mix_imported = ""
+;
+; SocialComponent.php line: 2313
+social_component_set_index = ""
+;
+; SocialComponent.php line: 2322
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 2328
+social_component_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2346
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 2350
+social_component_share_title = ""
+;
+; SocialComponent.php line: 2352
+social_component_share_description = ""
+;
+; SocialComponent.php line: 2357
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 2408
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2413
+social_component_mix_not_owner = ""
+;
+; SocialComponent.php line: 2423
+social_component_add_crawls = "Cộng th&ecirc;m thu thập"
+;
+; SocialComponent.php line: 2425
+social_component_num_results = "Số kết quả"
+;
+; SocialComponent.php line: 2427
+social_component_del_frag = ""
+;
+; SocialComponent.php line: 2429
+social_component_weight = "Trọng lượng"
+;
+; SocialComponent.php line: 2430
+social_component_name = ""
+;
+; SocialComponent.php line: 2432
+social_component_add_keywords = ""
+;
+; SocialComponent.php line: 2434
+social_component_actions = "H&agrave;nh động"
+;
+; SocialComponent.php line: 2436
+social_component_add_query = "Cộng th&ecirc;m truy vấn"
+;
+; SocialComponent.php line: 2437
+social_component_delete = ""
+;
+; SocialComponent.php line: 2487
+social_component_too_many_fragments = ""
+;
+; SocialComponent.php line: 2498
+social_component_mix_saved = "Kết hợp đ&atilde; được lưu dữ"
+;
+; SystemComponent.php line: 82
+system_component_select_machine = ""
+;
+; SystemComponent.php line: 143
+system_component_machine_added = ""
+;
+; SystemComponent.php line: 147
+system_component_machine_exists = ""
+;
+; SystemComponent.php line: 151
+system_component_machine_incomplete = ""
+;
+; SystemComponent.php line: 158
+system_component_machine_doesnt_exists = ""
+;
+; SystemComponent.php line: 179
+system_component_stop_service_first = ""
+;
+; SystemComponent.php line: 185
+system_component_machine_deleted = ""
+;
+; SystemComponent.php line: 200
+system_component_updatemode_toggled = ""
+;
+; SystemComponent.php line: 246
+system_component_no_machine_log = ""
+;
+; SystemComponent.php line: 270
+system_component_machine_servers_updated = ""
+;
+; SystemComponent.php line: 274
+system_component_machine_no_action = ""
+;
+; SystemComponent.php line: 310
+system_component_select_mode = ""
+;
+; SystemComponent.php line: 351
+system_component_locale_missing_info = ""
+;
+; SystemComponent.php line: 358
+system_component_locale_added = "Miền địa phương th&ecirc;m v&agrave;o"
+;
+; SystemComponent.php line: 365
+system_component_localename_doesnt_exists = "Miền địa phương kh&ocirc;ng tồn tại"
+;
+; SystemComponent.php line: 370
+system_component_localename_deleted = "X&oacute;a miền địa phương"
+;
+; SystemComponent.php line: 376
+system_component_localename_doesnt_exists = "Miền địa phương kh&ocirc;ng tồn tại"
+;
+; SystemComponent.php line: 405
+system_component_locale_updated = ""
+;
+; SystemComponent.php line: 435
+system_component_localestrings_updated = "Chuỗi Địa phương được cập nhật"
+;
+; SystemComponent.php line: 446
+system_component_all_strings = ""
+;
+; SystemComponent.php line: 447
+system_component_missing_strings = ""
+;
+; SystemComponent.php line: 566
+system_component_configure_no_change_db = "Vấn đề cập nhật cơ sở dữ liệu"
+;
+; SystemComponent.php line: 571
+system_component_configure_profile_change = "Hồ sơ được cập nhật"
+;
+; SystemComponent.php line: 574
+system_component_configure_no_change_profile = "C&oacute; sự trở ngaị về việc cập nhật hồ sơ "
+;
+; SystemComponent.php line: 607
+system_component_configure_disable_registration = ""
+;
+; SystemComponent.php line: 609
+system_component_configure_no_activation = ""
+;
+; SystemComponent.php line: 611
+system_component_configure_email_activation = ""
+;
+; SystemComponent.php line: 613
+system_component_configure_admin_activation = ""
+;
+; SystemComponent.php line: 617
+system_component_configure_no_advertisements = ""
+;
+; SystemComponent.php line: 619
+system_component_configure_keyword_advertisements = ""
+;
+; SystemComponent.php line: 621
+system_component_configure_external_advertisements = ""
+;
+; SystemComponent.php line: 704
+captchasettings_element_text_captcha = ""
+;
+; SystemComponent.php line: 706
+captchasettings_element_hash_captcha = ""
+;
+; SystemComponent.php line: 708
+captchasettings_element_image_captcha = ""
+;
+; SystemComponent.php line: 713
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 715
+serversettings_element_zkp_authentication = ""
+;
+; SystemComponent.php line: 720
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 744
+system_component_settings_updated = ""
+;
+; SystemComponent.php line: 747
+system_component_no_update_settings = ""
+;
+; SystemComponent.php line: 788
+system_component_no_resource_folder = ""
+;
+; SystemComponent.php line: 802
+system_component_invalid_filetype = ""
+;
+; SystemComponent.php line: 807
+system_component_file_too_big = ""
+;
+; SystemComponent.php line: 822
+system_component_configure_profile_change = "Hồ sơ được cập nhật"
+;
+; SystemComponent.php line: 826
+system_component_configure_no_change_profile = "C&oacute; sự trở ngaị về việc cập nhật hồ sơ "
+;
+; SystemComponent.php line: 875
+system_component_configure_reset_completed = ""
+;
+; SystemComponent.php line: 878
+system_component_configure_no_change_profile = "C&oacute; sự trở ngaị về việc cập nhật hồ sơ "
+;
+; SystemComponent.php line: 957
+system_component_configure_use_absolute_path = ""
+;
+; SystemComponent.php line: 962
+system_component_configure_configure_diff_base_dir = ""
+;
+; SystemComponent.php line: 993
+system_component_configure_work_dir_set = "C&ocirc;ng việc thiết lập thư mục bị đ&ocirc;ng cứng (Bạn c&oacute; thể cần phải đăng nhập)"
+;
+; SystemComponent.php line: 1004
+system_component_name_your_bot = "Đặt t&ecirc;n cho r&ocirc; b&ocirc; của bạn"
+;
+; SystemComponent.php line: 1029
+system_component_configure_work_profile_made = "Thư mục l&agrave;m việc v&agrave; hồ sơ được tạo ra"
+;
+; SystemComponent.php line: 1033
+system_component_configure_no_set_config = "Kh&ocirc;ng thể cập nhật hồ sơ config.php"
+;
+; SystemComponent.php line: 1040
+system_component_configure_no_create_profile = "Kh&ocirc;ng thể tạo hồ sơ"
+;
+; SystemComponent.php line: 1047
+system_component_configure_work_dir_invalid = "C&ocirc;ng t&aacute;c thư mục kh&ocirc;ng hợp lệ"
+;
+; SystemComponent.php line: 1054
+system_component_configure_work_dir_invalid = "C&ocirc;ng t&aacute;c thư mục kh&ocirc;ng hợp lệ"
+;
+; SystemComponent.php line: 1083
+system_component_configure_profile_change = "Hồ sơ được cập nhật"
+;
+; SystemComponent.php line: 1087
+system_component_configure_no_change_profile = "C&oacute; sự trở ngaị về việc cập nhật hồ sơ "
+;
+; SystemComponent.php line: 1107
+system_component_describe_robot = "Diễn tả r&ocirc; b&ocirc; của bạn"
+;
+; SystemComponent.php line: 1161
+system_component_php_version = ""
+;
+; SystemComponent.php line: 1169
+system_component_no_write_config_php = ""
+;
+; SystemComponent.php line: 1174
+system_component_no_write_work_dir = ""
+;
+; SystemComponent.php line: 1179
+system_component_post_size_small = ""
+;
+; SystemComponent.php line: 1185
+system_component_missing_required = ""
+;
+; SystemComponent.php line: 1209
+system_component_missing_optional = ""
+;
+; SystemComponent.php line: 1215
+system_component_check_passed = "Kiểm tra được th&ocirc;ng qua"
+;
+; SystemComponent.php line: 1220
+system_component_using_local_config = ""
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/controllers
+;
+; MainController.php line: 74
+search_controller_logout_successful = "Tho&aacute;t th&agrave;nh c&ocirc;ng"
+;
+; MainController.php line: 98
+main_controller_download = ""
+;
+; MainController.php line: 115
+main_controller_missing_fields = ""
+;
+; MainController.php line: 150
+main_controller_yioop_download = ""
+;
+; MainController.php line: 151
+main_controller_click_download = ""
+;
+; MainController.php line: 164
+main_controller_url_error = ""
+;
+; MainController.php line: 173
+main_controller_expired_url = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views
+;
+; AdminView.php line: 71
+admin_view_admin = "Quản trị"
+;
+; AdminView.php line: 92
+adminview_auto_logout_one_minute = "Tự động tho&aacute;t trong một ph&uacute;t"
+;
+; CrawlstatusView.php line: 57
+crawlstatus_view_currently_processing = "Hiện tại đang tiến h&agrave;nh"
+;
+; CrawlstatusView.php line: 58
+crawlstatus_view_description = "M&ocirc; tả:"
+;
+; CrawlstatusView.php line: 62
+crawlstatus_view_starting_crawl = "Bắt đầu thu thập dữ liệu mới ..."
+;
+; CrawlstatusView.php line: 66
+managecrawls_element_stop_crawl = "Dừng thu thập th&ocirc;ng tin"
+;
+; CrawlstatusView.php line: 70
+crawlstatus_view_resuming_crawl = "Nối lại thu thập dữ liệu"
+;
+; CrawlstatusView.php line: 74
+managecrawls_element_stop_crawl = "Dừng thu thập th&ocirc;ng tin"
+;
+; CrawlstatusView.php line: 78
+crawlstatus_view_shutdown_queue = "Đ&oacute;ng h&agrave;ng đợi"
+;
+; CrawlstatusView.php line: 81
+crawlstatus_view_closing_dict = "Đ&oacute;ng từ điển thu thập dữ liệu"
+;
+; CrawlstatusView.php line: 84
+crawlstatus_view_run_plugins = ""
+;
+; CrawlstatusView.php line: 92
+managecrawls_element_stop_crawl = "Dừng thu thập th&ocirc;ng tin"
+;
+; CrawlstatusView.php line: 100
+crawlstatus_view_set_index = "C&agrave;i l&agrave;m mục lục"
+;
+; CrawlstatusView.php line: 103
+crawlstatus_view_search_index = "T&igrave;m mục lục"
+;
+; CrawlstatusView.php line: 110
+crawlstatus_view_changeoptions = ""
+;
+; CrawlstatusView.php line: 112
+crawlstatus_view_no_description = ""
+;
+; CrawlstatusView.php line: 117
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 119
+crawlstatus_view_time_started = "Thời gian bắt đầu:"
+;
+; CrawlstatusView.php line: 125
+crawlstatus_view_indexer_memory = ""
+;
+; CrawlstatusView.php line: 127
+crawlstatus_view_scheduler_memory = ""
+;
+; CrawlstatusView.php line: 130
+crawlstatus_view_queue_memory = ""
+;
+; CrawlstatusView.php line: 135
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 139
+crawlstatus_view_fetcher_memory = ""
+;
+; CrawlstatusView.php line: 144
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 147
+crawlstatus_view_webapp_memory = ""
+;
+; CrawlstatusView.php line: 152
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 155
+crawlstatus_view_urls_per_hour = ""
+;
+; CrawlstatusView.php line: 163
+crawlstatus_view_visited_urls = ""
+;
+; CrawlstatusView.php line: 167
+crawlstatus_view_total_urls = ""
+;
+; CrawlstatusView.php line: 170
+crawlstatus_view_most_recent_fetcher = ""
+;
+; CrawlstatusView.php line: 179
+crawlstatus_view_no_fetcher = ""
+;
+; CrawlstatusView.php line: 183
+crawlstatus_view_most_recent_urls = ""
+;
+; CrawlstatusView.php line: 193
+crawlstatus_view_no_recent_urls = ""
+;
+; CrawlstatusView.php line: 196
+crawlstatus_view_previous_crawls = ""
+;
+; CrawlstatusView.php line: 207
+crawlstatus_view_description = "M&ocirc; tả:"
+;
+; CrawlstatusView.php line: 210
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 211
+crawlstatus_view_url_counts = ""
+;
+; CrawlstatusView.php line: 215
+crawlstatus_view_actions = "Những h&agrave;nh động:"
+;
+; CrawlstatusView.php line: 226
+crawlstatus_view_statistics = ""
+;
+; CrawlstatusView.php line: 242
+crawlstatus_view_resume = "Bắt đầu trở lại"
+;
+; CrawlstatusView.php line: 244
+crawlstatus_view_no_resume = ""
+;
+; CrawlstatusView.php line: 251
+crawlstatus_view_set_index = "C&agrave;i l&agrave;m mục lục"
+;
+; CrawlstatusView.php line: 254
+crawlstatus_view_search_index = "T&igrave;m mục lục"
+;
+; CrawlstatusView.php line: 261
+crawlstatus_view_delete = "Xo&aacute;"
+;
+; CrawlstatusView.php line: 269
+crawlstatus_view_no_previous_crawl = ""
+;
+; GroupView.php line: 82
+groupfeed_element_wiki_thread = ""
+;
+; GroupView.php line: 96
+group_view_feed = ""
+;
+; GroupView.php line: 104
+group_view_wiki = ""
+;
+; GroupView.php line: 106
+group_view_user = ""
+;
+; GroupView.php line: 109
+group_view_myfeeds = ""
+;
+; GroupView.php line: 145
+adminview_auto_logout_one_minute = "Tự động tho&aacute;t trong một ph&uacute;t"
+;
+; MachinestatusView.php line: 56
+machinestatus_view_no_monitored = ""
+;
+; MachinestatusView.php line: 60
+machinestatus_media_updatemode = ""
+;
+; MachinestatusView.php line: 73
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 75
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 78
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 80
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 85
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 94
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 96
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 125
+confirm_delete_operation = ""
+;
+; MachinestatusView.php line: 126
+machinestatus_view_delete = ""
+;
+; MachinestatusView.php line: 148
+machinestatus_view_not_configured = ""
+;
+; MachinestatusView.php line: 158
+machinestatus_view_mirrors = ""
+;
+; MachinestatusView.php line: 161
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 176
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 179
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 191
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 193
+machinestatus_view_no_queue_server = ""
+;
+; MachinestatusView.php line: 204
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 207
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 229
+machinestatus_view_no_fetchers = ""
+;
+; MachinestatusView.php line: 241
+machinestatus_view_fetchers = ""
+;
+; MachinestatusView.php line: 248
+machinestatus_view_log = ""
+;
+; NocacheView.php line: 54
+nocache_view_no_cache = "Kh&ocirc;ng t&igrave;m thấy trang gốc m&agrave; bạn muốn t&igrave;m kiếm."
+;
+; NocacheView.php line: 59
+nocache_view_summary_contents = ""
+;
+; RecoverView.php line: 71
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 104
+register_view_new_password = ""
+;
+; RecoverView.php line: 116
+register_view_retypepassword = ""
+;
+; RecoverView.php line: 131
+recover_view_username = ""
+;
+; RecoverView.php line: 146
+register_view_account_recovery = ""
+;
+; RecoverView.php line: 153
+register_view_human_check = ""
+;
+; RecoverView.php line: 185
+register_view_human_check = ""
+;
+; RecoverView.php line: 202
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 211
+recover_view_return = ""
+;
+; RegisterView.php line: 76
+register_view_question0_most = ""
+;
+; RegisterView.php line: 77
+register_view_question0_least = ""
+;
+; RegisterView.php line: 78
+register_view_question0_choices = ""
+;
+; RegisterView.php line: 79
+register_view_question1_most = ""
+;
+; RegisterView.php line: 80
+register_view_question1_least = ""
+;
+; RegisterView.php line: 81
+register_view_question1_choices = ""
+;
+; RegisterView.php line: 82
+register_view_question2_most = ""
+;
+; RegisterView.php line: 83
+register_view_question2_least = ""
+;
+; RegisterView.php line: 84
+register_view_question2_choices = ""
+;
+; RegisterView.php line: 85
+register_view_question3_most = ""
+;
+; RegisterView.php line: 86
+register_view_question3_least = ""
+;
+; RegisterView.php line: 87
+register_view_question3_choices = ""
+;
+; RegisterView.php line: 88
+register_view_question4_most = ""
+;
+; RegisterView.php line: 89
+register_view_question4_least = ""
+;
+; RegisterView.php line: 90
+register_view_question4_choices = ""
+;
+; RegisterView.php line: 91
+register_view_question5_most = ""
+;
+; RegisterView.php line: 92
+register_view_question5_least = ""
+;
+; RegisterView.php line: 93
+register_view_question5_choices = ""
+;
+; RegisterView.php line: 94
+register_view_question6_most = ""
+;
+; RegisterView.php line: 95
+register_view_question6_least = ""
+;
+; RegisterView.php line: 96
+register_view_question6_choices = ""
+;
+; RegisterView.php line: 97
+register_view_question7_most = ""
+;
+; RegisterView.php line: 98
+register_view_question7_least = ""
+;
+; RegisterView.php line: 99
+register_view_question7_choices = ""
+;
+; RegisterView.php line: 100
+register_view_question8_most = ""
+;
+; RegisterView.php line: 101
+register_view_question8_least = ""
+;
+; RegisterView.php line: 102
+register_view_question8_choices = ""
+;
+; RegisterView.php line: 103
+register_view_question9_most = ""
+;
+; RegisterView.php line: 104
+register_view_question9_least = ""
+;
+; RegisterView.php line: 105
+register_view_question9_choices = ""
+;
+; RegisterView.php line: 108
+register_view_recovery1_more = ""
+;
+; RegisterView.php line: 109
+register_view_recovery1_less = ""
+;
+; RegisterView.php line: 110
+register_view_recovery1_choices = ""
+;
+; RegisterView.php line: 111
+register_view_recovery2_more = ""
+;
+; RegisterView.php line: 112
+register_view_recovery2_less = ""
+;
+; RegisterView.php line: 113
+register_view_recovery2_choices = ""
+;
+; RegisterView.php line: 114
+register_view_recovery3_more = ""
+;
+; RegisterView.php line: 115
+register_view_recovery3_less = ""
+;
+; RegisterView.php line: 116
+register_view_recovery3_choices = ""
+;
+; RegisterView.php line: 117
+register_view_recovery4_more = ""
+;
+; RegisterView.php line: 118
+register_view_recovery4_less = ""
+;
+; RegisterView.php line: 119
+register_view_recovery4_choices = ""
+;
+; RegisterView.php line: 120
+register_view_recovery5_more = ""
+;
+; RegisterView.php line: 121
+register_view_recovery5_less = ""
+;
+; RegisterView.php line: 122
+register_view_recovery5_choices = ""
+;
+; RegisterView.php line: 123
+register_view_recovery6_more = ""
+;
+; RegisterView.php line: 124
+register_view_recovery6_less = ""
+;
+; RegisterView.php line: 125
+register_view_recovery6_choices = ""
+;
+; RegisterView.php line: 153
+register_view_create_account = ""
+;
+; RegisterView.php line: 190
+register_view_firstname = ""
+;
+; RegisterView.php line: 205
+register_view_lastname = ""
+;
+; RegisterView.php line: 219
+register_view_username = ""
+;
+; RegisterView.php line: 232
+register_view_email = ""
+;
+; RegisterView.php line: 246
+register_view_password = ""
+;
+; RegisterView.php line: 261
+register_view_retypepassword = ""
+;
+; RegisterView.php line: 277
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 281
+register_view_human_check = ""
+;
+; RegisterView.php line: 283
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 315
+register_view_human_check = ""
+;
+; RegisterView.php line: 329
+register_view_i_agree = ""
+;
+; RegisterView.php line: 331
+register_view_terms = ""
+;
+; RegisterView.php line: 333
+register_view_and = ""
+;
+; RegisterView.php line: 335
+register_view_privacy = ""
+;
+; RegisterView.php line: 336
+register_view_period = ""
+;
+; RegisterView.php line: 346
+register_view_create_account = ""
+;
+; RegisterView.php line: 355
+register_view_return = ""
+;
+; SearchView.php line: 92
+search_view_title = ""
+;
+; SearchView.php line: 119
+search_view_input_label = "Đ&aacute;nh v&agrave;o những cụm từ m&agrave; bạn muốn t&igrave;m trang web"
+;
+; SearchView.php line: 123
+search_view_input_placeholder = "Đ&aacute;nh v&agrave;o c&aacute;i m&agrave; bạn muốn t&igrave;m"
+;
+; SearchView.php line: 126
+search_view_search = "T&igrave;m Kiếm"
+;
+; SearchView.php line: 155
+search_view_no_index_set = ""
+;
+; SearchView.php line: 164
+search_view_more_statistics = ""
+;
+; SearchView.php line: 201
+search_view_calculated = "%s gi&acirc;y."
+;
+; SearchView.php line: 203
+search_view_results = "Cho kết quả tứ %s - %s của %s"
+;
+; SearchView.php line: 229
+search_view_thesaurus_results = ""
+;
+; SearchView.php line: 339
+search_view_word_cloud = ""
+;
+; SearchView.php line: 380
+search_view_cache = "Trang&nbsp;gốc"
+;
+; SearchView.php line: 382
+search_view_as_text = "Trang&nbsp;Web&nbsp;Bắng Chữ"
+;
+; SearchView.php line: 393
+search_view_similar = "TÆ°Æ¡ng&nbsp;Tá»±"
+;
+; SearchView.php line: 402
+search_view_inlink = ""
+;
+; SearchView.php line: 419
+search_view_rank = "Thứ Tự: %s"
+;
+; SearchView.php line: 421
+search_view_relevancy = "Th&iacute;ch hợp: %s"
+;
+; SearchView.php line: 423
+search_view_proximity = "Gần: %s"
+;
+; SearchView.php line: 427
+search_view_thesaurus_score = ""
+;
+; SearchView.php line: 436
+search_view_score = "Điểm: %s"
+;
+; SettingsView.php line: 66
+settings_view_settings = "Sự sắp đặt"
+;
+; SettingsView.php line: 73
+settings_view_results_per_page = "Kết quả trong mỗi trang"
+;
+; SettingsView.php line: 79
+settings_view_open_in_tabs = ""
+;
+; SettingsView.php line: 86
+settings_view_search_index = "T&igrave;m mục lục:"
+;
+; SettingsView.php line: 92
+settings_view_language_label = "Ng&ocirc;n ngữ:"
+;
+; SettingsView.php line: 106
+settings_view_return = ""
+;
+; SettingsView.php line: 109
+settings_view_save = "Giữ sự sắp đặt"
+;
+; SettingsView.php line: 116
+settings_install_search_plugin = ""
+;
+; SigninView.php line: 68
+signin_view_signin = "Đăng nhập"
+;
+; SigninView.php line: 81
+sigin_view_signing_in = ""
+;
+; SigninView.php line: 84
+sigin_view_login_failed = ""
+;
+; SigninView.php line: 92
+signin_view_username = "T&ecirc;n đăng nhập "
+;
+; SigninView.php line: 99
+signin_view_password = "Mật khẩu"
+;
+; SigninView.php line: 109
+signin_view_login = "Đăng nhập"
+;
+; SigninView.php line: 124
+signin_view_recover_password = ""
+;
+; SigninView.php line: 129
+signin_view_create_account = ""
+;
+; SigninView.php line: 133
+signin_view_return = ""
+;
+; StaticView.php line: 68
+static_view_title = ""
+;
+; StatisticsView.php line: 75
+statistics_view_statistics = ""
+;
+; StatisticsView.php line: 80
+statistics_view_calculating = ""
+;
+; StatisticsView.php line: 94
+statistics_view_error_codes = ""
+;
+; StatisticsView.php line: 95
+statistics_view_sizes = ""
+;
+; StatisticsView.php line: 96
+statistics_view_links_per_page = ""
+;
+; StatisticsView.php line: 97
+statistics_view_page_date = ""
+;
+; StatisticsView.php line: 98
+statistics_view_dns_time = ""
+;
+; StatisticsView.php line: 99
+statistics_view_download_time = ""
+;
+; StatisticsView.php line: 100
+statistics_view_top_level_domain = ""
+;
+; StatisticsView.php line: 101
+statistics_view_file_extension = ""
+;
+; StatisticsView.php line: 102
+statistics_view_media_type = ""
+;
+; StatisticsView.php line: 103
+statistics_view_language = ""
+;
+; StatisticsView.php line: 104
+statistics_view_server = ""
+;
+; StatisticsView.php line: 105
+statistics_view_os = ""
+;
+; StatisticsView.php line: 108
+statistics_view_general_info = ""
+;
+; StatisticsView.php line: 109
+statistics_view_description = ""
+;
+; StatisticsView.php line: 111
+statistics_view_timestamp = ""
+;
+; StatisticsView.php line: 113
+statistics_view_crawl_date = ""
+;
+; StatisticsView.php line: 115
+statistics_view_pages = ""
+;
+; StatisticsView.php line: 117
+statistics_view_url = ""
+;
+; StatisticsView.php line: 120
+statistics_view_number_hosts = ""
+;
+; SuggestView.php line: 69
+suggest_view_suggest_url = ""
+;
+; SuggestView.php line: 71
+suggest_view_instructions = ""
+;
+; SuggestView.php line: 95
+suggest_view_url = ""
+;
+; SuggestView.php line: 109
+register_view_human_check = ""
+;
+; SuggestView.php line: 143
+suggest_view_human_check = ""
+;
+; SuggestView.php line: 164
+suggest_view_submit_url = ""
+;
+; SuggestView.php line: 173
+suggest_view_return = ""
+;
+; View.php line: 61
+view_locale_version14 = ""
+;
+; View.php line: 93
+view_logo_alt_text = ""
+;
+; WikiView.php line: 86
+wiki_view_read = ""
+;
+; WikiView.php line: 87
+wiki_view_edit = ""
+;
+; WikiView.php line: 90
+wiki_view_pages = ""
+;
+; WikiView.php line: 135
+wiki_view_feed = ""
+;
+; WikiView.php line: 136
+wiki_view_wiki = ""
+;
+; WikiView.php line: 160
+adminview_auto_logout_one_minute = "Tự động tho&aacute;t trong một ph&uacute;t"
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/elements
+;
+; ActivityElement.php line: 56
+activity_element_activities = "Những hoạt động"
+;
+; AppearanceElement.php line: 71
+appearance_element_use_wiki_landing = ""
+;
+; AppearanceElement.php line: 77
+appearance_element_background_color = ""
+;
+; AppearanceElement.php line: 84
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 91
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 99
+appearance_element_foreground_color = ""
+;
+; AppearanceElement.php line: 104
+appearance_element_topbar_color = ""
+;
+; AppearanceElement.php line: 109
+appearance_element_sidebar_color = ""
+;
+; AppearanceElement.php line: 115
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 122
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 132
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 139
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 148
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 155
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 163
+appearance_element_toolbar = ""
+;
+; AppearanceElement.php line: 174
+appearance_element_site_timezone = ""
+;
+; AppearanceElement.php line: 179
+appearance_element_cookie_name = ""
+;
+; AppearanceElement.php line: 184
+appearance_element_token_name = ""
+;
+; AppearanceElement.php line: 189
+appearance_element_auxiliary_css = ""
+;
+; AppearanceElement.php line: 194
+appearance_element_reset_customizations = ""
+;
+; AppearanceElement.php line: 199
+appearance_element_save = ""
+;
+; ConfigureElement.php line: 72
+configure_element_work_directory = "T&igrave;m kiếm sự hướng dẫn cơ cấu động cơ"
+;
+; ConfigureElement.php line: 76
+configure_element_load_or_create = "Tải hoặc tạo "
+;
+; ConfigureElement.php line: 92
+configure_element_component_check = ""
+;
+; ConfigureElement.php line: 96
+configure_element_profile_settings = "Những c&agrave;i đặt tiểu sử "
+;
+; ConfigureElement.php line: 101
+configure_element_default_language = "Ng&ocirc;n ngữ thiếu s&oacute;t:"
+;
+; ConfigureElement.php line: 108
+configure_element_debug_display = ""
+;
+; ConfigureElement.php line: 114
+configure_element_error_info = "Th&ocirc;ng tin về lỗi"
+;
+; ConfigureElement.php line: 120
+configure_element_query_info = "Th&ocirc;ng tin thắc mắc"
+;
+; ConfigureElement.php line: 126
+configure_element_test_info = "Th&ocirc;ng tin về kiểm tra"
+;
+; ConfigureElement.php line: 131
+configure_element_site_access = ""
+;
+; ConfigureElement.php line: 136
+configure_element_web_access = ""
+;
+; ConfigureElement.php line: 141
+configure_element_rss_access = ""
+;
+; ConfigureElement.php line: 146
+configure_element_api_access = ""
+;
+; ConfigureElement.php line: 150
+configure_element_crawl_robot = ""
+;
+; ConfigureElement.php line: 152
+configure_element_robot_name = ""
+;
+; ConfigureElement.php line: 160
+configure_element_robot_instance = ""
+;
+; ConfigureElement.php line: 166
+configure_element_robot_description = "M&ocirc; tả r&ocirc;-bốt"
+;
+; ConfigureElement.php line: 175
+serversettings_element_save = ""
+;
+; CrawloptionsElement.php line: 59
+crawloptions_element_back_to_manage = "Trở lại"
+;
+; CrawloptionsElement.php line: 62
+crawloptions_element_modify_active_crawl = ""
+;
+; CrawloptionsElement.php line: 64
+crawloptions_element_edit_crawl_options = ""
+;
+; CrawloptionsElement.php line: 87
+crawloptions_element_web_crawl = ""
+;
+; CrawloptionsElement.php line: 97
+crawloptions_element_archive_crawl = ""
+;
+; CrawloptionsElement.php line: 104
+crawloptions_element_load_options = ""
+;
+; CrawloptionsElement.php line: 109
+crawloptions_element_crawl_order = ""
+;
+; CrawloptionsElement.php line: 118
+crawloptions_element_restrict_by_url = ""
+;
+; CrawloptionsElement.php line: 126
+crawloptions_element_allowed_to_crawl = ""
+;
+; CrawloptionsElement.php line: 132
+crawloptions_element_disallowed_and_quota_sites = ""
+;
+; CrawloptionsElement.php line: 141
+crawloptions_element_seed_sites = ""
+;
+; CrawloptionsElement.php line: 145
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 156
+crawloptions_element_inject_sites = ""
+;
+; CrawloptionsElement.php line: 160
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 177
+crawloptions_element_reindex_crawl = ""
+;
+; CrawloptionsElement.php line: 185
+crawloptions_element_need_api_for_mix = ""
+;
+; CrawloptionsElement.php line: 193
+crawloptions_element_save_options = "Lưu những lựa chọn"
+;
+; EditclassifierElement.php line: 62
+editclassifier_back = ""
+;
+; EditclassifierElement.php line: 64
+editclassifier_edit_classifier = ""
+;
+; EditclassifierElement.php line: 76
+editclassifier_classifier_label = ""
+;
+; EditclassifierElement.php line: 81
+editclassifier_change = ""
+;
+; EditclassifierElement.php line: 86
+editclassifier_statistics = ""
+;
+; EditclassifierElement.php line: 87
+editclassifier_positive_examples = ""
+;
+; EditclassifierElement.php line: 90
+editclassifier_negative_examples = ""
+;
+; EditclassifierElement.php line: 93
+editclassifier_accuracy = ""
+;
+; EditclassifierElement.php line: 98
+crawl_component_na = ""
+;
+; EditclassifierElement.php line: 103
+editclassifier_update = ""
+;
+; EditclassifierElement.php line: 104
+editclassifier_add_examples = ""
+;
+; EditclassifierElement.php line: 113
+editclassifier_source = ""
+;
+; EditclassifierElement.php line: 117
+editclassifier_default_crawl = ""
+;
+; EditclassifierElement.php line: 127
+editclassifier_label_by_hand = ""
+;
+; EditclassifierElement.php line: 129
+editclassifier_all_in_class = ""
+;
+; EditclassifierElement.php line: 131
+editclassifier_none_in_class = ""
+;
+; EditclassifierElement.php line: 136
+editclassifier_keywords = ""
+;
+; EditclassifierElement.php line: 145
+editclassifier_load = ""
+;
+; EditclassifierElement.php line: 151
+editclassifier_finalize = ""
+;
+; EditclassifierElement.php line: 159
+editclassifier_no_documents = ""
+;
+; EditlocalesElement.php line: 62
+editlocales_element_back_to_manage = "Trở lại"
+;
+; EditlocalesElement.php line: 64
+editlocales_element_edit_locale = ""
+;
+; EditlocalesElement.php line: 78
+editlocales_element_show = ""
+;
+; EditlocalesElement.php line: 82
+editlocales_element_filter = ""
+;
+; EditlocalesElement.php line: 87
+editlocales_element_go = ""
+;
+; EditlocalesElement.php line: 91
+editlocales_element_no_matching = ""
+;
+; EditlocalesElement.php line: 127
+editlocales_element_save = ""
+;
+; EditmixElement.php line: 57
+editmix_element_back_to_mix = ""
+;
+; EditmixElement.php line: 59
+mixcrawls_element_edit_mix = ""
+;
+; EditmixElement.php line: 70
+mixcrawls_element_mix_name = ""
+;
+; EditmixElement.php line: 76
+mixcrawls_element_mix_components = ""
+;
+; EditmixElement.php line: 82
+mixcrawls_element_too_many = ""
+;
+; EditmixElement.php line: 83
+mixcrawls_element_add_fragment = ""
+;
+; EditmixElement.php line: 88
+mixcrawls_element_save_button = ""
+;
+; FooterElement.php line: 58
+footer_element_blog = ""
+;
+; FooterElement.php line: 60
+footer_element_privacy = ""
+;
+; FooterElement.php line: 62
+footer_element_terms = ""
+;
+; FooterElement.php line: 64
+footer_element_tools = ""
+;
+; FooterElement.php line: 66
+footer_element_bot = ""
+;
+; FooterElement.php line: 71
+footer_element_developed_seek_quarry = ""
+;
+; FooterElement.php line: 74
+footer_element_copyright_site = ""
+;
+; FooterElement.php line: 76
+footer_element_this_search_engine = ""
+;
+; GroupfeedElement.php line: 86
+groupfeed_element_add_group = ""
+;
+; GroupfeedElement.php line: 90
+groupfeed_element_request_add = ""
+;
+; GroupfeedElement.php line: 116
+groupfeed_element_wiki_page = ""
+;
+; GroupfeedElement.php line: 118
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 121
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 131
+groupfeed_element_group_activity = ""
+;
+; GroupfeedElement.php line: 135
+groupfeed_element_wiki_thread = ""
+;
+; GroupfeedElement.php line: 154
+groupfeed_element_feed = ""
+;
+; GroupfeedElement.php line: 159
+group_view_wiki = ""
+;
+; GroupfeedElement.php line: 161
+groupfeed_element_user = ""
+;
+; GroupfeedElement.php line: 205
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 240
+manageaccount_element_group_wiki = ""
+;
+; GroupfeedElement.php line: 241
+manageaccount_element_group_stats = ""
+;
+; GroupfeedElement.php line: 246
+manageaccount_element_last_post = ""
+;
+; GroupfeedElement.php line: 290
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 300
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 313
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 319
+groupfeed_element_no_posts_yet = ""
+;
+; GroupfeedElement.php line: 324
+groupfeed_element_thread_no_exist = ""
+;
+; GroupfeedElement.php line: 357
+groupfeed_element_edit = ""
+;
+; GroupfeedElement.php line: 362
+groupfeed_element_delete = ""
+;
+; GroupfeedElement.php line: 384
+groupfeed_element_num_posts = ""
+;
+; GroupfeedElement.php line: 394
+groupfeed_element_num_views = ""
+;
+; GroupfeedElement.php line: 419
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 421
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 437
+groupfeed_element_last_edited = ""
+;
+; GroupfeedElement.php line: 453
+groupfeed_element_post_vote = ""
+;
+; GroupfeedElement.php line: 480
+groupfeed_element_last_post_info = ""
+;
+; GroupfeedElement.php line: 496
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 550
+fileupload_helper_drag_textarea = ""
+;
+; GroupfeedElement.php line: 551
+fileupload_helper_click_textarea = ""
+;
+; GroupfeedElement.php line: 575
+groupfeed_element_add_comment = ""
+;
+; GroupfeedElement.php line: 589
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 627
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 634
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 647
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 682
+groupfeed_element_edit_post = ""
+;
+; GroupfeedElement.php line: 685
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 690
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 703
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 731
+groupfeed_element_no_longer_update = ""
+;
+; MachinelogElement.php line: 57
+machinelog_element_back_to_manage = ""
+;
+; MachinelogElement.php line: 62
+machinelog_element_filter = ""
+;
+; MachinelogElement.php line: 69
+machinelog_element_log_file = ""
+;
+; MachinelogElement.php line: 74
+machinelog_element_refresh_off = ""
+;
+; MachinelogElement.php line: 78
+machinelog_element_refresh_on = ""
+;
+; ManageaccountElement.php line: 64
+manageaccount_element_edit_or_no_text = ""
+;
+; ManageaccountElement.php line: 73
+manageaccount_element_welcome = ""
+;
+; ManageaccountElement.php line: 75
+manageaccount_element_what_can_do = ""
+;
+; ManageaccountElement.php line: 76
+manageaccount_element_account_details = ""
+;
+; ManageaccountElement.php line: 107
+manageaccounts_element_icon = ""
+;
+; ManageaccountElement.php line: 117
+manageusers_element_username = "T&ecirc;n sử dụng:"
+;
+; ManageaccountElement.php line: 124
+manageusers_element_firstname = ""
+;
+; ManageaccountElement.php line: 130
+manageusers_element_lastname = ""
+;
+; ManageaccountElement.php line: 136
+manageusers_element_email = ""
+;
+; ManageaccountElement.php line: 146
+manageaccount_element_is_advertiser = ""
+;
+; ManageaccountElement.php line: 159
+manageaccount_element_password = ""
+;
+; ManageaccountElement.php line: 166
+manageaccount_element_new_password = "Mật khẩu mới:"
+;
+; ManageaccountElement.php line: 172
+manageaccount_element_retype_password = "Đ&aacute;nh lại mật khẩu:"
+;
+; ManageaccountElement.php line: 184
+manageaccount_element_save = "LÆ°u"
+;
+; ManageaccountElement.php line: 190
+manageaccount_element_search_lang_settings = ""
+;
+; ManageaccountElement.php line: 195
+manageaccount_element_crawl_and_index = ""
+;
+; ManageaccountElement.php line: 196
+manageaccount_element_crawl_info = ""
+;
+; ManageaccountElement.php line: 197
+manageaccount_element_num_crawls = ""
+;
+; ManageaccountElement.php line: 200
+manageaccount_element_manage_crawls = ""
+;
+; ManageaccountElement.php line: 205
+manageaccount_element_groups_and_feeds = ""
+;
+; ManageaccountElement.php line: 206
+manageaccount_element_group_info = ""
+;
+; ManageaccountElement.php line: 208
+manageaccount_element_num_groups = ""
+;
+; ManageaccountElement.php line: 211
+manageaccount_element_num_group = ""
+;
+; ManageaccountElement.php line: 224
+manageaccount_element_group_wiki = ""
+;
+; ManageaccountElement.php line: 225
+manageaccount_element_group_stats = ""
+;
+; ManageaccountElement.php line: 229
+manageaccount_element_last_post = ""
+;
+; ManageaccountElement.php line: 239
+manageaccount_element_manage_all_groups = ""
+;
+; ManageaccountElement.php line: 241
+manageaccount_element_go_to_group_feed = ""
+;
+; ManageaccountElement.php line: 242
+manageaccount_element_crawl_mixes = ""
+;
+; ManageaccountElement.php line: 243
+manageaccount_element_mixes_info = ""
+;
+; ManageaccountElement.php line: 245
+manageaccount_element_num_mixes = ""
+;
+; ManageaccountElement.php line: 248
+manageaccount_element_num_mix = ""
+;
+; ManageaccountElement.php line: 252
+manageaccount_element_manage_mixes = ""
+;
+; ManageadvertisementsElement.php line: 58
+manageadvertisements_element_list = ""
+;
+; ManageadvertisementsElement.php line: 65
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 70
+manageadvertisements_element_username = ""
+;
+; ManageadvertisementsElement.php line: 73
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 75
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 76
+manageadvertisements_element_dates = ""
+;
+; ManageadvertisementsElement.php line: 77
+manageadvertisements_element_viewclicks = ""
+;
+; ManageadvertisementsElement.php line: 80
+manageadvertisements_element_status = ""
+;
+; ManageadvertisementsElement.php line: 82
+manageadvertisements_element_actions = ""
+;
+; ManageadvertisementsElement.php line: 111
+manageadvertisements_element_active = ""
+;
+; ManageadvertisementsElement.php line: 113
+manageadvertisements_element_deactivated = ""
+;
+; ManageadvertisementsElement.php line: 115
+manageadvertisements_element_suspended = ""
+;
+; ManageadvertisementsElement.php line: 117
+manageadvertisements_element_completed = ""
+;
+; ManageadvertisementsElement.php line: 144
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 147
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 157
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 161
+manageadvertisements_element_deactivate = ""
+;
+; ManageadvertisementsElement.php line: 166
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 170
+manageadvertisements_element_suspend = ""
+;
+; ManageadvertisementsElement.php line: 176
+manageadvertisements_element_reconfirm = ""
+;
+; ManageadvertisementsElement.php line: 180
+manageadvertisements_element_reactivate = ""
+;
+; ManageadvertisementsElement.php line: 225
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 227
+manageadvertisement_element_ad_info = ""
+;
+; ManageadvertisementsElement.php line: 231
+manageadvertisement_element_purchase_ad = ""
+;
+; ManageadvertisementsElement.php line: 250
+manageadvertisement_element_ad_user = ""
+;
+; ManageadvertisementsElement.php line: 263
+manageadvertisement_element_displayname = ""
+;
+; ManageadvertisementsElement.php line: 282
+manageadvertisement_element_text = ""
+;
+; ManageadvertisementsElement.php line: 302
+manageadvertisement_element_ad_url = ""
+;
+; ManageadvertisementsElement.php line: 323
+manageeadvertisement_element_ad_duration = ""
+;
+; ManageadvertisementsElement.php line: 339
+manageeadvertisement_element_start_day = ""
+;
+; ManageadvertisementsElement.php line: 344
+manageeadvertisement_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 349
+manageadvertisement_element_keyword_help = ""
+;
+; ManageadvertisementsElement.php line: 363
+manageadvertisement_element_keyword_bid_amount = ""
+;
+; ManageadvertisementsElement.php line: 370
+manageadvertisement_element_expensive_word = ""
+;
+; ManageadvertisementsElement.php line: 387
+manageadvertisement_element_calculate_bid = ""
+;
+; ManageadvertisementsElement.php line: 407
+manageadvertisement_element_update = ""
+;
+; ManageadvertisementsElement.php line: 416
+manageadvertisement_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 427
+manageadvertisement_element_card_number = ""
+;
+; ManageadvertisementsElement.php line: 438
+manageadvertisement_element_cvc = ""
+;
+; ManageadvertisementsElement.php line: 447
+manageadvertisement_element_expiration = ""
+;
+; ManageadvertisementsElement.php line: 465
+manageadvertisement_element_charge_warning = ""
+;
+; ManageadvertisementsElement.php line: 468
+manageadvertisement_element_program_terms = ""
+;
+; ManageadvertisementsElement.php line: 475
+manageadvertisement_element_edit_ad = ""
+;
+; ManageadvertisementsElement.php line: 479
+manageadvertisement_element_purchase = ""
+;
+; ManageadvertisementsElement.php line: 500
+manageadvertisement_element_preview = ""
+;
+; ManageadvertisementsElement.php line: 538
+manageadvertisements_element_search_advertisement = ""
+;
+; ManageadvertisementsElement.php line: 540
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 542
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 543
+manageadvertisements_element_description = ""
+;
+; ManageadvertisementsElement.php line: 544
+manageadvertisements_element_destination_url = ""
+;
+; ManageadvertisementsElement.php line: 545
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 546
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 547
+manageadvertisements_element_start_date = ""
+;
+; ManageadvertisementsElement.php line: 548
+manageadvertisements_element_end_date = ""
+;
+; ManageclassifiersElement.php line: 66
+manageclassifiers_available_classifiers = ""
+;
+; ManageclassifiersElement.php line: 74
+manageclassifiers_label_col = ""
+;
+; ManageclassifiersElement.php line: 77
+manageclassifiers_positive_col = ""
+;
+; ManageclassifiersElement.php line: 78
+manageclassifiers_negative_col = ""
+;
+; ManageclassifiersElement.php line: 82
+manageclassifiers_actions_col = ""
+;
+; ManageclassifiersElement.php line: 100
+manageclassifiers_edit = ""
+;
+; ManageclassifiersElement.php line: 103
+manageclassifiers_finalized = ""
+;
+; ManageclassifiersElement.php line: 109
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 111
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 116
+manageclassifiers_finalizing = ""
+;
+; ManageclassifiersElement.php line: 120
+confirm_delete_operation = ""
+;
+; ManageclassifiersElement.php line: 123
+manageclassifiers_delete = ""
+;
+; ManageclassifiersElement.php line: 155
+manageclassifiers_manage_classifiers = ""
+;
+; ManageclassifiersElement.php line: 165
+manageclassifiers_classifier_name = ""
+;
+; ManageclassifiersElement.php line: 170
+manageclassifiers_create_button = ""
+;
+; ManageclassifiersElement.php line: 185
+manageclassifiers_element_search = ""
+;
+; ManageclassifiersElement.php line: 186
+manageclassifiers_element_create_form = ""
+;
+; ManageclassifiersElement.php line: 187
+manageclassifiers_classifier_name = ""
+;
+; ManagecrawlsElement.php line: 51
+managecrawls_element_create_crawl = ""
+;
+; ManagecrawlsElement.php line: 60
+managecrawls_element_description = ""
+;
+; ManagecrawlsElement.php line: 67
+managecrawls_element_start_new_crawl = ""
+;
+; ManagecrawlsElement.php line: 71
+managecrawls_element_options = ""
+;
+; ManagecrawlsElement.php line: 77
+managecrawls_element_awaiting_status = ""
+;
+; ManagecrawlsElement.php line: 95
+managecrawls_element_up_longer_update = ""
+;
+; ManagegroupsElement.php line: 71
+managegroups_element_not_my_groups = ""
+;
+; ManagegroupsElement.php line: 73
+managegroups_element_groups = ""
+;
+; ManagegroupsElement.php line: 82
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 83
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 85
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 86
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 87
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 88
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 90
+managegroups_element_actions = ""
+;
+; ManagegroupsElement.php line: 196
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 200
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 214
+manageaccount_element_group_wiki = ""
+;
+; ManagegroupsElement.php line: 229
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 233
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 238
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 243
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 249
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 254
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 263
+managegroups_element_decline = ""
+;
+; ManagegroupsElement.php line: 265
+managegroups_element_unsubscribe = ""
+;
+; ManagegroupsElement.php line: 270
+confirm_delete_operation = ""
+;
+; ManagegroupsElement.php line: 273
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 303
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 304
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 306
+managegroups_element_create_group = ""
+;
+; ManagegroupsElement.php line: 310
+managegroups_element_add_group = ""
+;
+; ManagegroupsElement.php line: 327
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 338
+managegroups_element_browse = ""
+;
+; ManagegroupsElement.php line: 348
+managegroups_element_register = ""
+;
+; ManagegroupsElement.php line: 355
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 362
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 369
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 381
+managegroups_element_group_users = ""
+;
+; ManagegroupsElement.php line: 385
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 412
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 414
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 423
+managegroups_element_activate = ""
+;
+; ManagegroupsElement.php line: 429
+managegroups_element_ban = ""
+;
+; ManagegroupsElement.php line: 435
+managegroups_element_unban = ""
+;
+; ManagegroupsElement.php line: 443
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 471
+managegroups_element_filter = ""
+;
+; ManagegroupsElement.php line: 492
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 503
+managegroups_element_save = ""
+;
+; ManagegroupsElement.php line: 533
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 534
+managegroups_element_invite_users_group = ""
+;
+; ManagegroupsElement.php line: 546
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 554
+managegroups_element_usernames = ""
+;
+; ManagegroupsElement.php line: 561
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 580
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 581
+managegroups_element_transfer_group_owner = ""
+;
+; ManagegroupsElement.php line: 593
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 601
+managegroups_element_new_group_owner = ""
+;
+; ManagegroupsElement.php line: 608
+managegroups_element_change_owner = ""
+;
+; ManagegroupsElement.php line: 627
+managegroups_element_discover_groups = ""
+;
+; ManagegroupsElement.php line: 631
+managegroups_element_search_group = ""
+;
+; ManagegroupsElement.php line: 633
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 635
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 636
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 637
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 639
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 641
+managegroups_element_post_lifetime = ""
+;
+; ManagelocalesElement.php line: 62
+managelocales_element_locale_list = ""
+;
+; ManagelocalesElement.php line: 72
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 75
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 76
+managelocales_element_writingmode = "C&aacute;ch thức viết"
+;
+; ManagelocalesElement.php line: 77
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 81
+managelocales_element_percenttranslated = "Phần trăm đ&atilde; được phi&ecirc;n dịch"
+;
+; ManagelocalesElement.php line: 82
+managelocales_element_actions = ""
+;
+; ManagelocalesElement.php line: 102
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 103
+managelocales_element_false = ""
+;
+; ManagelocalesElement.php line: 110
+managelocales_element_edit = ""
+;
+; ManagelocalesElement.php line: 115
+confirm_delete_operation = ""
+;
+; ManagelocalesElement.php line: 116
+managelocales_element_delete = ""
+;
+; ManagelocalesElement.php line: 137
+manageloecales_element_add_locale_form = ""
+;
+; ManagelocalesElement.php line: 138
+managelocales_element_locale_info = ""
+;
+; ManagelocalesElement.php line: 140
+managelocales_element_add_locale = ""
+;
+; ManagelocalesElement.php line: 161
+managelocales_element_localenamelabel = ""
+;
+; ManagelocalesElement.php line: 174
+managelocales_element_localetaglabel = ""
+;
+; ManagelocalesElement.php line: 180
+managelocales_element_writingmodelabel = "C&aacute;ch thức viết:"
+;
+; ManagelocalesElement.php line: 190
+managelocales_element_localeenabled = ""
+;
+; ManagelocalesElement.php line: 201
+managelocales_element_submit = ""
+;
+; ManagelocalesElement.php line: 219
+managelocales_element_search_locales = ""
+;
+; ManagelocalesElement.php line: 220
+managelocales_element_addlocale_form = ""
+;
+; ManagelocalesElement.php line: 222
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 223
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 224
+managelocales_element_writingmode = "C&aacute;ch thức viết"
+;
+; ManagelocalesElement.php line: 225
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 231
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 232
+managelocales_element_false = ""
+;
+; ManagemachinesElement.php line: 56
+managemachines_element_add_machine = ""
+;
+; ManagemachinesElement.php line: 67
+managemachines_element_machine_name = ""
+;
+; ManagemachinesElement.php line: 72
+managemachines_element_machineurl = ""
+;
+; ManagemachinesElement.php line: 76
+managemachines_element_is_mirror = ""
+;
+; ManagemachinesElement.php line: 81
+managemachines_element_parent_name = ""
+;
+; ManagemachinesElement.php line: 87
+managemachines_element_has_queueserver = ""
+;
+; ManagemachinesElement.php line: 91
+managemachines_element_num_fetchers = ""
+;
+; ManagemachinesElement.php line: 96
+managemachines_element_submit = ""
+;
+; ManagemachinesElement.php line: 101
+managemachines_element_machine_info = ""
+;
+; ManagemachinesElement.php line: 105
+managemachines_element_awaiting_status = ""
+;
+; ManagemachinesElement.php line: 123
+managemachines_element_no_longer_update = ""
+;
+; ManagerolesElement.php line: 59
+manageroles_element_roles = ""
+;
+; ManagerolesElement.php line: 67
+manageroles_element_rolename = "T&ecirc;n chức vụ:"
+;
+; ManagerolesElement.php line: 68
+manageroles_element_actions = ""
+;
+; ManagerolesElement.php line: 94
+manageroles_element_edit = ""
+;
+; ManagerolesElement.php line: 99
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 103
+confirm_delete_operation = ""
+;
+; ManagerolesElement.php line: 106
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 140
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 141
+manageroles_element_role_info = ""
+;
+; ManagerolesElement.php line: 143
+manageroles_element_add_role = "Th&ecirc;m chức vụ"
+;
+; ManagerolesElement.php line: 154
+manageroles_element_rolename = "T&ecirc;n chức vụ:"
+;
+; ManagerolesElement.php line: 167
+manageroles_element_role_activities = ""
+;
+; ManagerolesElement.php line: 175
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 183
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 203
+manageroles_element_save = ""
+;
+; ManagerolesElement.php line: 220
+manageroles_element_search_role = ""
+;
+; ManagerolesElement.php line: 221
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 223
+manageroles_element_rolename = "T&ecirc;n chức vụ:"
+;
+; ManageusersElement.php line: 59
+manageusers_element_users = ""
+;
+; ManageusersElement.php line: 68
+manageusers_element_username = "T&ecirc;n sử dụng:"
+;
+; ManageusersElement.php line: 70
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 71
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 72
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 73
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 75
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 76
+manageusers_element_actions = ""
+;
+; ManageusersElement.php line: 141
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 145
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 151
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 155
+confirm_delete_operation = ""
+;
+; ManageusersElement.php line: 158
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 200
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 201
+manageusers_element_user_info = ""
+;
+; ManageusersElement.php line: 203
+manageusers_element_add_user = ""
+;
+; ManageusersElement.php line: 228
+manageusers_element_username = "T&ecirc;n sử dụng:"
+;
+; ManageusersElement.php line: 238
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 244
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 250
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 257
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 274
+manageusers_element_roles = ""
+;
+; ManageusersElement.php line: 278
+manageusers_element_num_roles = ""
+;
+; ManageusersElement.php line: 293
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 303
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 344
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 357
+manageusers_element_add_role = ""
+;
+; ManageusersElement.php line: 367
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 371
+manageusers_element_num_groups = ""
+;
+; ManageusersElement.php line: 392
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 431
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 443
+manageusers_element_add_group = ""
+;
+; ManageusersElement.php line: 456
+manageusers_element_password = "Mật khẩu:"
+;
+; ManageusersElement.php line: 462
+manageusers_element_retype_password = "Đ&aacute;nh lại mật khẩu:"
+;
+; ManageusersElement.php line: 469
+manageusers_element_save = ""
+;
+; ManageusersElement.php line: 496
+manageusers_element_search_user = ""
+;
+; ManageusersElement.php line: 497
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 499
+manageusers_element_username = "T&ecirc;n sử dụng:"
+;
+; ManageusersElement.php line: 500
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 501
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 502
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 503
+manageusers_element_status = ""
+;
+; MixcrawlsElement.php line: 65
+mixcrawls_element_available_mixes = ""
+;
+; MixcrawlsElement.php line: 72
+mixcrawls_view_name = ""
+;
+; MixcrawlsElement.php line: 74
+mixcrawls_view_definition = ""
+;
+; MixcrawlsElement.php line: 78
+mixcrawls_view_actions = ""
+;
+; MixcrawlsElement.php line: 112
+mixcrawls_view_no_components = ""
+;
+; MixcrawlsElement.php line: 118
+mixcrawls_view_share = ""
+;
+; MixcrawlsElement.php line: 120
+mixcrawls_view_edit = ""
+;
+; MixcrawlsElement.php line: 125
+mixcrawls_set_index = ""
+;
+; MixcrawlsElement.php line: 128
+mixcrawl_search_index = ""
+;
+; MixcrawlsElement.php line: 134
+confirm_delete_operation = ""
+;
+; MixcrawlsElement.php line: 136
+mixcrawls_view_delete = ""
+;
+; MixcrawlsElement.php line: 146
+mixcrawls_view_back = ""
+;
+; MixcrawlsElement.php line: 147
+mixcrawls_element_share_mix_group = ""
+;
+; MixcrawlsElement.php line: 157
+mixcrawls_element_mixname = ""
+;
+; MixcrawlsElement.php line: 163
+mixcrawls_element_group = ""
+;
+; MixcrawlsElement.php line: 169
+mixcrawls_element_share = ""
+;
+; MixcrawlsElement.php line: 193
+mixcrawls_element_make_mix = ""
+;
+; MixcrawlsElement.php line: 203
+mixcrawls_element_mix_name = ""
+;
+; MixcrawlsElement.php line: 208
+mixcrawls_element_create_button = ""
+;
+; MixcrawlsElement.php line: 224
+mixcrawls_element_search_mix = ""
+;
+; MixcrawlsElement.php line: 225
+mixcrawls_element_createmix_form = ""
+;
+; MixcrawlsElement.php line: 227
+mixcrawls_element_mixname = ""
+;
+; MoreoptionsElement.php line: 82
+moreoptions_element_other_searches = ""
+;
+; MoreoptionsElement.php line: 119
+moreoptions_element_previous = ""
+;
+; MoreoptionsElement.php line: 125
+moreoptions_element_next = ""
+;
+; MoreoptionsElement.php line: 137
+moreoptions_element_my_accounts = ""
+;
+; MoreoptionsElement.php line: 142
+signin_element_settings = "Những c&agrave;i đặt"
+;
+; MoreoptionsElement.php line: 151
+signin_element_signin = "Đăng nhập"
+;
+; MoreoptionsElement.php line: 154
+signin_element_admin = ""
+;
+; MoreoptionsElement.php line: 167
+signin_view_create_account = ""
+;
+; MoreoptionsElement.php line: 186
+moreoptions_element_suggest = ""
+;
+; MoreoptionsElement.php line: 188
+moreoptions_element_wiki_pages = ""
+;
+; MoreoptionsElement.php line: 199
+moreoptions_element_tools = ""
+;
+; PageoptionsElement.php line: 59
+pageoptions_element_crawl_time = ""
+;
+; PageoptionsElement.php line: 64
+pageoptions_element_search_time = ""
+;
+; PageoptionsElement.php line: 69
+pageoptions_element_test_options = ""
+;
+; PageoptionsElement.php line: 81
+pageoptions_element_load_options = ""
+;
+; PageoptionsElement.php line: 86
+pageoptions_element_page_range = ""
+;
+; PageoptionsElement.php line: 92
+pageoptions_element_summarizer = ""
+;
+; PageoptionsElement.php line: 101
+pageoptions_element_max_description = ""
+;
+; PageoptionsElement.php line: 107
+pageoptions_element_save_cache = ""
+;
+; PageoptionsElement.php line: 117
+pageoptions_element_allow_recrawl = ""
+;
+; PageoptionsElement.php line: 124
+pageoptions_element_file_types = ""
+;
+; PageoptionsElement.php line: 153
+pageoptions_element_classifiers_rankers = ""
+;
+; PageoptionsElement.php line: 169
+pageoptions_element_use_classify = ""
+;
+; PageoptionsElement.php line: 170
+pageoptions_element_use_rank = ""
+;
+; PageoptionsElement.php line: 197
+pageoptions_element_no_classifiers = ""
+;
+; PageoptionsElement.php line: 200
+pageoptions_element_indexing_plugins = ""
+;
+; PageoptionsElement.php line: 206
+pageoptions_element_plugin = ""
+;
+; PageoptionsElement.php line: 207
+pageoptions_element_plugin_include = ""
+;
+; PageoptionsElement.php line: 223
+pageoptions_element_configure = ""
+;
+; PageoptionsElement.php line: 235
+pageoptions_element_no_compatible_plugins = ""
+;
+; PageoptionsElement.php line: 238
+pageoptions_element_page_rules = ""
+;
+; PageoptionsElement.php line: 247
+page_element_search_page = ""
+;
+; PageoptionsElement.php line: 254
+pageoptions_element_wd_suggest = ""
+;
+; PageoptionsElement.php line: 262
+pageoptions_element_subsearch_link = ""
+;
+; PageoptionsElement.php line: 271
+pageoptions_element_signin_link = ""
+;
+; PageoptionsElement.php line: 279
+pageoptions_element_cache_link = ""
+;
+; PageoptionsElement.php line: 288
+pageoptions_element_similar_link = ""
+;
+; PageoptionsElement.php line: 297
+pageoptions_element_in_link = ""
+;
+; PageoptionsElement.php line: 304
+pageoptions_element_ip_link = ""
+;
+; PageoptionsElement.php line: 313
+pageoptions_element_ranking_factors = ""
+;
+; PageoptionsElement.php line: 318
+pageoptions_element_title_weight = ""
+;
+; PageoptionsElement.php line: 323
+pageoptions_element_description_weight = ""
+;
+; PageoptionsElement.php line: 328
+pageoptions_element_link_weight = ""
+;
+; PageoptionsElement.php line: 333
+pageoptions_element_results_grouping_options = ""
+;
+; PageoptionsElement.php line: 338
+pageoptions_element_min_results_to_group = ""
+;
+; PageoptionsElement.php line: 344
+pageoptions_element_server_alpha = ""
+;
+; PageoptionsElement.php line: 352
+pageoptions_element_test_page = ""
+;
+; PageoptionsElement.php line: 356
+pageoptions_element_page_type = ""
+;
+; PageoptionsElement.php line: 372
+pageoptions_element_save_options = ""
+;
+; PageoptionsElement.php line: 374
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 380
+pageoptions_element_test_results = ""
+;
+; PageoptionsElement.php line: 383
+pageoptions_element_page_truncated = ""
+;
+; PageoptionsElement.php line: 388
+pageoptions_element_after_process = ""
+;
+; PageoptionsElement.php line: 392
+pageoptions_element_after_rules = ""
+;
+; PageoptionsElement.php line: 396
+pageoptions_element_extracted_words = ""
+;
+; PageoptionsElement.php line: 400
+pageoptions_element_extracted_metas = ""
+;
+; PageoptionsElement.php line: 417
+page_element_plugin_back = ""
+;
+; PageoptionsElement.php line: 454
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 458
+pageoptions_element_save_options = ""
+;
+; ResultseditorElement.php line: 52
+resultseditor_element_edit_page = ""
+;
+; ResultseditorElement.php line: 57
+resultseditor_element_edited_pages = ""
+;
+; ResultseditorElement.php line: 66
+resultseditor_element_url_list = ""
+;
+; ResultseditorElement.php line: 68
+resultseditor_element_load_page = ""
+;
+; ResultseditorElement.php line: 81
+resultseditor_element_page_url = ""
+;
+; ResultseditorElement.php line: 87
+resultseditor_element_page_title = ""
+;
+; ResultseditorElement.php line: 93
+resultseditor_element_description = ""
+;
+; ResultseditorElement.php line: 97
+resultseditor_element_reset = ""
+;
+; ResultseditorElement.php line: 99
+resultseditor_element_save_page = ""
+;
+; ResultseditorElement.php line: 102
+resultseditor_element_filter_websites = ""
+;
+; ResultseditorElement.php line: 114
+resultseditor_element_sites_to_filter = ""
+;
+; ResultseditorElement.php line: 119
+resultseditor_element_save_filter = ""
+;
+; SearchsourcesElement.php line: 62
+searchsources_element_addsource_form = ""
+;
+; SearchsourcesElement.php line: 63
+searchsources_element_edit_media_source = ""
+;
+; SearchsourcesElement.php line: 67
+searchsources_element_add_media_source = ""
+;
+; SearchsourcesElement.php line: 90
+searchsources_element_sourcetype = ""
+;
+; SearchsourcesElement.php line: 95
+searchsources_element_sourcename = ""
+;
+; SearchsourcesElement.php line: 104
+searchsources_element_url = ""
+;
+; SearchsourcesElement.php line: 110
+searchsources_element_locale_tag = ""
+;
+; SearchsourcesElement.php line: 115
+searchsources_element_thumbnail = ""
+;
+; SearchsourcesElement.php line: 125
+searchsources_element_feed_instruct = ""
+;
+; SearchsourcesElement.php line: 128
+searchsources_element_channelpath = ""
+;
+; SearchsourcesElement.php line: 134
+searchsources_element_itempath = ""
+;
+; SearchsourcesElement.php line: 140
+searchsources_element_titlepath = ""
+;
+; SearchsourcesElement.php line: 146
+searchsources_element_descpath = ""
+;
+; SearchsourcesElement.php line: 152
+searchsources_element_linkpath = ""
+;
+; SearchsourcesElement.php line: 158
+searchsources_element_image_xpath = ""
+;
+; SearchsourcesElement.php line: 164
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 170
+searchsources_element_media_sources = ""
+;
+; SearchsourcesElement.php line: 193
+searchsources_element_medianame = ""
+;
+; SearchsourcesElement.php line: 194
+searchsources_element_mediatype = ""
+;
+; SearchsourcesElement.php line: 196
+searchsources_element_mediaurls = ""
+;
+; SearchsourcesElement.php line: 199
+searchsources_element_action = ""
+;
+; SearchsourcesElement.php line: 227
+searchsources_element_editmedia = ""
+;
+; SearchsourcesElement.php line: 230
+confirm_delete_operation = ""
+;
+; SearchsourcesElement.php line: 233
+searchsources_element_deletemedia = ""
+;
+; SearchsourcesElement.php line: 242
+searchsources_element_addsearch_form = ""
+;
+; SearchsourcesElement.php line: 244
+searchsources_element_edit_subsearch = ""
+;
+; SearchsourcesElement.php line: 249
+searchsources_element_add_subsearch = ""
+;
+; SearchsourcesElement.php line: 264
+searchsources_element_foldername = ""
+;
+; SearchsourcesElement.php line: 274
+searchsources_element_indexsource = ""
+;
+; SearchsourcesElement.php line: 280
+searchsources_element_per_page = ""
+;
+; SearchsourcesElement.php line: 286
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 292
+searchsources_element_subsearches = ""
+;
+; SearchsourcesElement.php line: 302
+searchsources_element_dirname = ""
+;
+; SearchsourcesElement.php line: 303
+searchsources_element_index = ""
+;
+; SearchsourcesElement.php line: 306
+searchsources_element_localestring = ""
+;
+; SearchsourcesElement.php line: 307
+searchsources_element_perpage = ""
+;
+; SearchsourcesElement.php line: 311
+searchsources_element_actions = ""
+;
+; SearchsourcesElement.php line: 327
+searchsources_element_editsource = ""
+;
+; SearchsourcesElement.php line: 333
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 335
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 342
+searchsources_element_deletesubsearch = ""
+;
+; SecurityElement.php line: 58
+security_element_auth_captcha = ""
+;
+; SecurityElement.php line: 69
+security_element_authentication_type = ""
+;
+; SecurityElement.php line: 81
+security_element_zero_unavailable = ""
+;
+; SecurityElement.php line: 90
+security_element_captcha_type = ""
+;
+; SecurityElement.php line: 103
+security_element_save = ""
+;
+; SecurityElement.php line: 107
+security_element_captcha_recovery_questions = ""
+;
+; SecurityElement.php line: 113
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 118
+security_element_edit_captcha = ""
+;
+; SecurityElement.php line: 123
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 126
+security_element_edit_captcha = ""
+;
+; ServersettingsElement.php line: 59
+serversettings_element_server_settings = ""
+;
+; ServersettingsElement.php line: 62
+serversettings_element_name_server = ""
+;
+; ServersettingsElement.php line: 66
+serversettings_element_name_server_key = ""
+;
+; ServersettingsElement.php line: 73
+serversettings_element_name_server_url = ""
+;
+; ServersettingsElement.php line: 81
+serversettings_element_use_memcache = ""
+;
+; ServersettingsElement.php line: 89
+serversettings_element_memcache_servers = ""
+;
+; ServersettingsElement.php line: 100
+serversettings_element_use_filecache = ""
+;
+; ServersettingsElement.php line: 110
+configure_element_database_setup = "C&agrave;i đặt cơ sở dữ liệu "
+;
+; ServersettingsElement.php line: 115
+serversettings_element_database_system = "Hệ thống cơ sở dữ liệu:"
+;
+; ServersettingsElement.php line: 123
+serversettings_element_databasename = "T&ecirc;n cơ cở dữ liệu:"
+;
+; ServersettingsElement.php line: 130
+serversettings_element_databasehost = ""
+;
+; ServersettingsElement.php line: 137
+serversettings_element_databaseuser = "Người sử dụng cơ sở dữ liệu:"
+;
+; ServersettingsElement.php line: 145
+serversettings_element_databasepassword = "Mật khẩu cơ sở dữ liệu:"
+;
+; ServersettingsElement.php line: 158
+serversettings_element_account_registration = ""
+;
+; ServersettingsElement.php line: 169
+serversettings_element_mail_sender = ""
+;
+; ServersettingsElement.php line: 175
+serversettings_element_send_media_updater = ""
+;
+; ServersettingsElement.php line: 185
+serversettings_element_use_php_mail = ""
+;
+; ServersettingsElement.php line: 192
+serversettings_element_mail_server = ""
+;
+; ServersettingsElement.php line: 198
+serversettings_element_mail_serverport = ""
+;
+; ServersettingsElement.php line: 205
+serversettings_element_mail_username = ""
+;
+; ServersettingsElement.php line: 211
+serversettings_element_mail_password = ""
+;
+; ServersettingsElement.php line: 218
+serversettings_element_mail_security = ""
+;
+; ServersettingsElement.php line: 228
+serversettings_element_proxy_title = ""
+;
+; ServersettingsElement.php line: 232
+serversettings_element_tor_proxy = ""
+;
+; ServersettingsElement.php line: 238
+serversettings_element_use_proxy_servers = ""
+;
+; ServersettingsElement.php line: 247
+serversettings_element_proxy_servers = ""
+;
+; ServersettingsElement.php line: 256
+serversettings_element_adserver_configuration = ""
+;
+; ServersettingsElement.php line: 261
+serversettings_element_advertising_source = ""
+;
+; ServersettingsElement.php line: 273
+serversettings_element_no_payment_processing = ""
+;
+; ServersettingsElement.php line: 275
+serversettings_element_purchase_processing = ""
+;
+; ServersettingsElement.php line: 282
+serversettings_element_ad_location = ""
+;
+; ServersettingsElement.php line: 287
+serversettings_element_top = ""
+;
+; ServersettingsElement.php line: 292
+serversettings_element_side = ""
+;
+; ServersettingsElement.php line: 297
+serversettings_element_both = ""
+;
+; ServersettingsElement.php line: 302
+serversettings_element_none = ""
+;
+; ServersettingsElement.php line: 305
+serversettings_element_global_adscript = ""
+;
+; ServersettingsElement.php line: 312
+serversettings_element_top_adscript = ""
+;
+; ServersettingsElement.php line: 319
+serversettings_element_side_adscript = ""
+;
+; ServersettingsElement.php line: 329
+serversettings_element_save = ""
+;
+; SigninElement.php line: 73
+signin_element_settings = "Những c&agrave;i đặt"
+;
+; SigninElement.php line: 77
+signin_element_signin = "Đăng nhập"
+;
+; SigninElement.php line: 81
+signin_element_signout = "Tho&aacute;t"
+;
+; SubsearchElement.php line: 69
+subsearch_element_more = ""
+;
+; WikiElement.php line: 121
+wiki_view_back = ""
+;
+; WikiElement.php line: 139
+groupfeed_element_feed = ""
+;
+; WikiElement.php line: 140
+wiki_view_wiki = ""
+;
+; WikiElement.php line: 144
+wiki_view_page = ""
+;
+; WikiElement.php line: 148
+wiki_view_read = ""
+;
+; WikiElement.php line: 149
+wiki_view_edit = ""
+;
+; WikiElement.php line: 152
+wiki_view_pages = ""
+;
+; WikiElement.php line: 237
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 245
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 246
+wiki_view_create_edit = ""
+;
+; WikiElement.php line: 247
+wiki_view_use_form_below = ""
+;
+; WikiElement.php line: 259
+wiki_element_submit = ""
+;
+; WikiElement.php line: 265
+wiki_view_syntax_summary = ""
+;
+; WikiElement.php line: 268
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 270
+wiki_view_signin_edit = ""
+;
+; WikiElement.php line: 272
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 302
+wiki_element_history = ""
+;
+; WikiElement.php line: 306
+wiki_element_discuss = ""
+;
+; WikiElement.php line: 342
+wiki_element_locale_name = ""
+;
+; WikiElement.php line: 346
+wiki_element_page = ""
+;
+; WikiElement.php line: 349
+configure_element_toggle_page_settings = ""
+;
+; WikiElement.php line: 353
+wiki_element_page_type = ""
+;
+; WikiElement.php line: 361
+wiki_element_page_alias = ""
+;
+; WikiElement.php line: 369
+wiki_element_page_border = ""
+;
+; WikiElement.php line: 376
+wiki_element_table_of_contents = ""
+;
+; WikiElement.php line: 385
+wiki_element_title = ""
+;
+; WikiElement.php line: 391
+wiki_element_meta_author = ""
+;
+; WikiElement.php line: 397
+wiki_element_meta_robots = ""
+;
+; WikiElement.php line: 404
+wiki_element_meta_description = ""
+;
+; WikiElement.php line: 411
+wiki_element_page_header = ""
+;
+; WikiElement.php line: 417
+wiki_element_page_footer = ""
+;
+; WikiElement.php line: 440
+wiki_element_archive_info = ""
+;
+; WikiElement.php line: 443
+wiki_element_edit_reason = ""
+;
+; WikiElement.php line: 450
+wiki_element_savebutton = ""
+;
+; WikiElement.php line: 454
+wiki_element_media_list = ""
+;
+; WikiElement.php line: 455
+wiki_element_ml_description = ""
+;
+; WikiElement.php line: 458
+wiki_view_page_resources = ""
+;
+; WikiElement.php line: 493
+wiki_view_upload = ""
+;
+; WikiElement.php line: 497
+wiki_element_resources_info = ""
+;
+; WikiElement.php line: 512
+wiki_element_rename_failed = ""
+;
+; WikiElement.php line: 578
+wiki_element_rename = ""
+;
+; WikiElement.php line: 582
+wiki_element_add_to_page = ""
+;
+; WikiElement.php line: 602
+wiki_element_no_resources = ""
+;
+; WikiElement.php line: 624
+wiki_view_wiki_page_list = ""
+;
+; WikiElement.php line: 637
+wiki_view_filter_or_create = ""
+;
+; WikiElement.php line: 639
+wiki_element_go = ""
+;
+; WikiElement.php line: 644
+wiki_view_create_page = ""
+;
+; WikiElement.php line: 655
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 677
+wiki_view_no_pages = ""
+;
+; WikiElement.php line: 700
+wiki_view_back = ""
+;
+; WikiElement.php line: 716
+wiki_view_difference = ""
+;
+; WikiElement.php line: 722
+wiki_view_go = ""
+;
+; WikiElement.php line: 741
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 743
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 747
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 748
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 754
+wiki_view_edited_by = ""
+;
+; WikiElement.php line: 758
+wiki_view_page_len = ""
+;
+; WikiElement.php line: 760
+wiki_view_revert = ""
+;
+; WikiElement.php line: 763
+wiki_view_revert = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/helpers
+;
+; FeedsHelper.php line: 70
+feeds_helper_view_feed_results = ""
+;
+; FeedsHelper.php line: 164
+feeds_helper_view_onehour = ""
+;
+; FeedsHelper.php line: 169
+feeds_helper_view_minsecs = ""
+;
+; FeedsHelper.php line: 174
+feeds_helper_view_hourdate = ""
+;
+; FileuploadHelper.php line: 72
+fileupload_helper_drag_textarea = ""
+;
+; FileuploadHelper.php line: 73
+fileupload_helper_click_textarea = ""
+;
+; FileuploadHelper.php line: 75
+fileupload_helper_drag_above = ""
+;
+; FileuploadHelper.php line: 76
+fileupload_helper_click_upload = ""
+;
+; FileuploadHelper.php line: 117
+basic_js_invalid_filetype = ""
+;
+; FileuploadHelper.php line: 119
+basic_js_file_too_big = ""
+;
+; FileuploadHelper.php line: 121
+basic_js_upload_progress = ""
+;
+; FileuploadHelper.php line: 123
+basic_js_progress_meter_disabled = ""
+;
+; FileuploadHelper.php line: 125
+basic_js_upload_error = ""
+;
+; FileuploadHelper.php line: 127
+basic_js_upload_cancelled = ""
+;
+; FileuploadHelper.php line: 129
+basic_js_too_many_files = ""
+;
+; HelpbuttonHelper.php line: 106
+wiki_question_mark = ""
+;
+; HelpbuttonHelper.php line: 138
+wiki_view_edit = ""
+;
+; HelpbuttonHelper.php line: 139
+wiki_view_not_available = ""
+;
+; HelpbuttonHelper.php line: 141
+wiki_view_create_edit = ""
+;
+; HelpbuttonHelper.php line: 143
+wiki_view_page_no_exist = ""
+;
+; HelpbuttonHelper.php line: 145
+wiki_view_read = ""
+;
+; ImagesHelper.php line: 55
+images_helper_view_image_results = ""
+;
+; PaginationHelper.php line: 97
+pagination_helper_previous = "Trang trước"
+;
+; PaginationHelper.php line: 121
+pagination_helper_next = "Trang kế tiếp"
+;
+; PagingtableHelper.php line: 103
+pagingtable_helper_search = ""
+;
+; PagingtableHelper.php line: 125
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 138
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 215
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 233
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 241
+pagingtable_helper_search = ""
+;
+; SearchformHelper.php line: 119
+searchform_helper_any = ""
+;
+; SearchformHelper.php line: 148
+searchform_helper_search = ""
+;
+; ToggleHelper.php line: 59
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 61
+toggle_helper_off = ""
+;
+; ToggleHelper.php line: 65
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 67
+toggle_helper_off = ""
+;
+; ToggleHelper.php line: 71
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 73
+toggle_helper_off = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/layouts
+;
+; RssLayout.php line: 62
+rss_layout_title = ""
+;
+; RssLayout.php line: 69
+rss_layout_description = ""
+;
+; WebLayout.php line: 63
+web_layout_title = ""
+;
+; WebLayout.php line: 73
+web_layout_description = "Gi&uacute;p t&igrave;m ca&iacute; m&agrave; bạn muốn t&igrave;m kiếm"
+;
+; WebLayout.php line: 75
+web_layout_site_author = ""
+;
+; WebLayout.php line: 219
+web_layout_query_statistics = ""
+;
+; WebLayout.php line: 223
+web_layout_total_elapsed_time = ""
+;
+; WebLayout.php line: 228
+web_layout_query_time = "Thời gian: %s gi&acirc;y"
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/views
+;
+; DownloadView.php line: 65
+download_view_form = ""
+;
+; DownloadView.php line: 74
+download_view_thank_you = ""
+;
+; DownloadView.php line: 76
+download_view_full_name = ""
+;
+; DownloadView.php line: 81
+download_view_email = ""
+;
+; DownloadView.php line: 85
+download_view_business = ""
+;
+; DownloadView.php line: 90
+download_view_interest = ""
+;
+; DownloadView.php line: 96
+download_view_get_email = ""
+;
+; DownloadView.php line: 102
+download_view_return_main = ""
+;
+; DownloadView.php line: 115
+download_view_required_fields = ""
+;
+; DownloadView.php line: 119
+download_view_name_required = ""
+;
+; DownloadView.php line: 123
+download_view_valid_email = ""
+;
+; StoreView.php line: 65
+download_view_form = ""
+;
+; StoreView.php line: 74
+download_view_thank_you = ""
+;
+; StoreView.php line: 76
+download_view_full_name = ""
+;
+; StoreView.php line: 81
+download_view_email = ""
+;
+; StoreView.php line: 85
+download_view_business = ""
+;
+; StoreView.php line: 90
+download_view_interest = ""
+;
+; StoreView.php line: 96
+download_view_get_email = ""
+;
+; StoreView.php line: 102
+download_view_return_main = ""
+;
+; StoreView.php line: 115
+download_view_required_fields = ""
+;
+; StoreView.php line: 119
+download_view_name_required = ""
+;
+; StoreView.php line: 123
+download_view_valid_email = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/library/indexing_plugins
+;
+; WordfilterPlugin.php line: 355
+wordfilter_plugin_settings_saved = ""
+;
+; WordfilterPlugin.php line: 364
+wordfilter_plugin_defaults_restored = ""
+;
+; WordfilterPlugin.php line: 469
+wordfilter_plugin_preferences = ""
+;
+; WordfilterPlugin.php line: 473
+wordfilter_plugin_factory_settings = ""
+;
+; WordfilterPlugin.php line: 485
+wordfilter_plugin_save = ""
diff --git a/locale/vi_VN/resources/Tokenizer.php b/locale/vi_VN/resources/Tokenizer.php
new file mode 100755
index 0000000..abc9de4
--- /dev/null
+++ b/locale/vi_VN/resources/Tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\vi_VN\resources;
+
+/**
+ * Vietnamese specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\vi-VN
+ */
+
+/*for Vietnamese neither char gramming or stemming seemed to make sense, so
+  for now this file is blank.
+*/
+class Tokenizer
+{
+
+}
diff --git a/locale/vi_VN/resources/locale.js b/locale/vi_VN/resources/locale.js
new file mode 100755
index 0000000..89aa0e8
--- /dev/null
+++ b/locale/vi_VN/resources/locale.js
@@ -0,0 +1,54 @@
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\vi-VN
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015s
+ * @filesource
+ */
+
+
+/*
+ * The alphabet for this locale
+ */
+var alpha = "bcdghklmnpqrstvđaáà" +
+    "ãảạâấầẫẩậăắằẵẳặeéèẽẻ" +
+    "ẹêếềễểệiíìĩỉịoóòõỏọôố" +
+    "ồỗổộơớờỡởợuúùũủụưứừữử" +
+    "ựyýỳỹỷỵ";
+    //put consonants then vowels
+
+/*
+ * Transliteration mapping for this locale
+ */
+var roman_array = {};
+
+/*
+ * To analyze the query and generate actual input query from the
+ * transliterated query
+ */
+function analyzeQuery()
+{
+}
diff --git a/locale/vi_VN/resources/suggest_trie.txt.gz b/locale/vi_VN/resources/suggest_trie.txt.gz
new file mode 100755
index 0000000..c65c609
Binary files /dev/null and b/locale/vi_VN/resources/suggest_trie.txt.gz differ
diff --git a/locale/vi_VN/statistics.txt b/locale/vi_VN/statistics.txt
new file mode 100755
index 0000000..1bdc2c4
--- /dev/null
+++ b/locale/vi_VN/statistics.txt
@@ -0,0 +1 @@
+d:10;
\ No newline at end of file
diff --git a/locale/zh_CN/configure.ini b/locale/zh_CN/configure.ini
new file mode 100755
index 0000000..afc0714
--- /dev/null
+++ b/locale/zh_CN/configure.ini
@@ -0,0 +1,4503 @@
+; ***** BEGIN LICENSE BLOCK *****
+;  SeekQuarry/Yioop Open Source Pure PHP Search Engine, Crawler, and Indexer
+;  Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+;
+;  This program is free software: you can redistribute it and/or modify
+;  it under the terms of the GNU General Public License as published by
+;  the Free Software Foundation, either version 3 of the License, or
+;  (at your option) any later version.
+;
+;  This program is distributed in the hope that it will be useful,
+;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;  GNU General Public License for more details.
+;
+;  You should have received a copy of the GNU General Public License
+;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;  ***** END LICENSE BLOCK *****
+;
+; configure.ini
+;
+; zh_CN configuration file
+;
+[general]
+;
+; Strings to translate on various pages
+;
+[strings]
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers
+;
+; AdminController.php line: 114
+admin_controller_need_cookies = ""
+;
+; AdminController.php line: 164
+admin_controller_account_not_active = ""
+;
+; AdminController.php line: 170
+admin_controller_login_successful = "登入成功"
+;
+; AdminController.php line: 189
+admin_controller_no_back_button = ""
+;
+; AdminController.php line: 203
+admin_controller_login_failed = "登入失敗"
+;
+; AdminController.php line: 209
+admin_controller_login_to_config = "登入管理介面"
+;
+; AdminController.php line: 213
+admin_controller_status_updates_stopped = "管理員終止更新"
+;
+; AdminController.php line: 367
+admin_controller_account_access = ""
+;
+; AdminController.php line: 368
+admin_controller_social = ""
+;
+; AdminController.php line: 369
+admin_controller_crawl_settings = ""
+;
+; AdminController.php line: 370
+admin_controller_system_settings = ""
+;
+; AdminController.php line: 371
+admin_controller_advertisement = ""
+;
+; AdminController.php line: 545
+admin_controller_equal = ""
+;
+; AdminController.php line: 546
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 547
+admin_controller_contains = ""
+;
+; AdminController.php line: 548
+admin_controller_begins_with = ""
+;
+; AdminController.php line: 549
+admin_controller_ends_with = ""
+;
+; AdminController.php line: 552
+admin_controller_equal = ""
+;
+; AdminController.php line: 553
+admin_controller_not_equal = ""
+;
+; AdminController.php line: 556
+admin_controller_no_sort = ""
+;
+; AdminController.php line: 557
+admin_controller_sort_ascending = ""
+;
+; AdminController.php line: 558
+admin_controller_sort_descending = ""
+;
+; MachineController.php line: 193
+machine_controller_nolines = ""
+;
+; RegisterController.php line: 249
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 315
+register_controller_account_created = ""
+;
+; RegisterController.php line: 333
+register_controller_registration_email_sent = ""
+;
+; RegisterController.php line: 335
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 336
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 338
+register_controller_email_body = ""
+;
+; RegisterController.php line: 372
+register_controller_account_request_made = ""
+;
+; RegisterController.php line: 376
+register_controller_admin_activation_request = ""
+;
+; RegisterController.php line: 377
+register_controller_admin_activation_message = ""
+;
+; RegisterController.php line: 419
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 425
+register_controller_already_activated = ""
+;
+; RegisterController.php line: 432
+register_controller_account_activated = ""
+;
+; RegisterController.php line: 435
+register_controller_email_verification_error = ""
+;
+; RegisterController.php line: 483
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 492
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 496
+register_controller_account_recover_email = ""
+;
+; RegisterController.php line: 500
+register_controller_recover_request = ""
+;
+; RegisterController.php line: 501
+register_controller_admin_email_salutation = ""
+;
+; RegisterController.php line: 503
+register_controller_recover_body = ""
+;
+; RegisterController.php line: 537
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 549
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 562
+register_controller_account_recover_fail = ""
+;
+; RegisterController.php line: 569
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 573
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 579
+register_controller_password_changed = ""
+;
+; RegisterController.php line: 587
+register_controller_passwords_dont_match = ""
+;
+; RegisterController.php line: 601
+register_controller_recovered_already = ""
+;
+; RegisterController.php line: 605
+register_controller_recovery_expired = ""
+;
+; RegisterController.php line: 732
+register_controller_invalid_url = ""
+;
+; RegisterController.php line: 736
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 749
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 759
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 786
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 800
+register_controller_suggest_full = ""
+;
+; RegisterController.php line: 804
+register_controller_url_submitted = ""
+;
+; RegisterController.php line: 1006
+register_controller_need_cookies = ""
+;
+; RegisterController.php line: 1012
+register_controller_failed_human = ""
+;
+; RegisterController.php line: 1027
+register_controller_failed_graphical_human = ""
+;
+; RegisterController.php line: 1038
+register_controller_failed_hashcode = ""
+;
+; RegisterController.php line: 1066
+register_controller_error_fields = ""
+;
+; RegisterController.php line: 1069
+register_controller_check_email = ""
+;
+; RegisterController.php line: 1076
+register_controller_user_already_exists = ""
+;
+; SearchController.php line: 280
+search_controller_web = ""
+;
+; SearchController.php line: 341
+search_controller_logout_successful = ""
+;
+; SearchController.php line: 549
+search_controller_mix_info = ""
+;
+; SearchController.php line: 555
+search_controller_crawl_info = ""
+;
+; SearchController.php line: 591
+search_controller_search = ""
+;
+; SearchController.php line: 695
+search_controller_no_index_set = ""
+;
+; SearchController.php line: 698
+search_controller_no_index_set = ""
+;
+; SearchController.php line: 800
+search_controller_get_keyword_ads = ""
+;
+; SearchController.php line: 803
+search_controller_ad_keyword_description = ""
+;
+; SearchController.php line: 1382
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1391
+search_controller_no_archive_page = ""
+;
+; SearchController.php line: 1441
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1446
+search_controller_original_page = ""
+;
+; SearchController.php line: 1463
+search_controller_extracted_title = ""
+;
+; SearchController.php line: 1465
+search_controller_extracted_description = ""
+;
+; SearchController.php line: 1467
+search_controller_extracted_links = ""
+;
+; SearchController.php line: 1472
+search_controller_extracted_allow_paths = ""
+;
+; SearchController.php line: 1478
+search_controller_extracted_disallow_paths = ""
+;
+; SearchController.php line: 1484
+search_controller_crawl_delay = ""
+;
+; SearchController.php line: 1548
+search_controller_cache_comment = ""
+;
+; SearchController.php line: 1559
+search_controller_site_cache = ""
+;
+; SearchController.php line: 1594
+search_controller_cached_version = ""
+;
+; SearchController.php line: 1689
+search_controller_download_fetcher = ""
+;
+; SearchController.php line: 1707
+search_controller_header_summaries = ""
+;
+; SearchController.php line: 1821
+search_controller_history = ""
+;
+; SearchController.php line: 1991
+search_controller_all_cached = ""
+;
+; SearchController.php line: 2022
+search_controller_year = ""
+;
+; SearchController.php line: 2023
+search_controller_month = ""
+;
+; SettingsController.php line: 115
+settings_controller_crawl_mix = ""
+;
+; SettingsController.php line: 130
+settings_controller_settings_saved = "設定已儲存"
+;
+; StaticController.php line: 68
+static_controller_logout_successful = ""
+;
+; StaticController.php line: 146
+static_controller_complete_title = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/controllers/components
+;
+; AccountaccessComponent.php line: 155
+accountaccess_component_no_posts_yet = ""
+;
+; AccountaccessComponent.php line: 171
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 181
+accountaccess_component_passwords_dont_match = "密碼錯誤"
+;
+; AccountaccessComponent.php line: 188
+accountaccess_component_invalid_password = ""
+;
+; AccountaccessComponent.php line: 230
+accountaccess_component_unknown_imagetype = ""
+;
+; AccountaccessComponent.php line: 235
+accountaccess_component_icon_too_big = ""
+;
+; AccountaccessComponent.php line: 244
+accountaccess_component_no_user_folder = ""
+;
+; AccountaccessComponent.php line: 253
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 294
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 295
+accountaccess_component_inactive_status = ""
+;
+; AccountaccessComponent.php line: 297
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 300
+accountaccess_component_request_join = ""
+;
+; AccountaccessComponent.php line: 301
+accountaccess_component_invited = ""
+;
+; AccountaccessComponent.php line: 302
+accountaccess_component_active_status = ""
+;
+; AccountaccessComponent.php line: 304
+accountaccess_component_suspended_status = ""
+;
+; AccountaccessComponent.php line: 352
+accountaccess_component_passwords_too_long = ""
+;
+; AccountaccessComponent.php line: 357
+accountaccess_component_passwords_dont_match = "密碼錯誤"
+;
+; AccountaccessComponent.php line: 361
+accountaccess_component_invalid_username = ""
+;
+; AccountaccessComponent.php line: 365
+accountaccess_component_user_exists = ""
+;
+; AccountaccessComponent.php line: 394
+accountaccess_component_user_added = ""
+;
+; AccountaccessComponent.php line: 403
+accountaccess_component_user_doesnt_exist = ""
+;
+; AccountaccessComponent.php line: 410
+accountaccess_component_cant_edit_public_user = ""
+;
+; AccountaccessComponent.php line: 452
+accountaccess_component_passwords_dont_match = "密碼錯誤"
+;
+; AccountaccessComponent.php line: 458
+accountaccess_component_user_updated = ""
+;
+; AccountaccessComponent.php line: 464
+accountaccess_component_user_filter_group = ""
+;
+; AccountaccessComponent.php line: 468
+accountaccess_component_user_filter_role = ""
+;
+; AccountaccessComponent.php line: 479
+accountaccess_component_username_doesnt_exists = "此使用者不存在"
+;
+; AccountaccessComponent.php line: 484
+accountaccess_component_cant_delete_builtin = ""
+;
+; AccountaccessComponent.php line: 489
+accountaccess_component_user_deleted = ""
+;
+; AccountaccessComponent.php line: 498
+accountaccess_component_username_doesnt_exists = "此使用者不存在"
+;
+; AccountaccessComponent.php line: 503
+accountaccess_component_rolename_doesnt_exists = "無此暱稱"
+;
+; AccountaccessComponent.php line: 509
+accountaccess_component_rolename_already_added = ""
+;
+; AccountaccessComponent.php line: 515
+accountaccess_component_rolename_added = "增加暱稱"
+;
+; AccountaccessComponent.php line: 525
+accountaccess_component_username_doesnt_exists = "此使用者不存在"
+;
+; AccountaccessComponent.php line: 530
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 536
+accountaccess_component_groupname_already_added = ""
+;
+; AccountaccessComponent.php line: 544
+accountaccess_component_groupname_added = ""
+;
+; AccountaccessComponent.php line: 554
+accountaccess_component_username_doesnt_exists = "此使用者不存在"
+;
+; AccountaccessComponent.php line: 559
+accountaccess_component_rolename_doesnt_exists = "無此暱稱"
+;
+; AccountaccessComponent.php line: 568
+accountaccess_component_rolename_deleted = "刪除暱稱"
+;
+; AccountaccessComponent.php line: 578
+accountaccess_component_username_doesnt_exists = "此使用者不存在"
+;
+; AccountaccessComponent.php line: 583
+accountaccess_component_groupname_doesnt_exists = ""
+;
+; AccountaccessComponent.php line: 592
+accountaccess_component_group_deleted = ""
+;
+; AccountaccessComponent.php line: 609
+accountaccess_component_username_doesnt_exists = "此使用者不存在"
+;
+; AccountaccessComponent.php line: 615
+accountaccess_component_userstatus_updated = ""
+;
+; AccountaccessComponent.php line: 778
+accountaccess_component_select_activityname = "選擇活動名稱"
+;
+; AccountaccessComponent.php line: 803
+accountaccess_component_rolename_doesnt_exists = "無此暱稱"
+;
+; AccountaccessComponent.php line: 819
+accountaccess_component_activity_added = "活動名稱已加入"
+;
+; AccountaccessComponent.php line: 828
+accountaccess_component_rolename_exists = "此暱稱已存在"
+;
+; AccountaccessComponent.php line: 834
+accountaccess_component_rolename_added = "增加暱稱"
+;
+; AccountaccessComponent.php line: 838
+accountaccess_component_rolename_blank = ""
+;
+; AccountaccessComponent.php line: 847
+accountaccess_component_rolename_doesnt_exists = "無此暱稱"
+;
+; AccountaccessComponent.php line: 865
+accountaccess_component_activity_deleted = "活動已刪除"
+;
+; AccountaccessComponent.php line: 873
+accountaccess_component_rolename_doesnt_exists = "無此暱稱"
+;
+; AccountaccessComponent.php line: 878
+accountaccess_component_rolename_deleted = "刪除暱稱"
+;
+; AccountaccessComponent.php line: 910
+accountaccess_component_role_updated = ""
+;
+; AdvertisementComponent.php line: 55
+advertisement_component_num_days = ""
+;
+; AdvertisementComponent.php line: 56
+advertisement_component_one_day = ""
+;
+; AdvertisementComponent.php line: 57
+advertisement_component_seven_days = ""
+;
+; AdvertisementComponent.php line: 58
+advertisement_component_thirty_days = ""
+;
+; AdvertisementComponent.php line: 59
+advertisement_component_ninety_days = ""
+;
+; AdvertisementComponent.php line: 60
+advertisement_component_one_eighty_days = ""
+;
+; AdvertisementComponent.php line: 69
+advertisement_component_month = ""
+;
+; AdvertisementComponent.php line: 76
+advertisement_component_year = ""
+;
+; AdvertisementComponent.php line: 100
+advertisement_component_fields_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 105
+advertisement_component_duration_cannot_be_empty = ""
+;
+; AdvertisementComponent.php line: 110
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 157
+advertisement_component_enter_keywords = ""
+;
+; AdvertisementComponent.php line: 163
+advertisement_component_bid_too_low = ""
+;
+; AdvertisementComponent.php line: 171
+advertisement_component_processing_error = ""
+;
+; AdvertisementComponent.php line: 178
+advertisement_component_ad_created = ""
+;
+; AdvertisementComponent.php line: 206
+advertisement_component_status_changed = ""
+;
+; AdvertisementComponent.php line: 252
+advertisement_component_ad_updated = ""
+;
+; CrawlComponent.php line: 92
+crawl_component_starting_new_crawl = "開始新的搜尋"
+;
+; CrawlComponent.php line: 107
+crawl_component_stop_crawl = "停止搜尋,需要一段時間更新"
+;
+; CrawlComponent.php line: 135
+crawl_component_resume_crawl = "回復搜尋,需要一段時間更新"
+;
+; CrawlComponent.php line: 143
+crawl_component_delete_crawl_success = "刪除搜尋,需要一段時間更新"
+;
+; CrawlComponent.php line: 147
+crawl_component_delete_crawl_fail = "刪除搜尋失敗"
+;
+; CrawlComponent.php line: 156
+crawl_component_set_index = "設置索引"
+;
+; CrawlComponent.php line: 188
+crawl_component_no_description = "沒有任何項目"
+;
+; CrawlComponent.php line: 336
+crawl_component_use_below = "以下使用者"
+;
+; CrawlComponent.php line: 337
+crawl_component_use_defaults = "使用者預設"
+;
+; CrawlComponent.php line: 340
+crawl_component_use_below = "以下使用者"
+;
+; CrawlComponent.php line: 344
+crawl_component_previous_crawl = "前一搜尋"
+;
+; CrawlComponent.php line: 415
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 429
+crawl_component_add_suggest = ""
+;
+; CrawlComponent.php line: 433
+crawl_component_no_new_suggests = ""
+;
+; CrawlComponent.php line: 479
+crawl_component_breadth_first = "深度優先"
+;
+; CrawlComponent.php line: 481
+crawl_component_page_importance = "網頁重要性"
+;
+; CrawlComponent.php line: 545
+crawl_component_added_urls = ""
+;
+; CrawlComponent.php line: 555
+crawl_component_urls_injected = "插入網址"
+;
+; CrawlComponent.php line: 565
+crawl_component_update_seed_info = "更新種子資訊"
+;
+; CrawlComponent.php line: 619
+crawl_component_new_classifier = ""
+;
+; CrawlComponent.php line: 623
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 646
+crawl_component_classifier_deleted = ""
+;
+; CrawlComponent.php line: 650
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 661
+crawl_component_no_classifier = ""
+;
+; CrawlComponent.php line: 679
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 705
+crawl_component_finalizing_classifier = ""
+;
+; CrawlComponent.php line: 751
+crawl_component_classifier_exists = ""
+;
+; CrawlComponent.php line: 760
+crawl_component_load_failed = ""
+;
+; CrawlComponent.php line: 762
+crawl_component_loading = ""
+;
+; CrawlComponent.php line: 764
+crawl_component_added_examples = ""
+;
+; CrawlComponent.php line: 766
+crawl_component_label_update_failed = ""
+;
+; CrawlComponent.php line: 768
+crawl_component_updating = ""
+;
+; CrawlComponent.php line: 770
+crawl_component_acc_update_failed = ""
+;
+; CrawlComponent.php line: 772
+crawl_component_na = ""
+;
+; CrawlComponent.php line: 774
+crawl_component_no_docs = ""
+;
+; CrawlComponent.php line: 776
+crawl_component_num_docs = ""
+;
+; CrawlComponent.php line: 778
+crawl_component_in_class = ""
+;
+; CrawlComponent.php line: 780
+crawl_component_not_in_class = ""
+;
+; CrawlComponent.php line: 782
+crawl_component_skip = ""
+;
+; CrawlComponent.php line: 784
+crawl_component_prediction = ""
+;
+; CrawlComponent.php line: 786
+crawl_component_scores = ""
+;
+; CrawlComponent.php line: 823
+crawl_component_use_below = "以下使用者"
+;
+; CrawlComponent.php line: 824
+crawl_component_use_defaults = "使用者預設"
+;
+; CrawlComponent.php line: 826
+crawl_component_use_below = "以下使用者"
+;
+; CrawlComponent.php line: 834
+crawl_component_recrawl_never = "取消重新搜尋"
+;
+; CrawlComponent.php line: 835
+crawl_component_recrawl_1day = "每日重新搜尋"
+;
+; CrawlComponent.php line: 836
+crawl_component_recrawl_2day = "兩日重新搜尋"
+;
+; CrawlComponent.php line: 837
+crawl_component_recrawl_3day = "三日重新搜尋"
+;
+; CrawlComponent.php line: 838
+crawl_component_recrawl_7day = "一週重新搜尋"
+;
+; CrawlComponent.php line: 839
+crawl_component_recrawl_14day = "兩週重新搜尋"
+;
+; CrawlComponent.php line: 847
+crawl_component_basic = ""
+;
+; CrawlComponent.php line: 848
+crawl_component_centroid = ""
+;
+; CrawlComponent.php line: 849
+crawl_component_graph_based = ""
+;
+; CrawlComponent.php line: 1137
+crawl_component_page_options_updated = "更新頁面選項"
+;
+; CrawlComponent.php line: 1165
+crawl_component_page_options_running_tests = ""
+;
+; CrawlComponent.php line: 1346
+crawl_component_results_editor_update = "編輯者更新結果"
+;
+; CrawlComponent.php line: 1361
+crawl_component_edited_pages = "編輯頁面"
+;
+; CrawlComponent.php line: 1374
+crawl_component_results_editor_need_url = "需要網址"
+;
+; CrawlComponent.php line: 1380
+crawl_component_results_editor_page_updated = "更新頁面"
+;
+; CrawlComponent.php line: 1393
+crawl_component_results_editor_page_loaded = "載入頁面"
+;
+; CrawlComponent.php line: 1424
+crawl_component_media_kind = "多媒體類別"
+;
+; CrawlComponent.php line: 1425
+crawl_component_video = "影片"
+;
+; CrawlComponent.php line: 1426
+crawl_component_rss_feed = "RSS"
+;
+; CrawlComponent.php line: 1427
+crawl_component_html_feed = ""
+;
+; CrawlComponent.php line: 1441
+crawl_component_sources_indexes = ""
+;
+; CrawlComponent.php line: 1496
+crawl_component_no_source_type = ""
+;
+; CrawlComponent.php line: 1510
+crawl_component_missing_type = ""
+;
+; CrawlComponent.php line: 1524
+crawl_component_invalid_url = ""
+;
+; CrawlComponent.php line: 1531
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1548
+crawl_component_media_source_added = "增加多媒體"
+;
+; CrawlComponent.php line: 1561
+crawl_component_missing_fields = ""
+;
+; CrawlComponent.php line: 1569
+crawl_component_subsearch_added = ""
+;
+; CrawlComponent.php line: 1575
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1581
+crawl_component_media_source_deleted = "刪除多媒體"
+;
+; CrawlComponent.php line: 1588
+crawl_component_no_delete_source = ""
+;
+; CrawlComponent.php line: 1595
+crawl_component_subsearch_deleted = ""
+;
+; CrawlComponent.php line: 1630
+crawl_component_subsearch_updated = ""
+;
+; CrawlComponent.php line: 1705
+crawl_component_media_source_updated = ""
+;
+; SocialComponent.php line: 92
+social_component_request_join = ""
+;
+; SocialComponent.php line: 93
+social_component_invited = ""
+;
+; SocialComponent.php line: 94
+social_component_active_status = ""
+;
+; SocialComponent.php line: 95
+social_component_suspended_status = ""
+;
+; SocialComponent.php line: 98
+social_component_no_join = ""
+;
+; SocialComponent.php line: 99
+social_component_by_request = ""
+;
+; SocialComponent.php line: 101
+social_component_public_request = ""
+;
+; SocialComponent.php line: 102
+social_component_public_join = ""
+;
+; SocialComponent.php line: 105
+social_component_private = ""
+;
+; SocialComponent.php line: 106
+social_component_read = ""
+;
+; SocialComponent.php line: 107
+social_component_read_comment = ""
+;
+; SocialComponent.php line: 108
+social_component_read_write = ""
+;
+; SocialComponent.php line: 109
+social_component_read_wiki = ""
+;
+; SocialComponent.php line: 112
+social_component_no_voting = ""
+;
+; SocialComponent.php line: 113
+social_component_up_voting = ""
+;
+; SocialComponent.php line: 114
+social_component_up_down_voting = ""
+;
+; SocialComponent.php line: 117
+social_component_forever = ""
+;
+; SocialComponent.php line: 118
+social_component_one_hour = ""
+;
+; SocialComponent.php line: 119
+social_component_one_day = ""
+;
+; SocialComponent.php line: 120
+social_component_one_month = ""
+;
+; SocialComponent.php line: 192
+accountaccess_component_user_activated = ""
+;
+; SocialComponent.php line: 197
+accountaccess_component_no_user_activated = ""
+;
+; SocialComponent.php line: 216
+social_component_joined = ""
+;
+; SocialComponent.php line: 220
+social_component_groupname_unavailable = ""
+;
+; SocialComponent.php line: 226
+social_component_name_available = ""
+;
+; SocialComponent.php line: 243
+social_component_user_banned = ""
+;
+; SocialComponent.php line: 248
+social_component_no_user_banned = ""
+;
+; SocialComponent.php line: 269
+social_component_owner_changed = ""
+;
+; SocialComponent.php line: 274
+social_component_not_in_group = ""
+;
+; SocialComponent.php line: 280
+social_component_not_a_user = ""
+;
+; SocialComponent.php line: 296
+social_component_groupname_exists = ""
+;
+; SocialComponent.php line: 320
+social_component_groupname_added = ""
+;
+; SocialComponent.php line: 329
+social_component_groupname_doesnt_exists = ""
+;
+; SocialComponent.php line: 336
+social_component_group_deleted = ""
+;
+; SocialComponent.php line: 339
+social_component_no_delete_group = ""
+;
+; SocialComponent.php line: 352
+social_component_user_deleted = ""
+;
+; SocialComponent.php line: 357
+social_component_no_delete_user_group = ""
+;
+; SocialComponent.php line: 406
+social_component_users_invited = ""
+;
+; SocialComponent.php line: 411
+social_component_no_users_invited = ""
+;
+; SocialComponent.php line: 427
+social_component_joined = ""
+;
+; SocialComponent.php line: 430
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 471
+social_component_user_reinstated = ""
+;
+; SocialComponent.php line: 476
+social_component_no_user_reinstated = ""
+;
+; SocialComponent.php line: 483
+social_component_request_join = ""
+;
+; SocialComponent.php line: 485
+social_component_invited = ""
+;
+; SocialComponent.php line: 487
+social_component_banned_status = ""
+;
+; SocialComponent.php line: 504
+social_component_unsubscribe = ""
+;
+; SocialComponent.php line: 508
+social_component_no_unsubscribe = ""
+;
+; SocialComponent.php line: 556
+social_component_group_joined = ""
+;
+; SocialComponent.php line: 558
+social_component_group_request_join = ""
+;
+; SocialComponent.php line: 573
+social_component_activate_group = ""
+;
+; SocialComponent.php line: 580
+social_component_activate_body = ""
+;
+; SocialComponent.php line: 584
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 585
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 656
+social_component_no_permission = ""
+;
+; SocialComponent.php line: 669
+social_component_group_updated = ""
+;
+; SocialComponent.php line: 677
+social_component_unknown_access = ""
+;
+; SocialComponent.php line: 685
+social_component_group_filter_users = ""
+;
+; SocialComponent.php line: 776
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 780
+social_component_no_comment = ""
+;
+; SocialComponent.php line: 792
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 798
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 802
+social_component_join_group = ""
+;
+; SocialComponent.php line: 805
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 820
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 833
+social_component_thread_notification = ""
+;
+; SocialComponent.php line: 835
+social_component_notify_body = ""
+;
+; SocialComponent.php line: 838
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 839
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 841
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 848
+social_component_comment_added = ""
+;
+; SocialComponent.php line: 859
+social_component_groupname_cant_add = ""
+;
+; SocialComponent.php line: 865
+social_component_delete_error = ""
+;
+; SocialComponent.php line: 885
+social_component_item_deleted = ""
+;
+; SocialComponent.php line: 888
+social_component_no_item_deleted = ""
+;
+; SocialComponent.php line: 896
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 905
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 910
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 914
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 918
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 924
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 929
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 940
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 948
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 961
+social_component_new_thread_mail = ""
+;
+; SocialComponent.php line: 965
+social_component_new_thread_body = ""
+;
+; SocialComponent.php line: 969
+social_component_notify_closing = ""
+;
+; SocialComponent.php line: 970
+social_component_notify_signature = ""
+;
+; SocialComponent.php line: 975
+social_component_notify_salutation = ""
+;
+; SocialComponent.php line: 983
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 991
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 995
+social_component_need_title_description = ""
+;
+; SocialComponent.php line: 1001
+social_component_post_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1009
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1022
+social_component_no_update_access = ""
+;
+; SocialComponent.php line: 1031
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1034
+social_component_post_updated = ""
+;
+; SocialComponent.php line: 1041
+social_component_vote_error = ""
+;
+; SocialComponent.php line: 1050
+social_component_no_vote_access = ""
+;
+; SocialComponent.php line: 1055
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 1059
+social_component_already_voted = ""
+;
+; SocialComponent.php line: 1063
+social_component_vote_recorded = ""
+;
+; SocialComponent.php line: 1094
+social_component_join_group = ""
+;
+; SocialComponent.php line: 1097
+social_component_join_group_detail = ""
+;
+; SocialComponent.php line: 1373
+accountaccess_component_no_posts_yet = ""
+;
+; SocialComponent.php line: 1416
+social_component_search = ""
+;
+; SocialComponent.php line: 1503
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1506
+social_component_no_group_access = ""
+;
+; SocialComponent.php line: 1530
+social_component_standard_page = ""
+;
+; SocialComponent.php line: 1531
+social_component_page_alias = ""
+;
+; SocialComponent.php line: 1532
+social_component_media_list = ""
+;
+; SocialComponent.php line: 1533
+social_component_presentation = ""
+;
+; SocialComponent.php line: 1536
+social_component_solid = ""
+;
+; SocialComponent.php line: 1537
+social_component_dashed = ""
+;
+; SocialComponent.php line: 1538
+social_component_none = ""
+;
+; SocialComponent.php line: 1577
+social_component_missing_fields = ""
+;
+; SocialComponent.php line: 1583
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1633
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1634
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1639
+social_component_page_saved = ""
+;
+; SocialComponent.php line: 1651
+social_component_resource_deleted = ""
+;
+; SocialComponent.php line: 1656
+social_component_resource_not_deleted = ""
+;
+; SocialComponent.php line: 1673
+social_component_resource_renamed = ""
+;
+; SocialComponent.php line: 1678
+social_component_resource_not_renamed = ""
+;
+; SocialComponent.php line: 1688
+social_component_resource_save_first = ""
+;
+; SocialComponent.php line: 1700
+social_component_page_created = ""
+;
+; SocialComponent.php line: 1702
+social_component_page_discuss_here = ""
+;
+; SocialComponent.php line: 1706
+social_component_resource_uploaded = ""
+;
+; SocialComponent.php line: 1711
+social_component_upload_error = ""
+;
+; SocialComponent.php line: 1758
+social_component_back = ""
+;
+; SocialComponent.php line: 1759
+social_component_history_page = ""
+;
+; SocialComponent.php line: 1794
+social_component_back = ""
+;
+; SocialComponent.php line: 1795
+social_component_diff_page = ""
+;
+; SocialComponent.php line: 1809
+social_component_wiki_edited_elsewhere = ""
+;
+; SocialComponent.php line: 1817
+social_component_page_revert_to = ""
+;
+; SocialComponent.php line: 1821
+social_component_page_reverted = ""
+;
+; SocialComponent.php line: 1825
+social_component_revert_error = ""
+;
+; SocialComponent.php line: 1896
+social_component_main = ""
+;
+; SocialComponent.php line: 2142
+wiki_js_small = ""
+;
+; SocialComponent.php line: 2143
+wiki_js_medium = ""
+;
+; SocialComponent.php line: 2144
+wiki_js_large = ""
+;
+; SocialComponent.php line: 2145
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2146
+wiki_js_prompt_heading = ""
+;
+; SocialComponent.php line: 2147
+wiki_js_example = ""
+;
+; SocialComponent.php line: 2148
+wiki_js_table_title = ""
+;
+; SocialComponent.php line: 2149
+wiki_js_submit = ""
+;
+; SocialComponent.php line: 2150
+wiki_js_cancel = ""
+;
+; SocialComponent.php line: 2151
+wiki_js_bold = ""
+;
+; SocialComponent.php line: 2152
+wiki_js_italic = ""
+;
+; SocialComponent.php line: 2153
+wiki_js_underline = ""
+;
+; SocialComponent.php line: 2154
+wiki_js_strike = ""
+;
+; SocialComponent.php line: 2155
+wiki_js_heading = ""
+;
+; SocialComponent.php line: 2156
+wiki_js_heading1 = ""
+;
+; SocialComponent.php line: 2157
+wiki_js_heading2 = ""
+;
+; SocialComponent.php line: 2158
+wiki_js_heading3 = ""
+;
+; SocialComponent.php line: 2159
+wiki_js_heading4 = ""
+;
+; SocialComponent.php line: 2160
+wiki_js_bullet = ""
+;
+; SocialComponent.php line: 2161
+wiki_js_enum = ""
+;
+; SocialComponent.php line: 2162
+wiki_js_nowiki = ""
+;
+; SocialComponent.php line: 2163
+wiki_js_add_search = ""
+;
+; SocialComponent.php line: 2164
+wiki_js_search_size = ""
+;
+; SocialComponent.php line: 2165
+wiki_js_add_wiki_table = ""
+;
+; SocialComponent.php line: 2166
+wiki_js_for_table_cols = ""
+;
+; SocialComponent.php line: 2167
+wiki_js_for_table_rows = ""
+;
+; SocialComponent.php line: 2168
+wiki_js_add_hyperlink = ""
+;
+; SocialComponent.php line: 2169
+wiki_js_link_text = ""
+;
+; SocialComponent.php line: 2170
+wiki_js_link_url = ""
+;
+; SocialComponent.php line: 2171
+wiki_js_placeholder = ""
+;
+; SocialComponent.php line: 2172
+wiki_js_centeraligned = ""
+;
+; SocialComponent.php line: 2173
+wiki_js_rightaligned = ""
+;
+; SocialComponent.php line: 2174
+wiki_js_leftaligned = ""
+;
+; SocialComponent.php line: 2176
+wiki_js_definitionlist_item = ""
+;
+; SocialComponent.php line: 2178
+wiki_js_definitionlist_definition = ""
+;
+; SocialComponent.php line: 2180
+wiki_js_slide_sample_title = ""
+;
+; SocialComponent.php line: 2182
+wiki_js_slide_sample_bullet = ""
+;
+; SocialComponent.php line: 2184
+wiki_js_slide_resource_description = ""
+;
+; SocialComponent.php line: 2222
+social_component_select_crawl = "搜尋選擇"
+;
+; SocialComponent.php line: 2223
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2225
+social_component_select_crawl = "搜尋選擇"
+;
+; SocialComponent.php line: 2227
+social_component_default_crawl = ""
+;
+; SocialComponent.php line: 2257
+social_component_mix_created = ""
+;
+; SocialComponent.php line: 2260
+social_component_invalid_name = ""
+;
+; SocialComponent.php line: 2268
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2272
+social_component_mix_deleted = ""
+;
+; SocialComponent.php line: 2291
+social_component_mix_doesnt_exists = ""
+;
+; SocialComponent.php line: 2299
+social_component_mix_imported = ""
+;
+; SocialComponent.php line: 2313
+social_component_set_index = ""
+;
+; SocialComponent.php line: 2322
+social_component_comment_error = ""
+;
+; SocialComponent.php line: 2328
+social_component_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2346
+social_component_no_post_access = ""
+;
+; SocialComponent.php line: 2350
+social_component_share_title = ""
+;
+; SocialComponent.php line: 2352
+social_component_share_description = ""
+;
+; SocialComponent.php line: 2357
+social_component_thread_created = ""
+;
+; SocialComponent.php line: 2408
+social_component_mix_invalid_timestamp = ""
+;
+; SocialComponent.php line: 2413
+social_component_mix_not_owner = ""
+;
+; SocialComponent.php line: 2423
+social_component_add_crawls = "增加索引"
+;
+; SocialComponent.php line: 2425
+social_component_num_results = "結果數量"
+;
+; SocialComponent.php line: 2427
+social_component_del_frag = ""
+;
+; SocialComponent.php line: 2429
+social_component_weight = "元素重量"
+;
+; SocialComponent.php line: 2430
+social_component_name = ""
+;
+; SocialComponent.php line: 2432
+social_component_add_keywords = ""
+;
+; SocialComponent.php line: 2434
+social_component_actions = "元素活動"
+;
+; SocialComponent.php line: 2436
+social_component_add_query = "增加查詢"
+;
+; SocialComponent.php line: 2437
+social_component_delete = ""
+;
+; SocialComponent.php line: 2487
+social_component_too_many_fragments = ""
+;
+; SocialComponent.php line: 2498
+social_component_mix_saved = ""
+;
+; SystemComponent.php line: 82
+system_component_select_machine = ""
+;
+; SystemComponent.php line: 143
+system_component_machine_added = "加入"
+;
+; SystemComponent.php line: 147
+system_component_machine_exists = "已存在"
+;
+; SystemComponent.php line: 151
+system_component_machine_incomplete = "未完成"
+;
+; SystemComponent.php line: 158
+system_component_machine_doesnt_exists = "不存在"
+;
+; SystemComponent.php line: 179
+system_component_stop_service_first = "停止服務"
+;
+; SystemComponent.php line: 185
+system_component_machine_deleted = "刪除"
+;
+; SystemComponent.php line: 200
+system_component_updatemode_toggled = ""
+;
+; SystemComponent.php line: 246
+system_component_no_machine_log = "無紀錄"
+;
+; SystemComponent.php line: 270
+system_component_machine_servers_updated = "服務更新"
+;
+; SystemComponent.php line: 274
+system_component_machine_no_action = "無動作"
+;
+; SystemComponent.php line: 310
+system_component_select_mode = ""
+;
+; SystemComponent.php line: 351
+system_component_locale_missing_info = ""
+;
+; SystemComponent.php line: 358
+system_component_locale_added = "增加語言"
+;
+; SystemComponent.php line: 365
+system_component_localename_doesnt_exists = "語言不存在"
+;
+; SystemComponent.php line: 370
+system_component_localename_deleted = "刪除語言"
+;
+; SystemComponent.php line: 376
+system_component_localename_doesnt_exists = "語言不存在"
+;
+; SystemComponent.php line: 405
+system_component_locale_updated = ""
+;
+; SystemComponent.php line: 435
+system_component_localestrings_updated = "語言更新"
+;
+; SystemComponent.php line: 446
+system_component_all_strings = ""
+;
+; SystemComponent.php line: 447
+system_component_missing_strings = ""
+;
+; SystemComponent.php line: 566
+system_component_configure_no_change_db = ""
+;
+; SystemComponent.php line: 571
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 574
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 607
+system_component_configure_disable_registration = ""
+;
+; SystemComponent.php line: 609
+system_component_configure_no_activation = ""
+;
+; SystemComponent.php line: 611
+system_component_configure_email_activation = ""
+;
+; SystemComponent.php line: 613
+system_component_configure_admin_activation = ""
+;
+; SystemComponent.php line: 617
+system_component_configure_no_advertisements = ""
+;
+; SystemComponent.php line: 619
+system_component_configure_keyword_advertisements = ""
+;
+; SystemComponent.php line: 621
+system_component_configure_external_advertisements = ""
+;
+; SystemComponent.php line: 704
+captchasettings_element_text_captcha = ""
+;
+; SystemComponent.php line: 706
+captchasettings_element_hash_captcha = ""
+;
+; SystemComponent.php line: 708
+captchasettings_element_image_captcha = ""
+;
+; SystemComponent.php line: 713
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 715
+serversettings_element_zkp_authentication = ""
+;
+; SystemComponent.php line: 720
+serversettings_element_normal_authentication = ""
+;
+; SystemComponent.php line: 744
+system_component_settings_updated = ""
+;
+; SystemComponent.php line: 747
+system_component_no_update_settings = ""
+;
+; SystemComponent.php line: 788
+system_component_no_resource_folder = ""
+;
+; SystemComponent.php line: 802
+system_component_invalid_filetype = ""
+;
+; SystemComponent.php line: 807
+system_component_file_too_big = ""
+;
+; SystemComponent.php line: 822
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 826
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 875
+system_component_configure_reset_completed = ""
+;
+; SystemComponent.php line: 878
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 957
+system_component_configure_use_absolute_path = "使用絕對路徑"
+;
+; SystemComponent.php line: 962
+system_component_configure_configure_diff_base_dir = ""
+;
+; SystemComponent.php line: 993
+system_component_configure_work_dir_set = "工作目錄配置"
+;
+; SystemComponent.php line: 1004
+system_component_name_your_bot = "取名"
+;
+; SystemComponent.php line: 1029
+system_component_configure_work_profile_made = "工作設置已建立"
+;
+; SystemComponent.php line: 1033
+system_component_configure_no_set_config = "無設置"
+;
+; SystemComponent.php line: 1040
+system_component_configure_no_create_profile = "未建立簡歷"
+;
+; SystemComponent.php line: 1047
+system_component_configure_work_dir_invalid = ""
+;
+; SystemComponent.php line: 1054
+system_component_configure_work_dir_invalid = ""
+;
+; SystemComponent.php line: 1083
+system_component_configure_profile_change = ""
+;
+; SystemComponent.php line: 1087
+system_component_configure_no_change_profile = ""
+;
+; SystemComponent.php line: 1107
+system_component_describe_robot = ""
+;
+; SystemComponent.php line: 1161
+system_component_php_version = "PHP版本"
+;
+; SystemComponent.php line: 1169
+system_component_no_write_config_php = "PHP未寫入"
+;
+; SystemComponent.php line: 1174
+system_component_no_write_work_dir = "未寫入目錄"
+;
+; SystemComponent.php line: 1179
+system_component_post_size_small = "張貼小容量"
+;
+; SystemComponent.php line: 1185
+system_component_missing_required = "缺少必要項目"
+;
+; SystemComponent.php line: 1209
+system_component_missing_optional = "缺少選擇項目"
+;
+; SystemComponent.php line: 1215
+system_component_check_passed = "通過檢查"
+;
+; SystemComponent.php line: 1220
+system_component_using_local_config = "使用當地語言"
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/controllers
+;
+; MainController.php line: 74
+search_controller_logout_successful = ""
+;
+; MainController.php line: 98
+main_controller_download = ""
+;
+; MainController.php line: 115
+main_controller_missing_fields = ""
+;
+; MainController.php line: 150
+main_controller_yioop_download = ""
+;
+; MainController.php line: 151
+main_controller_click_download = ""
+;
+; MainController.php line: 164
+main_controller_url_error = ""
+;
+; MainController.php line: 173
+main_controller_expired_url = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views
+;
+; AdminView.php line: 71
+admin_view_admin = "管理者"
+;
+; AdminView.php line: 92
+adminview_auto_logout_one_minute = ""
+;
+; CrawlstatusView.php line: 57
+crawlstatus_view_currently_processing = ""
+;
+; CrawlstatusView.php line: 58
+crawlstatus_view_description = ""
+;
+; CrawlstatusView.php line: 62
+crawlstatus_view_starting_crawl = ""
+;
+; CrawlstatusView.php line: 66
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 70
+crawlstatus_view_resuming_crawl = ""
+;
+; CrawlstatusView.php line: 74
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 78
+crawlstatus_view_shutdown_queue = ""
+;
+; CrawlstatusView.php line: 81
+crawlstatus_view_closing_dict = ""
+;
+; CrawlstatusView.php line: 84
+crawlstatus_view_run_plugins = ""
+;
+; CrawlstatusView.php line: 92
+managecrawls_element_stop_crawl = ""
+;
+; CrawlstatusView.php line: 100
+crawlstatus_view_set_index = ""
+;
+; CrawlstatusView.php line: 103
+crawlstatus_view_search_index = ""
+;
+; CrawlstatusView.php line: 110
+crawlstatus_view_changeoptions = ""
+;
+; CrawlstatusView.php line: 112
+crawlstatus_view_no_description = ""
+;
+; CrawlstatusView.php line: 117
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 119
+crawlstatus_view_time_started = ""
+;
+; CrawlstatusView.php line: 125
+crawlstatus_view_indexer_memory = ""
+;
+; CrawlstatusView.php line: 127
+crawlstatus_view_scheduler_memory = ""
+;
+; CrawlstatusView.php line: 130
+crawlstatus_view_queue_memory = ""
+;
+; CrawlstatusView.php line: 135
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 139
+crawlstatus_view_fetcher_memory = ""
+;
+; CrawlstatusView.php line: 144
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 147
+crawlstatus_view_webapp_memory = ""
+;
+; CrawlstatusView.php line: 152
+crawlstatus_view_no_mem_data = ""
+;
+; CrawlstatusView.php line: 155
+crawlstatus_view_urls_per_hour = ""
+;
+; CrawlstatusView.php line: 163
+crawlstatus_view_visited_urls = ""
+;
+; CrawlstatusView.php line: 167
+crawlstatus_view_total_urls = ""
+;
+; CrawlstatusView.php line: 170
+crawlstatus_view_most_recent_fetcher = ""
+;
+; CrawlstatusView.php line: 179
+crawlstatus_view_no_fetcher = ""
+;
+; CrawlstatusView.php line: 183
+crawlstatus_view_most_recent_urls = ""
+;
+; CrawlstatusView.php line: 193
+crawlstatus_view_no_recent_urls = ""
+;
+; CrawlstatusView.php line: 196
+crawlstatus_view_previous_crawls = ""
+;
+; CrawlstatusView.php line: 207
+crawlstatus_view_description = ""
+;
+; CrawlstatusView.php line: 210
+crawlstatus_view_timestamp = ""
+;
+; CrawlstatusView.php line: 211
+crawlstatus_view_url_counts = ""
+;
+; CrawlstatusView.php line: 215
+crawlstatus_view_actions = ""
+;
+; CrawlstatusView.php line: 226
+crawlstatus_view_statistics = ""
+;
+; CrawlstatusView.php line: 242
+crawlstatus_view_resume = ""
+;
+; CrawlstatusView.php line: 244
+crawlstatus_view_no_resume = ""
+;
+; CrawlstatusView.php line: 251
+crawlstatus_view_set_index = ""
+;
+; CrawlstatusView.php line: 254
+crawlstatus_view_search_index = ""
+;
+; CrawlstatusView.php line: 261
+crawlstatus_view_delete = ""
+;
+; CrawlstatusView.php line: 269
+crawlstatus_view_no_previous_crawl = ""
+;
+; GroupView.php line: 82
+groupfeed_element_wiki_thread = ""
+;
+; GroupView.php line: 96
+group_view_feed = ""
+;
+; GroupView.php line: 104
+group_view_wiki = ""
+;
+; GroupView.php line: 106
+group_view_user = ""
+;
+; GroupView.php line: 109
+group_view_myfeeds = ""
+;
+; GroupView.php line: 145
+adminview_auto_logout_one_minute = ""
+;
+; MachinestatusView.php line: 56
+machinestatus_view_no_monitored = ""
+;
+; MachinestatusView.php line: 60
+machinestatus_media_updatemode = ""
+;
+; MachinestatusView.php line: 73
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 75
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 78
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 80
+machinestatus_distributed = ""
+;
+; MachinestatusView.php line: 85
+machinestatus_name_server = ""
+;
+; MachinestatusView.php line: 94
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 96
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 125
+confirm_delete_operation = ""
+;
+; MachinestatusView.php line: 126
+machinestatus_view_delete = ""
+;
+; MachinestatusView.php line: 148
+machinestatus_view_not_configured = ""
+;
+; MachinestatusView.php line: 158
+machinestatus_view_mirrors = ""
+;
+; MachinestatusView.php line: 161
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 176
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 179
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 191
+machinestatus_view_queue_server = ""
+;
+; MachinestatusView.php line: 193
+machinestatus_view_no_queue_server = ""
+;
+; MachinestatusView.php line: 204
+machinestatus_view_media_updater = ""
+;
+; MachinestatusView.php line: 207
+machinestatus_view_log = ""
+;
+; MachinestatusView.php line: 229
+machinestatus_view_no_fetchers = ""
+;
+; MachinestatusView.php line: 241
+machinestatus_view_fetchers = ""
+;
+; MachinestatusView.php line: 248
+machinestatus_view_log = ""
+;
+; NocacheView.php line: 54
+nocache_view_no_cache = ""
+;
+; NocacheView.php line: 59
+nocache_view_summary_contents = ""
+;
+; RecoverView.php line: 71
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 104
+register_view_new_password = ""
+;
+; RecoverView.php line: 116
+register_view_retypepassword = ""
+;
+; RecoverView.php line: 131
+recover_view_username = ""
+;
+; RecoverView.php line: 146
+register_view_account_recovery = ""
+;
+; RecoverView.php line: 153
+register_view_human_check = ""
+;
+; RecoverView.php line: 185
+register_view_human_check = ""
+;
+; RecoverView.php line: 202
+recover_view_recover_password = ""
+;
+; RecoverView.php line: 211
+recover_view_return = ""
+;
+; RegisterView.php line: 76
+register_view_question0_most = ""
+;
+; RegisterView.php line: 77
+register_view_question0_least = ""
+;
+; RegisterView.php line: 78
+register_view_question0_choices = ""
+;
+; RegisterView.php line: 79
+register_view_question1_most = ""
+;
+; RegisterView.php line: 80
+register_view_question1_least = ""
+;
+; RegisterView.php line: 81
+register_view_question1_choices = ""
+;
+; RegisterView.php line: 82
+register_view_question2_most = ""
+;
+; RegisterView.php line: 83
+register_view_question2_least = ""
+;
+; RegisterView.php line: 84
+register_view_question2_choices = ""
+;
+; RegisterView.php line: 85
+register_view_question3_most = ""
+;
+; RegisterView.php line: 86
+register_view_question3_least = ""
+;
+; RegisterView.php line: 87
+register_view_question3_choices = ""
+;
+; RegisterView.php line: 88
+register_view_question4_most = ""
+;
+; RegisterView.php line: 89
+register_view_question4_least = ""
+;
+; RegisterView.php line: 90
+register_view_question4_choices = ""
+;
+; RegisterView.php line: 91
+register_view_question5_most = ""
+;
+; RegisterView.php line: 92
+register_view_question5_least = ""
+;
+; RegisterView.php line: 93
+register_view_question5_choices = ""
+;
+; RegisterView.php line: 94
+register_view_question6_most = ""
+;
+; RegisterView.php line: 95
+register_view_question6_least = ""
+;
+; RegisterView.php line: 96
+register_view_question6_choices = ""
+;
+; RegisterView.php line: 97
+register_view_question7_most = ""
+;
+; RegisterView.php line: 98
+register_view_question7_least = ""
+;
+; RegisterView.php line: 99
+register_view_question7_choices = ""
+;
+; RegisterView.php line: 100
+register_view_question8_most = ""
+;
+; RegisterView.php line: 101
+register_view_question8_least = ""
+;
+; RegisterView.php line: 102
+register_view_question8_choices = ""
+;
+; RegisterView.php line: 103
+register_view_question9_most = ""
+;
+; RegisterView.php line: 104
+register_view_question9_least = ""
+;
+; RegisterView.php line: 105
+register_view_question9_choices = ""
+;
+; RegisterView.php line: 108
+register_view_recovery1_more = ""
+;
+; RegisterView.php line: 109
+register_view_recovery1_less = ""
+;
+; RegisterView.php line: 110
+register_view_recovery1_choices = ""
+;
+; RegisterView.php line: 111
+register_view_recovery2_more = ""
+;
+; RegisterView.php line: 112
+register_view_recovery2_less = ""
+;
+; RegisterView.php line: 113
+register_view_recovery2_choices = ""
+;
+; RegisterView.php line: 114
+register_view_recovery3_more = ""
+;
+; RegisterView.php line: 115
+register_view_recovery3_less = ""
+;
+; RegisterView.php line: 116
+register_view_recovery3_choices = ""
+;
+; RegisterView.php line: 117
+register_view_recovery4_more = ""
+;
+; RegisterView.php line: 118
+register_view_recovery4_less = ""
+;
+; RegisterView.php line: 119
+register_view_recovery4_choices = ""
+;
+; RegisterView.php line: 120
+register_view_recovery5_more = ""
+;
+; RegisterView.php line: 121
+register_view_recovery5_less = ""
+;
+; RegisterView.php line: 122
+register_view_recovery5_choices = ""
+;
+; RegisterView.php line: 123
+register_view_recovery6_more = ""
+;
+; RegisterView.php line: 124
+register_view_recovery6_less = ""
+;
+; RegisterView.php line: 125
+register_view_recovery6_choices = ""
+;
+; RegisterView.php line: 153
+register_view_create_account = ""
+;
+; RegisterView.php line: 190
+register_view_firstname = ""
+;
+; RegisterView.php line: 205
+register_view_lastname = ""
+;
+; RegisterView.php line: 219
+register_view_username = ""
+;
+; RegisterView.php line: 232
+register_view_email = ""
+;
+; RegisterView.php line: 246
+register_view_password = ""
+;
+; RegisterView.php line: 261
+register_view_retypepassword = ""
+;
+; RegisterView.php line: 277
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 281
+register_view_human_check = ""
+;
+; RegisterView.php line: 283
+register_view_account_recovery = ""
+;
+; RegisterView.php line: 315
+register_view_human_check = ""
+;
+; RegisterView.php line: 329
+register_view_i_agree = ""
+;
+; RegisterView.php line: 331
+register_view_terms = ""
+;
+; RegisterView.php line: 333
+register_view_and = ""
+;
+; RegisterView.php line: 335
+register_view_privacy = ""
+;
+; RegisterView.php line: 336
+register_view_period = ""
+;
+; RegisterView.php line: 346
+register_view_create_account = ""
+;
+; RegisterView.php line: 355
+register_view_return = ""
+;
+; SearchView.php line: 92
+search_view_title = "PHP 搜索引擎 - Yioop!"
+;
+; SearchView.php line: 119
+search_view_input_label = ""
+;
+; SearchView.php line: 123
+search_view_input_placeholder = "输入您正在寻找什么"
+;
+; SearchView.php line: 126
+search_view_search = "搜尋"
+;
+; SearchView.php line: 155
+search_view_no_index_set = ""
+;
+; SearchView.php line: 164
+search_view_more_statistics = ""
+;
+; SearchView.php line: 201
+search_view_calculated = "總計: %s 秒"
+;
+; SearchView.php line: 203
+search_view_results = "結果"
+;
+; SearchView.php line: 229
+search_view_thesaurus_results = ""
+;
+; SearchView.php line: 339
+search_view_word_cloud = ""
+;
+; SearchView.php line: 380
+search_view_cache = ""
+;
+; SearchView.php line: 382
+search_view_as_text = ""
+;
+; SearchView.php line: 393
+search_view_similar = "相似"
+;
+; SearchView.php line: 402
+search_view_inlink = ""
+;
+; SearchView.php line: 419
+search_view_rank = "排名: %s 名"
+;
+; SearchView.php line: 421
+search_view_relevancy = "關聯度:  %s 趴"
+;
+; SearchView.php line: 423
+search_view_proximity = ""
+;
+; SearchView.php line: 427
+search_view_thesaurus_score = ""
+;
+; SearchView.php line: 436
+search_view_score = "分數"
+;
+; SettingsView.php line: 66
+settings_view_settings = "設定"
+;
+; SettingsView.php line: 73
+settings_view_results_per_page = "每頁顯示項目數量"
+;
+; SettingsView.php line: 79
+settings_view_open_in_tabs = ""
+;
+; SettingsView.php line: 86
+settings_view_search_index = ""
+;
+; SettingsView.php line: 92
+settings_view_language_label = "語言"
+;
+; SettingsView.php line: 106
+settings_view_return = ""
+;
+; SettingsView.php line: 109
+settings_view_save = "儲存"
+;
+; SettingsView.php line: 116
+settings_install_search_plugin = ""
+;
+; SigninView.php line: 68
+signin_view_signin = "登入"
+;
+; SigninView.php line: 81
+sigin_view_signing_in = ""
+;
+; SigninView.php line: 84
+sigin_view_login_failed = ""
+;
+; SigninView.php line: 92
+signin_view_username = "使用者名稱"
+;
+; SigninView.php line: 99
+signin_view_password = "密碼"
+;
+; SigninView.php line: 109
+signin_view_login = "登入"
+;
+; SigninView.php line: 124
+signin_view_recover_password = ""
+;
+; SigninView.php line: 129
+signin_view_create_account = ""
+;
+; SigninView.php line: 133
+signin_view_return = ""
+;
+; StaticView.php line: 68
+static_view_title = ""
+;
+; StatisticsView.php line: 75
+statistics_view_statistics = ""
+;
+; StatisticsView.php line: 80
+statistics_view_calculating = ""
+;
+; StatisticsView.php line: 94
+statistics_view_error_codes = ""
+;
+; StatisticsView.php line: 95
+statistics_view_sizes = ""
+;
+; StatisticsView.php line: 96
+statistics_view_links_per_page = ""
+;
+; StatisticsView.php line: 97
+statistics_view_page_date = ""
+;
+; StatisticsView.php line: 98
+statistics_view_dns_time = ""
+;
+; StatisticsView.php line: 99
+statistics_view_download_time = ""
+;
+; StatisticsView.php line: 100
+statistics_view_top_level_domain = ""
+;
+; StatisticsView.php line: 101
+statistics_view_file_extension = ""
+;
+; StatisticsView.php line: 102
+statistics_view_media_type = ""
+;
+; StatisticsView.php line: 103
+statistics_view_language = ""
+;
+; StatisticsView.php line: 104
+statistics_view_server = ""
+;
+; StatisticsView.php line: 105
+statistics_view_os = ""
+;
+; StatisticsView.php line: 108
+statistics_view_general_info = ""
+;
+; StatisticsView.php line: 109
+statistics_view_description = ""
+;
+; StatisticsView.php line: 111
+statistics_view_timestamp = ""
+;
+; StatisticsView.php line: 113
+statistics_view_crawl_date = ""
+;
+; StatisticsView.php line: 115
+statistics_view_pages = ""
+;
+; StatisticsView.php line: 117
+statistics_view_url = ""
+;
+; StatisticsView.php line: 120
+statistics_view_number_hosts = ""
+;
+; SuggestView.php line: 69
+suggest_view_suggest_url = ""
+;
+; SuggestView.php line: 71
+suggest_view_instructions = ""
+;
+; SuggestView.php line: 95
+suggest_view_url = ""
+;
+; SuggestView.php line: 109
+register_view_human_check = ""
+;
+; SuggestView.php line: 143
+suggest_view_human_check = ""
+;
+; SuggestView.php line: 164
+suggest_view_submit_url = ""
+;
+; SuggestView.php line: 173
+suggest_view_return = ""
+;
+; View.php line: 61
+view_locale_version14 = ""
+;
+; View.php line: 93
+view_logo_alt_text = ""
+;
+; WikiView.php line: 86
+wiki_view_read = ""
+;
+; WikiView.php line: 87
+wiki_view_edit = ""
+;
+; WikiView.php line: 90
+wiki_view_pages = ""
+;
+; WikiView.php line: 135
+wiki_view_feed = ""
+;
+; WikiView.php line: 136
+wiki_view_wiki = ""
+;
+; WikiView.php line: 160
+adminview_auto_logout_one_minute = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/elements
+;
+; ActivityElement.php line: 56
+activity_element_activities = ""
+;
+; AppearanceElement.php line: 71
+appearance_element_use_wiki_landing = ""
+;
+; AppearanceElement.php line: 77
+appearance_element_background_color = ""
+;
+; AppearanceElement.php line: 84
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 91
+appearance_element_background_image = ""
+;
+; AppearanceElement.php line: 99
+appearance_element_foreground_color = ""
+;
+; AppearanceElement.php line: 104
+appearance_element_topbar_color = ""
+;
+; AppearanceElement.php line: 109
+appearance_element_sidebar_color = ""
+;
+; AppearanceElement.php line: 115
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 122
+appearance_element_site_logo = ""
+;
+; AppearanceElement.php line: 132
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 139
+appearance_element_mobile_logo = ""
+;
+; AppearanceElement.php line: 148
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 155
+appearance_element_favicon = ""
+;
+; AppearanceElement.php line: 163
+appearance_element_toolbar = ""
+;
+; AppearanceElement.php line: 174
+appearance_element_site_timezone = ""
+;
+; AppearanceElement.php line: 179
+appearance_element_cookie_name = ""
+;
+; AppearanceElement.php line: 184
+appearance_element_token_name = ""
+;
+; AppearanceElement.php line: 189
+appearance_element_auxiliary_css = ""
+;
+; AppearanceElement.php line: 194
+appearance_element_reset_customizations = ""
+;
+; AppearanceElement.php line: 199
+appearance_element_save = ""
+;
+; ConfigureElement.php line: 72
+configure_element_work_directory = ""
+;
+; ConfigureElement.php line: 76
+configure_element_load_or_create = ""
+;
+; ConfigureElement.php line: 92
+configure_element_component_check = ""
+;
+; ConfigureElement.php line: 96
+configure_element_profile_settings = ""
+;
+; ConfigureElement.php line: 101
+configure_element_default_language = ""
+;
+; ConfigureElement.php line: 108
+configure_element_debug_display = ""
+;
+; ConfigureElement.php line: 114
+configure_element_error_info = ""
+;
+; ConfigureElement.php line: 120
+configure_element_query_info = ""
+;
+; ConfigureElement.php line: 126
+configure_element_test_info = ""
+;
+; ConfigureElement.php line: 131
+configure_element_site_access = ""
+;
+; ConfigureElement.php line: 136
+configure_element_web_access = ""
+;
+; ConfigureElement.php line: 141
+configure_element_rss_access = ""
+;
+; ConfigureElement.php line: 146
+configure_element_api_access = ""
+;
+; ConfigureElement.php line: 150
+configure_element_crawl_robot = ""
+;
+; ConfigureElement.php line: 152
+configure_element_robot_name = ""
+;
+; ConfigureElement.php line: 160
+configure_element_robot_instance = ""
+;
+; ConfigureElement.php line: 166
+configure_element_robot_description = ""
+;
+; ConfigureElement.php line: 175
+serversettings_element_save = ""
+;
+; CrawloptionsElement.php line: 59
+crawloptions_element_back_to_manage = ""
+;
+; CrawloptionsElement.php line: 62
+crawloptions_element_modify_active_crawl = ""
+;
+; CrawloptionsElement.php line: 64
+crawloptions_element_edit_crawl_options = ""
+;
+; CrawloptionsElement.php line: 87
+crawloptions_element_web_crawl = ""
+;
+; CrawloptionsElement.php line: 97
+crawloptions_element_archive_crawl = ""
+;
+; CrawloptionsElement.php line: 104
+crawloptions_element_load_options = ""
+;
+; CrawloptionsElement.php line: 109
+crawloptions_element_crawl_order = ""
+;
+; CrawloptionsElement.php line: 118
+crawloptions_element_restrict_by_url = ""
+;
+; CrawloptionsElement.php line: 126
+crawloptions_element_allowed_to_crawl = ""
+;
+; CrawloptionsElement.php line: 132
+crawloptions_element_disallowed_and_quota_sites = ""
+;
+; CrawloptionsElement.php line: 141
+crawloptions_element_seed_sites = ""
+;
+; CrawloptionsElement.php line: 145
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 156
+crawloptions_element_inject_sites = ""
+;
+; CrawloptionsElement.php line: 160
+crawloptions_element_add_suggest_urls = ""
+;
+; CrawloptionsElement.php line: 177
+crawloptions_element_reindex_crawl = ""
+;
+; CrawloptionsElement.php line: 185
+crawloptions_element_need_api_for_mix = ""
+;
+; CrawloptionsElement.php line: 193
+crawloptions_element_save_options = ""
+;
+; EditclassifierElement.php line: 62
+editclassifier_back = ""
+;
+; EditclassifierElement.php line: 64
+editclassifier_edit_classifier = ""
+;
+; EditclassifierElement.php line: 76
+editclassifier_classifier_label = ""
+;
+; EditclassifierElement.php line: 81
+editclassifier_change = ""
+;
+; EditclassifierElement.php line: 86
+editclassifier_statistics = ""
+;
+; EditclassifierElement.php line: 87
+editclassifier_positive_examples = ""
+;
+; EditclassifierElement.php line: 90
+editclassifier_negative_examples = ""
+;
+; EditclassifierElement.php line: 93
+editclassifier_accuracy = ""
+;
+; EditclassifierElement.php line: 98
+crawl_component_na = ""
+;
+; EditclassifierElement.php line: 103
+editclassifier_update = ""
+;
+; EditclassifierElement.php line: 104
+editclassifier_add_examples = ""
+;
+; EditclassifierElement.php line: 113
+editclassifier_source = ""
+;
+; EditclassifierElement.php line: 117
+editclassifier_default_crawl = ""
+;
+; EditclassifierElement.php line: 127
+editclassifier_label_by_hand = ""
+;
+; EditclassifierElement.php line: 129
+editclassifier_all_in_class = ""
+;
+; EditclassifierElement.php line: 131
+editclassifier_none_in_class = ""
+;
+; EditclassifierElement.php line: 136
+editclassifier_keywords = ""
+;
+; EditclassifierElement.php line: 145
+editclassifier_load = ""
+;
+; EditclassifierElement.php line: 151
+editclassifier_finalize = ""
+;
+; EditclassifierElement.php line: 159
+editclassifier_no_documents = ""
+;
+; EditlocalesElement.php line: 62
+editlocales_element_back_to_manage = "回到管理頁面"
+;
+; EditlocalesElement.php line: 64
+editlocales_element_edit_locale = ""
+;
+; EditlocalesElement.php line: 78
+editlocales_element_show = ""
+;
+; EditlocalesElement.php line: 82
+editlocales_element_filter = ""
+;
+; EditlocalesElement.php line: 87
+editlocales_element_go = ""
+;
+; EditlocalesElement.php line: 91
+editlocales_element_no_matching = ""
+;
+; EditlocalesElement.php line: 127
+editlocales_element_save = ""
+;
+; EditmixElement.php line: 57
+editmix_element_back_to_mix = ""
+;
+; EditmixElement.php line: 59
+mixcrawls_element_edit_mix = ""
+;
+; EditmixElement.php line: 70
+mixcrawls_element_mix_name = ""
+;
+; EditmixElement.php line: 76
+mixcrawls_element_mix_components = ""
+;
+; EditmixElement.php line: 82
+mixcrawls_element_too_many = ""
+;
+; EditmixElement.php line: 83
+mixcrawls_element_add_fragment = ""
+;
+; EditmixElement.php line: 88
+mixcrawls_element_save_button = ""
+;
+; FooterElement.php line: 58
+footer_element_blog = ""
+;
+; FooterElement.php line: 60
+footer_element_privacy = ""
+;
+; FooterElement.php line: 62
+footer_element_terms = ""
+;
+; FooterElement.php line: 64
+footer_element_tools = ""
+;
+; FooterElement.php line: 66
+footer_element_bot = ""
+;
+; FooterElement.php line: 71
+footer_element_developed_seek_quarry = ""
+;
+; FooterElement.php line: 74
+footer_element_copyright_site = ""
+;
+; FooterElement.php line: 76
+footer_element_this_search_engine = ""
+;
+; GroupfeedElement.php line: 86
+groupfeed_element_add_group = ""
+;
+; GroupfeedElement.php line: 90
+groupfeed_element_request_add = ""
+;
+; GroupfeedElement.php line: 116
+groupfeed_element_wiki_page = ""
+;
+; GroupfeedElement.php line: 118
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 121
+groupfeed_element_back = ""
+;
+; GroupfeedElement.php line: 131
+groupfeed_element_group_activity = ""
+;
+; GroupfeedElement.php line: 135
+groupfeed_element_wiki_thread = ""
+;
+; GroupfeedElement.php line: 154
+groupfeed_element_feed = ""
+;
+; GroupfeedElement.php line: 159
+group_view_wiki = ""
+;
+; GroupfeedElement.php line: 161
+groupfeed_element_user = ""
+;
+; GroupfeedElement.php line: 205
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 240
+manageaccount_element_group_wiki = ""
+;
+; GroupfeedElement.php line: 241
+manageaccount_element_group_stats = ""
+;
+; GroupfeedElement.php line: 246
+manageaccount_element_last_post = ""
+;
+; GroupfeedElement.php line: 290
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 300
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 313
+groupfeed_element_start_thread = ""
+;
+; GroupfeedElement.php line: 319
+groupfeed_element_no_posts_yet = ""
+;
+; GroupfeedElement.php line: 324
+groupfeed_element_thread_no_exist = ""
+;
+; GroupfeedElement.php line: 357
+groupfeed_element_edit = ""
+;
+; GroupfeedElement.php line: 362
+groupfeed_element_delete = ""
+;
+; GroupfeedElement.php line: 384
+groupfeed_element_num_posts = ""
+;
+; GroupfeedElement.php line: 394
+groupfeed_element_num_views = ""
+;
+; GroupfeedElement.php line: 419
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 421
+groupfeed_element_start_thread_in_group = ""
+;
+; GroupfeedElement.php line: 437
+groupfeed_element_last_edited = ""
+;
+; GroupfeedElement.php line: 453
+groupfeed_element_post_vote = ""
+;
+; GroupfeedElement.php line: 480
+groupfeed_element_last_post_info = ""
+;
+; GroupfeedElement.php line: 496
+groupfeed_element_comment = ""
+;
+; GroupfeedElement.php line: 550
+fileupload_helper_drag_textarea = ""
+;
+; GroupfeedElement.php line: 551
+fileupload_helper_click_textarea = ""
+;
+; GroupfeedElement.php line: 575
+groupfeed_element_add_comment = ""
+;
+; GroupfeedElement.php line: 589
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 627
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 634
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 647
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 682
+groupfeed_element_edit_post = ""
+;
+; GroupfeedElement.php line: 685
+groupfeed_element_subject = ""
+;
+; GroupfeedElement.php line: 690
+groupfeed_element_post = ""
+;
+; GroupfeedElement.php line: 703
+groupfeed_element_save = ""
+;
+; GroupfeedElement.php line: 731
+groupfeed_element_no_longer_update = ""
+;
+; MachinelogElement.php line: 57
+machinelog_element_back_to_manage = ""
+;
+; MachinelogElement.php line: 62
+machinelog_element_filter = ""
+;
+; MachinelogElement.php line: 69
+machinelog_element_log_file = ""
+;
+; MachinelogElement.php line: 74
+machinelog_element_refresh_off = ""
+;
+; MachinelogElement.php line: 78
+machinelog_element_refresh_on = ""
+;
+; ManageaccountElement.php line: 64
+manageaccount_element_edit_or_no_text = ""
+;
+; ManageaccountElement.php line: 73
+manageaccount_element_welcome = ""
+;
+; ManageaccountElement.php line: 75
+manageaccount_element_what_can_do = ""
+;
+; ManageaccountElement.php line: 76
+manageaccount_element_account_details = ""
+;
+; ManageaccountElement.php line: 107
+manageaccounts_element_icon = ""
+;
+; ManageaccountElement.php line: 117
+manageusers_element_username = "使用者名稱"
+;
+; ManageaccountElement.php line: 124
+manageusers_element_firstname = ""
+;
+; ManageaccountElement.php line: 130
+manageusers_element_lastname = ""
+;
+; ManageaccountElement.php line: 136
+manageusers_element_email = ""
+;
+; ManageaccountElement.php line: 146
+manageaccount_element_is_advertiser = ""
+;
+; ManageaccountElement.php line: 159
+manageaccount_element_password = ""
+;
+; ManageaccountElement.php line: 166
+manageaccount_element_new_password = "新的密碼"
+;
+; ManageaccountElement.php line: 172
+manageaccount_element_retype_password = "再次輸入新的密碼"
+;
+; ManageaccountElement.php line: 184
+manageaccount_element_save = ""
+;
+; ManageaccountElement.php line: 190
+manageaccount_element_search_lang_settings = ""
+;
+; ManageaccountElement.php line: 195
+manageaccount_element_crawl_and_index = ""
+;
+; ManageaccountElement.php line: 196
+manageaccount_element_crawl_info = ""
+;
+; ManageaccountElement.php line: 197
+manageaccount_element_num_crawls = ""
+;
+; ManageaccountElement.php line: 200
+manageaccount_element_manage_crawls = ""
+;
+; ManageaccountElement.php line: 205
+manageaccount_element_groups_and_feeds = ""
+;
+; ManageaccountElement.php line: 206
+manageaccount_element_group_info = ""
+;
+; ManageaccountElement.php line: 208
+manageaccount_element_num_groups = ""
+;
+; ManageaccountElement.php line: 211
+manageaccount_element_num_group = ""
+;
+; ManageaccountElement.php line: 224
+manageaccount_element_group_wiki = ""
+;
+; ManageaccountElement.php line: 225
+manageaccount_element_group_stats = ""
+;
+; ManageaccountElement.php line: 229
+manageaccount_element_last_post = ""
+;
+; ManageaccountElement.php line: 239
+manageaccount_element_manage_all_groups = ""
+;
+; ManageaccountElement.php line: 241
+manageaccount_element_go_to_group_feed = ""
+;
+; ManageaccountElement.php line: 242
+manageaccount_element_crawl_mixes = ""
+;
+; ManageaccountElement.php line: 243
+manageaccount_element_mixes_info = ""
+;
+; ManageaccountElement.php line: 245
+manageaccount_element_num_mixes = ""
+;
+; ManageaccountElement.php line: 248
+manageaccount_element_num_mix = ""
+;
+; ManageaccountElement.php line: 252
+manageaccount_element_manage_mixes = ""
+;
+; ManageadvertisementsElement.php line: 58
+manageadvertisements_element_list = ""
+;
+; ManageadvertisementsElement.php line: 65
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 70
+manageadvertisements_element_username = ""
+;
+; ManageadvertisementsElement.php line: 73
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 75
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 76
+manageadvertisements_element_dates = ""
+;
+; ManageadvertisementsElement.php line: 77
+manageadvertisements_element_viewclicks = ""
+;
+; ManageadvertisementsElement.php line: 80
+manageadvertisements_element_status = ""
+;
+; ManageadvertisementsElement.php line: 82
+manageadvertisements_element_actions = ""
+;
+; ManageadvertisementsElement.php line: 111
+manageadvertisements_element_active = ""
+;
+; ManageadvertisementsElement.php line: 113
+manageadvertisements_element_deactivated = ""
+;
+; ManageadvertisementsElement.php line: 115
+manageadvertisements_element_suspended = ""
+;
+; ManageadvertisementsElement.php line: 117
+manageadvertisements_element_completed = ""
+;
+; ManageadvertisementsElement.php line: 144
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 147
+manageadvertisements_element_edit = ""
+;
+; ManageadvertisementsElement.php line: 157
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 161
+manageadvertisements_element_deactivate = ""
+;
+; ManageadvertisementsElement.php line: 166
+manageadvertisements_element_deconfirm = ""
+;
+; ManageadvertisementsElement.php line: 170
+manageadvertisements_element_suspend = ""
+;
+; ManageadvertisementsElement.php line: 176
+manageadvertisements_element_reconfirm = ""
+;
+; ManageadvertisementsElement.php line: 180
+manageadvertisements_element_reactivate = ""
+;
+; ManageadvertisementsElement.php line: 225
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 227
+manageadvertisement_element_ad_info = ""
+;
+; ManageadvertisementsElement.php line: 231
+manageadvertisement_element_purchase_ad = ""
+;
+; ManageadvertisementsElement.php line: 250
+manageadvertisement_element_ad_user = ""
+;
+; ManageadvertisementsElement.php line: 263
+manageadvertisement_element_displayname = ""
+;
+; ManageadvertisementsElement.php line: 282
+manageadvertisement_element_text = ""
+;
+; ManageadvertisementsElement.php line: 302
+manageadvertisement_element_ad_url = ""
+;
+; ManageadvertisementsElement.php line: 323
+manageeadvertisement_element_ad_duration = ""
+;
+; ManageadvertisementsElement.php line: 339
+manageeadvertisement_element_start_day = ""
+;
+; ManageadvertisementsElement.php line: 344
+manageeadvertisement_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 349
+manageadvertisement_element_keyword_help = ""
+;
+; ManageadvertisementsElement.php line: 363
+manageadvertisement_element_keyword_bid_amount = ""
+;
+; ManageadvertisementsElement.php line: 370
+manageadvertisement_element_expensive_word = ""
+;
+; ManageadvertisementsElement.php line: 387
+manageadvertisement_element_calculate_bid = ""
+;
+; ManageadvertisementsElement.php line: 407
+manageadvertisement_element_update = ""
+;
+; ManageadvertisementsElement.php line: 416
+manageadvertisement_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 427
+manageadvertisement_element_card_number = ""
+;
+; ManageadvertisementsElement.php line: 438
+manageadvertisement_element_cvc = ""
+;
+; ManageadvertisementsElement.php line: 447
+manageadvertisement_element_expiration = ""
+;
+; ManageadvertisementsElement.php line: 465
+manageadvertisement_element_charge_warning = ""
+;
+; ManageadvertisementsElement.php line: 468
+manageadvertisement_element_program_terms = ""
+;
+; ManageadvertisementsElement.php line: 475
+manageadvertisement_element_edit_ad = ""
+;
+; ManageadvertisementsElement.php line: 479
+manageadvertisement_element_purchase = ""
+;
+; ManageadvertisementsElement.php line: 500
+manageadvertisement_element_preview = ""
+;
+; ManageadvertisementsElement.php line: 538
+manageadvertisements_element_search_advertisement = ""
+;
+; ManageadvertisementsElement.php line: 540
+manageadvertisement_element_addadvertisement_form = ""
+;
+; ManageadvertisementsElement.php line: 542
+manageadvertisements_element_adname = ""
+;
+; ManageadvertisementsElement.php line: 543
+manageadvertisements_element_description = ""
+;
+; ManageadvertisementsElement.php line: 544
+manageadvertisements_element_destination_url = ""
+;
+; ManageadvertisementsElement.php line: 545
+manageadvertisements_element_keywords = ""
+;
+; ManageadvertisementsElement.php line: 546
+manageadvertisements_element_budget = ""
+;
+; ManageadvertisementsElement.php line: 547
+manageadvertisements_element_start_date = ""
+;
+; ManageadvertisementsElement.php line: 548
+manageadvertisements_element_end_date = ""
+;
+; ManageclassifiersElement.php line: 66
+manageclassifiers_available_classifiers = ""
+;
+; ManageclassifiersElement.php line: 74
+manageclassifiers_label_col = ""
+;
+; ManageclassifiersElement.php line: 77
+manageclassifiers_positive_col = ""
+;
+; ManageclassifiersElement.php line: 78
+manageclassifiers_negative_col = ""
+;
+; ManageclassifiersElement.php line: 82
+manageclassifiers_actions_col = ""
+;
+; ManageclassifiersElement.php line: 100
+manageclassifiers_edit = ""
+;
+; ManageclassifiersElement.php line: 103
+manageclassifiers_finalized = ""
+;
+; ManageclassifiersElement.php line: 109
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 111
+manageclassifiers_finalize = ""
+;
+; ManageclassifiersElement.php line: 116
+manageclassifiers_finalizing = ""
+;
+; ManageclassifiersElement.php line: 120
+confirm_delete_operation = ""
+;
+; ManageclassifiersElement.php line: 123
+manageclassifiers_delete = ""
+;
+; ManageclassifiersElement.php line: 155
+manageclassifiers_manage_classifiers = ""
+;
+; ManageclassifiersElement.php line: 165
+manageclassifiers_classifier_name = ""
+;
+; ManageclassifiersElement.php line: 170
+manageclassifiers_create_button = ""
+;
+; ManageclassifiersElement.php line: 185
+manageclassifiers_element_search = ""
+;
+; ManageclassifiersElement.php line: 186
+manageclassifiers_element_create_form = ""
+;
+; ManageclassifiersElement.php line: 187
+manageclassifiers_classifier_name = ""
+;
+; ManagecrawlsElement.php line: 51
+managecrawls_element_create_crawl = ""
+;
+; ManagecrawlsElement.php line: 60
+managecrawls_element_description = ""
+;
+; ManagecrawlsElement.php line: 67
+managecrawls_element_start_new_crawl = ""
+;
+; ManagecrawlsElement.php line: 71
+managecrawls_element_options = ""
+;
+; ManagecrawlsElement.php line: 77
+managecrawls_element_awaiting_status = ""
+;
+; ManagecrawlsElement.php line: 95
+managecrawls_element_up_longer_update = ""
+;
+; ManagegroupsElement.php line: 71
+managegroups_element_not_my_groups = ""
+;
+; ManagegroupsElement.php line: 73
+managegroups_element_groups = ""
+;
+; ManagegroupsElement.php line: 82
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 83
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 85
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 86
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 87
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 88
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 90
+managegroups_element_actions = ""
+;
+; ManagegroupsElement.php line: 196
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 200
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 214
+manageaccount_element_group_wiki = ""
+;
+; ManagegroupsElement.php line: 229
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 233
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 238
+managegroups_element_edit = ""
+;
+; ManagegroupsElement.php line: 243
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 249
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 254
+managegroups_element_join = ""
+;
+; ManagegroupsElement.php line: 263
+managegroups_element_decline = ""
+;
+; ManagegroupsElement.php line: 265
+managegroups_element_unsubscribe = ""
+;
+; ManagegroupsElement.php line: 270
+confirm_delete_operation = ""
+;
+; ManagegroupsElement.php line: 273
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 303
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 304
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 306
+managegroups_element_create_group = ""
+;
+; ManagegroupsElement.php line: 310
+managegroups_element_add_group = ""
+;
+; ManagegroupsElement.php line: 327
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 338
+managegroups_element_browse = ""
+;
+; ManagegroupsElement.php line: 348
+managegroups_element_register = ""
+;
+; ManagegroupsElement.php line: 355
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 362
+managegroups_element_voting = ""
+;
+; ManagegroupsElement.php line: 369
+managegroups_element_post_lifetime = ""
+;
+; ManagegroupsElement.php line: 381
+managegroups_element_group_users = ""
+;
+; ManagegroupsElement.php line: 385
+managegroups_element_num_users = ""
+;
+; ManagegroupsElement.php line: 412
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 414
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 423
+managegroups_element_activate = ""
+;
+; ManagegroupsElement.php line: 429
+managegroups_element_ban = ""
+;
+; ManagegroupsElement.php line: 435
+managegroups_element_unban = ""
+;
+; ManagegroupsElement.php line: 443
+managegroups_element_delete = ""
+;
+; ManagegroupsElement.php line: 471
+managegroups_element_filter = ""
+;
+; ManagegroupsElement.php line: 492
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 503
+managegroups_element_save = ""
+;
+; ManagegroupsElement.php line: 533
+managegroups_element_group_info = ""
+;
+; ManagegroupsElement.php line: 534
+managegroups_element_invite_users_group = ""
+;
+; ManagegroupsElement.php line: 546
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 554
+managegroups_element_usernames = ""
+;
+; ManagegroupsElement.php line: 561
+managegroups_element_invite = ""
+;
+; ManagegroupsElement.php line: 580
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 581
+managegroups_element_transfer_group_owner = ""
+;
+; ManagegroupsElement.php line: 593
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 601
+managegroups_element_new_group_owner = ""
+;
+; ManagegroupsElement.php line: 608
+managegroups_element_change_owner = ""
+;
+; ManagegroupsElement.php line: 627
+managegroups_element_discover_groups = ""
+;
+; ManagegroupsElement.php line: 631
+managegroups_element_search_group = ""
+;
+; ManagegroupsElement.php line: 633
+managegroups_element_addgroup_form = ""
+;
+; ManagegroupsElement.php line: 635
+managegroups_element_groupname = ""
+;
+; ManagegroupsElement.php line: 636
+managegroups_element_groupowner = ""
+;
+; ManagegroupsElement.php line: 637
+managegroups_element_registertype = ""
+;
+; ManagegroupsElement.php line: 639
+managegroups_element_memberaccess = ""
+;
+; ManagegroupsElement.php line: 641
+managegroups_element_post_lifetime = ""
+;
+; ManagelocalesElement.php line: 62
+managelocales_element_locale_list = ""
+;
+; ManagelocalesElement.php line: 72
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 75
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 76
+managelocales_element_writingmode = ""
+;
+; ManagelocalesElement.php line: 77
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 81
+managelocales_element_percenttranslated = ""
+;
+; ManagelocalesElement.php line: 82
+managelocales_element_actions = ""
+;
+; ManagelocalesElement.php line: 102
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 103
+managelocales_element_false = ""
+;
+; ManagelocalesElement.php line: 110
+managelocales_element_edit = ""
+;
+; ManagelocalesElement.php line: 115
+confirm_delete_operation = ""
+;
+; ManagelocalesElement.php line: 116
+managelocales_element_delete = ""
+;
+; ManagelocalesElement.php line: 137
+manageloecales_element_add_locale_form = ""
+;
+; ManagelocalesElement.php line: 138
+managelocales_element_locale_info = ""
+;
+; ManagelocalesElement.php line: 140
+managelocales_element_add_locale = ""
+;
+; ManagelocalesElement.php line: 161
+managelocales_element_localenamelabel = ""
+;
+; ManagelocalesElement.php line: 174
+managelocales_element_localetaglabel = ""
+;
+; ManagelocalesElement.php line: 180
+managelocales_element_writingmodelabel = ""
+;
+; ManagelocalesElement.php line: 190
+managelocales_element_localeenabled = ""
+;
+; ManagelocalesElement.php line: 201
+managelocales_element_submit = "完成"
+;
+; ManagelocalesElement.php line: 219
+managelocales_element_search_locales = ""
+;
+; ManagelocalesElement.php line: 220
+managelocales_element_addlocale_form = ""
+;
+; ManagelocalesElement.php line: 222
+managelocales_element_localename = ""
+;
+; ManagelocalesElement.php line: 223
+managelocales_element_localetag = ""
+;
+; ManagelocalesElement.php line: 224
+managelocales_element_writingmode = ""
+;
+; ManagelocalesElement.php line: 225
+managelocales_element_enabled = ""
+;
+; ManagelocalesElement.php line: 231
+managelocales_element_true = ""
+;
+; ManagelocalesElement.php line: 232
+managelocales_element_false = ""
+;
+; ManagemachinesElement.php line: 56
+managemachines_element_add_machine = ""
+;
+; ManagemachinesElement.php line: 67
+managemachines_element_machine_name = ""
+;
+; ManagemachinesElement.php line: 72
+managemachines_element_machineurl = ""
+;
+; ManagemachinesElement.php line: 76
+managemachines_element_is_mirror = ""
+;
+; ManagemachinesElement.php line: 81
+managemachines_element_parent_name = ""
+;
+; ManagemachinesElement.php line: 87
+managemachines_element_has_queueserver = ""
+;
+; ManagemachinesElement.php line: 91
+managemachines_element_num_fetchers = ""
+;
+; ManagemachinesElement.php line: 96
+managemachines_element_submit = ""
+;
+; ManagemachinesElement.php line: 101
+managemachines_element_machine_info = ""
+;
+; ManagemachinesElement.php line: 105
+managemachines_element_awaiting_status = ""
+;
+; ManagemachinesElement.php line: 123
+managemachines_element_no_longer_update = ""
+;
+; ManagerolesElement.php line: 59
+manageroles_element_roles = ""
+;
+; ManagerolesElement.php line: 67
+manageroles_element_rolename = "使用者名稱"
+;
+; ManagerolesElement.php line: 68
+manageroles_element_actions = ""
+;
+; ManagerolesElement.php line: 94
+manageroles_element_edit = ""
+;
+; ManagerolesElement.php line: 99
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 103
+confirm_delete_operation = ""
+;
+; ManagerolesElement.php line: 106
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 140
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 141
+manageroles_element_role_info = ""
+;
+; ManagerolesElement.php line: 143
+manageroles_element_add_role = "新增使用者"
+;
+; ManagerolesElement.php line: 154
+manageroles_element_rolename = "使用者名稱"
+;
+; ManagerolesElement.php line: 167
+manageroles_element_role_activities = ""
+;
+; ManagerolesElement.php line: 175
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 183
+manageroles_element_delete = ""
+;
+; ManagerolesElement.php line: 203
+manageroles_element_save = ""
+;
+; ManagerolesElement.php line: 220
+manageroles_element_search_role = ""
+;
+; ManagerolesElement.php line: 221
+manageroles_element_addrole_form = ""
+;
+; ManagerolesElement.php line: 223
+manageroles_element_rolename = "使用者名稱"
+;
+; ManageusersElement.php line: 59
+manageusers_element_users = ""
+;
+; ManageusersElement.php line: 68
+manageusers_element_username = "使用者名稱"
+;
+; ManageusersElement.php line: 70
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 71
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 72
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 73
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 75
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 76
+manageusers_element_actions = ""
+;
+; ManageusersElement.php line: 141
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 145
+manageusers_element_edit = ""
+;
+; ManageusersElement.php line: 151
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 155
+confirm_delete_operation = ""
+;
+; ManageusersElement.php line: 158
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 200
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 201
+manageusers_element_user_info = ""
+;
+; ManageusersElement.php line: 203
+manageusers_element_add_user = ""
+;
+; ManageusersElement.php line: 228
+manageusers_element_username = "使用者名稱"
+;
+; ManageusersElement.php line: 238
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 244
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 250
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 257
+manageusers_element_status = ""
+;
+; ManageusersElement.php line: 274
+manageusers_element_roles = ""
+;
+; ManageusersElement.php line: 278
+manageusers_element_num_roles = ""
+;
+; ManageusersElement.php line: 293
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 303
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 344
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 357
+manageusers_element_add_role = ""
+;
+; ManageusersElement.php line: 367
+manageusers_element_groups = ""
+;
+; ManageusersElement.php line: 371
+manageusers_element_num_groups = ""
+;
+; ManageusersElement.php line: 392
+manageusers_element_delete = ""
+;
+; ManageusersElement.php line: 431
+manageusers_element_filter = ""
+;
+; ManageusersElement.php line: 443
+manageusers_element_add_group = ""
+;
+; ManageusersElement.php line: 456
+manageusers_element_password = "密碼"
+;
+; ManageusersElement.php line: 462
+manageusers_element_retype_password = "再次輸入密碼"
+;
+; ManageusersElement.php line: 469
+manageusers_element_save = ""
+;
+; ManageusersElement.php line: 496
+manageusers_element_search_user = ""
+;
+; ManageusersElement.php line: 497
+manageusers_element_adduser_form = ""
+;
+; ManageusersElement.php line: 499
+manageusers_element_username = "使用者名稱"
+;
+; ManageusersElement.php line: 500
+manageusers_element_firstname = ""
+;
+; ManageusersElement.php line: 501
+manageusers_element_lastname = ""
+;
+; ManageusersElement.php line: 502
+manageusers_element_email = ""
+;
+; ManageusersElement.php line: 503
+manageusers_element_status = ""
+;
+; MixcrawlsElement.php line: 65
+mixcrawls_element_available_mixes = ""
+;
+; MixcrawlsElement.php line: 72
+mixcrawls_view_name = ""
+;
+; MixcrawlsElement.php line: 74
+mixcrawls_view_definition = ""
+;
+; MixcrawlsElement.php line: 78
+mixcrawls_view_actions = ""
+;
+; MixcrawlsElement.php line: 112
+mixcrawls_view_no_components = ""
+;
+; MixcrawlsElement.php line: 118
+mixcrawls_view_share = ""
+;
+; MixcrawlsElement.php line: 120
+mixcrawls_view_edit = ""
+;
+; MixcrawlsElement.php line: 125
+mixcrawls_set_index = ""
+;
+; MixcrawlsElement.php line: 128
+mixcrawl_search_index = ""
+;
+; MixcrawlsElement.php line: 134
+confirm_delete_operation = ""
+;
+; MixcrawlsElement.php line: 136
+mixcrawls_view_delete = ""
+;
+; MixcrawlsElement.php line: 146
+mixcrawls_view_back = ""
+;
+; MixcrawlsElement.php line: 147
+mixcrawls_element_share_mix_group = ""
+;
+; MixcrawlsElement.php line: 157
+mixcrawls_element_mixname = ""
+;
+; MixcrawlsElement.php line: 163
+mixcrawls_element_group = ""
+;
+; MixcrawlsElement.php line: 169
+mixcrawls_element_share = ""
+;
+; MixcrawlsElement.php line: 193
+mixcrawls_element_make_mix = ""
+;
+; MixcrawlsElement.php line: 203
+mixcrawls_element_mix_name = ""
+;
+; MixcrawlsElement.php line: 208
+mixcrawls_element_create_button = ""
+;
+; MixcrawlsElement.php line: 224
+mixcrawls_element_search_mix = ""
+;
+; MixcrawlsElement.php line: 225
+mixcrawls_element_createmix_form = ""
+;
+; MixcrawlsElement.php line: 227
+mixcrawls_element_mixname = ""
+;
+; MoreoptionsElement.php line: 82
+moreoptions_element_other_searches = ""
+;
+; MoreoptionsElement.php line: 119
+moreoptions_element_previous = ""
+;
+; MoreoptionsElement.php line: 125
+moreoptions_element_next = ""
+;
+; MoreoptionsElement.php line: 137
+moreoptions_element_my_accounts = ""
+;
+; MoreoptionsElement.php line: 142
+signin_element_settings = "設定"
+;
+; MoreoptionsElement.php line: 151
+signin_element_signin = "登入"
+;
+; MoreoptionsElement.php line: 154
+signin_element_admin = "管理員"
+;
+; MoreoptionsElement.php line: 167
+signin_view_create_account = ""
+;
+; MoreoptionsElement.php line: 186
+moreoptions_element_suggest = ""
+;
+; MoreoptionsElement.php line: 188
+moreoptions_element_wiki_pages = ""
+;
+; MoreoptionsElement.php line: 199
+moreoptions_element_tools = ""
+;
+; PageoptionsElement.php line: 59
+pageoptions_element_crawl_time = ""
+;
+; PageoptionsElement.php line: 64
+pageoptions_element_search_time = ""
+;
+; PageoptionsElement.php line: 69
+pageoptions_element_test_options = ""
+;
+; PageoptionsElement.php line: 81
+pageoptions_element_load_options = ""
+;
+; PageoptionsElement.php line: 86
+pageoptions_element_page_range = ""
+;
+; PageoptionsElement.php line: 92
+pageoptions_element_summarizer = ""
+;
+; PageoptionsElement.php line: 101
+pageoptions_element_max_description = ""
+;
+; PageoptionsElement.php line: 107
+pageoptions_element_save_cache = ""
+;
+; PageoptionsElement.php line: 117
+pageoptions_element_allow_recrawl = ""
+;
+; PageoptionsElement.php line: 124
+pageoptions_element_file_types = ""
+;
+; PageoptionsElement.php line: 153
+pageoptions_element_classifiers_rankers = ""
+;
+; PageoptionsElement.php line: 169
+pageoptions_element_use_classify = ""
+;
+; PageoptionsElement.php line: 170
+pageoptions_element_use_rank = ""
+;
+; PageoptionsElement.php line: 197
+pageoptions_element_no_classifiers = ""
+;
+; PageoptionsElement.php line: 200
+pageoptions_element_indexing_plugins = ""
+;
+; PageoptionsElement.php line: 206
+pageoptions_element_plugin = ""
+;
+; PageoptionsElement.php line: 207
+pageoptions_element_plugin_include = ""
+;
+; PageoptionsElement.php line: 223
+pageoptions_element_configure = ""
+;
+; PageoptionsElement.php line: 235
+pageoptions_element_no_compatible_plugins = ""
+;
+; PageoptionsElement.php line: 238
+pageoptions_element_page_rules = ""
+;
+; PageoptionsElement.php line: 247
+page_element_search_page = ""
+;
+; PageoptionsElement.php line: 254
+pageoptions_element_wd_suggest = ""
+;
+; PageoptionsElement.php line: 262
+pageoptions_element_subsearch_link = ""
+;
+; PageoptionsElement.php line: 271
+pageoptions_element_signin_link = ""
+;
+; PageoptionsElement.php line: 279
+pageoptions_element_cache_link = ""
+;
+; PageoptionsElement.php line: 288
+pageoptions_element_similar_link = ""
+;
+; PageoptionsElement.php line: 297
+pageoptions_element_in_link = ""
+;
+; PageoptionsElement.php line: 304
+pageoptions_element_ip_link = ""
+;
+; PageoptionsElement.php line: 313
+pageoptions_element_ranking_factors = ""
+;
+; PageoptionsElement.php line: 318
+pageoptions_element_title_weight = ""
+;
+; PageoptionsElement.php line: 323
+pageoptions_element_description_weight = ""
+;
+; PageoptionsElement.php line: 328
+pageoptions_element_link_weight = ""
+;
+; PageoptionsElement.php line: 333
+pageoptions_element_results_grouping_options = ""
+;
+; PageoptionsElement.php line: 338
+pageoptions_element_min_results_to_group = ""
+;
+; PageoptionsElement.php line: 344
+pageoptions_element_server_alpha = ""
+;
+; PageoptionsElement.php line: 352
+pageoptions_element_test_page = ""
+;
+; PageoptionsElement.php line: 356
+pageoptions_element_page_type = ""
+;
+; PageoptionsElement.php line: 372
+pageoptions_element_save_options = ""
+;
+; PageoptionsElement.php line: 374
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 380
+pageoptions_element_test_results = ""
+;
+; PageoptionsElement.php line: 383
+pageoptions_element_page_truncated = ""
+;
+; PageoptionsElement.php line: 388
+pageoptions_element_after_process = ""
+;
+; PageoptionsElement.php line: 392
+pageoptions_element_after_rules = ""
+;
+; PageoptionsElement.php line: 396
+pageoptions_element_extracted_words = ""
+;
+; PageoptionsElement.php line: 400
+pageoptions_element_extracted_metas = ""
+;
+; PageoptionsElement.php line: 417
+page_element_plugin_back = ""
+;
+; PageoptionsElement.php line: 454
+pageoptions_element_run_tests = ""
+;
+; PageoptionsElement.php line: 458
+pageoptions_element_save_options = ""
+;
+; ResultseditorElement.php line: 52
+resultseditor_element_edit_page = ""
+;
+; ResultseditorElement.php line: 57
+resultseditor_element_edited_pages = ""
+;
+; ResultseditorElement.php line: 66
+resultseditor_element_url_list = ""
+;
+; ResultseditorElement.php line: 68
+resultseditor_element_load_page = ""
+;
+; ResultseditorElement.php line: 81
+resultseditor_element_page_url = ""
+;
+; ResultseditorElement.php line: 87
+resultseditor_element_page_title = ""
+;
+; ResultseditorElement.php line: 93
+resultseditor_element_description = ""
+;
+; ResultseditorElement.php line: 97
+resultseditor_element_reset = ""
+;
+; ResultseditorElement.php line: 99
+resultseditor_element_save_page = ""
+;
+; ResultseditorElement.php line: 102
+resultseditor_element_filter_websites = ""
+;
+; ResultseditorElement.php line: 114
+resultseditor_element_sites_to_filter = ""
+;
+; ResultseditorElement.php line: 119
+resultseditor_element_save_filter = ""
+;
+; SearchsourcesElement.php line: 62
+searchsources_element_addsource_form = ""
+;
+; SearchsourcesElement.php line: 63
+searchsources_element_edit_media_source = ""
+;
+; SearchsourcesElement.php line: 67
+searchsources_element_add_media_source = ""
+;
+; SearchsourcesElement.php line: 90
+searchsources_element_sourcetype = ""
+;
+; SearchsourcesElement.php line: 95
+searchsources_element_sourcename = ""
+;
+; SearchsourcesElement.php line: 104
+searchsources_element_url = ""
+;
+; SearchsourcesElement.php line: 110
+searchsources_element_locale_tag = ""
+;
+; SearchsourcesElement.php line: 115
+searchsources_element_thumbnail = ""
+;
+; SearchsourcesElement.php line: 125
+searchsources_element_feed_instruct = ""
+;
+; SearchsourcesElement.php line: 128
+searchsources_element_channelpath = ""
+;
+; SearchsourcesElement.php line: 134
+searchsources_element_itempath = ""
+;
+; SearchsourcesElement.php line: 140
+searchsources_element_titlepath = ""
+;
+; SearchsourcesElement.php line: 146
+searchsources_element_descpath = ""
+;
+; SearchsourcesElement.php line: 152
+searchsources_element_linkpath = ""
+;
+; SearchsourcesElement.php line: 158
+searchsources_element_image_xpath = ""
+;
+; SearchsourcesElement.php line: 164
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 170
+searchsources_element_media_sources = ""
+;
+; SearchsourcesElement.php line: 193
+searchsources_element_medianame = ""
+;
+; SearchsourcesElement.php line: 194
+searchsources_element_mediatype = ""
+;
+; SearchsourcesElement.php line: 196
+searchsources_element_mediaurls = ""
+;
+; SearchsourcesElement.php line: 199
+searchsources_element_action = ""
+;
+; SearchsourcesElement.php line: 227
+searchsources_element_editmedia = ""
+;
+; SearchsourcesElement.php line: 230
+confirm_delete_operation = ""
+;
+; SearchsourcesElement.php line: 233
+searchsources_element_deletemedia = ""
+;
+; SearchsourcesElement.php line: 242
+searchsources_element_addsearch_form = ""
+;
+; SearchsourcesElement.php line: 244
+searchsources_element_edit_subsearch = ""
+;
+; SearchsourcesElement.php line: 249
+searchsources_element_add_subsearch = ""
+;
+; SearchsourcesElement.php line: 264
+searchsources_element_foldername = ""
+;
+; SearchsourcesElement.php line: 274
+searchsources_element_indexsource = ""
+;
+; SearchsourcesElement.php line: 280
+searchsources_element_per_page = ""
+;
+; SearchsourcesElement.php line: 286
+searchsources_element_submit = ""
+;
+; SearchsourcesElement.php line: 292
+searchsources_element_subsearches = ""
+;
+; SearchsourcesElement.php line: 302
+searchsources_element_dirname = ""
+;
+; SearchsourcesElement.php line: 303
+searchsources_element_index = ""
+;
+; SearchsourcesElement.php line: 306
+searchsources_element_localestring = ""
+;
+; SearchsourcesElement.php line: 307
+searchsources_element_perpage = ""
+;
+; SearchsourcesElement.php line: 311
+searchsources_element_actions = ""
+;
+; SearchsourcesElement.php line: 327
+searchsources_element_editsource = ""
+;
+; SearchsourcesElement.php line: 333
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 335
+searchsources_element_localize = ""
+;
+; SearchsourcesElement.php line: 342
+searchsources_element_deletesubsearch = ""
+;
+; SecurityElement.php line: 58
+security_element_auth_captcha = ""
+;
+; SecurityElement.php line: 69
+security_element_authentication_type = ""
+;
+; SecurityElement.php line: 81
+security_element_zero_unavailable = ""
+;
+; SecurityElement.php line: 90
+security_element_captcha_type = ""
+;
+; SecurityElement.php line: 103
+security_element_save = ""
+;
+; SecurityElement.php line: 107
+security_element_captcha_recovery_questions = ""
+;
+; SecurityElement.php line: 113
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 118
+security_element_edit_captcha = ""
+;
+; SecurityElement.php line: 123
+security_element_edit_recovery = ""
+;
+; SecurityElement.php line: 126
+security_element_edit_captcha = ""
+;
+; ServersettingsElement.php line: 59
+serversettings_element_server_settings = ""
+;
+; ServersettingsElement.php line: 62
+serversettings_element_name_server = ""
+;
+; ServersettingsElement.php line: 66
+serversettings_element_name_server_key = ""
+;
+; ServersettingsElement.php line: 73
+serversettings_element_name_server_url = ""
+;
+; ServersettingsElement.php line: 81
+serversettings_element_use_memcache = ""
+;
+; ServersettingsElement.php line: 89
+serversettings_element_memcache_servers = ""
+;
+; ServersettingsElement.php line: 100
+serversettings_element_use_filecache = ""
+;
+; ServersettingsElement.php line: 110
+configure_element_database_setup = ""
+;
+; ServersettingsElement.php line: 115
+serversettings_element_database_system = ""
+;
+; ServersettingsElement.php line: 123
+serversettings_element_databasename = ""
+;
+; ServersettingsElement.php line: 130
+serversettings_element_databasehost = ""
+;
+; ServersettingsElement.php line: 137
+serversettings_element_databaseuser = ""
+;
+; ServersettingsElement.php line: 145
+serversettings_element_databasepassword = ""
+;
+; ServersettingsElement.php line: 158
+serversettings_element_account_registration = ""
+;
+; ServersettingsElement.php line: 169
+serversettings_element_mail_sender = ""
+;
+; ServersettingsElement.php line: 175
+serversettings_element_send_media_updater = ""
+;
+; ServersettingsElement.php line: 185
+serversettings_element_use_php_mail = ""
+;
+; ServersettingsElement.php line: 192
+serversettings_element_mail_server = ""
+;
+; ServersettingsElement.php line: 198
+serversettings_element_mail_serverport = ""
+;
+; ServersettingsElement.php line: 205
+serversettings_element_mail_username = ""
+;
+; ServersettingsElement.php line: 211
+serversettings_element_mail_password = ""
+;
+; ServersettingsElement.php line: 218
+serversettings_element_mail_security = ""
+;
+; ServersettingsElement.php line: 228
+serversettings_element_proxy_title = ""
+;
+; ServersettingsElement.php line: 232
+serversettings_element_tor_proxy = ""
+;
+; ServersettingsElement.php line: 238
+serversettings_element_use_proxy_servers = ""
+;
+; ServersettingsElement.php line: 247
+serversettings_element_proxy_servers = ""
+;
+; ServersettingsElement.php line: 256
+serversettings_element_adserver_configuration = ""
+;
+; ServersettingsElement.php line: 261
+serversettings_element_advertising_source = ""
+;
+; ServersettingsElement.php line: 273
+serversettings_element_no_payment_processing = ""
+;
+; ServersettingsElement.php line: 275
+serversettings_element_purchase_processing = ""
+;
+; ServersettingsElement.php line: 282
+serversettings_element_ad_location = ""
+;
+; ServersettingsElement.php line: 287
+serversettings_element_top = ""
+;
+; ServersettingsElement.php line: 292
+serversettings_element_side = ""
+;
+; ServersettingsElement.php line: 297
+serversettings_element_both = ""
+;
+; ServersettingsElement.php line: 302
+serversettings_element_none = ""
+;
+; ServersettingsElement.php line: 305
+serversettings_element_global_adscript = ""
+;
+; ServersettingsElement.php line: 312
+serversettings_element_top_adscript = ""
+;
+; ServersettingsElement.php line: 319
+serversettings_element_side_adscript = ""
+;
+; ServersettingsElement.php line: 329
+serversettings_element_save = ""
+;
+; SigninElement.php line: 73
+signin_element_settings = "設定"
+;
+; SigninElement.php line: 77
+signin_element_signin = "登入"
+;
+; SigninElement.php line: 81
+signin_element_signout = "登出"
+;
+; SubsearchElement.php line: 69
+subsearch_element_more = ""
+;
+; WikiElement.php line: 121
+wiki_view_back = ""
+;
+; WikiElement.php line: 139
+groupfeed_element_feed = ""
+;
+; WikiElement.php line: 140
+wiki_view_wiki = ""
+;
+; WikiElement.php line: 144
+wiki_view_page = ""
+;
+; WikiElement.php line: 148
+wiki_view_read = ""
+;
+; WikiElement.php line: 149
+wiki_view_edit = ""
+;
+; WikiElement.php line: 152
+wiki_view_pages = ""
+;
+; WikiElement.php line: 237
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 245
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 246
+wiki_view_create_edit = ""
+;
+; WikiElement.php line: 247
+wiki_view_use_form_below = ""
+;
+; WikiElement.php line: 259
+wiki_element_submit = ""
+;
+; WikiElement.php line: 265
+wiki_view_syntax_summary = ""
+;
+; WikiElement.php line: 268
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 270
+wiki_view_signin_edit = ""
+;
+; WikiElement.php line: 272
+wiki_view_page_no_exist = ""
+;
+; WikiElement.php line: 302
+wiki_element_history = ""
+;
+; WikiElement.php line: 306
+wiki_element_discuss = ""
+;
+; WikiElement.php line: 342
+wiki_element_locale_name = ""
+;
+; WikiElement.php line: 346
+wiki_element_page = ""
+;
+; WikiElement.php line: 349
+configure_element_toggle_page_settings = ""
+;
+; WikiElement.php line: 353
+wiki_element_page_type = ""
+;
+; WikiElement.php line: 361
+wiki_element_page_alias = ""
+;
+; WikiElement.php line: 369
+wiki_element_page_border = ""
+;
+; WikiElement.php line: 376
+wiki_element_table_of_contents = ""
+;
+; WikiElement.php line: 385
+wiki_element_title = ""
+;
+; WikiElement.php line: 391
+wiki_element_meta_author = ""
+;
+; WikiElement.php line: 397
+wiki_element_meta_robots = ""
+;
+; WikiElement.php line: 404
+wiki_element_meta_description = ""
+;
+; WikiElement.php line: 411
+wiki_element_page_header = ""
+;
+; WikiElement.php line: 417
+wiki_element_page_footer = ""
+;
+; WikiElement.php line: 440
+wiki_element_archive_info = ""
+;
+; WikiElement.php line: 443
+wiki_element_edit_reason = ""
+;
+; WikiElement.php line: 450
+wiki_element_savebutton = ""
+;
+; WikiElement.php line: 454
+wiki_element_media_list = ""
+;
+; WikiElement.php line: 455
+wiki_element_ml_description = ""
+;
+; WikiElement.php line: 458
+wiki_view_page_resources = ""
+;
+; WikiElement.php line: 493
+wiki_view_upload = ""
+;
+; WikiElement.php line: 497
+wiki_element_resources_info = ""
+;
+; WikiElement.php line: 512
+wiki_element_rename_failed = ""
+;
+; WikiElement.php line: 578
+wiki_element_rename = ""
+;
+; WikiElement.php line: 582
+wiki_element_add_to_page = ""
+;
+; WikiElement.php line: 602
+wiki_element_no_resources = ""
+;
+; WikiElement.php line: 624
+wiki_view_wiki_page_list = ""
+;
+; WikiElement.php line: 637
+wiki_view_filter_or_create = ""
+;
+; WikiElement.php line: 639
+wiki_element_go = ""
+;
+; WikiElement.php line: 644
+wiki_view_create_page = ""
+;
+; WikiElement.php line: 655
+wiki_element_redirect_to = ""
+;
+; WikiElement.php line: 677
+wiki_view_no_pages = ""
+;
+; WikiElement.php line: 700
+wiki_view_back = ""
+;
+; WikiElement.php line: 716
+wiki_view_difference = ""
+;
+; WikiElement.php line: 722
+wiki_view_go = ""
+;
+; WikiElement.php line: 741
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 743
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 747
+wiki_view_diff_first = ""
+;
+; WikiElement.php line: 748
+wiki_view_diff_second = ""
+;
+; WikiElement.php line: 754
+wiki_view_edited_by = ""
+;
+; WikiElement.php line: 758
+wiki_view_page_len = ""
+;
+; WikiElement.php line: 760
+wiki_view_revert = ""
+;
+; WikiElement.php line: 763
+wiki_view_revert = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/helpers
+;
+; FeedsHelper.php line: 70
+feeds_helper_view_feed_results = ""
+;
+; FeedsHelper.php line: 164
+feeds_helper_view_onehour = "1小时前"
+;
+; FeedsHelper.php line: 169
+feeds_helper_view_minsecs = ""
+;
+; FeedsHelper.php line: 174
+feeds_helper_view_hourdate = "%s小时前"
+;
+; FileuploadHelper.php line: 72
+fileupload_helper_drag_textarea = ""
+;
+; FileuploadHelper.php line: 73
+fileupload_helper_click_textarea = ""
+;
+; FileuploadHelper.php line: 75
+fileupload_helper_drag_above = ""
+;
+; FileuploadHelper.php line: 76
+fileupload_helper_click_upload = ""
+;
+; FileuploadHelper.php line: 117
+basic_js_invalid_filetype = ""
+;
+; FileuploadHelper.php line: 119
+basic_js_file_too_big = ""
+;
+; FileuploadHelper.php line: 121
+basic_js_upload_progress = ""
+;
+; FileuploadHelper.php line: 123
+basic_js_progress_meter_disabled = ""
+;
+; FileuploadHelper.php line: 125
+basic_js_upload_error = ""
+;
+; FileuploadHelper.php line: 127
+basic_js_upload_cancelled = ""
+;
+; FileuploadHelper.php line: 129
+basic_js_too_many_files = ""
+;
+; HelpbuttonHelper.php line: 106
+wiki_question_mark = ""
+;
+; HelpbuttonHelper.php line: 138
+wiki_view_edit = ""
+;
+; HelpbuttonHelper.php line: 139
+wiki_view_not_available = ""
+;
+; HelpbuttonHelper.php line: 141
+wiki_view_create_edit = ""
+;
+; HelpbuttonHelper.php line: 143
+wiki_view_page_no_exist = ""
+;
+; HelpbuttonHelper.php line: 145
+wiki_view_read = ""
+;
+; ImagesHelper.php line: 55
+images_helper_view_image_results = ""
+;
+; PaginationHelper.php line: 97
+pagination_helper_previous = "上一页"
+;
+; PaginationHelper.php line: 121
+pagination_helper_next = "下一页"
+;
+; PagingtableHelper.php line: 103
+pagingtable_helper_search = ""
+;
+; PagingtableHelper.php line: 125
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 138
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 215
+pagingtable_helper_row_range = ""
+;
+; PagingtableHelper.php line: 233
+pagingtable_helper_show = ""
+;
+; PagingtableHelper.php line: 241
+pagingtable_helper_search = ""
+;
+; SearchformHelper.php line: 119
+searchform_helper_any = ""
+;
+; SearchformHelper.php line: 148
+searchform_helper_search = ""
+;
+; ToggleHelper.php line: 59
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 61
+toggle_helper_off = ""
+;
+; ToggleHelper.php line: 65
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 67
+toggle_helper_off = ""
+;
+; ToggleHelper.php line: 71
+toggle_helper_on = ""
+;
+; ToggleHelper.php line: 73
+toggle_helper_off = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/views/layouts
+;
+; RssLayout.php line: 62
+rss_layout_title = ""
+;
+; RssLayout.php line: 69
+rss_layout_description = ""
+;
+; WebLayout.php line: 63
+web_layout_title = "PHP 搜索引擎 - Yioop!"
+;
+; WebLayout.php line: 73
+web_layout_description = ""
+;
+; WebLayout.php line: 75
+web_layout_site_author = ""
+;
+; WebLayout.php line: 219
+web_layout_query_statistics = ""
+;
+; WebLayout.php line: 223
+web_layout_total_elapsed_time = ""
+;
+; WebLayout.php line: 228
+web_layout_query_time = ""
+;
+; /Library/WebServer/search_engine/seek_quarry_data/app/views
+;
+; DownloadView.php line: 65
+download_view_form = ""
+;
+; DownloadView.php line: 74
+download_view_thank_you = ""
+;
+; DownloadView.php line: 76
+download_view_full_name = ""
+;
+; DownloadView.php line: 81
+download_view_email = ""
+;
+; DownloadView.php line: 85
+download_view_business = ""
+;
+; DownloadView.php line: 90
+download_view_interest = ""
+;
+; DownloadView.php line: 96
+download_view_get_email = ""
+;
+; DownloadView.php line: 102
+download_view_return_main = ""
+;
+; DownloadView.php line: 115
+download_view_required_fields = ""
+;
+; DownloadView.php line: 119
+download_view_name_required = ""
+;
+; DownloadView.php line: 123
+download_view_valid_email = ""
+;
+; StoreView.php line: 65
+download_view_form = ""
+;
+; StoreView.php line: 74
+download_view_thank_you = ""
+;
+; StoreView.php line: 76
+download_view_full_name = ""
+;
+; StoreView.php line: 81
+download_view_email = ""
+;
+; StoreView.php line: 85
+download_view_business = ""
+;
+; StoreView.php line: 90
+download_view_interest = ""
+;
+; StoreView.php line: 96
+download_view_get_email = ""
+;
+; StoreView.php line: 102
+download_view_return_main = ""
+;
+; StoreView.php line: 115
+download_view_required_fields = ""
+;
+; StoreView.php line: 119
+download_view_name_required = ""
+;
+; StoreView.php line: 123
+download_view_valid_email = ""
+;
+; /Library/WebServer/search_engine/seek_quarry/src/library/indexing_plugins
+;
+; WordfilterPlugin.php line: 355
+wordfilter_plugin_settings_saved = ""
+;
+; WordfilterPlugin.php line: 364
+wordfilter_plugin_defaults_restored = ""
+;
+; WordfilterPlugin.php line: 469
+wordfilter_plugin_preferences = ""
+;
+; WordfilterPlugin.php line: 473
+wordfilter_plugin_factory_settings = ""
+;
+; WordfilterPlugin.php line: 485
+wordfilter_plugin_save = ""
diff --git a/locale/zh_CN/resources/Tokenizer.php b/locale/zh_CN/resources/Tokenizer.php
new file mode 100755
index 0000000..71d4988
--- /dev/null
+++ b/locale/zh_CN/resources/Tokenizer.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015
+ * @filesource
+ */
+namespace seekquarry\yioop\locale\zh_CN\resources;
+
+use seekquarry\yioop\library\PhraseParser;
+
+/**
+ * Chinese specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry\locale\zh-CN
+ */
+
+class Tokenizer
+{
+    /**
+     * Removes the stop words from the page
+     * @param string $page the page to remove stop words from.
+     * @return string $page with no stop words
+     */
+    public static function stopwordsRemover($page)
+    {
+        return $page;
+    }
+    /**
+     * A word segmenter.
+     * Such a segmenter on input thisisabunchofwords would output
+     * this is a bunch of words
+     *
+     * @param string $pre_segment  before segmentation
+     * @return string with words separated by space
+     */
+    public static function segment($pre_segment)
+    {
+        return PhraseParser::reverseMaximalMatch($pre_segment, "zh-CN",
+            ['/\d+/', '/[a-zA-Z]+/']);
+    }
+}
diff --git a/locale/zh_CN/resources/locale.js b/locale/zh_CN/resources/locale.js
new file mode 100755
index 0000000..77ec0da
--- /dev/null
+++ b/locale/zh_CN/resources/locale.js
@@ -0,0 +1,36 @@
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2015  Chris Pollett chris@pollett.org
+ *
+ * LICENSE:
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Sandhya Vissapragada
+ * @package seek_quarry\locale\zh-CN
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2015s
+ * @filesource
+ */
+
+/*
+ * The alphabet for this locale (just a stub for now)
+ */
+var alpha = "";
+
diff --git a/locale/zh_CN/resources/segment_word_grams.ftr b/locale/zh_CN/resources/segment_word_grams.ftr
new file mode 100755
index 0000000..c39e160
Binary files /dev/null and b/locale/zh_CN/resources/segment_word_grams.ftr differ
diff --git a/locale/zh_CN/statistics.txt b/locale/zh_CN/statistics.txt
new file mode 100755
index 0000000..531e93b
--- /dev/null
+++ b/locale/zh_CN/statistics.txt
@@ -0,0 +1 @@
+d:9;
\ No newline at end of file
diff --git a/resources/4Pa/4PaP2dQJZTE/AppearanceActivity.png b/resources/4Pa/4PaP2dQJZTE/AppearanceActivity.png
new file mode 100644
index 0000000..c574372
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/AppearanceActivity.png differ
diff --git a/resources/4Pa/4PaP2dQJZTE/CreateAdStep1.png b/resources/4Pa/4PaP2dQJZTE/CreateAdStep1.png
new file mode 100644
index 0000000..74e8c78
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/CreateAdStep1.png differ
diff --git a/resources/4Pa/4PaP2dQJZTE/CreateAdStep2.png b/resources/4Pa/4PaP2dQJZTE/CreateAdStep2.png
new file mode 100644
index 0000000..6d2c8d2
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/CreateAdStep2.png differ
diff --git a/resources/4Pa/4PaP2dQJZTE/DefaultYioopLandingPage.png b/resources/4Pa/4PaP2dQJZTE/DefaultYioopLandingPage.png
new file mode 100644
index 0000000..910b595
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/DefaultYioopLandingPage.png differ
diff --git a/resources/4Pa/4PaP2dQJZTE/KeywordAdSearchResult.png b/resources/4Pa/4PaP2dQJZTE/KeywordAdSearchResult.png
new file mode 100644
index 0000000..548ec77
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/KeywordAdSearchResult.png differ
diff --git a/resources/4Pa/4PaP2dQJZTE/ManageAdvertisementElement.png b/resources/4Pa/4PaP2dQJZTE/ManageAdvertisementElement.png
new file mode 100644
index 0000000..372d62f
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/ManageAdvertisementElement.png differ
diff --git a/resources/4Pa/4PaP2dQJZTE/ManageAdvertisements.png b/resources/4Pa/4PaP2dQJZTE/ManageAdvertisements.png
new file mode 100644
index 0000000..6a4e9a4
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/ManageAdvertisements.png differ
diff --git a/resources/4Pa/4PaP2dQJZTE/Version210.pdf b/resources/4Pa/4PaP2dQJZTE/Version210.pdf
new file mode 100644
index 0000000..3639fff
Binary files /dev/null and b/resources/4Pa/4PaP2dQJZTE/Version210.pdf differ
diff --git a/resources/Seekquarry.png b/resources/Seekquarry.png
new file mode 100644
index 0000000..fdd3270
Binary files /dev/null and b/resources/Seekquarry.png differ
diff --git a/resources/xyq/xyqWsOS2HOY/AppearanceActivity.png.jpg b/resources/xyq/xyqWsOS2HOY/AppearanceActivity.png.jpg
new file mode 100644
index 0000000..d5caff8
Binary files /dev/null and b/resources/xyq/xyqWsOS2HOY/AppearanceActivity.png.jpg differ
diff --git a/resources/xyq/xyqWsOS2HOY/CreateAdStep1.png.jpg b/resources/xyq/xyqWsOS2HOY/CreateAdStep1.png.jpg
new file mode 100644
index 0000000..2c5ac83
Binary files /dev/null and b/resources/xyq/xyqWsOS2HOY/CreateAdStep1.png.jpg differ
diff --git a/resources/xyq/xyqWsOS2HOY/CreateAdStep2.png.jpg b/resources/xyq/xyqWsOS2HOY/CreateAdStep2.png.jpg
new file mode 100644
index 0000000..08c7702
Binary files /dev/null and b/resources/xyq/xyqWsOS2HOY/CreateAdStep2.png.jpg differ
diff --git a/resources/xyq/xyqWsOS2HOY/DefaultYioopLandingPage.png.jpg b/resources/xyq/xyqWsOS2HOY/DefaultYioopLandingPage.png.jpg
new file mode 100644
index 0000000..408acac
Binary files /dev/null and b/resources/xyq/xyqWsOS2HOY/DefaultYioopLandingPage.png.jpg differ
diff --git a/resources/xyq/xyqWsOS2HOY/KeywordAdSearchResult.png.jpg b/resources/xyq/xyqWsOS2HOY/KeywordAdSearchResult.png.jpg
new file mode 100644
index 0000000..791b8a1
Binary files /dev/null and b/resources/xyq/xyqWsOS2HOY/KeywordAdSearchResult.png.jpg differ
diff --git a/resources/xyq/xyqWsOS2HOY/ManageAdvertisementElement.png.jpg b/resources/xyq/xyqWsOS2HOY/ManageAdvertisementElement.png.jpg
new file mode 100644
index 0000000..73dd720
Binary files /dev/null and b/resources/xyq/xyqWsOS2HOY/ManageAdvertisementElement.png.jpg differ
diff --git a/resources/xyq/xyqWsOS2HOY/ManageAdvertisements.png.jpg b/resources/xyq/xyqWsOS2HOY/ManageAdvertisements.png.jpg
new file mode 100644
index 0000000..37e9d3f
Binary files /dev/null and b/resources/xyq/xyqWsOS2HOY/ManageAdvertisements.png.jpg differ
diff --git a/views/DownloadView.php b/views/DownloadView.php
new file mode 100755
index 0000000..9825e05
--- /dev/null
+++ b/views/DownloadView.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2014  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @package seek_quarry
+ * @subpackage view
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2014
+ * @filesource
+ */
+namespace seekquarry\yioop\views;
+
+use seekquarry\yioop as B;
+use seekquarry\yioop\configs as C;
+
+/**
+ * This View is responsible for drawing the download
+ * information request form for the Seek Quarry app
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage view
+ */
+
+class DownloadView extends View
+{
+
+    /** This view is drawn on a web layout
+     *  @var string
+     */
+    var $layout = "web";
+
+    /**
+     *  Draws the download yioop web page.
+     *
+     *  @param array $data  contains the anti CSRF token YIOOP_TOKEN
+     *  the view
+     */
+    function renderView($data) {
+?>
+   <div  class="download">
+  <h1 class="logo"><a href="<?=C\BASE_URL ?>"><img
+src="<?=C\BASE_URL ?>?c=resource&amp;a=get&amp;f=resources&amp;g=2&amp;p=11&amp;n=SeekQuarry.png"
+    alt="SeekQuarry" /></a><span> - <?= tl('download_view_form')
+    ?></span></h1>
+<form  method="post" action="<?=C\BASE_URL ?>" onsubmit="return checkFields();">
+<input type="hidden" name="YIOOP_TOKEN" value="<?= $data['YIOOP_TOKEN'] ?>" />
+<input type="hidden" name="a" value="download" />
+<input type="hidden" name="arg" value="step1" />
+<input type="hidden" name="version" value="<?= $data['version']?>" />
+
+    <table>
+    <tr><td colspan="2"><?= tl('download_view_thank_you') ?></td></tr>
+    <tr>
+    <th class="table-label" ><label for="full-name"><?= tl('download_view_full_name') ?></label>:</th>
+        <td class="table-input"><input id="full-name" type="text"
+            class="narrowfield" maxlength="80" name="full_name"/>
+    </td></tr>
+    <tr>
+    <th class="table-label" ><label for="e-mail"><?= tl('download_view_email') ?></label>:</th>
+        <td class="table-input"><input id="e-mail" type="text"
+        class="narrowfield" maxlength="80" name="e_mail" /></td>
+    <tr>
+    <th class="table-label" ><label for="business-id"><?=tl('download_view_business') ?></label>:</th>
+        <td class="table-input"><input id="business-id" type="text"
+        class="narrowfield" maxlength="80" name="business" /></td>
+    </tr>
+    <tr>
+    <th class="table-label" colspan="2"><label for="yioop-use"><?= tl('download_view_interest') ?></label></th>
+    </tr>
+    <tr><td colspan="2">
+    <textarea class="shorttextarea" name="interest" ></textarea></td>
+    </tr>
+    <tr><td colspan="2" class="center">
+    <button  type="submit" name="c" value="main"><?= tl('download_view_get_email') ?></button>
+    </td></tr>
+    </table>
+</form>
+
+<div class="center"><a href="<?=B\wikiUrl('Downloads', false, 'static') ?>"><?=
+tl('download_view_return_main') ?></a></div>
+</div>
+<script type="text/javascript" />
+function checkFields()
+{
+    var full_name = elt('full-name');
+    var email = elt('e-mail');
+    var email_regex =
+        /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
+    var email_good = email_regex.test(email.value);
+    if(full_name.value == "" && !email_good) {
+        full_name.style.backgroundColor = 'red';
+        email.style.backgroundColor = 'red';
+        doMessage('<h1 class="red"><?= tl("download_view_required_fields") ?></h1>');
+        return false;
+    } else if(full_name.value == "") {
+        full_name.style.backgroundColor = 'red';
+        doMessage('<h1 class="red"><?= tl("download_view_name_required") ?></h1>');
+        return false;
+    } else if(!email_good) {
+        email.style.backgroundColor = 'red';
+        doMessage('<h1 class="red"><?= tl("download_view_valid_email") ?></h1>');
+        return false;
+    }
+    return true;
+}
+</script>
+<?php
+    }
+}
diff --git a/views/StoreView.php b/views/StoreView.php
new file mode 100644
index 0000000..9825e05
--- /dev/null
+++ b/views/StoreView.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2014  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @package seek_quarry
+ * @subpackage view
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2014
+ * @filesource
+ */
+namespace seekquarry\yioop\views;
+
+use seekquarry\yioop as B;
+use seekquarry\yioop\configs as C;
+
+/**
+ * This View is responsible for drawing the download
+ * information request form for the Seek Quarry app
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage view
+ */
+
+class DownloadView extends View
+{
+
+    /** This view is drawn on a web layout
+     *  @var string
+     */
+    var $layout = "web";
+
+    /**
+     *  Draws the download yioop web page.
+     *
+     *  @param array $data  contains the anti CSRF token YIOOP_TOKEN
+     *  the view
+     */
+    function renderView($data) {
+?>
+   <div  class="download">
+  <h1 class="logo"><a href="<?=C\BASE_URL ?>"><img
+src="<?=C\BASE_URL ?>?c=resource&amp;a=get&amp;f=resources&amp;g=2&amp;p=11&amp;n=SeekQuarry.png"
+    alt="SeekQuarry" /></a><span> - <?= tl('download_view_form')
+    ?></span></h1>
+<form  method="post" action="<?=C\BASE_URL ?>" onsubmit="return checkFields();">
+<input type="hidden" name="YIOOP_TOKEN" value="<?= $data['YIOOP_TOKEN'] ?>" />
+<input type="hidden" name="a" value="download" />
+<input type="hidden" name="arg" value="step1" />
+<input type="hidden" name="version" value="<?= $data['version']?>" />
+
+    <table>
+    <tr><td colspan="2"><?= tl('download_view_thank_you') ?></td></tr>
+    <tr>
+    <th class="table-label" ><label for="full-name"><?= tl('download_view_full_name') ?></label>:</th>
+        <td class="table-input"><input id="full-name" type="text"
+            class="narrowfield" maxlength="80" name="full_name"/>
+    </td></tr>
+    <tr>
+    <th class="table-label" ><label for="e-mail"><?= tl('download_view_email') ?></label>:</th>
+        <td class="table-input"><input id="e-mail" type="text"
+        class="narrowfield" maxlength="80" name="e_mail" /></td>
+    <tr>
+    <th class="table-label" ><label for="business-id"><?=tl('download_view_business') ?></label>:</th>
+        <td class="table-input"><input id="business-id" type="text"
+        class="narrowfield" maxlength="80" name="business" /></td>
+    </tr>
+    <tr>
+    <th class="table-label" colspan="2"><label for="yioop-use"><?= tl('download_view_interest') ?></label></th>
+    </tr>
+    <tr><td colspan="2">
+    <textarea class="shorttextarea" name="interest" ></textarea></td>
+    </tr>
+    <tr><td colspan="2" class="center">
+    <button  type="submit" name="c" value="main"><?= tl('download_view_get_email') ?></button>
+    </td></tr>
+    </table>
+</form>
+
+<div class="center"><a href="<?=B\wikiUrl('Downloads', false, 'static') ?>"><?=
+tl('download_view_return_main') ?></a></div>
+</div>
+<script type="text/javascript" />
+function checkFields()
+{
+    var full_name = elt('full-name');
+    var email = elt('e-mail');
+    var email_regex =
+        /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
+    var email_good = email_regex.test(email.value);
+    if(full_name.value == "" && !email_good) {
+        full_name.style.backgroundColor = 'red';
+        email.style.backgroundColor = 'red';
+        doMessage('<h1 class="red"><?= tl("download_view_required_fields") ?></h1>');
+        return false;
+    } else if(full_name.value == "") {
+        full_name.style.backgroundColor = 'red';
+        doMessage('<h1 class="red"><?= tl("download_view_name_required") ?></h1>');
+        return false;
+    } else if(!email_good) {
+        email.style.backgroundColor = 'red';
+        doMessage('<h1 class="red"><?= tl("download_view_valid_email") ?></h1>');
+        return false;
+    }
+    return true;
+}
+</script>
+<?php
+    }
+}
ViewGit