LCOV - code coverage report
Current view: top level - src/util - translation.h (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 4 21 19.0 %
Date: 2023-09-26 12:08:55 Functions: 7 105 6.7 %

          Line data    Source code
       1             : // Copyright (c) 2019-2022 The Bitcoin Core developers
       2             : // Distributed under the MIT software license, see the accompanying
       3             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4             : 
       5             : #ifndef BITCOIN_UTIL_TRANSLATION_H
       6             : #define BITCOIN_UTIL_TRANSLATION_H
       7             : 
       8             : #include <tinyformat.h>
       9             : 
      10             : #include <functional>
      11             : #include <string>
      12             : 
      13             : /**
      14             :  * Bilingual messages:
      15             :  *   - in GUI: user's native language + untranslated (i.e. English)
      16             :  *   - in log and stderr: untranslated only
      17             :  */
      18        1466 : struct bilingual_str {
      19             :     std::string original;
      20             :     std::string translated;
      21             : 
      22           0 :     bilingual_str& operator+=(const bilingual_str& rhs)
      23             :     {
      24           0 :         original += rhs.original;
      25           0 :         translated += rhs.translated;
      26           0 :         return *this;
      27             :     }
      28             : 
      29         146 :     bool empty() const
      30             :     {
      31         146 :         return original.empty();
      32             :     }
      33             : 
      34             :     void clear()
      35             :     {
      36             :         original.clear();
      37             :         translated.clear();
      38             :     }
      39             : };
      40             : 
      41           0 : inline bilingual_str operator+(bilingual_str lhs, const bilingual_str& rhs)
      42             : {
      43           0 :     lhs += rhs;
      44           0 :     return lhs;
      45             : }
      46             : 
      47             : /** Mark a bilingual_str as untranslated */
      48        1200 : inline bilingual_str Untranslated(std::string original) { return {original, original}; }
      49             : 
      50             : // Provide an overload of tinyformat::format which can take bilingual_str arguments.
      51             : namespace tinyformat {
      52             : template <typename... Args>
      53           0 : bilingual_str format(const bilingual_str& fmt, const Args&... args)
      54             : {
      55           0 :     const auto translate_arg{[](const auto& arg, bool translated) -> const auto& {
      56             :         if constexpr (std::is_same_v<decltype(arg), const bilingual_str&>) {
      57           0 :             return translated ? arg.translated : arg.original;
      58             :         } else {
      59           0 :             return arg;
      60             :         }
      61             :     }};
      62           0 :     return bilingual_str{tfm::format(fmt.original, translate_arg(args, false)...),
      63           0 :                          tfm::format(fmt.translated, translate_arg(args, true)...)};
      64           0 : }
      65             : } // namespace tinyformat
      66             : 
      67             : /** Translate a message to the native language of the user. */
      68             : const extern std::function<std::string(const char*)> G_TRANSLATION_FUN;
      69             : 
      70             : /**
      71             :  * Translation function.
      72             :  * If no translation function is set, simply return the input.
      73             :  */
      74           0 : inline bilingual_str _(const char* psz)
      75             : {
      76           0 :     return bilingual_str{psz, G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(psz) : psz};
      77           0 : }
      78             : 
      79             : #endif // BITCOIN_UTIL_TRANSLATION_H

Generated by: LCOV version 1.14