       throw new Meteor.Error 500, "Failed to build unified languages files. Failed to create a file: #{lang_file_path}",
         {lang_file_path: lang_file_path, error: error}
 
-  # Map the unified languages files
-  has_unified_languages_files = _.extend(
-    _.object(_.map(supported_languages, (lang) -> [lang, false])),
-    _.object(_.map(unified_languages_files, (content, lang) -> [lang, true]))
-  )
-
-  log "Done building unified languages files"
-
-  return has_unified_languages_files
-
 build_files_once_log = {}
 build_files_once_arch_log = {}
 projectTapI18n = null
+unified_languages_files = {}
 buildFilesOnce = (compileStep) ->
-  # Builds the unified languages files and the project configuration (for each
-  # arch) once per build cycle
-
-  # To tell whether or not we are in a new build cycle we assume that if the
-  # same file triggered a call to that function for the same architecture we
-  # are in a new cycle
-  current_step_file = "#{compileStep._fullInputPath}::#{compileStep.arch}"
-
-  # Once per build cycle - regardless of arch
-  #
-  # If the build_files_once_log is empty or if the current_step_file is already
-  # in the log - we are in a new build cycle
-  if _.isEmpty(build_files_once_log) or (current_step_file of build_files_once_log)
-    # Init logs
-    build_files_once_log = {}
-    build_files_once_arch_log = {}
-
+  # Builds the unified languages files and the project configuration once
+  # per build cycle
+
+  oncePerCycle = () ->
     # Reload the project configuration
     projectTapI18n = loadProjectConf()
 
-    # Build the unified languages files only if tap-i18n is enabled in the
-    # project level
+    # Generate and build the unified languages files only
+    # if tap-i18n is enabled in the project level
     if projectTapI18n?
-      langs_with_unified_lang_files =
-        buildUnifiedLangFiles compileStep, projectTapI18n.build_files_path, projectTapI18n.supported_languages, projectTapI18n.languages_files_dir
+      unified_languages_files =
+        getUnifiedLangFiles projectTapI18n.supported_languages, projectTapI18n.languages_files_dir
+
+      addUnifiedFilesAsFsFiles unified_languages_files, projectTapI18n.build_files_path
 
       # If the supported languages for that project haven't been specified - all
       # the languages we have a unified language file for (and the fallback
       # language) are supported 
-      projectTapI18n.supported_languages ?= _.union([fallback_language], _.keys langs_with_unified_lang_files)
-
-      projectTapI18n.unified_lang_files_map = langs_with_unified_lang_files
+      projectTapI18n.supported_languages ?= _.union([fallback_language], _.keys unified_languages_files)
+
+      projectTapI18n.unified_lang_files_map = _.object _.map(unified_languages_files, (content, lang) -> [lang, if content != "{}" then true else false])
 
       # Map supported language tags with respective titles in english and native
       projectTapI18n.language_names = {}

        data: project_i18n_js_file,
        bare: false

    build_files_once_arch_log[compileStep.arch] = true

  # Same build cycle - log file
  build_files_once_log[current_step_file] = true

    _.each dialects, (dialect) ->
      base_language = (dialect.split "-")[0]
      if not (base_language of languages_files)
        throw new Meteor.Error 500, "Package #{package_map.name} has no language file for the base language (#{base_language}) of the dialect (#{dialect})"

    if supported_languages
