public function create($path = '', $query = [], $absolute = false, $separator = '&amp;') {
		// if the passed path is empty use the path of the current page
		if (empty($path)) $path = $this->_fullpath;

		// parse input url
		$parts = $this->parse($path);

		// combine query parameters
		parse_str($parts['query'], $parts['query']);
		$parts['query'] = array_merge($parts['query'], $query);

		// only for URLs without a scheme
		if (empty($parts['scheme_divider'])) {

			$nodes				= explode('/', trim($parts['path'], '/'));

			// **********************  language handling
			$lang = $this->_language_actual;

			// remove the language from the path
			if (in_array($nodes[0], $this->_language_possible)) {
				$lang = array_shift($nodes);
			}

			// lang as GET param has precedence
			if (isset($query['language']) && in_array($query['language'], $this->_language_possible)) {
				$lang = $query['language'];
				unset($parts['query']['language']);
			}

			// now we have to add the language in some cases
			// add the lang to the path if it is not the current language and not the default language
			if ($lang !== $this->_language_actual || $this->_language_possible[0] !== $this->_language_actual) {
				array_unshift($nodes, $lang);
			}
			// **********************

			// put it back together
			$parts['path'] = implode('/', $nodes);

			// create complete url with domain
			if ($absolute) {
				$base			= $this->parse($this->getBaseHref());
				$base['path']	= $base['path'] . $parts['path'];
				$base['query']	= $parts['query'];
				$parts			= $base;
			}
		}

		if (count($parts['query']) > 0) {
			$parts['query_divider'] = '?';
		}

		// create query string
		$parts['query'] = http_build_query($parts['query'], '', $separator);

		return implode('', $parts);
	}