text: // Copyright (c) 2019-2020 The BitcoinCore developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #ifndef BARICOIN_UTIL_TRANSLATION_H
  #define BARICOIN_UTIL_TRANSLATION_H
  
  #include <tinyformat.h>
  #include <functional>
  
  /**
   * Bilingual messages:
   *   - in GUI: user's native language + untranslated (i.e. English)
   *   - in log and stderr: untranslated only
   */
  struct bilingual_str {
      std::string original;
      std::string translated;
  
      bilingual_str& operator+=(const bilingual_str& rhs)
      {
          original += rhs.original;
          translated += rhs.translated;
          return *this;
      }
  
      bool empty() const
      {
          return original.empty();
      }
  };
  
  inline bilingual_str operator+(bilingual_str lhs, const bilingual_str& rhs)
  {
      lhs += rhs;
      return lhs;
  }
  
  /** Mark a bilingual_str as untranslated */
  inline bilingual_str Untranslated(std::string original) { return {original, original}; }
  
  namespace tinyformat {
  template <typename... Args>
  bilingual_str format(const bilingual_str& fmt, const Args&... args)
  {
      return bilingual_str{format(fmt.original, args...), format(fmt.translated, args...)};
  }
  } // namespace tinyformat
  
  /** Translate a message to the native language of the user. */
  const extern std::function<std::string(const char*)> G_TRANSLATION_FUN;
  
  /**
   * Translation function.
   * If no translation function is set, simply return the input.
   */
  inline bilingual_str _(const char* psz)
  {
      return bilingual_str{psz, G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(psz) : psz};
  }
  
  #endif // BARICOIN_UTIL_TRANSLATION_H
  