lib/translate_self/translation.rb in translate_self-1.0.1 vs lib/translate_self/translation.rb in translate_self-2.0.1

- old
+ new

@@ -1,14 +1,23 @@ require 'deepl' # The part where the actual translation happens. module Translation - @@languages = %w[bg cs da de el en es et fi fr hu it ja lt lv nl pl pt ro ru sk sl sv zh].freeze - attr_accessor :language, :to_language + LANGUAGES = %w[bg cs da de el en es et fi fr hu it ja lt lv nl pl pt ro ru sk sl sv zh].freeze + attr_accessor :language + def to_language + @to_language || 'fi' + end + + def to_language=(language) + defroster if needs_defrosting? + @to_language = LANGUAGES.include?(language) ? language : 'fi' + end + def available_languages - @@languages + LANGUAGES end # Translates self to the desired language. \ # Sample usage: # hello = 'hello'\ @@ -28,58 +37,72 @@ # hello.translate! # pp hello # # 'Hei' # @return [String] self replaced with the new translation def translate! + defroster if needs_defrosting? replace translate end # Translates the string itself to a language the user wants to translate it to. # Sample usage: # 'hello'.translate_to_fi # # Hei # # @param [String] the language to translate to, e.g. "fi" # @return [String] the contents translated to another language - @@languages.each do |lan| + LANGUAGES.each do |lan| define_method("translate_to_#{lan}".to_sym) do |language = lan| call_deepl(self.language, language) end alias_method "to_#{lan}".to_sym, "translate_to_#{lan}".to_sym end private + def needs_defrosting? + frozen? && TranslateSelf.config.defrosting + end + + def defroster + require 'defrost' + defrost + end + def break_up(to_lan) sentences = break_text_into_sentences sentences.length.times.map.with_index do |_i, i| sentences[i].send "translate_to_#{to_lan}" end.join(' ') end def break_text_into_sentences - last_letter = if self[-1] == '.' - '.' - else - '' - end + last_letter = last_letter_of_self tr_count = (bytesize / 25_000.to_f).ceil sentences = split('.') number_of_sentences = sentences.length / tr_count current_count = 0 tr_count.times.map do |num| txt = sentences[current_count..(current_count + number_of_sentences)].join('.') current_count += number_of_sentences.next - txt + last_letter if num == tr_count.pred + if num == tr_count.pred + txt + last_letter + else + txt + end end end + def last_letter_of_self + end_with?('.') ? '.' : '' + end + def call_deepl(language = self.language, to_lan = to_language) warn 'No language given!' and return if to_lan.nil? return break_up(to_lan) if bytesize > 30_000 response = DeepL.translate self, language, to_lan - self.language = response.detected_source_language.downcase if self.language.nil? && !frozen? + self.language = response.detected_source_language.downcase if !frozen? || (needs_defrosting? && defroster) actual_translation = response.text actual_translation.language = to_lan actual_translation end end