diff --git a/Library/Homebrew/cask/lib/hbc/dsl.rb b/Library/Homebrew/cask/lib/hbc/dsl.rb index 9970f839547663ca37ed085b9aa173f3d09564ec..08afe75fc519f58019510b5850b6875b0c69b73a 100644 --- a/Library/Homebrew/cask/lib/hbc/dsl.rb +++ b/Library/Homebrew/cask/lib/hbc/dsl.rb @@ -1,4 +1,5 @@ require "set" +require "locale" require "hbc/dsl/appcast" require "hbc/dsl/base" @@ -99,9 +100,10 @@ module Hbc @homepage ||= homepage end - def language(*args, &block) + def language(*args, default: false, &block) if !args.empty? && block_given? @language_blocks ||= {} + @language_blocks.default = block if default @language_blocks[args] = block else language_eval @@ -114,29 +116,15 @@ module Hbc return unless instance_variable_defined?(:@language_blocks) - default_key = @language_blocks.keys.detect { |key| key.include?(:default) } + MacOS.languages.map(&Locale.method(:parse)).any? { |locale| + key = @language_blocks.keys.detect { |strings| + strings.any? { |string| locale.include?(string) } + } - MacOS.languages.each do |language| - @language_blocks.each do |regexes_or_strings, block| - if regexes_or_strings.include?(:default) - regexes_or_strings = regexes_or_strings - [:default] + [%r{^en}] - end + return @language = @language_blocks[key].call unless key.nil? + } - regexes_or_strings.each do |regex_or_string| - if regex_or_string.class == language.class - next unless regex_or_string == language - else - next unless regex_or_string =~ language - end - - @language = block.call - return - end - end - end - - # fallback to :default - @language = default_key.nil? ? nil : @language_blocks[default_key].call + @language = @language_blocks.default.call end def url(*args, &block) diff --git a/Library/Homebrew/cask/test/cask/dsl_test.rb b/Library/Homebrew/cask/test/cask/dsl_test.rb index f6fca3d2d1b9e2d123a45c2ee5d1b7f7a0ece74b..053eae1e1dd11d793a01a7335de7d3afadd686f9 100644 --- a/Library/Homebrew/cask/test/cask/dsl_test.rb +++ b/Library/Homebrew/cask/test/cask/dsl_test.rb @@ -124,36 +124,51 @@ describe Hbc::DSL do describe "language stanza" do it "allows multilingual casks" do - cask = lambda { + cask = lambda do Hbc::Cask.new("cask-with-apps") do - language "FIRST_LANGUAGE" do - :first + language "zh" do + sha256 "abc123" + "zh-CN" end - language %r{SECOND_LANGUAGE} do - :second + language "en-US", default: true do + sha256 "xyz789" + "en-US" end - language :default do - :default - end + url "https://example.org/#{language}.zip" end - } - - MacOS.stubs(languages: ["FIRST_LANGUAGE"]) - cask.call.language.must_equal :first - - MacOS.stubs(languages: ["SECOND_LANGUAGE"]) - cask.call.language.must_equal :second - - MacOS.stubs(languages: ["THIRD_LANGUAGE"]) - cask.call.language.must_equal :default - - MacOS.stubs(languages: ["THIRD_LANGUAGE", "SECOND_LANGUAGE", "FIRST_LANGUAGE"]) - cask.call.language.must_equal :second + end - MacOS.stubs(languages: ["THIRD_LANGUAGE", "FIRST_LANGUAGE", "SECOND_LANGUAGE"]) - cask.call.language.must_equal :first + MacOS.stubs(languages: ["zh"]) + cask.call.language.must_equal "zh-CN" + cask.call.sha256.must_equal "abc123" + cask.call.url.to_s.must_equal "https://example.org/zh-CN.zip" + + MacOS.stubs(languages: ["zh-XX"]) + cask.call.language.must_equal "zh-CN" + cask.call.sha256.must_equal "abc123" + cask.call.url.to_s.must_equal "https://example.org/zh-CN.zip" + + MacOS.stubs(languages: ["en"]) + cask.call.language.must_equal "en-US" + cask.call.sha256.must_equal "xyz789" + cask.call.url.to_s.must_equal "https://example.org/en-US.zip" + + MacOS.stubs(languages: ["xx-XX"]) + cask.call.language.must_equal "en-US" + cask.call.sha256.must_equal "xyz789" + cask.call.url.to_s.must_equal "https://example.org/en-US.zip" + + MacOS.stubs(languages: ["xx-XX", "zh", "en"]) + cask.call.language.must_equal "zh-CN" + cask.call.sha256.must_equal "abc123" + cask.call.url.to_s.must_equal "https://example.org/zh-CN.zip" + + MacOS.stubs(languages: ["xx-XX", "en-US", "zh"]) + cask.call.language.must_equal "en-US" + cask.call.sha256.must_equal "xyz789" + cask.call.url.to_s.must_equal "https://example.org/en-US.zip" end end