<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>features/language_from_header.feature</filename>
    </added>
    <added>
      <filename>lib/cucumber/feature_file.rb</filename>
    </added>
    <added>
      <filename>lib/cucumber/filter.rb</filename>
    </added>
    <added>
      <filename>lib/cucumber/parser/i18n/language.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,5 +1,19 @@
 == 0.3.12 (In Git)
 
+The Egality release
+
+English is not the world's most spoken language, so why should Cucumber force non-English speakers to use the
+--language flag? As of this release you're no longer forced to do that. Instead, you can add a comment header 
+to your .feature files:
+
+  # language: fr
+  Fonctionnalit&#233;: Trou de boulette
+
+If you don't have that header, Cucumber will work as before - using whatever you specified with --language,
+or default to English if no --language option was specified. A nice side effect of this is that you can now
+have features in several languages side by side and run them in the same cucumber. (Not recommended unless 
+you want to take polyglot programming to an extreme level).
+
 === Bugfixes
 * JUnit formatter uses original file name instead of narrative to avoid accidental duplicate XML files (Aslak Helles&#248;y)
 * rake gems no longer lists cucumber as a [F]ramework gem (David Chelimsky)
@@ -7,6 +21,7 @@
 * Make sure script/generate cucumber --spork uses the cucumber Rails environment (Philippe Lafoucri&#232;re)
 
 === New Features
+* Possibility to specify scenario language as part of the .feature file (#345 Aslak Helles&#248;y)
 * Support specifying environment variables using foo=bar syntax on command line or in profiles (#362 Bryan Helmkamp)
 * Display failing scenarios at the end of pretty format to make it easier for people to play them back (#360 Ryan Bigg)
 </diff>
      <filename>History.txt</filename>
    </modified>
    <modified>
      <diff>@@ -256,6 +256,7 @@ features/expand.feature
 features/html_formatter.feature
 features/html_formatter/a.html
 features/junit_formatter.feature
+features/language_from_header.feature
 features/multiline_names.feature
 features/rake_task.feature
 features/report_called_undefined_steps.feature
@@ -307,6 +308,8 @@ lib/cucumber/core_ext/exception.rb
 lib/cucumber/core_ext/instance_exec.rb
 lib/cucumber/core_ext/proc.rb
 lib/cucumber/core_ext/string.rb
+lib/cucumber/feature_file.rb
+lib/cucumber/filter.rb
 lib/cucumber/formatter/ansicolor.rb
 lib/cucumber/formatter/color_io.rb
 lib/cucumber/formatter/console.rb
@@ -328,6 +331,7 @@ lib/cucumber/parser.rb
 lib/cucumber/parser/feature.rb
 lib/cucumber/parser/feature.tt
 lib/cucumber/parser/i18n.tt
+lib/cucumber/parser/i18n/language.rb
 lib/cucumber/parser/table.rb
 lib/cucumber/parser/table.tt
 lib/cucumber/parser/treetop_ext.rb</diff>
      <filename>Manifest.txt</filename>
    </modified>
    <modified>
      <diff>@@ -61,8 +61,7 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
   #p.extra_deps = []     # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '&gt;= 1.3.1'] ]
   p.extra_deps = [ 
     ['term-ansicolor', '&gt;= 1.0.3'], 
-    ['treetop', '&gt;= 1.2.5'], 
-    ['polyglot', '&gt;= 0.2.5'], # Remove this when Treetop no longer loads polyglot by default. 
+    ['treetop', '&gt;= 1.2.6'], 
     ['diff-lcs', '&gt;= 1.1.2'],
     ['builder', '&gt;= 2.1.2']
   ]</diff>
      <filename>config/hoe.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,11 +2,11 @@
 
 Gem::Specification.new do |s|
   s.name = %q{cucumber}
-  s.version = &quot;0.3.11.3&quot;
+  s.version = &quot;0.3.11.4&quot;
 
   s.required_rubygems_version = Gem::Requirement.new(&quot;&gt;= 0&quot;) if s.respond_to? :required_rubygems_version=
   s.authors = [&quot;Aslak Helles\303\270y&quot;]
-  s.date = %q{2009-06-07}
+  s.date = %q{2009-06-15}
   s.default_executable = %q{cucumber}
   s.description = %q{Executable Feature scenarios}
   s.email = [&quot;aslak.hellesoy@gmail.com&quot;]
@@ -26,21 +26,18 @@ Gem::Specification.new do |s|
 
     if Gem::Version.new(Gem::RubyGemsVersion) &gt;= Gem::Version.new('1.2.0') then
       s.add_runtime_dependency(%q&lt;term-ansicolor&gt;, [&quot;&gt;= 1.0.3&quot;])
-      s.add_runtime_dependency(%q&lt;treetop&gt;, [&quot;&gt;= 1.2.5&quot;])
-      s.add_runtime_dependency(%q&lt;polyglot&gt;, [&quot;&gt;= 0.2.5&quot;])
+      s.add_runtime_dependency(%q&lt;treetop&gt;, [&quot;&gt;= 1.2.6&quot;])
       s.add_runtime_dependency(%q&lt;diff-lcs&gt;, [&quot;&gt;= 1.1.2&quot;])
       s.add_runtime_dependency(%q&lt;builder&gt;, [&quot;&gt;= 2.1.2&quot;])
     else
       s.add_dependency(%q&lt;term-ansicolor&gt;, [&quot;&gt;= 1.0.3&quot;])
-      s.add_dependency(%q&lt;treetop&gt;, [&quot;&gt;= 1.2.5&quot;])
-      s.add_dependency(%q&lt;polyglot&gt;, [&quot;&gt;= 0.2.5&quot;])
+      s.add_dependency(%q&lt;treetop&gt;, [&quot;&gt;= 1.2.6&quot;])
       s.add_dependency(%q&lt;diff-lcs&gt;, [&quot;&gt;= 1.1.2&quot;])
       s.add_dependency(%q&lt;builder&gt;, [&quot;&gt;= 2.1.2&quot;])
     end
   else
     s.add_dependency(%q&lt;term-ansicolor&gt;, [&quot;&gt;= 1.0.3&quot;])
-    s.add_dependency(%q&lt;treetop&gt;, [&quot;&gt;= 1.2.5&quot;])
-    s.add_dependency(%q&lt;polyglot&gt;, [&quot;&gt;= 0.2.5&quot;])
+    s.add_dependency(%q&lt;treetop&gt;, [&quot;&gt;= 1.2.6&quot;])
     s.add_dependency(%q&lt;diff-lcs&gt;, [&quot;&gt;= 1.1.2&quot;])
     s.add_dependency(%q&lt;builder&gt;, [&quot;&gt;= 2.1.2&quot;])
   end</diff>
      <filename>cucumber.gemspec</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language ar}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/ar/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ar
 &#1582;&#1575;&#1589;&#1610;&#1577;: &#1575;&#1604;&#1580;&#1605;&#1593;
   &#1605;&#1606; &#1575;&#1580;&#1604; &#1578;&#1580;&#1606;&#1576; &#1575;&#1604;&#1571;&#1582;&#1591;&#1575;&#1569; &#1575;&#1604;&#1587;&#1582;&#1610;&#1601;&#1577;
   &#1603;&#1588;&#1582;&#1589; &#1594;&#1576;&#1610; &#1601;&#1610; &#1575;&#1604;&#1585;&#1610;&#1575;&#1590;&#1610;&#1575;&#1578;</diff>
      <filename>examples/i18n/ar/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language bg}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/bg/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: bg
 &#1060;&#1091;&#1085;&#1082;&#1094;&#1080;&#1086;&#1085;&#1072;&#1083;&#1085;&#1086;&#1089;&#1090;: &#1057;&#1098;&#1073;&#1080;&#1088;&#1072;&#1085;&#1077; &#1085;&#1072; &#1095;&#1080;&#1089;&#1083;&#1072;
   &#1047;&#1072; &#1076;&#1072; &#1085;&#1077; &#1075;&#1086; &#1087;&#1088;&#1072;&#1074;&#1103;&#1090; &#1085;&#1072;&#1091;&#1084;
   &#1055;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;&#1080;&#1090;&#1077;</diff>
      <filename>examples/i18n/bg/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: bg
 &#1060;&#1091;&#1085;&#1082;&#1094;&#1080;&#1086;&#1085;&#1072;&#1083;&#1086;&#1089;&#1090;: &#1055;&#1086;&#1089;&#1083;&#1077;&#1076;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1085;&#1080; &#1080;&#1079;&#1095;&#1080;&#1089;&#1083;&#1077;&#1085;&#1080;&#1103;
   &#1047;&#1072; &#1076;&#1072; &#1085;&#1077; &#1075;&#1086; &#1087;&#1088;&#1072;&#1074;&#1103;&#1090; &#1085;&#1072;&#1091;&#1084;
   &#1055;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;&#1080;&#1090;&#1077;</diff>
      <filename>examples/i18n/bg/features/consecutive_calculations.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: bg
 &#1060;&#1091;&#1085;&#1094;&#1082;&#1094;&#1080;&#1086;&#1085;&#1072;&#1083;&#1085;&#1086;&#1089;&#1090;: &#1044;&#1077;&#1083;&#1077;&#1085;&#1077; &#1085;&#1072; &#1095;&#1080;&#1089;&#1083;&#1072;
   &#1047;&#1072; &#1076;&#1072; &#1085;&#1077; &#1075;&#1086; &#1087;&#1088;&#1072;&#1074;&#1103;&#1090; &#1085;&#1072;&#1091;&#1084;
   &#1055;&#1086;&#1090;&#1088;&#1077;&#1073;&#1080;&#1090;&#1077;&#1083;&#1080;&#1090;&#1077;</diff>
      <filename>examples/i18n/bg/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language cat}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/cat/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: cat
 Caracter&#237;stica: Suma
   Per evitar fer errors tontos
   Com un matem&#224;tic idiota</diff>
      <filename>examples/i18n/cat/features/suma.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language da}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/da/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: da
 Egenskab: Summering
   For at slippe for at lave dumme fejl
   Som en regnskabsf&#248;rer</diff>
      <filename>examples/i18n/da/features/summering.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language de}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/de/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: de
 Funktionalit&#228;t: Addition
   Um dumme Fehler zu vermeiden
   m&#246;chte ich als Matheidiot</diff>
      <filename>examples/i18n/de/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: de
 Funktionalit&#228;t: Division
   Um dumme Fehler zu vermeiden
   m&#252;ssen Kassierer in der Lage sein einen Bruchteil zu berechnen</diff>
      <filename>examples/i18n/de/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-# stuffing.feature
