Merge pull request #2286 from splitbrain/betterCoreSearch

Better core search
This commit is contained in:
Michael Große 2018-04-05 09:51:45 +02:00 committed by GitHub
commit 5c0b2e60a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
126 changed files with 1442 additions and 336 deletions

View File

@ -0,0 +1,104 @@
<?php
// must be run within Dokuwiki
if (!defined('DOKU_INC')) {
die();
}
/**
* Test cases for the link index
*
* @author Michael Große <grosse@cosmocode.de>
*
* @group fulltext
*/
class fulltext_query_test extends DokuWikiTest
{
public function test_parse_query()
{
$Indexer = idx_get_indexer();
$inputQuery = 'test -baz "foo bar" @abc ^def';
$actualParsedQuery = ft_queryParser($Indexer, $inputQuery);
$expectedParsedQuery = [
'query' => 'test -baz "foo bar" @abc ^def',
'parsed_str' => '(W+:test)ANDNOT((W-:baz))AND((W_:foo)AND(W_:bar)AND(P+:foo bar))AND(N+:abc)ANDNOT(N-:def)',
'parsed_ary' => [
'W+:test',
'W-:baz',
'NOT',
'AND',
'W_:foo',
'W_:bar',
'AND',
'P+:foo bar',
'AND',
'AND',
'N+:abc',
'AND',
'N-:def',
'NOT',
'AND',
],
'words' => [
'test',
'baz',
'foo',
'bar',
],
'highlight' => [
'test',
'foo bar',
],
'and' => [
'test',
],
'phrases' => [
'foo bar',
],
'ns' => [
'abc',
],
'notns' => [
'def',
],
'not' => [
'baz',
],
];
$this->assertEquals($expectedParsedQuery, $actualParsedQuery);
}
public function test_unparse_query()
{
$input = [
'and' => [
'test',
],
'not' => [
'baz'
],
'phrases' => [
'foo bar',
],
'ns' => [
'abc',
],
'notns' => [
'def'
],
];
$actualQuery = ft_queryUnparser_simple(
$input['and'],
$input['not'],
$input['phrases'],
$input['ns'],
$input['notns']
);
$expectedQuery = 'test -baz "foo bar" @abc ^def';
$this->assertEquals($expectedQuery, $actualQuery);
}
}

View File

@ -156,6 +156,8 @@ $conf['broken_iua'] = 0; //Platform with broken ignore_user_abor
$conf['xsendfile'] = 0; //Use X-Sendfile (1 = lighttpd, 2 = standard)
$conf['renderer_xhtml'] = 'xhtml'; //renderer to use for main page generation
$conf['readdircache'] = 0; //time cache in second for the readdir operation, 0 to deactivate.
$conf['search_limit_to_first_ns'] = 0; //Option to limit the search to the current X namespaces
$conf['search_default_fragment_behaviour'] = 'exact'; // Option to specify the default fragment search behavior
/* Network Settings */
$conf['dnslookups'] = 1; //disable to disallow IP to hostname lookups

View File

@ -35,7 +35,7 @@ require_once(DOKU_INC.'inc/init.php');
//import variables
$INPUT->set('id', str_replace("\xC2\xAD", '', $INPUT->str('id'))); //soft-hyphen
$QUERY = trim($INPUT->str('id'));
$QUERY = trim($INPUT->str('q'));
$ID = getID();
$REV = $INPUT->int('rev');

View File

