require 'i15r/pattern_matcher' class I15R class AppFolderNotFound < Exception; end class Config def initialize(config) @options = config end def prefix @options.fetch(:prefix, nil) end def dry_run? @options.fetch(:dry_run, false) end def add_default @options.fetch(:add_default, true) end end attr_reader :config def initialize(reader, writer, printer, config={}) @reader = reader @writer = writer @printer = printer @config = I15R::Config.new(config) end def config=(hash) @config = I15R::Config.new(hash) end def file_path_to_message_prefix(file) segments = File.expand_path(file).split('/').reject { |segment| segment.empty? } subdir = %w(views helpers controllers models).find do |app_subdir| segments.index(app_subdir) end if subdir.nil? raise AppFolderNotFound, "No app. subfolders were found to determine prefix. Path is #{File.expand_path(file)}" end first_segment_index = segments.index(subdir) + 1 file_name_without_extensions = segments.last.split('.').first if file_name_without_extensions and file_name_without_extensions[0] == '_' file_name_without_extensions = file_name_without_extensions[1..-1] end path_segments = segments.slice(first_segment_index...-1) if path_segments.empty? file_name_without_extensions else "#{path_segments.join('.')}.#{file_name_without_extensions}" end end def internationalize_file(path) text = @reader.read(path) prefix = config.prefix || file_path_to_message_prefix(path) template_type = path[/(?:.*)\.(.*)$/, 1] @printer.println("#{path}:") @printer.println("") i18ned_text = sub_plain_strings(text, prefix, template_type.to_sym) @writer.write(path, i18ned_text) unless config.dry_run? end def sub_plain_strings(text, prefix, file_type) pm = I15R::PatternMatcher.new(prefix, file_type, :add_default => config.add_default) transformed_text = pm.run(text) do |old_line, new_line| @printer.print_diff(old_line, new_line) end transformed_text + "\n" end def internationalize!(path) @printer.println "Running in dry-run mode" if config.dry_run? path = "app" if path.nil? files = File.directory?(path) ? Dir.glob("#{path}/**/*.{erb,haml}") : [path] files.each { |file| internationalize_file(file) } end end