rosette-proj/rosette-core

View on GitHub
lib/rosette/core/translation_status.rb

Summary

Maintainability
A
0 mins
Test Coverage
# encoding: UTF-8

module Rosette
  module Core

    # A utility class that encapsulates how translated a set of phrases is.
    # The class knows how to report translation percentages, etc.
    #
    # @!attribute [r] phrase_count
    #   @return [Fixnum] the total number of phrases.
    # @!attribute [r] locale_counts
    #   @return [Hash<Fixnum>] a hash of locale codes to counts. Each count
    #     represents the number of completed translations for that locale.
    class TranslationStatus
      attr_reader :phrase_count, :locale_counts

      # Creates a new instance.
      #
      # @param [Fixnum] phrase_count The total number of phrases.
      # @return [TranslationStatus]
      def initialize(phrase_count)
        @phrase_count = phrase_count
        @locale_counts = {}
      end

      # Adds a locale code and count pair. The count should be the total number
      # of completed translations in the locale.
      #
      # @param [String] locale_code
      # @param [Fixnum] count
      # @return [void]
      def add_locale_count(locale_code, count)
        locale_counts[locale_code] = count
      end

      # Returns true if the given locale is fully translated (i.e. the number of
      # translations is greater than or equal to the number of phrases).
      #
      # @param [String] locale_code
      # @return [Boolean]
      def fully_translated_in?(locale_code)
        (locale_counts[locale_code] || -1) >= phrase_count
      end

      # Returns true if every locale is fully translated, false otherwise.
      #
      # @return [Boolean]
      def fully_translated?
        locale_counts.all? do |locale_code, _|
          fully_translated_in?(locale_code)
        end
      end

      # Retrieves the number of completed translations for the given locale.
      # Use this method in combination with +add_locale_count+.
      def locale_count(locale_code)
        locale_counts[locale_code]
      end

      # Retrieves a list of all the added locales.
      #
      # @return [Array<String>]
      def locales
        locale_counts.keys
      end

      # Calculates a translated percentage for the given locale.
      #
      # @param [String] locale_code
      # @param [Fixnum] precision The precision to use when rounding the
      #   percentage.
      # @return [Float] the translation percentage, rounded to +precision+
      #   decimal places.
      def percent_translated(locale_code, precision = 2)
        pct = locale_counts[locale_code] / phrase_count.to_f
        [1.0, pct.round(precision)].min
      end
    end

  end
end