@ -13,6 +13,10 @@ use dokuwiki\Action\Exception\ActionAbort;
*/
class Search extends AbstractAction {
protected $pageLookupResults = array();
protected $fullTextResults = array();
protected $highlight = array();
/** @inheritdoc */
public function minimumPermission() {
return AUTH_NONE;
@ -25,13 +29,107 @@ class Search extends AbstractAction {
*/
public function checkPermissions() {
parent::checkPermissions();
global $QUERY;
}
public function preProcess()
{
global $QUERY, $ID, $conf, $INPUT;
$s = cleanID($QUERY);
if($s === '') throw new ActionAbort();
if ($ID !== $conf['start'] && !$INPUT->has('q')) {
parse_str($INPUT->server->str('QUERY_STRING'), $urlParts);
$urlParts['q'] = $urlParts['id'];
$urlParts['id'] = $conf['start'];
$url = DOKU_URL . DOKU_SCRIPT . '?' . http_build_query($urlParts, null, '&');
send_redirect($url);
}
if ($s === '') throw new ActionAbort();
$this->adjustGlobalQuery();
}
/** @inheritdoc */
public function tplContent() {
html_search();
public function tplContent()
{
$this->execute();
$search = new \dokuwiki\Ui\Search($this->pageLookupResults, $this->fullTextResults, $this->highlight);
$search->show();
}
/**
* run the search
*/
protected function execute()
{
global $INPUT, $QUERY;
$after = $INPUT->str('min');
$before = $INPUT->str('max');
$this->pageLookupResults = ft_pageLookup($QUERY, true, useHeading('navigation'), $after, $before);
$this->fullTextResults = ft_pageSearch($QUERY, $highlight, $INPUT->str('srt'), $after, $before);
$this->highlight = $highlight;
}
/**
* Adjust the global query accordingly to the config search_limit_to_first_ns and search_default_fragment_behaviour
*
* This will only do something if the search didn't originate from the form on the searchpage itself
*/
protected function adjustGlobalQuery()
{
global $conf, $INPUT, $QUERY, $ID;
if ($INPUT->bool('sf')) {
return;
}
$Indexer = idx_get_indexer();
$parsedQuery = ft_queryParser($Indexer, $QUERY);
if (empty($parsedQuery['ns']) && empty($parsedQuery['notns'])) {
if ($conf['search_limit_to_first_ns'] > 0) {
if (getNS($ID) !== false) {
$nsParts = explode(':', getNS($ID));
$ns = implode(':', array_slice($nsParts, 0, $conf['search_limit_to_first_ns']));
$QUERY .= " @$ns";
}
}
}
if ($conf['search_default_fragment_behaviour'] !== 'exact') {
if (empty(array_diff($parsedQuery['words'], $parsedQuery['and']))) {
if (strpos($QUERY, '*') === false) {
$queryParts = explode(' ', $QUERY);
$queryParts = array_map(function ($part) {
if (strpos($part, '@') === 0) {
return $part;
}
if (strpos($part, 'ns:') === 0) {
return $part;
}
if (strpos($part, '^') === 0) {
return $part;
}
if (strpos($part, '-ns:') === 0) {
return $part;
}
global $conf;
if ($conf['search_default_fragment_behaviour'] === 'starts_with') {
return $part . '*';
}
if ($conf['search_default_fragment_behaviour'] === 'ends_with') {
return '*' . $part;
}
return '*' . $part . '*';
}, $queryParts);
$QUERY = implode(' ', $queryParts);
}
}
}
}
}

View File

@ -24,8 +24,9 @@ class Form extends Element {
* Creates a new, empty form with some default attributes
*
* @param array $attributes
* @param bool $unsafe if true, then the security token is ommited
*/
public function __construct($attributes = array()) {
public function __construct($attributes = array(), $unsafe = false) {
global $ID;
parent::__construct('form', $attributes);
@ -49,7 +50,9 @@ class Form extends Element {
}
// add the security token by default
$this->setHiddenField('sectok', getSecurityToken());
if (!$unsafe) {
$this->setHiddenField('sectok', getSecurityToken());
}
// identify this as a new form based form in HTML
$this->addClass('doku_form');
@ -78,6 +81,20 @@ class Form extends Element {
return count($this->elements);
}
/**
* Get the position of the element in the form or false if it is not in the form
*
* Warning: This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE. Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.
*
* @param Element $element
*
* @return false|int
*/
public function getElementPosition(Element $element)
{
return array_search($element, $this->elements, true);
}
/**
* Returns a reference to the element at a position.
* A position out-of-bounds will return either the

View File

@ -18,7 +18,7 @@ class Edit extends AbstractItem {
parent::__construct();
if($ACT == 'show' || $ACT == 'search') {
if($ACT === 'show') {
$this->method = 'post';
if($INFO['writable']) {
$this->accesskey = 'e';

636
inc/Ui/Search.php Normal file
View File

@ -0,0 +1,636 @@
<?php
namespace dokuwiki\Ui;
use \dokuwiki\Form\Form;
class Search extends Ui
{
protected $query;
protected $parsedQuery;
protected $searchState;
protected $pageLookupResults = array();
protected $fullTextResults = array();
protected $highlight = array();
/**
* Search constructor.
*
* @param array $pageLookupResults pagename lookup results in the form [pagename => pagetitle]
* @param array $fullTextResults fulltext search results in the form [pagename => #hits]
* @param array $highlight array of strings to be highlighted
*/
public function __construct(array $pageLookupResults, array $fullTextResults, $highlight)
{
global $QUERY;
$Indexer = idx_get_indexer();
$this->query = $QUERY;
$this->parsedQuery = ft_queryParser($Indexer, $QUERY);
$this->searchState = new SearchState($this->parsedQuery);
$this->pageLookupResults = $pageLookupResults;
$this->fullTextResults = $fullTextResults;
$this->highlight = $highlight;
}
/**
* display the search result
*
* @return void
*/
public function show()
{
$searchHTML = '';
$searchHTML .= $this->getSearchIntroHTML($this->query);
$searchHTML .= $this->getSearchFormHTML($this->query);
$searchHTML .= $this->getPageLookupHTML($this->pageLookupResults);
$searchHTML .= $this->getFulltextResultsHTML($this->fullTextResults, $this->highlight);
echo $searchHTML;
}
/**
* Get a form which can be used to adjust/refine the search
*
* @param string $query
*
* @return string
*/
protected function getSearchFormHTML($query)
{
global $lang, $ID, $INPUT;
$searchForm = (new Form(['method' => 'get'], true))->addClass('search-results-form');
$searchForm->setHiddenField('do', 'search');
$searchForm->setHiddenField('id', $ID);
$searchForm->setHiddenField('sf', '1');
if ($INPUT->has('min')) {
$searchForm->setHiddenField('min', $INPUT->str('min'));
}
if ($INPUT->has('max')) {
$searchForm->setHiddenField('max', $INPUT->str('max'));
}
if ($INPUT->has('srt')) {
$searchForm->setHiddenField('srt', $INPUT->str('srt'));
}
$searchForm->addFieldsetOpen()->addClass('search-form');
$searchForm->addTextInput('q')->val($query)->useInput(false);
$searchForm->addButton('', $lang['btn_search'])->attr('type', 'submit');
$this->addSearchAssistanceElements($searchForm);
$searchForm->addFieldsetClose();
trigger_event('FORM_SEARCH_OUTPUT', $searchForm);
return $searchForm->toHTML();
}
/**
* Add elements to adjust how the results are sorted
*
* @param Form $searchForm
*/
protected function addSortTool(Form $searchForm)
{
global $INPUT, $lang;
$options = [
'hits' => [
'label' => $lang['search_sort_by_hits'],
'sort' => '',
],
'mtime' => [
'label' => $lang['search_sort_by_mtime'],
'sort' => 'mtime',
],
];
$activeOption = 'hits';
if ($INPUT->str('srt') === 'mtime') {
$activeOption = 'mtime';
}
$searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
// render current
$currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
if ($activeOption !== 'hits') {
$currentWrapper->addClass('changed');
}
$searchForm->addHTML($options[$activeOption]['label']);
$searchForm->addTagClose('div');
// render options list
$searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
foreach ($options as $key => $option) {
$listItem = $searchForm->addTagOpen('li');
if ($key === $activeOption) {
$listItem->addClass('active');
$searchForm->addHTML($option['label']);
} else {
$link = $this->searchState->withSorting($option['sort'])->getSearchLink($option['label']);
$searchForm->addHTML($link);
}
$searchForm->addTagClose('li');
}
$searchForm->addTagClose('ul');
$searchForm->addTagClose('div');
}
/**
* Check if the query is simple enough to modify its namespace limitations without breaking the rest of the query
*
* @param array $parsedQuery
*
* @return bool
*/
protected function isNamespaceAssistanceAvailable(array $parsedQuery) {
if (preg_match('/[\(\)\|]/', $parsedQuery['query']) === 1) {
return false;
}
return true;
}
/**
* Check if the query is simple enough to modify the fragment search behavior without breaking the rest of the query
*
* @param array $parsedQuery
*
* @return bool
*/
protected function isFragmentAssistanceAvailable(array $parsedQuery) {
if (preg_match('/[\(\)\|]/', $parsedQuery['query']) === 1) {
return false;
}
if (!empty($parsedQuery['phrases'])) {
return false;
}
return true;
}
/**
* Add the elements to be used for search assistance
*
* @param Form $searchForm
*/
protected function addSearchAssistanceElements(Form $searchForm)
{
$searchForm->addTagOpen('div')
->addClass('advancedOptions')
->attr('style', 'display: none;')
->attr('aria-hidden', 'true');
$this->addFragmentBehaviorLinks($searchForm);
$this->addNamespaceSelector($searchForm);
$this->addDateSelector($searchForm);
$this->addSortTool($searchForm);
$searchForm->addTagClose('div');
}
/**
* Add the elements to adjust the fragment search behavior
*
* @param Form $searchForm
*/
protected function addFragmentBehaviorLinks(Form $searchForm)
{
if (!$this->isFragmentAssistanceAvailable($this->parsedQuery)) {
return;
}
global $lang;
$options = [
'exact' => [
'label' => $lang['search_exact_match'],
'and' => array_map(function ($term) {
return trim($term, '*');
}, $this->parsedQuery['and']),
'not' => array_map(function ($term) {
return trim($term, '*');
}, $this->parsedQuery['not']),
],
'starts' => [
'label' => $lang['search_starts_with'],
'and' => array_map(function ($term) {
return trim($term, '*') . '*';
}, $this->parsedQuery['and']),
'not' => array_map(function ($term) {
return trim($term, '*') . '*';
}, $this->parsedQuery['not']),
],
'ends' => [
'label' => $lang['search_ends_with'],
'and' => array_map(function ($term) {
return '*' . trim($term, '*');
}, $this->parsedQuery['and']),
'not' => array_map(function ($term) {
return '*' . trim($term, '*');
}, $this->parsedQuery['not']),
],
'contains' => [
'label' => $lang['search_contains'],
'and' => array_map(function ($term) {
return '*' . trim($term, '*') . '*';
}, $this->parsedQuery['and']),
'not' => array_map(function ($term) {
return '*' . trim($term, '*') . '*';
}, $this->parsedQuery['not']),
]
];
// detect current
$activeOption = 'custom';
foreach ($options as $key => $option) {
if ($this->parsedQuery['and'] === $option['and']) {
$activeOption = $key;
}
}
if ($activeOption === 'custom') {
$options = array_merge(['custom' => [
'label' => $lang['search_custom_match'],
]], $options);
}
$searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
// render current
$currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
if ($activeOption !== 'exact') {
$currentWrapper->addClass('changed');
}
$searchForm->addHTML($options[$activeOption]['label']);
$searchForm->addTagClose('div');
// render options list
$searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
foreach ($options as $key => $option) {
$listItem = $searchForm->addTagOpen('li');
if ($key === $activeOption) {
$listItem->addClass('active');
$searchForm->addHTML($option['label']);
} else {
$link = $this->searchState
->withFragments($option['and'], $option['not'])
->getSearchLink($option['label'])
;
$searchForm->addHTML($link);
}
$searchForm->addTagClose('li');
}
$searchForm->addTagClose('ul');
$searchForm->addTagClose('div');
// render options list
}
/**
* Add the elements for the namespace selector
*
* @param Form $searchForm
*/
protected function addNamespaceSelector(Form $searchForm)
{
if (!$this->isNamespaceAssistanceAvailable($this->parsedQuery)) {
return;
}
global $lang;
$baseNS = empty($this->parsedQuery['ns']) ? '' : $this->parsedQuery['ns'][0];
$extraNS = $this->getAdditionalNamespacesFromResults($baseNS);
$searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
// render current
$currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
if ($baseNS) {
$currentWrapper->addClass('changed');
$searchForm->addHTML('@' . $baseNS);
} else {
$searchForm->addHTML($lang['search_any_ns']);
}
$searchForm->addTagClose('div');
// render options list
$searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
$listItem = $searchForm->addTagOpen('li');
if ($baseNS) {
$listItem->addClass('active');
$link = $this->searchState->withNamespace('')->getSearchLink($lang['search_any_ns']);
$searchForm->addHTML($link);
} else {
$searchForm->addHTML($lang['search_any_ns']);
}
$searchForm->addTagClose('li');
foreach ($extraNS as $ns => $count) {
$listItem = $searchForm->addTagOpen('li');
$label = $ns . ($count ? " <bdi>($count)</bdi>" : '');
if ($ns === $baseNS) {
$listItem->addClass('active');
$searchForm->addHTML($label);
} else {
$link = $this->searchState->withNamespace($ns)->getSearchLink($label);
$searchForm->addHTML($link);
}
$searchForm->addTagClose('li');
}
$searchForm->addTagClose('ul');
$searchForm->addTagClose('div');
}
/**
* Parse the full text results for their top namespaces below the given base namespace
*
* @param string $baseNS the namespace within which was searched, empty string for root namespace
*
* @return array an associative array with namespace => #number of found pages, sorted descending
*/
protected function getAdditionalNamespacesFromResults($baseNS)
{
$namespaces = [];
$baseNSLength = strlen($baseNS);
foreach ($this->fullTextResults as $page => $numberOfHits) {
$namespace = getNS($page);
if (!$namespace) {
continue;
}
if ($namespace === $baseNS) {
continue;
}
$firstColon = strpos((string)$namespace, ':', $baseNSLength + 1) ?: strlen($namespace);
$subtopNS = substr($namespace, 0, $firstColon);
if (empty($namespaces[$subtopNS])) {
$namespaces[$subtopNS] = 0;
}
$namespaces[$subtopNS] += 1;
}
ksort($namespaces);
arsort($namespaces);
return $namespaces;
}
/**
* @ToDo: custom date input
*
* @param Form $searchForm
*/
protected function addDateSelector(Form $searchForm)
{
global $INPUT, $lang;
$options = [
'any' => [
'before' => false,
'after' => false,
'label' => $lang['search_any_time'],
],
'week' => [
'before' => false,
'after' => '1 week ago',
'label' => $lang['search_past_7_days'],
],
'month' => [
'before' => false,
'after' => '1 month ago',
'label' => $lang['search_past_month'],
],
'year' => [
'before' => false,
'after' => '1 year ago',
'label' => $lang['search_past_year'],
],
];
$activeOption = 'any';
foreach ($options as $key => $option) {
if ($INPUT->str('min') === $option['after']) {
$activeOption = $key;
break;
}
}
$searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
// render current
$currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
if ($INPUT->has('max') || $INPUT->has('min')) {
$currentWrapper->addClass('changed');
}
$searchForm->addHTML($options[$activeOption]['label']);
$searchForm->addTagClose('div');
// render options list
$searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
foreach ($options as $key => $option) {
$listItem = $searchForm->addTagOpen('li');
if ($key === $activeOption) {
$listItem->addClass('active');
$searchForm->addHTML($option['label']);
} else {
$link = $this->searchState
->withTimeLimitations($option['after'], $option['before'])
->getSearchLink($option['label'])
;
$searchForm->addHTML($link);
}
$searchForm->addTagClose('li');
}
$searchForm->addTagClose('ul');
$searchForm->addTagClose('div');
}
/**
* Build the intro text for the search page
*
* @param string $query the search query
*
* @return string
*/
protected function getSearchIntroHTML($query)
{
global $lang;
$intro = p_locale_xhtml('searchpage');
$queryPagename = $this->createPagenameFromQuery($this->parsedQuery);
$createQueryPageLink = html_wikilink($queryPagename . '?do=edit', $queryPagename);
$pagecreateinfo = '';
if (auth_quickaclcheck($queryPagename) >= AUTH_CREATE) {
$pagecreateinfo = sprintf($lang['searchcreatepage'], $createQueryPageLink);
}
$intro = str_replace(
array('@QUERY@', '@SEARCH@', '@CREATEPAGEINFO@'),
array(hsc(rawurlencode($query)), hsc($query), $pagecreateinfo),
$intro
);
return $intro;
}
/**
* Create a pagename based the parsed search query
*
* @param array $parsedQuery
*
* @return string pagename constructed from the parsed query
*/
protected function createPagenameFromQuery($parsedQuery)
{
$pagename = '';
if (!empty($parsedQuery['ns'])) {
$pagename .= cleanID($parsedQuery['ns'][0]);
}
$pagename .= ':' . cleanID(implode(' ' , $parsedQuery['highlight']));
return $pagename;
}
/**
* Build HTML for a list of pages with matching pagenames
*
* @param array $data search results
*
* @return string
*/
protected function getPageLookupHTML($data)
{
if (empty($data)) {
return '';
}
global $lang;
$html = '<div class="search_quickresult">';
$html .= '<h3>' . $lang['quickhits'] . ':</h3>';
$html .= '<ul class="search_quickhits">';
foreach ($data as $id => $title) {
$link = html_wikilink(':' . $id);
$eventData = [
'listItemContent' => [$link],
'page' => $id,
];
trigger_event('SEARCH_RESULT_PAGELOOKUP', $eventData);
$html .= '<li>' . implode('', $eventData['listItemContent']) . '</li>';
}
$html .= '</ul> ';
//clear float (see http://www.complexspiral.com/publications/containing-floats/)
$html .= '<div class="clearer"></div>';
$html .= '</div>';
return $html;
}
/**
* Build HTML for fulltext search results or "no results" message
*
* @param array $data the results of the fulltext search
* @param array $highlight the terms to be highlighted in the results
*
* @return string
*/
protected function getFulltextResultsHTML($data, $highlight)
{
global $lang;
if (empty($data)) {
return '<div class="nothing">' . $lang['nothingfound'] . '</div>';
}
$html = '<div class="search_fulltextresult">';
$html .= '<h3>' . $lang['search_fullresults'] . ':</h3>';
$html .= '<dl class="search_results">';
$num = 1;
foreach ($data as $id => $cnt) {
$resultLink = html_wikilink(':' . $id, null, $highlight);
$resultHeader = [$resultLink];
$restrictQueryToNSLink = $this->restrictQueryToNSLink(getNS($id));
if ($restrictQueryToNSLink) {
$resultHeader[] = $restrictQueryToNSLink;
}
$snippet = '';
$lastMod = '';
$mtime = filemtime(wikiFN($id));
if ($cnt !== 0) {
$resultHeader[] = $cnt . ' ' . $lang['hits'];
if ($num < FT_SNIPPET_NUMBER) { // create snippets for the first number of matches only
$snippet = '<dd>' . ft_snippet($id, $highlight) . '</dd>';
$lastMod = '<span class="search_results__lastmod">' . $lang['lastmod'] . ' ';
$lastMod .= '<time datetime="' . date_iso8601($mtime) . '" title="'.dformat($mtime).'">' . dformat($mtime, '%f') . '</time>';
$lastMod .= '</span>';
}
$num++;
}
$metaLine = '<div class="search_results__metaLine">';
$metaLine .= $lastMod;
$metaLine .= '</div>';
$eventData = [
'resultHeader' => $resultHeader,
'resultBody' => [$metaLine, $snippet],
'page' => $id,
];
trigger_event('SEARCH_RESULT_FULLPAGE', $eventData);
$html .= '<div class="search_fullpage_result">';
$html .= '<dt>' . implode(' ', $eventData['resultHeader']) . '</dt>';
$html .= implode('', $eventData['resultBody']);
$html .= '</div>';
}
$html .= '</dl>';
$html .= '</div>';
return $html;
}
/**
* create a link to restrict the current query to a namespace
*
* @param false|string $ns the namespace to which to restrict the query
*
* @return false|string
*/
protected function restrictQueryToNSLink($ns)
{
if (!$ns) {
return false;
}
if (!$this->isNamespaceAssistanceAvailable($this->parsedQuery)) {
return false;
}
if (!empty($this->parsedQuery['ns']) && $this->parsedQuery['ns'][0] === $ns) {
return false;
}
$name = '@' . $ns;
return $this->searchState->withNamespace($ns)->getSearchLink($name);
}
}

141
inc/Ui/SearchState.php Normal file
View File

@ -0,0 +1,141 @@
<?php
namespace dokuwiki\Ui;
class SearchState
{
/**
* @var array
*/
protected $parsedQuery = [];
/**
* SearchState constructor.
*
* @param array $parsedQuery
*/
public function __construct(array $parsedQuery)
{
global $INPUT;
$this->parsedQuery = $parsedQuery;
if (!isset($parsedQuery['after'])) {
$this->parsedQuery['after'] = $INPUT->str('min');
}
if (!isset($parsedQuery['before'])) {
$this->parsedQuery['before'] = $INPUT->str('max');
}
if (!isset($parsedQuery['sort'])) {
$this->parsedQuery['sort'] = $INPUT->str('srt');
}
}
/**
* Get a search state for the current search limited to a new namespace
*
* @param string $ns the namespace to which to limit the search, falsy to remove the limitation
* @param array $notns
*
* @return SearchState
*/
public function withNamespace($ns, array $notns = [])
{
$parsedQuery = $this->parsedQuery;
$parsedQuery['ns'] = $ns ? [$ns] : [];
$parsedQuery['notns'] = $notns;
return new SearchState($parsedQuery);
}
/**
* Get a search state for the current search with new search fragments and optionally phrases
*
* @param array $and
* @param array $not
* @param array $phrases
*
* @return SearchState
*/
public function withFragments(array $and, array $not, array $phrases = [])
{
$parsedQuery = $this->parsedQuery;
$parsedQuery['and'] = $and;
$parsedQuery['not'] = $not;
$parsedQuery['phrases'] = $phrases;
return new SearchState($parsedQuery);
}
/**
* Get a search state for the current search with with adjusted time limitations
*
* @param $after
* @param $before
*
* @return SearchState
*/
public function withTimeLimitations($after, $before)
{
$parsedQuery = $this->parsedQuery;
$parsedQuery['after'] = $after;
$parsedQuery['before'] = $before;
return new SearchState($parsedQuery);
}
/**
* Get a search state for the current search with adjusted sort preference
*
* @param $sort
*
* @return SearchState
*/
public function withSorting($sort)
{
$parsedQuery = $this->parsedQuery;
$parsedQuery['sort'] = $sort;
return new SearchState($parsedQuery);
}
/**
* Get a link that represents the current search state
*
* Note that this represents only a simplified version of the search state.
* Grouping with braces and "OR" conditions are not supported.
*
* @param $label
*
* @return string
*/
public function getSearchLink($label)
{
global $ID, $conf;
$parsedQuery = $this->parsedQuery;
$tagAttributes = [
'target' => $conf['target']['wiki'],
];
$newQuery = ft_queryUnparser_simple(
$parsedQuery['and'],
$parsedQuery['not'],
$parsedQuery['phrases'],
$parsedQuery['ns'],
$parsedQuery['notns']
);
$hrefAttributes = ['do' => 'search', 'sf' => '1', 'q' => $newQuery];
if ($parsedQuery['after']) {
$hrefAttributes['min'] = $parsedQuery['after'];
}
if ($parsedQuery['before']) {
$hrefAttributes['max'] = $parsedQuery['before'];
}
if ($parsedQuery['sort']) {
$hrefAttributes['srt'] = $parsedQuery['sort'];
}
$href = wl($ID, $hrefAttributes, false, '&');
return "<a href='$href' " . buildAttributes($tagAttributes) . ">$label</a>";
}
}

View File

@ -20,14 +20,25 @@ if(!defined('FT_SNIPPET_NUMBER')) define('FT_SNIPPET_NUMBER',15);
*
* refactored into ft_pageSearch(), _ft_pageSearch() and trigger_event()
*
* @param string $query
* @param array $highlight
* @param string $query
* @param array $highlight
* @param string $sort
* @param int|string $after only show results with an modified time after this date, accepts timestap or strtotime arguments
* @param int|string $before only show results with an modified time before this date, accepts timestap or strtotime arguments
*
* @return array
*/
function ft_pageSearch($query,&$highlight){
function ft_pageSearch($query,&$highlight, $sort = null, $after = null, $before = null){
$data = array();
$data['query'] = $query;
if ($sort === null) {
$sort = 'hits';
}
$data = [
'query' => $query,
'sort' => $sort,
'after' => $after,
'before' => $before
];
$data['highlight'] =& $highlight;
return trigger_event('SEARCH_QUERY_FULLPAGE', $data, '_ft_pageSearch');
@ -100,7 +111,7 @@ function _ft_pageSearch(&$data) {
break;
case 'N+:':
case 'N-:': // namespace
$ns = substr($token, 3);
$ns = cleanID(substr($token, 3)) . ':';
$pages_matched = array();
foreach (array_keys($pages_all) as $id) {
if (strpos($id, $ns) === 0) {
@ -134,8 +145,14 @@ function _ft_pageSearch(&$data) {
}
}
// sort docs by count
arsort($docs);
$docs = _ft_filterResultsByTime($docs, $data['after'], $data['before']);
if ($data['sort'] === 'mtime') {
uksort($docs, 'ft_pagemtimesorter');
} else {
// sort docs by count
arsort($docs);
}
return $docs;
}
@ -199,7 +216,6 @@ function ft_mediause($id, $ignore_perms = false){
}
/**
* Quicksearch for pagenames
*
@ -210,16 +226,25 @@ function ft_mediause($id, $ignore_perms = false){
* The function always returns titles as well
*
* @triggers SEARCH_QUERY_PAGELOOKUP
* @author Andreas Gohr <andi@splitbrain.org>
* @author Adrian Lang <lang@cosmocode.de>
* @author Andreas Gohr <andi@splitbrain.org>
* @author Adrian Lang <lang@cosmocode.de>
*
* @param string $id page id
* @param bool $in_ns match against namespace as well?
* @param bool $in_title search in title?
* @param int|string $after only show results with an modified time after this date, accepts timestap or strtotime arguments
* @param int|string $before only show results with an modified time before this date, accepts timestap or strtotime arguments
*
* @param string $id page id
* @param bool $in_ns match against namespace as well?
* @param bool $in_title search in title?
* @return string[]
*/
function ft_pageLookup($id, $in_ns=false, $in_title=false){
$data = compact('id', 'in_ns', 'in_title');
function ft_pageLookup($id, $in_ns=false, $in_title=false, $after = null, $before = null){
$data = [
'id' => $id,
'in_ns' => $in_ns,
'in_title' => $in_title,
'after' => $after,
'before' => $before
];
$data['has_titles'] = true; // for plugin backward compatibility check
return trigger_event('SEARCH_QUERY_PAGELOOKUP', $data, '_ft_pageLookup');
}
@ -233,9 +258,11 @@ function ft_pageLookup($id, $in_ns=false, $in_title=false){
function _ft_pageLookup(&$data){
// split out original parameters
$id = $data['id'];
if (preg_match('/(?:^| )(?:@|ns:)([\w:]+)/', $id, $matches)) {
$ns = cleanID($matches[1]) . ':';
$id = str_replace($matches[0], '', $id);
$Indexer = idx_get_indexer();
$parsedQuery = ft_queryParser($Indexer, $id);
if (count($parsedQuery['ns']) > 0) {
$ns = cleanID($parsedQuery['ns'][0]) . ':';
$id = implode(' ', $parsedQuery['highlight']);
}
$in_ns = $data['in_ns'];
@ -279,10 +306,40 @@ function _ft_pageLookup(&$data){
}
}
$pages = _ft_filterResultsByTime($pages, $data['after'], $data['before']);
uksort($pages,'ft_pagesorter');
return $pages;
}
/**
* @param array $results search results in the form pageid => value
* @param int|string $after only returns results with an modified time after this date, accepts timestap or strtotime arguments
* @param int|string $before only returns results with an modified time after this date, accepts timestap or strtotime arguments
*
* @return array
*/
function _ft_filterResultsByTime(array $results, $after, $before) {
if ($after || $before) {
$after = is_int($after) ? $after : strtotime($after);
$before = is_int($before) ? $before : strtotime($before);
foreach ($results as $id => $value) {
$mTime = filemtime(wikiFN($id));
if ($after && $after > $mTime) {
unset($results[$id]);
continue;
}
if ($before && $before < $mTime) {
unset($results[$id]);
}
}
}
return $results;
}
/**
* Tiny helper function for comparing the searched title with the title
* from the search index. This function is a wrapper around stripos with
@ -316,6 +373,20 @@ function ft_pagesorter($a, $b){
return strcmp ($a,$b);
}
/**
* Sort pages by their mtime, from newest to oldest
*
* @param string $a
* @param string $b
*
* @return int Returns < 0 if $a is newer than $b, > 0 if $b is newer than $a and 0 if they are of the same age
*/
function ft_pagemtimesorter($a, $b) {
$mtimeA = filemtime(wikiFN($a));
$mtimeB = filemtime(wikiFN($b));
return $mtimeB - $mtimeA;
}
/**
* Creates a snippet extract
*
@ -813,4 +884,36 @@ function ft_termParser($Indexer, $term, $consider_asian = true, $phrase_mode = f
return $parsed;
}
/**
* Recreate a search query string based on parsed parts, doesn't support negated phrases and `OR` searches
*
* @param array $and
* @param array $not
* @param array $phrases
* @param array $ns
* @param array $notns
*
* @return string
*/
function ft_queryUnparser_simple(array $and, array $not, array $phrases, array $ns, array $notns) {
$query = implode(' ', $and);
if (!empty($not)) {
$query .= ' -' . implode(' -', $not);
}
if (!empty($phrases)) {
$query .= ' "' . implode('" "', $phrases) . '"';
}
if (!empty($ns)) {
$query .= ' @' . implode(' @', $ns);
}
if (!empty($notns)) {
$query .= ' ^' . implode(' ^', $notns);
}
return $query;
}
//Setup VIM: ex: et ts=4 :

View File

@ -362,78 +362,6 @@ function html_hilight_callback($m) {
return $hlight;
}
/**
* Run a search and display the result
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_search(){
global $QUERY, $ID;
global $lang;
$intro = p_locale_xhtml('searchpage');
// allow use of placeholder in search intro
$pagecreateinfo = (auth_quickaclcheck($ID) >= AUTH_CREATE) ? $lang['searchcreatepage'] : '';
$intro = str_replace(
array('@QUERY@', '@SEARCH@', '@CREATEPAGEINFO@'),
array(hsc(rawurlencode($QUERY)), hsc($QUERY), $pagecreateinfo),
$intro
);
echo $intro;
//do quick pagesearch
$data = ft_pageLookup($QUERY,true,useHeading('navigation'));
if(count($data)){
print '<div class="search_quickresult">';
print '<h3>'.$lang['quickhits'].':</h3>';
print '<ul class="search_quickhits">';
foreach($data as $id => $title){
print '<li> ';
if (useHeading('navigation')) {
$name = $title;
}else{
$ns = getNS($id);
if($ns){
$name = shorten(noNS($id), ' ('.$ns.')',30);
}else{
$name = $id;
}
}
print html_wikilink(':'.$id,$name);
print '</li> ';
}
print '</ul> ';
//clear float (see http://www.complexspiral.com/publications/containing-floats/)
print '<div class="clearer"></div>';
print '</div>';
}
//do fulltext search
$regex = array();
$data = ft_pageSearch($QUERY,$regex);
if(count($data)){
print '<dl class="search_results">';
$num = 1;
foreach($data as $id => $cnt){
print '<dt>';
print html_wikilink(':'.$id,useHeading('navigation')?null:$id,$regex);
if($cnt !== 0){
print ': '.$cnt.' '.$lang['hits'].'';
}
print '</dt>';
if($cnt !== 0){
if($num < FT_SNIPPET_NUMBER){ // create snippets for the first number of matches only
print '<dd>'.ft_snippet($id,$regex).'</dd>';
}
$num++;
}
}
print '</dl>';
}else{
print '<div class="nothing">'.$lang['nothingfound'].'</div>';
}
}
/**
* Display error on locked pages
*

View File

@ -70,7 +70,6 @@ $lang['badpassconfirm'] = 'عذراً,كلمة السر غير صحيحة
$lang['minoredit'] = 'تعديلات طفيفة';
$lang['draftdate'] = 'حفظ المسودات آليا مفعّل';
$lang['nosecedit'] = 'غُيرت الصفحة في هذه الأثناء، معلومات الجزء اصبحت قديمة. حُمُلت كل الصفحة بدلا.';
$lang['searchcreatepage'] = 'إن لم تجد ما تبحث عنه، يمكنك إنشاء صفحة جديدة بعنوان ما تبحث عنة بالضغط على زر "حرر هذه الصفحة".';
$lang['regmissing'] = 'عذرا، عليك ملء جميع الحقول.';
$lang['reguexists'] = 'عذرا، يوجد مشترك بنفس الاسم.';
$lang['regsuccess'] = 'أنشئ المستخدم و ارسلت كلمة السر بالبريد.';

View File

@ -2,4 +2,3 @@
نتائج البحث . @CREATEPAGEINFO@
===== نتائج البحث =====

View File

@ -59,7 +59,6 @@ $lang['badlogin'] = 'Təssüf ki istifadəçi adı və ya şifrə s
$lang['minoredit'] = 'Az dəyişiklər';
$lang['draftdate'] = 'Qaralama yadda saxlandı';
$lang['nosecedit'] = 'Bu vaxt ərzində səhifə dəyişilmişdir, və bölmə haqqında məlumat köhnəlmişdir. Səhifənin tam versiyası yüklənmişdir.';
$lang['searchcreatepage'] = 'Əgər Siz axtardığınızı tapa bilmədinizsə, onda Siz adı axtarışınız ilə uyğun düşən yeni səhifə yarada bilərsiniz. Bunu eləmək üçün, sadəcə \'\'Səhifəni yarat\'\' düyməsini sıxın.';
$lang['regmissing'] = 'Təssüf ki Siz bütün xanələri doldurmalısınız.';
$lang['reguexists'] = 'Təssüf ki bu ad ilə istifadəçi artıq mövcuddur.';
$lang['regsuccess'] = 'İstivadəci yaradıldı və şifrə sizin e-maila göndərildi.';

View File

@ -2,4 +2,3 @@
Qarşınızda - axtarışın nəticələridir. @CREATEPAGEINFO@
===== Nəticələr =====

View File

@ -67,7 +67,6 @@ $lang['badpassconfirm'] = 'За съжаление паролата е г
$lang['minoredit'] = 'Промените са незначителни';
$lang['draftdate'] = 'Черновата е автоматично записана на';
$lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.';
$lang['searchcreatepage'] = 'Ако не намирате каквото сте търсили, може да създадете или редактирате страница, кръстена на вашата заявка, чрез съответния бутон.';
$lang['regmissing'] = 'Моля, попълнете всички полета.';
$lang['reguexists'] = 'Вече съществува потребител с избраното име.';
$lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.';

View File

@ -2,4 +2,3 @@
Резултата от търсенето ще намерите по-долу. @CREATEPAGEINFO@
===== Резултати =====

View File

@ -59,7 +59,6 @@ $lang['badlogin'] = 'Disculpe, pero el nom d\'usuari o la contrasen
$lang['minoredit'] = 'Canvis menors';
$lang['draftdate'] = 'Borrador gravat el';
$lang['nosecedit'] = 'La pàgina ha canviat mentres tant, l\'informació de la secció no estava al dia, s\'ha carregat la pàgina sancera.';
$lang['searchcreatepage'] = 'Si no ha trobat lo que buscava pot crear o editar una pàgina en el mateix nom que el text que ha buscat utilisant el botó corresponent.';
$lang['regmissing'] = 'Disculpe, pero deu omplir tots els camps.';
$lang['reguexists'] = 'Disculpe, pero ya existix un usuari en este nom.';
$lang['regsuccess'] = 'S\'ha creat l\'usuari i se li ha enviat la contrasenya per correu electrònic.';

View File

@ -2,4 +2,3 @@
Pot vore els resultats de la busca ací baix. @CREATEPAGEINFO@
===== Resultats =====

View File

@ -71,7 +71,6 @@ $lang['badpassconfirm'] = 'Contrasenya incorrecta';
$lang['minoredit'] = 'Canvis menors';
$lang['draftdate'] = 'L\'esborrany s\'ha desat automàticament';
$lang['nosecedit'] = 'Mentrestant la pàgina ha estat modificada. La informació de seccions estava obsoleta i ha calgut carregar la pàgina sencera.';
$lang['searchcreatepage'] = 'Si no trobeu allò que buscàveu, podeu crear una pàgina nova per mitjà del botó \'\'Edita aquesta pàgina\'\'.';
$lang['regmissing'] = 'Heu d\'omplir tots els camps.';
$lang['reguexists'] = 'Ja existeix un altre usuari amb aquest nom.';
$lang['regsuccess'] = 'S\'ha creat l\'usuari. La contrasenya s\'ha enviat per correu.';

View File

@ -2,4 +2,3 @@
Heus ací els resultats de la cerca. @CREATEPAGEINFO@
===== Resultats =====

View File

@ -83,7 +83,6 @@ $lang['badpassconfirm'] = 'Bohužel špatné heslo';
$lang['minoredit'] = 'Drobné změny';
$lang['draftdate'] = 'Koncept automaticky uložen v';
$lang['nosecedit'] = 'Stránka byla v mezičase změněna. Informace o sekci již nebylo platné, byla načtena celá stránka.';
$lang['searchcreatepage'] = 'Pokud jste nenašli, co hledáte, zkuste požadovanou stránku sami vytvořit stisknutím tlačítka \'\'Vytvořit stránku\'\'.';
$lang['regmissing'] = 'Musíte vyplnit všechny údaje.';
$lang['reguexists'] = 'Uživatel se stejným jménem už je zaregistrován.';
$lang['regsuccess'] = 'Uživatelský účet byl vytvořen a heslo zasláno e-mailem.';

View File

@ -2,4 +2,3 @@
Výsledky hledání můžete vidět níže. @CREATEPAGEINFO@
===== Výsledky =====

View File

@ -70,7 +70,6 @@ $lang['badpassconfirm'] = 'Sori, roedd y cyfrinair yn anghywir';
$lang['minoredit'] = 'Newidiadau Bach';
$lang['draftdate'] = 'Awtogadwyd drafft ar'; // full dformat date will be added
$lang['nosecedit'] = 'Newidiwyd y dudaen yn y cyfamser, roedd gwybodaeth yr adran wedi dyddio, felly llwythwyd y dudalen gyfan.';
$lang['searchcreatepage'] = 'Os na wnaethoch chi ddod o hyd i\'r hyn roeddech chi am ddarganfod, gallwch chi greu neu golygu\'r dudalen wedi\'i henwi ar ôl eich ymholiad gyda\'r teclyn priodol.';
$lang['regmissing'] = 'Sori, llenwch bob maes.';
$lang['reguexists'] = 'Sori, mae defnyddiwr â\'r enw hwn yn bodoli eisoes.';

View File

@ -2,4 +2,3 @@
Gallwch chi ddarganfod canlyniadau eich chwiliad isod. @CREATEPAGEINFO@
===== Canlyniadau =====

View File

@ -80,7 +80,6 @@ $lang['badpassconfirm'] = 'Adgangkode var desværre forkert';
$lang['minoredit'] = 'Mindre ændringer';
$lang['draftdate'] = 'Kladde automatisk gemt d.';
$lang['nosecedit'] = 'Siden blev ændret i mellemtiden, sektions information var for gammel, hentede hele siden i stedet.';
$lang['searchcreatepage'] = 'Hvis resultaterne ikke indeholder det du søgte efter kan du oprette et nyt dokument med samme navn som søgningen ved at trykke på knappen **\'\'[Opret dette dokument]\'\'**.';
$lang['regmissing'] = 'Du skal udfylde alle felter.';
$lang['reguexists'] = 'Dette brugernavn er allerede i brug.';
$lang['regsuccess'] = 'Du er nu oprettet som bruger. Dit adgangskode bliver sendt til dig i en e-mail.';

View File

@ -2,4 +2,3 @@
Du kan se resultaterne af din søgning nedenunder. @CREATEPAGEINFO@
===== Søgeresultater =====

View File

@ -84,7 +84,6 @@ $lang['badpassconfirm'] = 'Das Passwort war falsch.';
$lang['minoredit'] = 'Kleine Änderung';
$lang['draftdate'] = 'Entwurf gespeichert am';
$lang['nosecedit'] = 'Diese Seite wurde in der Zwischenzeit geändert, da das Sektionsinfo veraltet ist. Die ganze Seite wird stattdessen geladen.';
$lang['searchcreatepage'] = 'Falls der gesuchte Begriff nicht gefunden wurde, kannst du direkt eine neue Seite für den Suchbegriff anlegen, indem du auf den Knopf **\'\'[Seite anlegen]\'\'** drückst.';
$lang['regmissing'] = 'Alle Felder müssen ausgefüllt werden';
$lang['reguexists'] = 'Der Benutzername existiert leider schon.';
$lang['regsuccess'] = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.';

View File

@ -2,6 +2,3 @@
Unten sind die Ergebnisse deiner Suche gelistet. @CREATEPAGEINFO@
===== Ergebnisse =====

View File

@ -93,7 +93,7 @@ $lang['badpassconfirm'] = 'Das Passwort war falsch.';
$lang['minoredit'] = 'kleine Änderung';
$lang['draftdate'] = 'Entwurf gespeichert am';
$lang['nosecedit'] = 'Diese Seite wurde in der Zwischenzeit geändert, der Seitenabschnitt ist veraltet, lade stattdessen volle Seite.';
$lang['searchcreatepage'] = 'Falls der gesuchte Begriff nicht gefunden wurde, können Sie direkt eine neue Seite für den Suchbegriff anlegen, indem Sie auf den **\'\'[Seite anlegen]\'\'** Knopf drücken.';
$lang['searchcreatepage'] = 'Falls der gesuchte Begriff nicht gefunden wurde, können Sie direkt eine neue, nach Ihrer Anfrage benannte Seite %s anlegen.';
$lang['regmissing'] = 'Bitte alle Felder ausfüllen!';
$lang['reguexists'] = 'Der Benutzername existiert leider schon.';
$lang['regsuccess'] = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.';

View File

@ -1,7 +1,3 @@
====== Suche ======
Unten sind die Ergebnisse Ihrer Suche gelistet. @CREATEPAGEINFO@
===== Ergebnisse =====

View File

@ -73,7 +73,6 @@ $lang['badpassconfirm'] = 'Ο κωδικός που εισάγατε εί
$lang['minoredit'] = 'Ασήμαντες αλλαγές';
$lang['draftdate'] = 'Αυτόματη αποθήκευση πρόχειρης σελίδας στις';
$lang['nosecedit'] = 'Η σελίδα τροποποιήθηκε στο μεταξύ και τα στοιχεία της ενότητας δεν ήταν συγχρονισμένα, οπότε φορτώθηκε η πλήρης σελίδα. ';
$lang['searchcreatepage'] = 'Αν δεν βρίσκεις αυτό που ψάχνεις, μπορείς να δημιουργήσεις ή να επεξεργαστείς τη σελίδα που ψάχνεις, χρησιμοποιώντας το κατάλληλο εργαλείο.';
$lang['regmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
$lang['reguexists'] = 'Αυτός ο λογαριασμός υπάρχει ήδη.';
$lang['regsuccess'] = 'Ο λογαριασμός δημιουργήθηκε και ο κωδικός εστάλει με e-mail.';

View File

@ -69,7 +69,22 @@ $lang['badpassconfirm'] = 'Sorry, the password was wrong';
$lang['minoredit'] = 'Minor Changes';
$lang['draftdate'] = 'Draft autosaved on'; // full dformat date will be added
$lang['nosecedit'] = 'The page was changed in the meantime, section info was out of date loaded full page instead.';
$lang['searchcreatepage'] = 'If you didn\'t find what you were looking for, you can create or edit the page named after your query with the appropriate tool.';
$lang['searchcreatepage'] = 'If you didn\'t find what you were looking for, you can create or edit the page %s, named after your query.';
$lang['search_fullresults'] = 'Fulltext results';
$lang['js']['search_toggle_tools'] = 'Toggle Search Tools';
$lang['search_exact_match'] = 'Exact match';
$lang['search_starts_with'] = 'Starts with';
$lang['search_ends_with'] = 'Ends with';
$lang['search_contains'] = 'Contains';
$lang['search_custom_match'] = 'Custom';
$lang['search_any_ns'] = 'Any namespace';
$lang['search_any_time'] = 'Any time';
$lang['search_past_7_days'] = 'Past week';
$lang['search_past_month'] = 'Past month';
$lang['search_past_year'] = 'Past year';
$lang['search_sort_by_hits'] = 'Sort by hits';
$lang['search_sort_by_mtime'] = 'Sort by last modified';
$lang['regmissing'] = 'Sorry, you must fill in all fields.';
$lang['reguexists'] = 'Sorry, a user with this login already exists.';

View File

@ -2,4 +2,3 @@
You can find the results of your search below. @CREATEPAGEINFO@
===== Results =====

View File

@ -68,7 +68,6 @@ $lang['badpassconfirm'] = 'Pardonu, la pasvorto malĝustis';
$lang['minoredit'] = 'Etaj modifoj';
$lang['draftdate'] = 'Lasta konservo de la skizo:';
$lang['nosecedit'] = 'La paĝo ŝanĝiĝis intertempe, sekcio-informo estis malĝisdata, tial la tuta paĝo estas reŝargita.';
$lang['searchcreatepage'] = 'Se vi ne trovis tion, kion vi serĉis, vi povas krei novan paĝon kun necesa nomo per la koresponda butono.';
$lang['regmissing'] = 'Pardonu, vi devas plenigi ĉiujn kampojn.';
$lang['reguexists'] = 'Pardonu, ĉi tiu uzanto-nomo jam ekzistas.';
$lang['regsuccess'] = 'La uzanto kreiĝis kaj la pasvorto sendiĝis per retpoŝto.';

View File

@ -1,5 +1,4 @@
====== Serĉo ======
Sube estas rezultoj de serĉo en la retejo.\\ @CREATEPAGEINFO@
Sube estas rezultoj de serĉo en la retejo. @CREATEPAGEINFO@
===== Rezultoj =====

View File

@ -105,7 +105,6 @@ $lang['badpassconfirm'] = 'Lo siento, la contraseña es errónea';
$lang['minoredit'] = 'Cambios menores';
$lang['draftdate'] = 'Borrador guardado automáticamente:';
$lang['nosecedit'] = 'La página ha cambiado en el lapso, la información de sección estaba anticuada, en su lugar se cargó la página completa.';
$lang['searchcreatepage'] = 'Si no has encontrado lo que buscabas, puedes crear una nueva página con tu consulta utilizando el botón \'\'Crea esta página\'\'.';
$lang['regmissing'] = 'Lo siento, tienes que completar todos los campos.';
$lang['reguexists'] = 'Lo siento, ya existe un usuario con este nombre.';
$lang['regsuccess'] = 'El usuario ha sido creado y la contraseña se ha enviado por correo.';

View File

@ -2,4 +2,3 @@
Puedes encontrar los resultados de tu búsqueda abajo. @CREATEPAGEINFO@
===== Resultados =====

View File

@ -68,7 +68,6 @@ $lang['badpassconfirm'] = 'Väär salasõna';
$lang['minoredit'] = 'Ebaolulised muudatused';
$lang['draftdate'] = 'Mustand automaatselt salvestatud';
$lang['nosecedit'] = 'Leht on vahepeal muutunud, jaotiste teave osutus aegunuks sestap laeti tervelehekülg.';
$lang['searchcreatepage'] = "Kui Sa otsitavat ei leidnud võid tekitada oma otsingu nimelise uue lehe kasutades ''Toimeta seda lehte'' nuppu.";
$lang['regmissing'] = 'Kõik väljad tuleb ära täita.';
$lang['reguexists'] = 'Tegelikult on sellise nimega kasutaja juba olemas.';
$lang['regsuccess'] = 'Kasutaja sai tehtud. Parool saadeti Sulle e-posti aadressil.';

View File

@ -2,4 +2,3 @@
Leiad vasted oma otsingule. @CREATEPAGEINFO@
===== Vasted =====

View File

@ -68,7 +68,6 @@ $lang['badpassconfirm'] = 'Pasahitz okerra';
$lang['minoredit'] = 'Aldaketa Txikiak';
$lang['draftdate'] = 'Zirriborroa automatikoki gorde da hemen:';
$lang['nosecedit'] = 'Orria aldatua izan da bitartean, info atala zaharkituta geratu da, orri osoa kargatu da horren ordez.';
$lang['searchcreatepage'] = 'Bilatzen zabiltzana aurkitu ez baduzu, zuk zeuk sortu dezakezu orri berri bat bilaketa ostean \'\'Sortu orri hau\'\' erabiliz.';
$lang['regmissing'] = 'Barkatu, hutsune guztiak bete behar dituzu.';
$lang['reguexists'] = 'Barkatu, izen bereko erabiltzailea existitzen da.';
$lang['regsuccess'] = 'Erabiltzailea sortu da. Pasahitza mailez bidaliko zaizu.';

View File

@ -2,4 +2,3 @@
Emaitzak ondorengo aurkiketan bilatu ditzakezu. @CREATEPAGEINFO@
===== Bilaketa emaitzak: =====

View File

@ -78,7 +78,6 @@ $lang['badpassconfirm'] = 'متاسفم، رمز عبور اشتباه ا
$lang['minoredit'] = 'ویرایش‌های خُرد';
$lang['draftdate'] = 'ذخیره خودکار پیش‌نویس در';
$lang['nosecedit'] = 'این صفحه در این میان تغییر کرده است، اطلاعات بخش قدیمی شده است، در عوض محتوای کل نمایش داده می‌شود.';
$lang['searchcreatepage'] = 'اگر به نتیجه‌ی مطلوبی نرسیده‌اید، می‌توانید صفحه‌ی مورد نظر را ایجاد کنید.';
$lang['regmissing'] = 'متاسفم، شما باید همه قسمت‌ها را پر کنید.';
$lang['reguexists'] = 'نام کاربری‌ای که وارد کردید قبلن استفاده شده است.';
$lang['regsuccess'] = 'کاربر ساخته شد و گذرواژه به صورت ایمیل ارسال گردید.';

View File

@ -2,4 +2,3 @@
نتایج جستجو در زیر آمده است. @CREATEPAGEINFO@
===== نتایج =====

View File

@ -71,7 +71,6 @@ $lang['badpassconfirm'] = 'Valitan. Salasana oli väärin';
$lang['minoredit'] = 'Pieni muutos';
$lang['draftdate'] = 'Luonnos tallennettu automaattisesti';
$lang['nosecedit'] = 'Sivu on muuttunut välillä ja kappaleen tiedot olivat vanhentuneet. Koko sivu ladattu.';
$lang['searchcreatepage'] = 'Jos et löytänyt etsimääsi voit luoda uuden sivun tiedustelusi pohjalta käyttämällä \'\'Muokkaa tätä sivua\'\' -napilla.';
$lang['regmissing'] = 'Kaikki kentät tulee täyttää.';
$lang['reguexists'] = 'Käyttäjä tällä käyttäjänimellä on jo olemassa.';
$lang['regsuccess'] = 'Käyttäjä luotiin ja salasana lähetettiin sähköpostilla.';

View File

@ -2,4 +2,3 @@
Löydät etsinnän tulokset alta. @CREATEPAGEINFO@
===== Tulokset =====

View File

@ -58,7 +58,6 @@ $lang['badlogin'] = 'Skeivt brúkaranavn ella loyniorð.';
$lang['minoredit'] = 'Smærri broytingar';
$lang['draftdate'] = 'Goym kladdu sett frá';
$lang['nosecedit'] = 'Hendan síðan var broytt undir tilevnan, brotið var ikki rætt dagfest, heintaði fulla síðu í staðin';
$lang['searchcreatepage'] = "Um úrslitini ikki innihalda tað sum tú leitaði eftir kanst tú upprætta eitt nýtt skjal við sama navni sum leitingin við at trýsta á **''[Upprætta hetta skjal]''** knappin.";
$lang['regmissing'] = 'Tú skalt fylla út øll øki.';
$lang['reguexists'] = 'Hetta brúkaranavn er upptiki.';
$lang['regsuccess'] = 'Tú ert nú stovnavur sum brúkari. Títt loyniorð verður sent til tín í einum T-posti.';

View File

@ -2,4 +2,3 @@
Tú kanst síggja úrslitini av tíni leiting niðanfyri. @CREATEPAGEINFO@
===== Leitiúrslit =====

View File

@ -99,7 +99,6 @@ $lang['badpassconfirm'] = 'Désolé, le mot de passe est erroné';
$lang['minoredit'] = 'Modification mineure';
$lang['draftdate'] = 'Brouillon enregistré automatiquement le';
$lang['nosecedit'] = 'La page a changé entre temps, les informations de la section sont obsolètes ; la page complète a été chargée à la place.';
$lang['searchcreatepage'] = 'Si vous n\'avez pas trouvé ce que vous cherchiez, vous pouvez créer ou modifier la page correspondant à votre requête en cliquant sur le bouton approprié.';
$lang['regmissing'] = 'Désolé, vous devez remplir tous les champs.';
$lang['reguexists'] = 'Désolé, ce nom d\'utilisateur est déjà pris.';
$lang['regsuccess'] = 'L\'utilisateur a été créé. Le mot de passe a été expédié par courriel.';

View File

@ -2,4 +2,3 @@
Voici les résultats de votre recherche. @CREATEPAGEINFO@
===== Résultats =====

View File

@ -62,7 +62,6 @@ $lang['badlogin'] = 'Sentímolo, mais o nome de usuario ou o contra
$lang['minoredit'] = 'Trocos Menores';
$lang['draftdate'] = 'Borrador gardado automaticamente en';
$lang['nosecedit'] = 'A páxina mudou entrementres, a información da sección estaba desfasada polo que se cargou a páxina completa no seu lugar.';
$lang['searchcreatepage'] = "Se non atopaches o que estabas a procurar, podes crear ou editar a páxina co nome relacionado coa túa procura empregando o botón axeitado.";
$lang['regmissing'] = 'Sentímolo, mais tes que cubrir todos os campos.';
$lang['reguexists'] = 'Sentímolo, mais xa existe un usuario con ese nome.';
$lang['regsuccess'] = 'O usuario foi creado e o contrasinal enviado por correo-e.';

View File

@ -2,4 +2,3 @@
Podes atopar os resultados da túa procura a continuación. @CREATEPAGEINFO@
===== Resultados =====

View File

@ -77,7 +77,6 @@ $lang['badpassconfirm'] = 'מצטערים, הסיסמה שגויה';
$lang['minoredit'] = 'שינוים מזעריים';
$lang['draftdate'] = 'הטיוטה נשמרה אוטומטית ב־';
$lang['nosecedit'] = 'הדף השתנה בינתיים, הקטע שערכת אינו מעודכן - העמוד כולו נטען במקום זאת.';
$lang['searchcreatepage'] = 'אם לא נמצאו דפים בחיפוש, לחיצה על הכפתור "עריכה" תיצור דף חדש על שם מילת החיפוש שהוזנה.';
$lang['regmissing'] = 'עליך למלא את כל השדות, עמך הסליחה.';
$lang['reguexists'] = 'משתמש בשם זה כבר נרשם, עמך הסליחה.';
$lang['regsuccess'] = 'ההרשמה הצליחה, המשתמש נרשם והודעה נשלחה בדוא״ל.';

View File

@ -2,4 +2,3 @@
ניתן לראות את תוצאות החיפוש למטה. @CREATEPAGEINFO@
===== תוצאות =====

View File

@ -68,7 +68,6 @@ $lang['badpassconfirm'] = 'Nažalost, lozinka nije ispravna';
$lang['minoredit'] = 'Manje izmjene';
$lang['draftdate'] = 'Nacrt promjena automatski spremljen u';
$lang['nosecedit'] = 'Stranica se u međuvremenu promijenila. Informacija o odjeljku je ostarila pa je učitana kompletna stranica.';
$lang['searchcreatepage'] = 'Ako ne možete naći što tražite, možete urediti ili stvoriti novu stranicu s odgovarajućim alatom.';
$lang['regmissing'] = 'Morate popuniti sva polja.';
$lang['reguexists'] = 'Korisnik s tim korisničkim imenom već postoji.';
$lang['regsuccess'] = 'Korisnik je uspješno stvoren i poslana je lozinka emailom.';

View File

@ -2,4 +2,3 @@
Možete naći rezultat vaše pretrage u nastavku. @CREATEPAGEINFO@
====== Rezultati ======

View File

@ -74,7 +74,6 @@ $lang['badpassconfirm'] = 'Hibás jelszó';
$lang['minoredit'] = 'Apróbb változások';
$lang['draftdate'] = 'Piszkozat elmentve:';
$lang['nosecedit'] = 'Időközben megváltozott az oldal, emiatt a szakasz nem friss. Töltsd újra az egész oldalt!';
$lang['searchcreatepage'] = 'Ha nem találtad meg amit kerestél, akkor létrehozhatsz egy új oldalt a keresésed alapján \'\'Az oldal szerkesztése\'\' gombbal.';
$lang['regmissing'] = 'Sajnáljuk, az összes mezőt ki kell töltened.';
$lang['reguexists'] = 'Sajnáljuk, ilyen azonosítójú felhasználónk már van.';
$lang['regsuccess'] = 'A felhasználói azonosítót létrehoztuk. A jelszót postáztuk.';

View File

@ -2,4 +2,3 @@
A keresés eredményét lentebb láthatod. @CREATEPAGEINFO@
===== Eredmény(ek) =====

View File

@ -63,7 +63,6 @@ $lang['badlogin'] = 'Le nomine de usator o le contrasigno es incorr
$lang['minoredit'] = 'Modificationes minor';
$lang['draftdate'] = 'Version provisori automaticamente salveguardate le';
$lang['nosecedit'] = 'Le pagina ha essite modificate intertanto. Le informationes del section es ora obsolete, dunque le pagina complete ha essite cargate in su loco.';
$lang['searchcreatepage'] = 'Si tu non ha trovate lo que tu cerca, tu pote crear o modificar le pagina nominate secundo tu consulta con le button appropriate.';
$lang['regmissing'] = 'Es necessari completar tote le campos.';
$lang['reguexists'] = 'Regrettabilemente, un usator con iste nomine ja existe.';
$lang['regsuccess'] = 'Le conto ha essite create e le contrasigno ha essite inviate per e-mail.';

View File

@ -2,4 +2,3 @@
Le resultatos de tu recerca se trova hic infra. @CREATEPAGEINFO@
===== Resultatos =====

View File

@ -64,7 +64,6 @@ $lang['badlogin'] = 'Maaf, username atau password salah.';
$lang['badpassconfirm'] = 'Maaf, password salah';
$lang['minoredit'] = 'Perubahan Minor';
$lang['draftdate'] = 'Simpan draft secara otomatis';
$lang['searchcreatepage'] = 'Jika Anda tidak menemukan apa yang diinginkan, Anda dapat membuat halaman baru, dengan nama sesuai "text pencarian" Anda. Gunakan tombol "Edit halaman ini".';
$lang['regmissing'] = 'Maaf, Anda harus mengisi semua field.';
$lang['reguexists'] = 'Maaf, user dengan user login ini telah ada.';
$lang['regsuccess'] = 'User telah didaftarkan dan password telah dikirim ke email Anda.';

View File

@ -2,4 +2,3 @@
Anda dapat menemukan hasil pencarian dibawah ini. @CREATEPAGEINFO@
===== Hasil Pencarian =====

View File

@ -82,7 +82,6 @@ $lang['badpassconfirm'] = 'La password è errata';
$lang['minoredit'] = 'Modifiche minori';
$lang['draftdate'] = 'Bozza salvata in automatico il';
$lang['nosecedit'] = 'La pagina è stata modificata nel frattempo; è impossibile modificare solo la sezione scelta, quindi è stata caricata la pagina intera.';
$lang['searchcreatepage'] = 'Se non hai trovato quello che cercavi, puoi creare una nuova pagina con questo titolo usando il pulsante \'\'Crea questa pagina\'\'.';
$lang['regmissing'] = 'Devi riempire tutti i campi.';
$lang['reguexists'] = 'Il nome utente inserito esiste già.';
$lang['regsuccess'] = 'L\'utente è stato creato. La password è stata spedita via email.';

View File

@ -2,4 +2,3 @@
Questi sono i risultati della ricerca. @CREATEPAGEINFO@
===== Risultati =====

View File

@ -72,7 +72,6 @@ $lang['badpassconfirm'] = 'パスワードが間違っています。';
$lang['minoredit'] = '小変更';
$lang['draftdate'] = 'ドラフト保存日時:';
$lang['nosecedit'] = 'ページ内容が変更されていますがセクション情報が古いため、代わりにページ全体をロードしました。';
$lang['searchcreatepage'] = 'もし、探しているものが見つからない場合、 検索キーワードにちなんだ名前の文書を作成もしくは編集を行ってください。';
$lang['regmissing'] = '全ての項目を入力してください。';
$lang['reguexists'] = 'このユーザー名は既に存在しています。';
$lang['regsuccess'] = '新しいユーザーが作成されました。パスワードは登録したメールアドレス宛てに送付されます。';

View File

@ -2,4 +2,3 @@
以下に検索結果を表示します。@CREATEPAGEINFO@
===== 結果 =====

View File

@ -76,7 +76,6 @@ $lang['badpassconfirm'] = '죄송하지만 비밀번호가 잘못되었
$lang['minoredit'] = '사소한 바뀜';
$lang['draftdate'] = '초안 자동 저장 시간';
$lang['nosecedit'] = '한 동안 문서가 바뀌었으며, 문단 정보가 오래되어 문서 전체를 대신 열었습니다.';
$lang['searchcreatepage'] = '만약 원하는 문서를 찾지 못했다면, \'\'문서 만들기\'\'나 \'\'문서 편집\'\'을 사용해 검색어와 같은 이름의 문서를 만들거나 편집할 수 있습니다.';
$lang['regmissing'] = '죄송하지만 모든 필드를 채워야 합니다.';
$lang['reguexists'] = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.';
$lang['regsuccess'] = '사용자 계정을 만들었으며 비밀번호는 이메일로 보냈습니다.';

View File

@ -2,4 +2,3 @@
아래에서 검색 결과를 찾을 수 있습니다. @CREATEPAGEINFO@
===== 결과 =====

View File

@ -41,6 +41,5 @@ $lang['lastmod'] = 'Guherandina dawî:';
$lang['deleted'] = 'hat jê birin';
$lang['created'] = 'hat afirandin';
$lang['summary'] = 'Kurteya guhartinê';
$lang['searchcreatepage'] = "Heke tiştek nehatibe dîtin, tu dikarî dest bi nivîsandina rûpelekê nû bikî. Ji bo vê, ''Vê rûpelê biguherîne'' bitikîne.";
//Setup VIM: ex: et ts=2 :

View File

@ -2,4 +2,3 @@
Jêr encamên lêgerandina te tên nîşan dan. @CREATEPAGEINFO@
===== Encam =====

View File

@ -2,4 +2,3 @@
Responsiones in hac pagina uidere potes. @CREATEPAGEINFO@
===== Responsiones =====

View File

@ -54,7 +54,6 @@ $lang['badlogin'] = 'Entschëllegt, de Benotzernumm oder d\'Passwue
$lang['minoredit'] = 'Kleng Ännerungen';
$lang['draftdate'] = 'Entworf automatesch gespäichert den';
$lang['nosecedit'] = 'D\'Säit gouf an Zwëschenzäit g\'ännert, Sektiounsinfo veralt. Ganz Säit gouf aplaz gelueden.';
$lang['searchcreatepage'] = 'Wanns de net fënns wats de gesicht hues kanns de eng nei Säit mam Numm vun denger Sich uleeën.';
$lang['regmissing'] = 'Du muss all d\'Felder ausfëllen.';
$lang['reguexists'] = 'Et get schonn e Benotzer mat deem Numm.';
$lang['regsuccess'] = 'De Benotzer gouf erstallt an d\'Passwuert via Email geschéckt.';

View File

@ -2,4 +2,3 @@
Hei ënnendrënner sinn d'Resultater vun der Sich. @CREATEPAGEINFO@
=====Resultater=====

View File

@ -61,7 +61,6 @@ $lang['badlogin'] = 'Nurodėte blogą vartotojo vardą arba slapta
$lang['minoredit'] = 'Nedidelis pataisymas';
$lang['draftdate'] = 'Juodraštis automatiškai išsaugotas';
$lang['nosecedit'] = 'Puslapis buvo kažkieno pataisytas, teksto dalies informacija tapo pasenusi, todėl pakrautas visas puslapis.';
$lang['searchcreatepage'] = 'Jeigu neradote to, ko ieškojote, galite sukurti naują puslapį šiuo pavadinimu paspausdami "Redaguoti šį puslapį".';
$lang['regmissing'] = 'Turite užpildyti visus laukus.';
$lang['reguexists'] = 'Vartotojas su pasirinktu prisijungimo vardu jau egzistuoja.';
$lang['regsuccess'] = 'Vartotojas sukurtas, slaptažodis išsiųstas el. paštu.';

View File

@ -2,4 +2,3 @@
Žemiau matote Jūsų atliktos paieškos rezultatus. @CREATEPAGEINFO@
===== Rezultatai =====

View File

@ -65,7 +65,6 @@ $lang['badpassconfirm'] = 'Atvaino, aplama parole';
$lang['minoredit'] = 'Sīki labojumi';
$lang['draftdate'] = 'Melnraksts automātiski saglabāts';
$lang['nosecedit'] = 'Lapa pa šo laiku ir mainījusies, sekcijas informācija novecojusi. Ielādēta lapas pilnās versija.';
$lang['searchcreatepage'] = 'Ja neatradi meklēto, nospiežot pogu "Labot lapu", vari izveidot jaunu lapu ar tevis meklētajiem atslēgvārdiem nosaukumā.';
$lang['regmissing'] = 'Atvaino, jāaizpilda visas ailes.';
$lang['reguexists'] = 'Atvaino, tāds lietotājs jau ir.';
$lang['regsuccess'] = 'Lietotājs izveidots. Parole nosūtīta pa pastu.';

View File

@ -2,4 +2,3 @@
Te vari redzēt meklēšanas rezultātus. @CREATEPAGEINFO@
===== Atrasts =====

View File

@ -114,7 +114,6 @@ $lang['qb_sig'] = 'Manisy sonia';
$lang['js']['del_confirm']= 'Hofafana ilay andalana?';
$lang['searchcreatepage'] = "Raha tsy nahita izay notadiavinao ianao, dia afaka mamorona pejy vaovao avy amin'ny teny nanaovanao fikarohana; Ampiasao ny bokotra ''Hanova ny pejy''.";
//Setup VIM: ex: et ts=2 :
$lang['email_signature_text'] = 'Ity imailaka ity dia navoakan\'ny wiki tao amin\'ny
@DOKUWIKIURL@';

View File

@ -1,7 +1,4 @@
====== Karoka ======
Ireto ambany ireto ny valin'ny fikarohanao.
Ireto ambany ireto ny valin'ny fikarohanao. @CREATEPAGEINFO@
@CREATEPAGEINFO@
===== Vokatry ny fikarohana =====

View File

@ -67,7 +67,6 @@ $lang['badlogin'] = 'माफ़ करा, वापरकर्
$lang['minoredit'] = 'छोटे बदल';
$lang['draftdate'] = 'प्रत आपोआप सुरक्षित केल्याची तारीख';
$lang['nosecedit'] = 'मध्यंतरीच्या काळात हे पृष्ठ बदलले आहे.विभागाची माहिती जुनी झाली होती. त्याऐवजी सबंध पृष्ठ परत लोड केले आहे.';
$lang['searchcreatepage'] = 'जर तुमची शोधत असलेली गोष्ट तुम्हाला सापडली नाही, तर योग्य बटण वापरून तुम्ही शोधत असलेल्या गोष्टीविषयी तुम्ही एखादे पान निर्माण किंवा संपादित करू शकता.';
$lang['regmissing'] = 'कृपया सर्व रकाने भरा.';
$lang['reguexists'] = 'या नावाने सदस्याची नोंदणी झालेली आहे, कृपया दुसरे सदस्य नाव निवडा.';
$lang['regsuccess'] = 'सदस्याची नोंदणी झाली आहे आणि परवलीचा शब्द इमेल केला आहे.';

View File

@ -2,4 +2,3 @@
तुम्हाला खाली तुमच्या शोधाचे फलित दिसतील. @CREATEPAGEINFO@
====== फलित ======

View File

@ -66,7 +66,6 @@ $lang['badpassconfirm'] = 'माफ गर्नुहोस् , पा
$lang['minoredit'] = 'सामान्य परिवर्तन';
$lang['draftdate'] = 'ड्राफ्ट स्वचालित रुपमा वचत भएको';
$lang['nosecedit'] = 'यो पृष्ठ यसै बखतमा परिवर्तन भयो, खण्ड जानकारी अध्यावधिक हुन सकेन र पूरै पृष्ठ लोड भयो । ';
$lang['searchcreatepage'] = 'यदि तपाईले आफुले खोजेको पाउनुभएन भने, तपाईलेको उपयुक्त बटन प्रयोग गरी खोज सँग सम्बन्धित शिर्षकहरु भएका पृष्ठ सृजना या सम्पादन गर्न सक्नुहुन्छ ।';
$lang['regmissing'] = 'माफ गर्नुहोला , सबै ठाउमा भर्नुपर्नेछ ।';
$lang['reguexists'] = 'यो नामको प्रयोगकर्ता पहिले देखि रहेको छ।';
$lang['regsuccess'] = 'यो प्रयोगकर्ता बनाइएको छ र प्रवेशशव्द इमेलमा पठइएको छ।';

View File

@ -2,4 +2,3 @@
तपाईले आफ्नो खोजको निम्न नतिजा पाउन सक्नुहुन्छ। @CREATEPAGEINFO@
===== नतिजा =====

View File

@ -89,7 +89,6 @@ $lang['badpassconfirm'] = 'Sorry, het wachtwoord was onjuist';
$lang['minoredit'] = 'Kleine wijziging';
$lang['draftdate'] = 'Concept automatisch opgeslagen op';
$lang['nosecedit'] = 'De pagina is tussentijds veranderd, sectie-informatie was verouderd, volledige pagina geladen.';
$lang['searchcreatepage'] = 'Niks gevonden? Maak een nieuwe pagina met als naam je zoekopdracht. Klik hiervoor op \'\'Maak deze pagina aan\'\'.';
$lang['regmissing'] = 'Vul alle velden in';
$lang['reguexists'] = 'Er bestaat al een gebruiker met deze loginnaam.';
$lang['regsuccess'] = 'De gebruiker is aangemaakt. Het wachtwoord is per e-mail verzonden.';

View File

@ -2,4 +2,3 @@
Hieronder zijn de resultaten van de zoekopdracht. @CREATEPAGEINFO@
===== Resultaten =====

View File

@ -86,7 +86,6 @@ $lang['badpassconfirm'] = 'Beklager, passordet var feil';
$lang['minoredit'] = 'Mindre endringer';
$lang['draftdate'] = 'Kladd autolagret';
$lang['nosecedit'] = 'Siden er i mellomtiden endret, seksjonsinfo har blitt foreldet - lastet full side istedet.';
$lang['searchcreatepage'] = 'Hvis du ikke finner det du leter etter, så kan du skape en ny side med samme navn som ditt søk ved å klikke på \'\'**Lag denne siden**\'\'-knappen.';
$lang['regmissing'] = 'Vennligst fyll ut alle felt.';
$lang['reguexists'] = 'Det finnes allerede en konto med dette brukernavnet.';
$lang['regsuccess'] = 'Brukerkonto har blitt laget og passord har blitt sendt via e-post.';

View File

@ -2,4 +2,3 @@
Du ser resultatet av dette søket nedenfor. @CREATEPAGEINFO@
===== Resultat =====

View File

@ -81,7 +81,6 @@ $lang['badpassconfirm'] = 'Niestety, hasło jest niepoprawne.';
$lang['minoredit'] = 'Mniejsze zmiany';
$lang['draftdate'] = 'Czas zachowania szkicu';
$lang['nosecedit'] = 'Strona została zmodyfikowana, sekcje zostały zmienione. Załadowano całą stronę.';
$lang['searchcreatepage'] = 'Jeśli nie znaleziono szukanego hasła, możesz utworzyć nową stronę, której tytułem będzie poszukiwane hasło.';
$lang['regmissing'] = 'Wypełnij wszystkie pola.';
$lang['reguexists'] = 'Użytkownik o tej nazwie już istnieje.';
$lang['regsuccess'] = 'Utworzono użytkownika. Hasło zostało przesłane pocztą.';

View File

@ -2,4 +2,3 @@
Wyniki wyszukiwania. @CREATEPAGEINFO@
===== Wyniki =====

View File

@ -84,7 +84,6 @@ $lang['badpassconfirm'] = 'Desculpe, mas a senha está errada ';
$lang['minoredit'] = 'Alterações mínimas';
$lang['draftdate'] = 'O rascunho foi salvo automaticamente em';
$lang['nosecedit'] = 'A página foi modificada nesse intervalo de tempo. Como a informação da seção estava desatualizada, foi carregada a página inteira.';
$lang['searchcreatepage'] = 'Se você não encontrou o que está procurando, pode criar ou editar a página com o nome que você especificou, usando o botão apropriado.';
$lang['regmissing'] = 'Desculpe, mas você precisa preencher todos os campos.';
$lang['reguexists'] = 'Desculpe, mas já existe um usuário com esse nome.';
$lang['regsuccess'] = 'O usuário foi criado e a senha enviada para seu e-mail.';

View File

@ -2,4 +2,3 @@
Você pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@
===== Resultados =====

View File

@ -76,7 +76,6 @@ $lang['badpassconfirm'] = 'Infelizmente a palavra-passe não é a correct
$lang['minoredit'] = 'Alterações Menores';
$lang['draftdate'] = 'Rascunho automaticamente gravado em';
$lang['nosecedit'] = 'A página foi modificada entretanto. Como a informação da secção estava desactualizada, foi carregada a página inteira.';
$lang['searchcreatepage'] = 'Se não encontrou o que procurava pode criar uma nova página com o nome da sua pesquisa, usando o botão apropriado.';
$lang['regmissing'] = 'Por favor, preencha todos os campos.';
$lang['reguexists'] = 'Este utilizador já está inscrito. Por favor escolha outro nome de utilizador.';
$lang['regsuccess'] = 'O utilizador foi criado e a senha foi enviada para o endereço de correio electrónico usado na inscrição.';

View File

@ -2,4 +2,3 @@
Pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@
===== Resultados =====

View File

@ -72,7 +72,6 @@ $lang['badpassconfirm'] = 'Ne pare rau, parola este gresita';
$lang['minoredit'] = 'Modificare minoră';
$lang['draftdate'] = 'Schiță salvată automat la';
$lang['nosecedit'] = 'Pagina s-a modificat între timp, secțiunea info a expirat, s-a încărcat pagina întreagă în loc.';
$lang['searchcreatepage'] = 'Dacă nu ai găsit ce ai căutat, poți crea o pagină nouă prin folosirea butonului \'\'Editează această pagină\'\'.';
$lang['regmissing'] = 'Ne pare rău, trebuie să completezi toate cîmpurile.';
$lang['reguexists'] = 'Ne pare rău, un utilizator cu acest nume este deja autentificat.';
$lang['regsuccess'] = 'Utilizatorul a fost creat. Parola a fost trimisă prin e-mail.';

View File

@ -2,4 +2,3 @@
Rezultatele căutării sunt afișate mai jos. @CREATEPAGEINFO@
===== Rezultate =====

View File

@ -97,7 +97,6 @@ $lang['badpassconfirm'] = 'Простите, пароль неверны
$lang['minoredit'] = 'Незначительные изменения';
$lang['draftdate'] = 'Черновик сохранён';
$lang['nosecedit'] = 'За это время страница была изменена и информация о секции устарела. Загружена полная версия страницы.';
$lang['searchcreatepage'] = 'Если вы не нашли то, что искали, вы можете создать новую страницу с именем, совпадающим с запросом. Чтобы сделать это, просто нажмите на кнопку «Создать страницу».';
$lang['regmissing'] = 'Извините, вам следует заполнить все поля.';
$lang['reguexists'] = 'Извините, пользователь с таким логином уже существует.';
$lang['regsuccess'] = 'Пользователь создан; пароль выслан на адрес электронной почты.';

View File

@ -2,4 +2,3 @@
Перед вами результаты поиска. @CREATEPAGEINFO@
===== Результаты =====

View File

@ -67,7 +67,6 @@ $lang['badpassconfirm'] = 'Ľutujem, heslo bolo nesprávne.';
$lang['minoredit'] = 'Menšie zmeny';
$lang['draftdate'] = 'Koncept automaticky uložený';
$lang['nosecedit'] = 'Stránka bola medzičasom zmenená, informácie o sekcii sú zastaralé a z tohto dôvodu bola nahraná celá stránka.';
$lang['searchcreatepage'] = 'Pokiaľ ste nenašli, čo hľadáte, skúste požadovanú stránku sami vytvoriť stlačením tlačidla \'\'Vytvoriť stránku\'\'.';
$lang['regmissing'] = 'Musíte vyplniť všetky údaje.';
$lang['reguexists'] = 'Používateľ s rovnakým menom je už zaregistrovaný.';
$lang['regsuccess'] = 'Používateľský účet bol vytvorený a heslo zaslané emailom.';

View File

@ -2,4 +2,3 @@
Výsledky hľadania môžete vidieť nižšie. @CREATEPAGEINFO@
===== Výsledky =====

View File

@ -71,7 +71,6 @@ $lang['badpassconfirm'] = 'Napaka! Geslo ni pravo.';
$lang['minoredit'] = 'Manjše spremembe';
$lang['draftdate'] = 'Samodejno shranjevanje osnutka je omogočeno';
$lang['nosecedit'] = 'Stran je bila v vmesnem času spremenjena. Podatki strani so bili zastareli, zato se je celotna vsebina naložila znova.';
$lang['searchcreatepage'] = 'V kolikor rezultati niso skladni z zahtevami iskanja, je mogoče ustvariti novo stran z nazivom vaše poizvedbe preko povezave \'\'Uredi stran\'\'.';
$lang['regmissing'] = 'Izpolniti je treba vsa polja.';
$lang['reguexists'] = 'Uporabnik s tem imenom že obstaja.';
$lang['regsuccess'] = 'Uporabniški račun je uspešno ustvarjen. Geslo je bilo poslano na naveden elektronski naslov.';

View File

@ -2,4 +2,3 @@
Spodaj so izpisani rezultati iskanja. @CREATEPAGEINFO@
===== Rezultati =====

Some files were not shown because too many files have changed in this diff Show More