+# language: en-lol
 OH HAI: STUFFING
 
   MISHUN: CUCUMBR</diff>
      <filename>examples/i18n/en-lol/features/stuffing.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language en}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/en/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: en
 Feature: Addition
   In order to avoid silly mistakes
   As a math idiot </diff>
      <filename>examples/i18n/en/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: en
 Feature: Division
   In order to avoid silly mistakes
   Cashiers must be able to calculate a fraction</diff>
      <filename>examples/i18n/en/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language es}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/es/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: es
 Caracter&#237;stica: adici&#243;n
   Para evitar hacer errores tontos
   Como un matem&#225;tico idiota</diff>
      <filename>examples/i18n/es/features/adicion.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language et}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/et/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: et
 Omadus: Jagamine
   Rumalate vigade v&#228;ltimiseks
   Peavad kassapidajad saama arvutada murdudes</diff>
      <filename>examples/i18n/et/features/jagamine.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: et
 Omadus: Liitmine
   Selleks et v&#228;ltida rumalaid vigu
   Olles matemaatika-puupea</diff>
      <filename>examples/i18n/et/features/liitmine.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language fi}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/fi/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: fi
 Ominaisuus: Jakolasku
   V&#228;ltty&#228;kseen h&#246;lm&#246;ilt&#228; virheilt&#228;
   Kassanhoitajan on voitava laskea osam&#228;&#228;r&#228;</diff>
      <filename>examples/i18n/fi/features/jakolasku.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language fr}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/fr/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,8 @@
+# language: fr
 Fonctionnalit&#233;: Addition
   Afin de gagner du temps lors du calcul de la facture
   En tant que commer&#231;ant
