--- /dev/null
+<?php
+
+/*
+ * This file is part of the Behat Gherkin.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Gherkin\Keywords;
+
+/**
+ * Array initializable keywords holder.
+ *
+ * $keywords = new Behat\Gherkin\Keywords\ArrayKeywords(array(
+ * 'en' => array(
+ * 'feature' => 'Feature',
+ * 'background' => 'Background',
+ * 'scenario' => 'Scenario',
+ * 'scenario_outline' => 'Scenario Outline|Scenario Template',
+ * 'examples' => 'Examples|Scenarios',
+ * 'given' => 'Given',
+ * 'when' => 'When',
+ * 'then' => 'Then',
+ * 'and' => 'And',
+ * 'but' => 'But'
+ * ),
+ * 'ru' => array(
+ * 'feature' => 'Функционал',
+ * 'background' => 'Предыстория',
+ * 'scenario' => 'Сценарий',
+ * 'scenario_outline' => 'Структура сценария',
+ * 'examples' => 'Значения',
+ * 'given' => 'Допустим',
+ * 'when' => 'Если',
+ * 'then' => 'То',
+ * 'and' => 'И',
+ * 'but' => 'Но'
+ * )
+ * ));
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class ArrayKeywords implements KeywordsInterface
+{
+ private $keywords = array();
+ private $keywordString = array();
+ private $language;
+
+ /**
+ * Initializes holder with keywords.
+ *
+ * @param array $keywords Keywords array
+ */
+ public function __construct(array $keywords)
+ {
+ $this->keywords = $keywords;
+ }
+
+ /**
+ * Sets keywords holder language.
+ *
+ * @param string $language Language name
+ */
+ public function setLanguage($language)
+ {
+ if (!isset($this->keywords[$language])) {
+ $this->language = 'en';
+ } else {
+ $this->language = $language;
+ }
+ }
+
+ /**
+ * Returns Feature keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getFeatureKeywords()
+ {
+ return $this->keywords[$this->language]['feature'];
+ }
+
+ /**
+ * Returns Background keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getBackgroundKeywords()
+ {
+ return $this->keywords[$this->language]['background'];
+ }
+
+ /**
+ * Returns Scenario keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getScenarioKeywords()
+ {
+ return $this->keywords[$this->language]['scenario'];
+ }
+
+ /**
+ * Returns Scenario Outline keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getOutlineKeywords()
+ {
+ return $this->keywords[$this->language]['scenario_outline'];
+ }
+
+ /**
+ * Returns Examples keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getExamplesKeywords()
+ {
+ return $this->keywords[$this->language]['examples'];
+ }
+
+ /**
+ * Returns Given keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getGivenKeywords()
+ {
+ return $this->keywords[$this->language]['given'];
+ }
+
+ /**
+ * Returns When keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getWhenKeywords()
+ {
+ return $this->keywords[$this->language]['when'];
+ }
+
+ /**
+ * Returns Then keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getThenKeywords()
+ {
+ return $this->keywords[$this->language]['then'];
+ }
+
+ /**
+ * Returns And keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getAndKeywords()
+ {
+ return $this->keywords[$this->language]['and'];
+ }
+
+ /**
+ * Returns But keywords (splitted by "|").
+ *
+ * @return string
+ */
+ public function getButKeywords()
+ {
+ return $this->keywords[$this->language]['but'];
+ }
+
+ /**
+ * Returns all step keywords (Given, When, Then, And, But).
+ *
+ * @return string
+ */
+ public function getStepKeywords()
+ {
+ if (!isset($this->keywordString[$this->language])) {
+ $keywords = array_merge(
+ explode('|', $this->getGivenKeywords()),
+ explode('|', $this->getWhenKeywords()),
+ explode('|', $this->getThenKeywords()),
+ explode('|', $this->getAndKeywords()),
+ explode('|', $this->getButKeywords())
+ );
+
+ usort($keywords, function ($keyword1, $keyword2) {
+ return mb_strlen($keyword2, 'utf8') - mb_strlen($keyword1, 'utf8');
+ });
+
+ $this->keywordString[$this->language] = implode('|', $keywords);
+ }
+
+ return $this->keywordString[$this->language];
+ }
+}