static public function create($params, LocatorInterface $locator = null) {
		if (! is_array($params) && ! $params instanceof Traversable) {
			throw new InvalidOptions('Options must be an array or a Traversable implementation');
		}
		
		if ($params instanceof Traversable) {
			$params = Std::iteratorToArray($params);
		}
		
		$translator = new Translator();
		
		foreach ($params as $param => $value) {
			if ($param === 'cacheStrategy') {
				$class = self::NAMESPACE_CACHE . '\Strategy' . ucfirst($value);
				
				$translator->setCache(new $class($locator));
				unset($params[$param]);
				continue;
			}
			
			if ($param === 'resources') {
				if (! is_array($value) && ! $value instanceof Traversable) {
					throw new InvalidOptions('Resources definition must be an array or a Traversable implementation');
				}
				
				$translator->setResources(self::createResources($value));
				unset($params[$param]);
				continue;
			}
			
			if ($param === 'bbcodes') {
				if ($value) {
					$bbcodes = new BBCodes();
					
					if (isset($params['paramsPattern'])) {
						$bbcodes->setParamsPattern($params['paramsPattern']);
					}
					
					$translator->addPlugin($bbcodes, 'bbcodes');
				}
				
				unset($params[$param]);
			}
		}
		
		$translator->setOptions($params, false, false);
		
		return $translator;
	}