-  Je souhaite pouvoir faire une additionn
+  Je souhaite pouvoir faire une addition
 
   Plan du Sc&#233;nario: Addition de deux nombres
     Soit une calculatrice</diff>
      <filename>examples/i18n/fr/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language he}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/he/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: he
 &#1514;&#1499;&#1493;&#1504;&#1492;: &#1495;&#1497;&#1489;&#1493;&#1512;
   &#1499;&#1491;&#1497; &#1500;&#1502;&#1504;&#1493;&#1506; &#1496;&#1506;&#1493;&#1497;&#1493;&#1514; &#1496;&#1508;&#1513;&#1497;&#1493;&#1514;
   &#1489;&#1514;&#1493;&#1512; &#1489;&#1493;&#1512; &#1502;&#1514;&#1502;&#1496;&#1497;</diff>
      <filename>examples/i18n/he/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: he
 &#1514;&#1499;&#1493;&#1504;&#1492;: &#1495;&#1497;&#1500;&#1493;&#1511;
   &#1499;&#1491;&#1497; &#1500;&#1502;&#1504;&#1493;&#1506; &#1496;&#1506;&#1493;&#1497;&#1493;&#1514; &#1496;&#1508;&#1513;&#1497;&#1493;&#1514;
   &#1500;&#1511;&#1493;&#1508;&#1488;&#1497;&#1501; &#1495;&#1497;&#1497;&#1489;&#1514; &#1500;&#1492;&#1497;&#1493;&#1514; &#1497;&#1499;&#1493;&#1500;&#1514; &#1500;&#1495;&#1513;&#1489; &#1513;&#1489;&#1512;</diff>
      <filename>examples/i18n/he/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language hu}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/hu/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: hu
 Jellemz&#337;: &#214;sszead&#225;s
   Az&#233;rt, hogy elker&#252;ljem a buta hib&#225;kat
   amit diszkalk&#250;li&#225;sk&#233;nt elk&#246;vethetek,</diff>
      <filename>examples/i18n/hu/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: hu
 Jellemz&#337;: Oszt&#225;s
   Az&#233;rt, hogy elker&#252;ljem a buta hib&#225;kat
   a sz&#225;mol&#243;g&#233;peknek tudniuk kell osztani.</diff>
      <filename>examples/i18n/hu/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language id}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/id/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: id
 Fitur: Addition
   Untuk menghindari kesalahan konyol 
   Sebagai orang yang gak bisa matematika</diff>
      <filename>examples/i18n/id/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: id
 Fitur: Division
   Untuk hindari kesalahan konyol
   Kasir harus dapat menghitung pembagian</diff>
      <filename>examples/i18n/id/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language it}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/it/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: it
 Funzionalit&#224;: somma
   Per evitare di fare errori stupidi
   Come utente</diff>
      <filename>examples/i18n/it/features/somma.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language ja}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/ja/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ja
 &#12501;&#12451;&#12540;&#12481;&#12515;: &#21152;&#31639;
   &#12496;&#12459;&#12394;&#38291;&#36949;&#12356;&#12434;&#36991;&#12369;&#12427;&#12383;&#12417;&#12395;
   &#25968;&#23398;&#12458;&#12531;&#12481;&#12392;&#12375;&#12390;</diff>
      <filename>examples/i18n/ja/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ja
 &#12501;&#12451;&#12540;&#12481;&#12515;: &#38500;&#31639;
   &#12496;&#12459;&#12394;&#38291;&#36949;&#12356;&#12434;&#36991;&#12369;&#12427;&#12383;&#12417;&#12395;
   &#26377;&#29702;&#25968;&#12418;&#35336;&#31639;&#12391;&#12365;&#12427;&#12371;&#12392;</diff>
      <filename>examples/i18n/ja/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language ko}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/ko/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ko
 &#44592;&#45733;: &#45927;&#49480;
   &#50696;&#44592;&#52824;&#47803;&#54620; &#49892;&#49688;&#51012; &#48169;&#51648;&#54616;&#44592; &#50948;&#54644;
   &#49688;&#54617;&#51012; &#51096; &#47803;&#54616;&#45716; &#49324;&#46988;&#51004;&#47196;&#50024; </diff>
      <filename>examples/i18n/ko/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ko
 &#44592;&#45733;: &#45208;&#45591;&#49480;
   &#50696;&#44592;&#52824;&#47803;&#54620; &#49892;&#49688;&#51012; &#48169;&#51648;&#54616;&#44592; &#50948;&#54644;
   &#48516;&#49688;&#47484; &#44228;&#49328; &#45733;&#47141; &#50836;&#44396;&#54620;&#45796; </diff>
      <filename>examples/i18n/ko/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language lt}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/lt/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: lt
 S&#261;vyb&#279;: Sud&#279;tis
   Norint i&#353;vengti kvail&#371; klaid&#371;
   Kaip matematinis idiotas</diff>
      <filename>examples/i18n/lt/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: lt
 Feature: Dalyba
   Norint i&#353;vengti klaid&#371;
   Kasininkai privalo mok&#279;ti skai&#269;iuoti trupmenas</diff>
      <filename>examples/i18n/lt/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language lv}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/lv/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: lv
 Funkcionalit&#257;te: Saskait&#299;&#353;ana
   Lai izvair&#299;tos no mu&#316;&#311;&#299;g&#257;m k&#316;&#363;d&#257;m
   K&#257; matem&#257;tikas idiots</diff>
      <filename>examples/i18n/lv/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: lv
 Funkcionalit&#257;te: Dal&#299;&#353;ana
   Lai izvair&#299;tos no mu&#316;&#311;&#299;g&#257;m k&#316;&#363;d&#257;m
   Kasieriem ir j&#257;prot apr&#275;&#311;in&#257;t da&#316;as</diff>
      <filename>examples/i18n/lv/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language no}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/no/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: no
 Egenskap: Summering
   For &#229; slippe &#229; gj&#248;re dumme feil
   Som en regnskapsf&#248;rer</diff>
      <filename>examples/i18n/no/features/summering.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language pl}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/pl/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: pl
 W&#322;a&#347;ciwo&#347;&#263;: Dodawanie
   W celu unikni&#281;cia g&#322;upich b&#322;&#281;d&#243;w
   Jako matematyczny idiota</diff>
      <filename>examples/i18n/pl/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: pl
 W&#322;a&#347;ciwo&#347;&#263;: Dzielenie
   W celu unikni&#281;cia g&#322;upich b&#322;&#281;d&#243;w
   Kasjer musi zna&#263; si&#281; na u&#322;amkach</diff>
      <filename>examples/i18n/pl/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language pt}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/pt/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: pt
 Funcionalidade: Adi&#231;&#227;o
   Para evitar erros bobos
   Como um p&#233;ssimo matem&#225;tico</diff>
      <filename>examples/i18n/pt/features/adicao.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language ro}
+  t.cucumber_opts = %w{--format pretty}
 end</diff>
      <filename>examples/i18n/ro/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ro
 Functionalitate: suma
   Pentru a nu face erori stupide
   Ca utilizator</diff>
      <filename>examples/i18n/ro/features/suma.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language ru}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/ru/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ru
 &#1060;&#1091;&#1085;&#1082;&#1094;&#1080;&#1086;&#1085;&#1072;&#1083;: &#1057;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077; &#1095;&#1080;&#1089;&#1077;&#1083;
   &#1063;&#1090;&#1086;&#1073;&#1099; &#1085;&#1077; &#1089;&#1082;&#1083;&#1072;&#1076;&#1099;&#1074;&#1072;&#1090;&#1100; &#1074; &#1091;&#1084;&#1077;
   &#1042;&#1089;&#1077;, &#1091; &#1082;&#1086;&#1075;&#1086; &#1089; &#1101;&#1090;&#1080;&#1084; &#1090;&#1091;&#1075;&#1086;</diff>
      <filename>examples/i18n/ru/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ru
 &#1060;&#1091;&#1085;&#1082;&#1094;&#1080;&#1086;&#1085;&#1072;&#1083;: &#1055;&#1086;&#1089;&#1083;&#1077;&#1076;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1100;&#1085;&#1099;&#1077; &#1074;&#1099;&#1095;&#1080;&#1089;&#1083;&#1077;&#1085;&#1080;&#1103;
   &#1063;&#1090;&#1086;&#1073;&#1099; &#1074;&#1099;&#1095;&#1080;&#1089;&#1083;&#1103;&#1090;&#1100; &#1089;&#1083;&#1086;&#1078;&#1085;&#1099;&#1077; &#1074;&#1099;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1103;
   &#1055;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1080; &#1093;&#1086;&#1090;&#1103;&#1090; &#1087;&#1088;&#1086;&#1074;&#1086;&#1076;&#1080;&#1090;&#1100; &#1074;&#1099;&#1095;&#1080;&#1089;&#1083;&#1077;&#1085;&#1080;&#1103; &#1085;&#1072;&#1076; &#1088;&#1077;&#1079;&#1091;&#1083;&#1100;&#1090;&#1072;&#1090;&#1086;&#1084; &#1087;&#1088;&#1077;&#1076;&#1099;&#1076;&#1091;&#1097;&#1077;&#1081; &#1086;&#1087;&#1077;&#1088;&#1072;&#1094;&#1080;&#1081;</diff>
      <filename>examples/i18n/ru/features/consecutive_calculations.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: ru
 &#1060;&#1091;&#1085;&#1082;&#1094;&#1080;&#1086;&#1085;&#1072;&#1083;: &#1044;&#1077;&#1083;&#1077;&#1085;&#1080;&#1077; &#1095;&#1080;&#1089;&#1077;&#1083;
   &#1055;&#1086;&#1089;&#1082;&#1086;&#1083;&#1100;&#1082;&#1091; &#1076;&#1077;&#1083;&#1077;&#1085;&#1080;&#1077; &#1089;&#1083;&#1086;&#1078;&#1085;&#1099;&#1081; &#1087;&#1088;&#1086;&#1094;&#1077;&#1089;&#1089; &#1080; &#1083;&#1102;&#1076;&#1080; &#1095;&#1072;&#1089;&#1090;&#1086; &#1076;&#1086;&#1087;&#1091;&#1089;&#1082;&#1072;&#1102;&#1090; &#1086;&#1096;&#1080;&#1073;&#1082;&#1080;
   &#1053;&#1091;&#1078;&#1085;&#1086; &#1076;&#1072;&#1090;&#1100; &#1080;&#1084; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;&#1089;&#1090;&#1100; &#1076;&#1077;&#1083;&#1080;&#1090;&#1100; &#1085;&#1072; &#1082;&#1072;&#1083;&#1100;&#1082;&#1091;&#1083;&#1103;&#1090;&#1086;&#1088;&#1077;</diff>
      <filename>examples/i18n/ru/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language se}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/se/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: se
 Egenskap: Summering
   F&#246;r att slippa att g&#246;ra dumma fel
   Som r&#228;knare</diff>
      <filename>examples/i18n/se/features/summering.feature</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__) + '/../../../lib')
 require 'cucumber/rake/task'
 
 Cucumber::Rake::Task.new do |t|
-  t.cucumber_opts = %w{--language sk}
+  t.cucumber_opts = %w{--format pretty}
 end
\ No newline at end of file</diff>
      <filename>examples/i18n/sk/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: sk
 Po&#382;iadavka: S&#269;&#237;tavanie
   Aby som sa vyhol hl&#250;pym chyb&#225;m
   Ako matematick&#253; idiot</diff>
      <filename>examples/i18n/sk/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: sk
 Po&#382;iadavka: Delenie
   Aby som sa vyhol hl&#250;pym chyb&#225;m
   Pokladn&#237;ci musia vedie&#357; vypo&#269;&#237;ta&#357; podiel</diff>
      <filename>examples/i18n/sk/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: zh-CN
 &#21151;&#33021;:&#21152;&#27861;
   &#20026;&#20102;&#36991;&#20813;&#19968;&#20123;&#24858;&#34850;&#30340;&#38169;&#35823;
   &#20316;&#20026;&#19968;&#20010;&#25968;&#23398;&#30333;&#30196;</diff>
      <filename>examples/i18n/zh-CN/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: zh-TW
 &#21151;&#33021;: &#21152;&#27861;
   &#28858;&#20102;&#36991;&#20813;&#24858;&#34850;&#30340;&#37679;&#35492;
   &#20316;&#28858;&#19968;&#20491;&#25976;&#23416;&#30333;&#30196; </diff>
      <filename>examples/i18n/zh-TW/features/addition.feature</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+# language: zh-TW
 &#21151;&#33021;: &#38500;&#27861;
   &#28858;&#20102;&#36991;&#20813;&#24858;&#34850;&#30340;&#37679;&#35492;
   &#25910;&#37504;&#27231;&#24517;&#38920;&#35201;&#33021;&#22816;&#35336;&#31639;&#38500;&#27861;</diff>
      <filename>examples/i18n/zh-TW/features/division.feature</filename>
    </modified>
    <modified>
      <diff>@@ -11,5 +11,5 @@ When /^I press '(.*)'$/ do |name|
 end
 
 Then /^I should see '(.*)'$/ do |text|
-  response.should contain(/#{text}/m)
+  response_body.should contain(/#{text}/m)
 end</diff>
      <filename>examples/sinatra/features/step_definitions/add_steps.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,14 +7,22 @@ require app_file
 # Force the application name because polyglot breaks the auto-detection logic.
 Sinatra::Application.app_file = app_file
 
-# RSpec
 require 'spec/expectations'
 
-# Webrat
 require 'webrat'
 Webrat.configure do |config|
-  config.mode = :sinatra
+  config.mode = :rack
 end
 
-World{Webrat::SinatraSession.new}
-World(Webrat::Matchers, Webrat::HaveTagMatcher)
+class MyWorld
+  include Webrat::Methods
+  include Webrat::Matchers
+
+  Webrat::Methods.delegate_to_session :response_code, :response_body
+
+  def app
+    Sinatra::Application
+  end
+end
+
+World{MyWorld.new}</diff>
      <filename>examples/sinatra/features/support/env.rb</filename>
    </modified>
    <modified>
      <diff>@@ -154,6 +154,7 @@ Feature: Cucumber command line
     When I run cucumber -q --language no features
     Then it should pass with
       &quot;&quot;&quot;
+      # language: no
       Egenskap: Summering
         For &#229; slippe &#229; gj&#248;re dumme feil
         Som en regnskapsf&#248;rer</diff>
      <filename>features/cucumber_cli.feature</filename>
    </modified>
    <modified>
      <diff>@@ -21,7 +21,8 @@ Feature: --expand option
 
   Scenario: Expand the outline
     When I run cucumber -i -q --expand features/expand_me.feature
-    Then it should pass with
+    Then STDERR should be empty
+    And it should pass with
       &quot;&quot;&quot;
       Feature: submit guess
 </diff>
      <filename>features/expand.feature</filename>
    </modified>
    <modified>
      <diff>@@ -9,60 +9,3 @@ require 'cucumber/step_mother'
 require 'cucumber/cli/main'
 require 'cucumber/broadcaster'
 require 'cucumber/core_ext/exception'
-
-module Cucumber
-  KEYWORD_KEYS = %w{name native encoding feature background scenario scenario_outline examples given when then but}
-  
-  class &lt;&lt; self
-    # The currently active language
-    attr_reader :lang
-    
-    def load_language(lang) #:nodoc:
-      return if @lang
-      @lang = lang
-      alias_step_definitions(lang)
-      Parser.load_parser(keyword_hash)
-    end
-
-    def language_incomplete?(lang=@lang)
-      KEYWORD_KEYS.detect{|key| keyword_hash(lang)[key].nil?}
-    end
-
-    # File mode that accounts for Ruby platform and current language
-    def file_mode(m)
-      Cucumber::RUBY_1_9 ? &quot;#{m}:#{keyword_hash['encoding']}&quot; : m
-    end
-
-    # Returns a Hash of the currently active
-    # language, or for a specific language if +lang+ is
-    # specified.
-    def keyword_hash(lang=@lang)
-      LANGUAGES[lang]
-    end
-
-    def scenario_keyword
-      keyword_hash['scenario'].split('|')[0] + ':'
-    end
-    
-    def alias_step_definitions(lang) #:nodoc:
-      keywords = %w{given when then and but}.map{|keyword| keyword_hash(lang)[keyword].split('|')}
-      alias_steps(keywords.flatten)
-    end
-    
-    # Sets up additional method aliases for Given, When and Then.
-    # This does *not* affect how feature files are parsed. If you
-    # want to create aliases in the parser, you have to do this in
-    # languages.yml. For example:
-    #
-    # and: And|With
-    def alias_steps(keywords)
-      keywords.each do |adverb|
-        StepMother.alias_adverb(adverb)
-        World.alias_adverb(adverb)
-      end
-    end
-  end  
-
-  # Make sure we always have English aliases
-  alias_step_definitions('en')
-end
\ No newline at end of file</diff>
      <filename>lib/cucumber.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@ module Cucumber
   module Ast
     # Represents the root node of a parsed feature.
     class Feature
-      attr_accessor :file
+      attr_accessor :file, :language
       attr_writer :features
       attr_reader :name
 </diff>
      <filename>lib/cucumber/ast/feature.rb</filename>
    </modified>
    <modified>
      <diff>@@ -49,5 +49,9 @@ module Cucumber
     def accept_hook?(hook)
       @tags.accept_hook?(hook) || @feature.accept_hook?(hook)
     end
+    
+    def language
+      @feature.language
+    end
   end
 end</diff>
      <filename>lib/cucumber/ast/feature_element.rb</filename>
    </modified>
    <modified>
      <diff>@@ -69,7 +69,12 @@ module Cucumber
       end
 
       def visit_scenario_name(visitor, row)
-        visitor.visit_scenario_name(Cucumber.scenario_keyword, row.name, file_colon_line(row.line), source_indent(first_line_length))
+        visitor.visit_scenario_name(
+          @feature.language.scenario_keyword,
+          row.name, 
+          file_colon_line(row.line), 
+          source_indent(first_line_length)
+        )
       end
 
       def to_sexp</diff>
      <filename>lib/cucumber/ast/scenario_outline.rb</filename>
    </modified>
    <modified>
      <diff>@@ -74,6 +74,10 @@ module Cucumber
         @file_colon_line ||= @feature_element.file_colon_line(@line) unless @feature_element.nil?
       end
 
+      def language
+        @feature_element.language
+      end
+
       def dom_id
         @dom_id ||= file_colon_line.gsub(/\//, '_').gsub(/\./, '_').gsub(/:/, '_')
       end</diff>
      <filename>lib/cucumber/ast/step.rb</filename>
    </modified>
    <modified>
      <diff>@@ -88,7 +88,8 @@ module Cucumber
       end
 
       def actual_keyword
-        if [Cucumber.keyword_hash['and'], Cucumber.keyword_hash['but']].index(@step.keyword) &amp;&amp; previous
+        repeat_keywords = [language.but_keywords, language.and_keywords].flatten
+        if repeat_keywords.index(@step.keyword) &amp;&amp; previous
           previous.actual_keyword
         else
           keyword
@@ -123,6 +124,10 @@ module Cucumber
         @step.backtrace_line
       end
 
+      def language
+        @step.language
+      end
+
       def to_sexp
         [:step_invocation, @step.line, @step.keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
       end</diff>
      <filename>lib/cucumber/ast/step_invocation.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,13 +4,14 @@ module Cucumber
 
     class Configuration
       BUILTIN_FORMATS = {
-        'html'     =&gt; 'Cucumber::Formatter::Html',
-        'pretty'   =&gt; 'Cucumber::Formatter::Pretty',
-        'profile'  =&gt; 'Cucumber::Formatter::Profile',
-        'progress' =&gt; 'Cucumber::Formatter::Progress',
-        'rerun'    =&gt; 'Cucumber::Formatter::Rerun',
-        'usage'    =&gt; 'Cucumber::Formatter::Usage',
-        'junit'    =&gt; 'Cucumber::Formatter::Junit'
+        'html'      =&gt; 'Cucumber::Formatter::Html',
+        'pretty'    =&gt; 'Cucumber::Formatter::Pretty',
+        'profile'   =&gt; 'Cucumber::Formatter::Profile',
+        'progress'  =&gt; 'Cucumber::Formatter::Progress',
+        'rerun'     =&gt; 'Cucumber::Formatter::Rerun',
+        'usage'     =&gt; 'Cucumber::Formatter::Usage',
+        'junit'     =&gt; 'Cucumber::Formatter::Junit',
+        'tag_cloud' =&gt; 'Cucumber::Formatter::TagCloud'
       }
       DEFAULT_FORMAT = 'pretty'
       DRB_FLAG = '--drb'
@@ -218,13 +219,13 @@ module Cucumber
         @drb
       end
 
-      def load_language
-        if Cucumber.language_incomplete?(@options[:lang])
-          list_keywords_and_exit(@options[:lang])
-        else
-          Cucumber.load_language(@options[:lang])
-        end
-      end
+      # def load_language
+      #   if Cucumber.language_incomplete?(@options[:lang])
+      #     list_keywords_and_exit(@options[:lang])
+      #   else
+      #     Cucumber.load_language(@options[:lang])
+      #   end
+      # end
 
       def parse_tags(tag_string)
         tag_names = tag_string.split(&quot;,&quot;)
@@ -384,6 +385,7 @@ Defined profiles in cucumber.yml:
         return @cucumber_yml
       end
 
+      # TODO: Move to Language
       def list_keywords_and_exit(lang)
         unless Cucumber::LANGUAGES[lang]
           raise(&quot;No language with key #{lang}&quot;)</diff>
      <filename>lib/cucumber/cli/configuration.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,7 @@ require 'optparse'
 require 'cucumber'
 require 'ostruct'
 require 'cucumber/parser'
+require 'cucumber/feature_file'
 require 'cucumber/formatter/color_io'
 require 'cucumber/cli/language_help_formatter'
 require 'cucumber/cli/configuration'
@@ -41,13 +42,11 @@ module Cucumber
             configuration.parse!(@args)
           end
         end
-        configuration.load_language
         step_mother.options = configuration.options
 
+        features = load_plain_text_features
         require_files
         enable_diffing
-      
-        features = load_plain_text_features
 
         visitor = configuration.build_formatter_broadcaster(step_mother)
         step_mother.visitor = visitor # Needed to support World#announce
@@ -63,11 +62,11 @@ module Cucumber
 
       def load_plain_text_features
         features = Ast::Features.new
-        parser = Parser::FeatureParser.new
 
         verbose_log(&quot;Features:&quot;)
         configuration.feature_files.each do |f|
-          feature = parser.parse_file(f, configuration.options)
+          feature_file = FeatureFile.new(f)
+          feature = feature_file.parse(configuration.options)
           if feature
             features.add_feature(feature)
             verbose_log(&quot;  * #{f}&quot;)</diff>
      <filename>lib/cucumber/cli/main.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,36 +3,4 @@ require 'cucumber/platform'
 require 'cucumber/ast'
 require 'cucumber/parser/treetop_ext'
 require 'cucumber/parser/table'
-
-module Cucumber
-  # Classes in this module parse feature files and translate the parse tree 
-  # (concrete syntax tree) into an abstract syntax tree (AST) using
-  # &lt;a href=&quot;http://martinfowler.com/dslwip/EmbeddedTranslation.html&quot;&gt;Embedded translation&lt;/a&gt;.
-  #
-  # The AST is built by the various &lt;tt&gt;#build&lt;/tt&gt; methods in the parse tree.
-  #
-  # The AST classes are defined in the Cucumber::Ast module.
-  module Parser
-    def self.load_parser(keywords)
-      Loader.new(keywords)
-    end
-    
-    class Loader
-      def initialize(keywords)
-        @keywords = keywords
-        i18n_tt = File.expand_path(File.dirname(__FILE__) + '/parser/i18n.tt')
-        template = File.open(i18n_tt, Cucumber.file_mode('r')).read
-        erb = ERB.new(template)
-        grammar = erb.result(binding)
-        Treetop.load_from_string(grammar)
-        require 'cucumber/parser/feature'
-      end
-
-      def keywords(key, raw=false)
-        return @keywords[key] if raw
-        values = @keywords[key].split('|')
-        values.map{|value| &quot;'#{value}'&quot;}.join(&quot; / &quot;)
-      end
-    end
-  end
-end
\ No newline at end of file
+require 'cucumber/parser/feature'</diff>
      <filename>lib/cucumber/parser.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,17 +10,13 @@ module Cucumber
       include Treetop::Runtime
 
       def root
-        @root || :feature
+        @root || :feature_sub
       end
 
-      include I18n
-
-      include Table
-
-      module Feature0
+      module FeatureSub0
       end
 
-      module Feature1
+      module FeatureSub1
         def white
           elements[0]
         end
@@ -55,7 +51,7 @@ module Cucumber
 
       end
 
-      module Feature2
+      module FeatureSub2
         def has_tags?(tag_names)
           tags.has_tags?(tag_names)
         end
@@ -74,10 +70,10 @@ module Cucumber
         end
       end
 
-      def _nt_feature
+      def _nt_feature_sub
         start_index = index
-        if node_cache[:feature].has_key?(index)
-          cached = node_cache[:feature][index]
+        if node_cache[:feature_sub].has_key?(index)
+          cached = node_cache[:feature_sub][index]
           @index = cached.interval.end if cached
           return cached
         end
@@ -139,7 +135,7 @@ module Cucumber
                     end
                     if s7.last
                       r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
-                      r7.extend(Feature0)
+                      r7.extend(FeatureSub0)
                     else
                       self.index = i7
                       r7 = nil
@@ -181,14 +177,14 @@ module Cucumber
         end
         if s0.last
           r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
-          r0.extend(Feature1)
-          r0.extend(Feature2)
+          r0.extend(FeatureSub1)
+          r0.extend(FeatureSub2)
         else
           self.index = i0
           r0 = nil
         end
 
-        node_cache[:feature][start_index] = r0
+        node_cache[:feature_sub][start_index] = r0
 
         return r0
       end
@@ -1346,7 +1342,7 @@ module Cucumber
 
       module LinesToKeyword2
         def build
-          self.text_value.split(&quot;\n&quot;).map{|s| s.strip }.join(&quot;\n&quot;)
+          self.text_value.split(&quot;\n&quot;).map{|s| s.strip}.join(&quot;\n&quot;)
         end
       end
 </diff>
      <filename>lib/cucumber/parser/feature.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,10 +7,8 @@ module Cucumber
     # Treetop will then generate the parser in-memory. When you're happy, just generate
     # the rb file with tt feature.tt
     grammar Feature
-      include I18n
-      include Table
 
-      rule feature
+      rule feature_sub
         white 
         comment 
         white </diff>
      <filename>lib/cucumber/parser/feature.tt</filename>
    </modified>
    <modified>
      <diff>@@ -1,35 +1,42 @@
 module Cucumber
   module Parser
-    grammar I18n
+    module I18n
+      grammar &lt;%= keywords('grammar_name', true) %&gt;
+        include Feature
+        include Table
 
-      rule background_keyword
-        (&lt;%= keywords('background') %&gt;) ':'
-      end
+        rule feature
+          feature_sub
+        end
 
-      rule scenario_keyword
-        (&lt;%= keywords('scenario') %&gt;) ':'
-      end
+        rule background_keyword
+          (&lt;%= keywords('background') %&gt;) ':'
+        end
 
-      rule scenario_outline_keyword
-        (&lt;%= keywords('scenario_outline') %&gt;) ':'
-      end
+        rule scenario_keyword
+          (&lt;%= keywords('scenario') %&gt;) ':'
+        end
 
-      rule step_keyword
-        (&lt;%= keywords('given') %&gt;) /
-        (&lt;%= keywords('when') %&gt;) /
-        (&lt;%= keywords('then') %&gt;) /
-        (&lt;%= keywords('and') %&gt;) /
-        (&lt;%= keywords('but') %&gt;)
-      end
+        rule scenario_outline_keyword
+          (&lt;%= keywords('scenario_outline') %&gt;) ':'
+        end
 
-      rule keyword_space
-        &lt;%= keywords('space_after_keyword', true) ? 'space+' : 'space*' %&gt;
-      end
+        rule step_keyword
+          (&lt;%= keywords('given') %&gt;) /
+          (&lt;%= keywords('when') %&gt;) /
+          (&lt;%= keywords('then') %&gt;) /
+          (&lt;%= keywords('and') %&gt;) /
+          (&lt;%= keywords('but') %&gt;)
+        end
 
-      rule examples_keyword
-        (&lt;%= keywords('examples') %&gt;) ':'?
-      end
+        rule keyword_space
+          &lt;%= keywords('space_after_keyword', true) ? 'space+' : 'space*' %&gt;
+        end
 
+        rule examples_keyword
+          (&lt;%= keywords('examples') %&gt;) ':'?
+        end
+      end
     end
   end
 end
\ No newline at end of file</diff>
      <filename>lib/cucumber/parser/i18n.tt</filename>
    </modified>
    <modified>
      <diff>@@ -12,78 +12,17 @@ end
 
 module Cucumber
   module Parser
-    class Filter
-      def initialize(lines, options)
-        @lines = lines
-        @include_tags = options[:include_tags] || []
-        @exclude_tags = options[:exclude_tags] || []
-        @name_regexps = options[:name_regexps] || []
-      end
-
-      def accept?(syntax_node)
-        at_line?(syntax_node) &amp;&amp;
-        matches_tags?(syntax_node) &amp;&amp;
-        matches_names?(syntax_node)
-      end
-
-      def accept_example?(syntax_node, outline)
-        (at_line?(syntax_node) || outline_at_line?(outline)) &amp;&amp; 
-        (matches_names?(syntax_node) || outline_matches_names?(outline))
-      end
-      
-      def at_line?(syntax_node)
-        @lines.nil? || @lines.empty? || @lines.detect{|line| syntax_node.at_line?(line)}
-      end
-
-      def outline_at_line?(syntax_node)
-         @lines.nil? || @lines.empty? || @lines.detect{|line| syntax_node.outline_at_line?(line)}
-      end
-
-      def matches_tags?(syntax_node)
-        !excluded_by_tags?(syntax_node) &amp;&amp;
-        included_by_tags?(syntax_node)
-      end
-
-      def included_by_tags?(syntax_node)
-        @include_tags.empty? || syntax_node.has_tags?(@include_tags)
-      end
-
-      def excluded_by_tags?(syntax_node)
-        @exclude_tags.any? &amp;&amp; syntax_node.has_tags?(@exclude_tags)
-      end
-      
-      def outline_matches_names?(syntax_node)
-        @name_regexps.nil? || @name_regexps.empty? || @name_regexps.detect{|name_regexp| syntax_node.outline_matches_name?(name_regexp)}
-      end
-      
-      def matches_names?(syntax_node)
-        @name_regexps.nil? || @name_regexps.empty? || @name_regexps.detect{|name_regexp| syntax_node.matches_name?(name_regexp)}
+    class SyntaxError &lt; StandardError
+      def initialize(parser, file, line_offset)
+        tf = parser.terminal_failures
+        expected = tf.size == 1 ? tf[0].expected_string.inspect : &quot;one of #{tf.map{|f| f.expected_string.inspect}.uniq*', '}&quot;
+        line = parser.failure_line + line_offset
+        message = &quot;#{file}:#{line}:#{parser.failure_column}: Parse error, expected #{expected}.&quot;
+        super(message)
       end
     end
-
-    module TreetopExt      
-      FILE_COLON_LINE_PATTERN = /^([\w\W]*?):([\d:]+)$/
-
-      # Parses a file and returns a Cucumber::Ast
-      def parse_file(file, options)
-        _, path, lines = *FILE_COLON_LINE_PATTERN.match(file)
-        if path
-          lines = lines.split(':').map { |line| line.to_i }
-        else
-          path = file
-        end
-        filter = Filter.new(lines, options)
-
-        loader = lambda { |io| parse_or_fail(io.read, filter, path) }
-        feature = if path =~ /^http/
-          require 'open-uri'
-          open(path, &amp;loader)
-        else
-          File.open(path, Cucumber.file_mode('r'), &amp;loader) 
-        end
-        feature
-      end
-
+    
+    module TreetopExt
       def parse_or_fail(string, filter=nil, file=nil, line_offset=0)
         parse_tree = parse(string)
         if parse_tree.nil?
@@ -95,16 +34,6 @@ module Cucumber
         end
       end
     end
-
-    class SyntaxError &lt; StandardError
-      def initialize(parser, file, line_offset)
-        tf = parser.terminal_failures
-        expected = tf.size == 1 ? tf[0].expected_string.inspect : &quot;one of #{tf.map{|f| f.expected_string.inspect}.uniq*', '}&quot;
-        line = parser.failure_line + line_offset
-        message = &quot;#{file}:#{line}:#{parser.failure_column}: Parse error, expected #{expected}.&quot;
-        super(message)
-      end
-    end
   end
 end
 
@@ -115,7 +44,7 @@ module Treetop
         input.line_of(interval.first)
       end
     end
-    
+
     class CompiledParser
       include Cucumber::Parser::TreetopExt
     end</diff>
      <filename>lib/cucumber/parser/treetop_ext.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,6 +4,7 @@ require 'rbconfig'
 require 'yaml'
 
 module Cucumber
+  # TODO: Move these constants and the file to Language. Update wiki
   LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/languages.yml')
   LANGUAGES     = YAML.load_file(LANGUAGE_FILE)
   BINARY        = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
@@ -15,4 +16,8 @@ module Cucumber
   RAILS         = defined?(Rails)
   RUBY_BINARY   = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
   RUBY_1_9      = RUBY_VERSION =~ /^1\.9/
+  
+  def self.file_mode(m)
+    RUBY_1_9 ? &quot;#{m}:UTF-8&quot; : m
+  end
 end
\ No newline at end of file</diff>
      <filename>lib/cucumber/platform.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@ module Cucumber #:nodoc:
     MAJOR = 0
     MINOR = 3
     TINY  = 11
-    PATCH = 3 # Set to nil for official release
+    PATCH = 4 # Set to nil for official release
 
     STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
   end</diff>
      <filename>lib/cucumber/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,10 +4,11 @@ module Cucumber
   module Ast
     describe StepCollection do
       it &quot;should convert And to Given in snippets&quot; do
-        c = StepCollection.new([
-          Step.new(1, 'Given', 'cukes'),
-          Step.new(2, 'And', 'turnips')
-        ])
+        s1 = Step.new(1, 'Given', 'cukes')
+        s2 = Step.new(2, 'And', 'turnips')
+        s1.stub!(:language).and_return(Parser::I18n::Language['en'])
+        s2.stub!(:language).and_return(Parser::I18n::Language['en'])
+        c = StepCollection.new([s1, s2])
         actual_keywords = c.step_invocations.map{|i| i.actual_keyword}
         actual_keywords.should == %w{Given Given}
       end</diff>
      <filename>spec/cucumber/ast/step_collection_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,7 +35,7 @@ module Cucumber
           @cli = Main.new(%w{--verbose example.feature}, @out)
           @cli.stub!(:require)
 
-          Parser::FeatureParser.stub!(:new).and_return(mock(&quot;feature parser&quot;, :parse_file =&gt; @empty_feature))
+          FeatureFile.stub!(:new).and_return(mock(&quot;feature file&quot;, :parse =&gt; @empty_feature))
 
           @cli.execute!(Object.new.extend(StepMother))
 
@@ -134,15 +134,8 @@ module Cucumber
             @configuration.should_receive(:parse!).exactly(:twice)
             @cli.execute!(@step_mother)
           end
-
-          it &quot;proceeds with the execution locally&quot; do
-            @configuration.should_receive(:load_language)
-            @cli.execute!(@step_mother)
-          end
         end
-
       end
-
     end
   end
 end</diff>
      <filename>spec/cucumber/cli/main_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,12 @@
 require File.dirname(__FILE__) + '/../../spec_helper'
-require 'cucumber/parser'
+require 'cucumber/parser/i18n/language'
 
 module Cucumber
   module Parser
     describe Feature do
       before do
-        @parser = FeatureParser.new
+        @language = I18n::Language['en']
+        @parser = @language.parser
       end
 
       def parse(text)
@@ -13,11 +14,11 @@ module Cucumber
       end
 
       def parse_file(file)
-        @parser.parse_file(File.dirname(__FILE__) + &quot;/../treetop_parser/&quot; + file, {})
+        @language.parse_file(File.dirname(__FILE__) + &quot;/../treetop_parser/&quot; + file, Filter.new([], {}))
       end
 
       def parse_example_file(file)
-        @parser.parse_file(File.dirname(__FILE__) + &quot;/../../../examples/&quot; + file, {})
+        @language.parse_file(File.dirname(__FILE__) + &quot;/../../../examples/&quot; + file, Filter.new([], {}))
       end
 
       describe &quot;Comments&quot; do
@@ -352,7 +353,8 @@ Given I am a step
 
       describe &quot;Filtering&quot; do
         it &quot;should filter outline tables&quot; do
-          f = parse_example_file('self_test/features/outline_sample.feature:12')
+          ff = FeatureFile.new(File.dirname(__FILE__) + '/../../../examples/self_test/features/outline_sample.feature:12')
+          f = ff.parse({:lang =&gt; 'en'})
           f.to_sexp.should ==
           [:feature,
            &quot;./spec/cucumber/parser/../../../examples/self_test/features/outline_sample.feature&quot;,</diff>
      <filename>spec/cucumber/parser/feature_parser_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ module Cucumber
   module Parser
     describe 'Tables' do
       before do
-        @parser = FeatureParser.new
+        @parser = I18n::EnglishParser.new
       end
       
       def parse(text)</diff>
      <filename>spec/cucumber/parser/table_parser_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,6 @@ require 'spec/autorun'
 ENV['CUCUMBER_COLORS']=nil
 $:.unshift(File.dirname(__FILE__) + '/../lib')
 require 'cucumber'
-Cucumber.load_language('en')
 $:.unshift(File.dirname(__FILE__))
 
 ::Term::ANSIColor.coloring = true</diff>
      <filename>spec/spec_helper.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>d282c602b1e9658eda6fdb8f471460b37b13475f</id>
    </parent>
  </parents>
  <author>
    <name>Aslak Helles&#248;y</name>
    <email>aslak.hellesoy@gmail.com</email>
  </author>
  <url>http://github.com/garnierjm/cucumber/commit/5435f225dd6c78c696cdacbf161cc010749733eb</url>
  <id>5435f225dd6c78c696cdacbf161cc010749733eb</id>
  <committed-date>2009-06-15T11:16:19-07:00</committed-date>
  <authored-date>2009-06-15T11:15:30-07:00</authored-date>
  <message>Possibility to specify scenario language as part of the .feature file [#345 state:resolved]</message>
  <tree>6cb071fad1816ee45ca7c72ad950c8d1cf2571b5</tree>
  <committer>
    <name>Aslak Helles&#248;y</name>
    <email>aslak.hellesoy@gmail.com</email>
  </committer>
</commit>
