gui: Bilingual GUI error messages #16224

pull hebasto wants to merge 5 commits into bitcoin:master from hebasto:20190617-bilingual-errors changing 23 files +166 −144
  1. hebasto commented at 1:02 pm on June 17, 2019: member

    This is an alternative to #15340 (it works with the Chain interface; see: #15340 (comment)). Refs:

    This PR:

    • makes GUI error messages bilingual: user’s native language + untranslated (i.e. English)
    • insures that only untranslated messages are written to the debug log file and to stderr (that is not the case on master).

    If a translated string is unavailable only an English string appears to a user.

    Here are some examples (updated):

    Screenshot from 2020-04-24 17-08-37

    Screenshot from 2020-04-24 17-12-17

    • qt5ct: using qt5ct plugin message is my local environment specific; please ignore it.

    Note for reviewers: InitWarning() is out of this PR scope.

  2. fanquake added the label GUI on Jun 17, 2019
  3. hebasto commented at 1:07 pm on June 17, 2019: member
    @MarcoFalke your #15340 (review) has been addressed.
  4. hebasto force-pushed on Jun 17, 2019
  5. ryanofsky commented at 3:02 pm on June 17, 2019: member

    EDIT: I didn’t realize when I wrote this there was lots of previous discussion already about showing untranslated messages in #15340.


    Concept ACK, especially for the code cleanup making error handling more consistent. Some thoughts:

    • I’m not sure it would be better to show same message twice in error dialogs, than to only show the translated message and something like “More detailed debug information can be found in debug.log,” or maybe just the translated message and a “View debug log…” button, to reduce the amount of clutter. I’d hope that in most cases translated error messages would be clear enough to help users solve problems, and only more rarely would users need untranslated strings for to report a bug or look things up.

    • Using _("") syntax for translated strings is pretty common and well understood, but _("", true) for bilingual strings seems harder to distinguish and figure out. Might worth considering other syntaxes _b(""), bilingual(""), translate("") or even ""_translate with user literal syntax. Other option would be not having any special syntax and just adding normal functions that return literal and formatted bilingual_str objects.

    PR looks good in its current form though, and it would be good to get opinions from other reviewers.

  6. MarcoFalke commented at 3:42 pm on June 17, 2019: member
    Is there even a point in having two different translation functions long term? Shouldn’t all non-gui code use the one that returns a bilingual_str?
  7. ryanofsky commented at 3:58 pm on June 17, 2019: member

    Is there even a point in having two different translation functions long term?

    Good point. I don’t think there is. So another alternative could be to update the _ function to return both translated and untranslated strings, and not have any new syntax at all.

  8. DrahtBot commented at 6:37 pm on June 17, 2019: member

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #18849 (The Zero Allocations project by jb55)
    • #18740 (Remove g_rpc_node global by ryanofsky)
    • #18000 (Index for UTXO Set Statistics by fjahr)
    • #17659 (qt: Do not block GUI thread in RPCConsole by hebasto)
    • #17127 (util: Correct permissions for datadir and wallets subdir by hebasto)
    • #15606 ([experimental] UTXO snapshots by jamesob)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  9. DrahtBot added the label Needs rebase on Jun 18, 2019
  10. hebasto force-pushed on Jun 19, 2019
  11. hebasto commented at 3:53 pm on June 19, 2019: member
    Rebased.
  12. DrahtBot removed the label Needs rebase on Jun 19, 2019
  13. DrahtBot added the label Needs rebase on Jun 25, 2019
  14. in src/util/translation.h:26 in 81baf61a15 outdated
    21+
    22+namespace tinyformat {
    23+template <typename... Args>
    24+bilingual_str format(const bilingual_str& fmt, const Args&... args)
    25+{
    26+    return std::move(bilingual_str{format(fmt.original, args...), format(fmt.translated, args...)});
    


    practicalswift commented at 3:40 pm on June 25, 2019:
    I think std::move prevents copy elision here.

    hebasto commented at 4:43 pm on June 25, 2019:
    Fixed.
  15. in src/util/translation.h:47 in 81baf61a15 outdated
    42+/**
    43+ * Bilingual translation function.
    44+ */
    45+inline bilingual_str _(const char* psz, bool ignored)
    46+{
    47+    return std::move(bilingual_str{psz, G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(psz) : psz});
    


    practicalswift commented at 3:40 pm on June 25, 2019:
    Same here :-)

    hebasto commented at 4:43 pm on June 25, 2019:
    Fixed.
  16. hebasto force-pushed on Jun 25, 2019
  17. hebasto commented at 4:46 pm on June 25, 2019: member
    Rebased. @practicalswift Thank you for review. Your comments have been addressed. Nothing prevents return value optimization now ;)
  18. hebasto commented at 4:54 pm on June 25, 2019: member

    @ryanofsky

    Using _("") syntax for translated strings is pretty common and well understood, but _("", true) for bilingual strings seems harder to distinguish and figure out. Might worth considering other syntaxes _b(""), bilingual(""), translate("") or even ""_translate with user literal syntax.

    IIUC, this will require appropriate changes for the share/qt/extract_strings_qt.py script, right?

  19. DrahtBot removed the label Needs rebase on Jun 25, 2019
  20. in src/util/translation.h:37 in 1855f54d3c outdated
    32+
    33+/**
    34+ * Translation function.
    35+ * If no translation function is set, simply return the input.
    36+ */
    37+inline std::string _(const char* psz)
    


    MarcoFalke commented at 6:13 pm on June 26, 2019:

    What about this?

    0inline bilingual_str _(const char* psz)
    

    Have you seen my comment here: #16224 (comment)?


    hebasto commented at 7:16 pm on June 26, 2019:

    Have you seen my comment here: #16224 (comment)?

    Sure!

    IIUC, your suggestion implies some kind of type conversion (from bilingual_str to std::string) for arguments of some functions and in assignment statements?


    MarcoFalke commented at 8:54 pm on June 26, 2019:

    If you don’t need the original string, it can be dropped with _().translated, no? I understand that the changes are more disruptive, but it seems clearer than the unused optional argument.

    It could probably be done as a scripted-diff.

  21. DrahtBot added the label Needs rebase on Jun 27, 2019
  22. hebasto force-pushed on Jun 28, 2019
  23. hebasto force-pushed on Jun 28, 2019
  24. DrahtBot removed the label Needs rebase on Jun 28, 2019
  25. hebasto commented at 6:31 pm on June 28, 2019: member

    @MarcoFalke

    Is there even a point in having two different translation functions long term? Shouldn’t all non-gui code use the one that returns a bilingual_str?

    Implemented.

    It could probably be done as a scripted-diff.

    Done.

    Also rebased on top of #16278.

  26. MarcoFalke commented at 7:03 pm on June 28, 2019: member

    ACK 72d3599e5b06fb1799c8b3689e76d7b97b067531

    Not sure about the huge scripted diff, you can probably replace the body with

    0sed -i --regexp-extended 's/\b_\("([^"]+|\\")*"\)/&.translated/g' $(git grep --files-with-matches '\b_(' src)
    
  27. hebasto force-pushed on Jun 29, 2019
  28. hebasto force-pushed on Jun 29, 2019
  29. hebasto commented at 9:01 am on June 29, 2019: member

    @MarcoFalke Thank you for your review.

    Not sure about the huge scripted diff, you can probably replace the body with

    0sed -i --regexp-extended 's/\b_\("([^"]+|\\")*"\)/&.translated/g' $(git grep --files-with-matches '\b_(' src)
    

    Done:

    0sed -i 's/\b_("\([^"]\|\\"\)*")/&.translated/g' $(git grep --files-with-matches '\b_("' src)
    
  30. hebasto commented at 9:04 am on June 29, 2019: member

    GH rearranged this PR commits. The amended commit 54419c82dd025df1b214ac3b99f85d66f3b9b403 became the last in the https://github.com/bitcoin/bitcoin/pull/16224/commits.

    UPDATE: https://help.github.com/en/articles/why-are-my-commits-in-the-wrong-order

    Is this an issue? If so, how may I fix it should I fix the commit order?

  31. promag commented at 2:26 pm on July 5, 2019: member

    Is this an issue? If so, how may I fix it should I fix the commit order? @hebasto no, it’s fine.

  32. promag commented at 2:48 pm on July 5, 2019: member
    Concept ACK, please don’t merge this yet.
  33. in src/init.cpp:756 in e985a077f5 outdated
    744@@ -745,17 +745,17 @@ static void ThreadImport(std::vector<fs::path> vImportFiles)
    745  */
    746 static bool InitSanityCheck()
    747 {
    748-    if(!ECC_InitSanityCheck()) {
    749-        InitError("Elliptic curve cryptography sanity check failure. Aborting.");
    750-        return false;
    751+    if (!ECC_InitSanityCheck()) {
    752+        std::string rare_error_do_not_translate = "Elliptic curve cryptography sanity check failure. Aborting.";
    753+        return InitError(bilingual_str{rare_error_do_not_translate, rare_error_do_not_translate});
    


    promag commented at 3:07 pm on July 5, 2019:

    e985a077f5f6b5e154f2cb4be25a50a45e00e211

    These changes are unnecessary if you keep error InitError(const std::string&) and just do:

    0bool InitError(const std::string& str)
    1{
    2    return InitError(bilingual_str{str, str});
    3}
    

    hebasto commented at 3:35 pm on July 5, 2019:
    The function with signature InitError(const std::string&) has been removed intentionally to prevent emerging of untranslated error messages in the future. All such cases should be implemented in the code explicitly.
  34. in src/ui_interface.cpp:65 in a9641a7ac1 outdated
    61     return false;
    62 }
    63 
    64+bool InitError(const bilingual_str& str)
    65+{
    66+    bilingual_str bs{str.original, str.translated};
    


    promag commented at 3:23 pm on July 5, 2019:

    a9641a7ac12e3eae763faadbf9bfeeb5f14e3717

    Just

    0bilingual_str bs{str};
    

    hebasto commented at 3:39 pm on July 5, 2019:
    Agree. Will be fixed tonight.

    hebasto commented at 8:29 pm on July 5, 2019:
    Done.

    hebasto commented at 7:06 am on July 6, 2019:

    promag commented at 1:26 pm on July 6, 2019:
    iono about that error 😕 somehow it doesn’t use copy constructor.

    hebasto commented at 1:56 pm on July 6, 2019:

    Copy initialization will do:

    0    bilingual_str bs = str;
    
  35. promag commented at 3:25 pm on July 5, 2019: member
    Agree with @ryanofsky, I think original text could be set with QMessageBox::setDetailedText and BitcoinGUI::message could be extended to accept that parameter.
  36. hebasto commented at 3:47 pm on July 5, 2019: member

    @promag Thank you for your review.

    Agree with @ryanofsky, I think original text could be set with QMessageBox::setDetailedText and BitcoinGUI::message could be extended to accept that parameter.

    Do you think the Show Details... button on an error message window is expressive enough for a user? Maybe QMessageBox::informativeText?

    Anyway, could this improvement be implemented with a successive PR?

  37. hebasto force-pushed on Jul 5, 2019
  38. promag commented at 8:47 pm on July 5, 2019: member
    I don’t think so, the idea is to allow access to the original message while not displaying both.
  39. hebasto commented at 8:54 pm on July 5, 2019: member

    @promag

    I don’t think so, the idea is to allow access to the original message while not displaying both.

    In this case “Original message:” prefix seems redundant in the detailed text, right?

  40. promag commented at 1:30 pm on July 6, 2019: member

    In this case “Original message:” prefix seems redundant in the detailed text, right?

    I don’t mind the prefix, actually it can help later if we decide to add more details, like:

    0Original message: This is a bad message in english.
    1Erro code: 123
    2Location: some_file.cpp:line
    
  41. hebasto force-pushed on Jul 6, 2019
  42. hebasto commented at 4:04 pm on July 6, 2019: member

    @promag

    I don’t think so, the idea is to allow access to the original message while not displaying both.

    Implemented.

  43. promag commented at 11:18 pm on July 6, 2019: member
    On macos Screenshot 2019-07-07 at 00 17 31 Screenshot 2019-07-07 at 00 17 34
  44. DrahtBot added the label Needs rebase on Jul 8, 2019
  45. hebasto force-pushed on Jul 9, 2019
  46. hebasto force-pushed on Jul 9, 2019
  47. hebasto commented at 3:55 pm on July 9, 2019: member
    Rebased.
  48. hebasto force-pushed on Jul 9, 2019
  49. MarcoFalke commented at 4:44 pm on July 9, 2019: member
    Could split all the refactoring-only up to (and including) 4e1eda717ed282f7a8ca67329d5a0669b6832ef8 to a separate pull request?
  50. hebasto commented at 6:04 pm on July 9, 2019: member

    @MarcoFalke

    Could split all the refactoring-only up to (and including) 4e1eda7 to a separate pull request?

    Done: #16362

  51. fanquake added this to the milestone 0.19.0 on Jul 10, 2019
  52. hebasto force-pushed on Jul 10, 2019
  53. hebasto commented at 3:15 pm on July 10, 2019: member
    Rebased.
  54. DrahtBot removed the label Needs rebase on Jul 10, 2019
  55. in src/init.cpp:974 in 32cf78af45 outdated
    959@@ -956,7 +960,7 @@ bool AppInitParameterInteraction()
    960 
    961     // Warn if unrecognized section name are present in the config file.
    962     for (const auto& section : gArgs.GetUnrecognizedSections()) {
    963-        InitWarning(strprintf("%s:%i " + _("Section [%s] is not recognized."), section.m_file, section.m_line, section.m_name));
    964+        InitWarning(strprintf("%s:%i " + _("Section [%s] is not recognized.").translated, section.m_file, section.m_line, section.m_name));
    


    ryanofsky commented at 7:38 pm on July 15, 2019:
    I think it’d be nice if InitWarning took a bilingual string. It would make InitWarning more consistent with InitError, and give us the ability to easily log untranslated warnings. But this could be implemented in a separate PR, since it would probably complicate this one.

    hebasto commented at 6:27 pm on July 18, 2019:
    You are reading my mind ;) InitWarning has been left for a separate PR.
  56. in src/init.cpp:1736 in 32cf78af45 outdated
    1625@@ -1622,9 +1626,10 @@ bool AppInitMain(InitInterfaces& interfaces)
    1626         if (!fLoaded && !ShutdownRequested()) {
    1627             // first suggest a reindex
    1628             if (!fReset) {
    1629+                bilingual_str bs = _("Do you want to rebuild the block database now?");
    1630                 bool fRet = uiInterface.ThreadSafeQuestion(
    1631-                    strLoadError + ".\n\n" + _("Do you want to rebuild the block database now?"),
    1632-                    strLoadError + ".\nPlease restart with -reindex or -reindex-chainstate to recover.",
    1633+                    bilingual_str{strLoadError.original + "\n\n" + bs.original, strLoadError.translated + "\n\n" + bs.translated},
    1634+                    strLoadError.original + ".\nPlease restart with -reindex or -reindex-chainstate to recover.",
    


    ryanofsky commented at 7:48 pm on July 15, 2019:
    I realize you are not changing behavior, but is it intentional that only the first part of the translated string is actually translated, and the second half is not? I’m not sure this makes very much sense, so it might be helpful to have a TODO comment for cleaning this up later.

    hebasto commented at 8:01 pm on July 18, 2019:

    … is it intentional that only the first part of the translated string is actually translated, and the second half is not?

    Yes, it is. The second half is a non-interactive message which is printed to the debug.log and std::cerr: https://github.com/bitcoin/bitcoin/blob/18c3521c2c72cee05094e49ec97c4ef8facdd1d8/src/noui.cpp#L47-L50

  57. in src/validation.cpp:1660 in 32cf78af45 outdated
    1382@@ -1382,7 +1383,7 @@ static bool AbortNode(const std::string& strMessage, const std::string& userMess
    1383     SetMiscWarning(strMessage);
    1384     LogPrintf("*** %s\n", strMessage);
    1385     if (!userMessage.empty()) {
    1386-        uiInterface.ThreadSafeMessageBox(userMessage, "", CClientUIInterface::MSG_ERROR | prefix);
    1387+        uiInterface.ThreadSafeMessageBox(bilingual_str{userMessage, userMessage}, "", CClientUIInterface::MSG_ERROR | prefix);
    


    ryanofsky commented at 7:52 pm on July 15, 2019:
    It would be good to add some comment here explaining this. If it’s intentional never to translate the abortnode message it’d be good to write that. Or if it would be better to fix this later, there could be a TODO comment here saying AbortNode should take a bilingual string, or whatever the followup would be.

    hebasto commented at 9:04 pm on July 18, 2019:
    Some TODO comments have been added.
  58. in src/init.cpp:1071 in 32cf78af45 outdated
    1057@@ -1054,7 +1058,7 @@ bool AppInitParameterInteraction()
    1058     if (gArgs.IsArgSet("-minimumchainwork")) {
    1059         const std::string minChainWorkStr = gArgs.GetArg("-minimumchainwork", "");
    1060         if (!IsHexNumber(minChainWorkStr)) {
    1061-            return InitError(strprintf("Invalid non-hex (%s) minimum chain work value specified", minChainWorkStr));
    1062+            return InitError(strprintf(_("Invalid non-hex (%s) minimum chain work value specified"), minChainWorkStr));
    


    ryanofsky commented at 8:04 pm on July 15, 2019:

    This change as a whole seems to be adding a lot of new translated strings. But I wonder if it would be better to be more conservative and not add new translations here, instead saving that part for a followup PR and selectively leaving less common errors untranslated. One way to do this might be with a DoNotTranslate function

    0bilingual_str DoNotTranslate(std::string original)
    1{
    2    return {original, original};
    3}
    

    hebasto commented at 9:04 pm on July 18, 2019:
    DoNotTranslate() has been implemented.

    Sjors commented at 2:32 pm on November 20, 2019:
    Nit: don’t forget to actually use Untranslated here.
  59. ryanofsky approved
  60. ryanofsky commented at 8:26 pm on July 15, 2019: member

    utACK 32cf78af45c662617eaf91bb3bb07e27151a3a95. I skimmed all the commits, but found it most easy just to review the final consolidated diff, because some of intermediate commits update the same lines more than once.

    This change seems acceptable in its current state, but my preference would be to have a new refactoring-only PR that introduces bilingual string instances without changing behavior. The refactoring-only PR could:

    1. Introduce the bilingual_str class
    2. Change _ to return bilingual strings, and change MessageBox and InitError (and maybe AbortNode and InitWarning) to accept bilingual strings
    3. Add DoNotTranslate (see below) calls wherever needed to maintain existing behavior and avoid breaking compilation.

    After that PR, this PR altering the GUI and adding new translations could be smaller and easier to understand.

  61. DrahtBot added the label Needs rebase on Jul 16, 2019
  62. hebasto force-pushed on Jul 18, 2019
  63. hebasto commented at 4:41 pm on July 18, 2019: member
    Rebased.
  64. DrahtBot removed the label Needs rebase on Jul 18, 2019
  65. hebasto commented at 6:19 pm on July 18, 2019: member

    @ryanofsky Thank you for your review.

    The refactoring-only PR could: … 2. Change _ to return bilingual strings, and change MessageBox and InitError (and maybe AbortNode and InitWarning) to accept bilingual strings

    Such commit could be very complicated. Currently, this PR introduces bilingual abilities to the related functions (ThreadSafeMessageBox, InitError) commit by commit.

    Also this PR has been already split as @MarcoFalke suggested.

  66. hebasto force-pushed on Jul 18, 2019
  67. hebasto commented at 9:03 pm on July 18, 2019: member
    @ryanofsky Added TODO comments and the DoNotTranslate() function.
  68. hebasto force-pushed on Jul 23, 2019
  69. hebasto commented at 5:29 pm on July 23, 2019: member
    Rebased on top of #16355.
  70. hebasto force-pushed on Jul 23, 2019
  71. DrahtBot added the label Needs rebase on Jul 24, 2019
  72. hebasto commented at 12:31 pm on July 24, 2019: member

    @promag

    … please don’t merge this yet.

    Could we move on? Would you mind looking into #16362 too?

  73. hebasto force-pushed on Jul 24, 2019
  74. hebasto commented at 1:59 pm on July 24, 2019: member
    Rebased.
  75. fanquake removed the label Needs rebase on Jul 24, 2019
  76. hebasto force-pushed on Jul 24, 2019
  77. hebasto commented at 3:30 pm on July 24, 2019: member

    @MarcoFalke Rebasing on top of #16366 caused a bilingual representation of some messages: diff.

    I suppose some of them should be untranslated intentionally. If so, let me know to make changes, please?

  78. ryanofsky commented at 4:48 pm on July 24, 2019: member

    I suppose some of them should be untranslated intentionally. If so, let me know to make changes, please?

    There could be other opinions, but I’d recommend replacing _ with DoNotTranslate here to avoid refactoring and changing behavior in the same PR. (Sorry for sounding like a broken record on mixing refactoring and behavior changes, but I think if we want to add new translations, this should happen in a small separate standalone PR adding new translations, not mixed in with everything else here).

  79. MarcoFalke referenced this in commit d960d5ca99 on Jul 24, 2019
  80. in src/bitcoind.cpp:22 in af608a0cf0 outdated
    18@@ -19,6 +19,9 @@
    19 #include <util/strencodings.h>
    20 #include <util/system.h>
    21 #include <util/threadnames.h>
    22+#include <util/translation.h>
    


    MarcoFalke commented at 6:15 pm on July 24, 2019:
    translations are only for the gui, this should never be added here

    ryanofsky commented at 6:47 pm on July 24, 2019:

    translations are only for the gui, this should never be added here

    I haven’t looked at the context for this comment yet, but in general translations are desirable when writing error messages to stderr, right? My understanding is we only want to avoid translating very technical messages, rare messages, and messages sent to debug.log.


    hebasto commented at 6:42 pm on July 26, 2019:

    translations are only for the gui, this should never be added here

    That is correct. But without #include <util/translation.h> the linker fires an error for the last but one commit:

    0  CXXLD    bitcoind
    1libbitcoin_server.a(libbitcoin_server_a-init.o): In function `_(char const*)':
    2/home/hebasto/github/bitcoin/src/./util/translation.h:39: undefined reference to `G_TRANSLATION_FUN[abi:cxx11]'
    
  81. in src/qt/bitcoin.cpp:458 in af608a0cf0 outdated
    458@@ -459,7 +459,7 @@ int GuiMain(int argc, char* argv[])
    459     SetupUIArgs();
    460     std::string error;
    461     if (!node->parseParameters(argc, argv, error)) {
    462-        node->initError(strprintf("Error parsing command line arguments: %s\n", error));
    463+        node->initError(strprintf(_("Error parsing command line arguments: %s\n"), error));
    464         // Create a message box, because the gui has neither been created nor has subscribed to core signals
    465         QMessageBox::critical(nullptr, PACKAGE_NAME,
    466             // message can not be translated because translations have not been initialized
    


    MarcoFalke commented at 6:16 pm on July 24, 2019:
    :eyes: Please remove the _( three lines above.

    hebasto commented at 7:08 pm on July 26, 2019:
    Correct. Fixed.
  82. in src/qt/bitcoin.cpp:524 in af608a0cf0 outdated
    520@@ -521,7 +521,7 @@ int GuiMain(int argc, char* argv[])
    521     try {
    522         node->selectParams(gArgs.GetChainName());
    523     } catch(std::exception &e) {
    524-        node->initError(strprintf("%s\n", e.what()));
    525+        node->initError(strprintf(_("%s\n"), e.what()));
    


    MarcoFalke commented at 6:17 pm on July 24, 2019:
    Here and the two other instances: The The gui is not yet subscribed to core signals and can’t pick up the translation, which is why it is manually translated below.

    hebasto commented at 7:08 pm on July 26, 2019:
    Correct. Fixed.
  83. hebasto force-pushed on Jul 26, 2019
  84. hebasto commented at 7:07 pm on July 26, 2019: member

    The latest push:

    • rebased on top of #16362
    • fixed rebasing on top of #16366: no more translations in bitcoind and Node::initError()
    • forward declaration of struct bilingual_str
  85. sidhujag referenced this in commit b4919222bc on Jul 29, 2019
  86. DrahtBot added the label Needs rebase on Aug 14, 2019
  87. hebasto force-pushed on Aug 15, 2019
  88. hebasto force-pushed on Aug 15, 2019
  89. hebasto commented at 6:36 pm on August 15, 2019: member
    Rebased on top of 367b023ae444e7d9641c4a3469f9154461e50e68.
  90. DrahtBot removed the label Needs rebase on Aug 15, 2019
  91. DrahtBot added the label Needs rebase on Aug 16, 2019
  92. hebasto force-pushed on Aug 17, 2019
  93. hebasto commented at 8:01 am on August 17, 2019: member
    Rebased after #16620 has been merged.
  94. hebasto force-pushed on Aug 17, 2019
  95. DrahtBot removed the label Needs rebase on Aug 17, 2019
  96. DrahtBot added the label Needs rebase on Aug 19, 2019
  97. hebasto force-pushed on Aug 19, 2019
  98. DrahtBot removed the label Needs rebase on Aug 19, 2019
  99. hebasto commented at 5:07 am on August 20, 2019: member
    Rebased.
  100. MarcoFalke removed this from the milestone 0.19.0 on Aug 28, 2019
  101. MarcoFalke added this to the milestone 0.20.0 on Aug 28, 2019
  102. MarcoFalke commented at 7:32 pm on August 28, 2019: member
    Translation string freeze is in three days, which seems too risky for this change. Assigned “0.20.0” milestone.
  103. DrahtBot added the label Needs rebase on Sep 3, 2019
  104. hebasto force-pushed on Sep 7, 2019
  105. DrahtBot removed the label Needs rebase on Sep 7, 2019
  106. hebasto force-pushed on Sep 7, 2019
  107. hebasto commented at 6:44 pm on September 7, 2019: member
    Rebased.
  108. DrahtBot added the label Needs rebase on Sep 19, 2019
  109. laanwj added the label Feature on Sep 30, 2019
  110. laanwj commented at 9:34 am on October 4, 2019: member
    Code review ACK 322ffab8771a2a968246deb32750e1b6b1b930b4
  111. hebasto force-pushed on Oct 5, 2019
  112. hebasto commented at 10:10 am on October 5, 2019: member
    Rebased after #16743 has been merged.
  113. DrahtBot removed the label Needs rebase on Oct 5, 2019
  114. hebasto commented at 11:29 am on October 5, 2019: member

    @MarcoFalke @ryanofsky @practicalswift @promag

    Would you mind re-reviewing this PR?

  115. in src/init.cpp:1623 in 7886733e16 outdated
    1618@@ -1619,7 +1619,8 @@ bool AppInitMain(InitInterfaces& interfaces)
    1619             // first suggest a reindex
    1620             if (!fReset) {
    1621                 bool fRet = uiInterface.ThreadSafeQuestion(
    1622-                    strLoadError + ".\n\n" + _("Do you want to rebuild the block database now?").translated,
    1623+                    strprintf(_("%s.\n\nDo you want to rebuild the block database now?"), strLoadError),
    1624+                    /*strLoadError + ".\n\n" + _("Do you want to rebuild the block database now?").translated,*/
    


    MarcoFalke commented at 5:35 pm on October 7, 2019:
    :eyes:

    hebasto commented at 6:06 pm on October 7, 2019:
    It seems this line is outdated already ;)

    hebasto commented at 6:26 pm on October 7, 2019:
    Sorry for a mess. Fixed in the latest push 24cae76e6476f467095327ca9970ef1a784c629b.
  116. in src/init.cpp:1622 in 7886733e16 outdated
    1618@@ -1619,7 +1619,8 @@ bool AppInitMain(InitInterfaces& interfaces)
    1619             // first suggest a reindex
    1620             if (!fReset) {
    1621                 bool fRet = uiInterface.ThreadSafeQuestion(
    1622-                    strLoadError + ".\n\n" + _("Do you want to rebuild the block database now?").translated,
    1623+                    strprintf(_("%s.\n\nDo you want to rebuild the block database now?"), strLoadError),
    


    MarcoFalke commented at 5:37 pm on October 7, 2019:
    Not sure if we want to translate %s.\n\n, maybe add an operator+ or operator<< to bilingual_str, so that either + or strprintf can be used.

    hebasto commented at 7:01 pm on October 7, 2019:

    This line is outdated due to the following commits ;)

    … maybe add an operator+ or operator<< to bilingual_str, so that either + or strprintf can be used.

    Agree. Good idea for the following PRs (as this PR does not touch bilingual_str itself).


    hebasto commented at 2:10 am on May 5, 2020:
  117. in src/qt/bitcoingui.cpp:1383 in 7886733e16 outdated
    1362     style &= ~CClientUIInterface::SECURE;
    1363     bool ret = false;
    1364+
    1365+    QString detailed_message;
    1366+    if (message.original != message.translated) {
    1367+        detailed_message = QObject::tr("Original message:") + "\n" + QString::fromStdString(message.original);
    


    MarcoFalke commented at 5:38 pm on October 7, 2019:
    what is the point of translations again, if we show the original message anyway?

    hebasto commented at 6:00 pm on October 7, 2019:
    This translated title, QObject::tr("Original message:"), is intended for non-english interface. The message itself is not translated, obviously. That was an initial idea, but I’m open for changes ;)

    MarcoFalke commented at 6:06 pm on October 7, 2019:
    yes, what is the point of showing the translation and the original message. If the user understood the original message (in English), what is the point of showing the translation?

    hebasto commented at 6:14 pm on October 7, 2019:
    Translation - for a user. Original message - for googling and referencing.

    MarcoFalke commented at 6:24 pm on October 7, 2019:
    I see. I guess fine with me, but at least the code could mention that.

    hebasto commented at 6:28 pm on October 7, 2019:
    Add some comments?

    MarcoFalke commented at 6:31 pm on October 7, 2019:
    jup

    hebasto commented at 6:55 pm on October 7, 2019:
    Done.
  118. MarcoFalke commented at 5:39 pm on October 7, 2019: member
    Concept ACK. One question inline.
  119. in src/util/translation.h:42 in aa21c807af outdated
    38@@ -39,4 +39,9 @@ inline static bilingual_str _(const char* psz)
    39     return bilingual_str{psz, G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(psz) : psz};
    40 }
    41 
    42+inline static bilingual_str DoNotTranslate(std::string original)
    


    MarcoFalke commented at 6:24 pm on October 7, 2019:

    in commit aa21c807af55f94867b11bab5e2e9a8160a3fc9d

    style-question: Could this be called Untranslated, so that arbitrary strings can be passed in (even string that are impossible to translate, such as error strings returned from third party libraries).


    hebasto commented at 6:57 pm on October 7, 2019:
    Done.
  120. hebasto force-pushed on Oct 7, 2019
  121. hebasto force-pushed on Oct 7, 2019
  122. hebasto commented at 7:03 pm on October 7, 2019: member
    @MarcoFalke Thank you for your review. Your comments have been addressed.
  123. jonasschnelli commented at 7:37 am on October 10, 2019: contributor
    Tested and looks good. Would it make sense to also make the strings in qt/bitcoin.cpp translate the new way? Things like "Specified data directory \"%s\" does not exist" or "Error reading configuration file: %s\n"
  124. hebasto commented at 8:44 am on October 10, 2019: member

    @jonasschnelli

    Would it make sense to also make the strings in qt/bitcoin.cpp translate the new way? Things like "Specified data directory \"%s\" does not exist" or "Error reading configuration file: %s\n"

    These strings are not in qt/bitcoin.cpp but in bitcoind.cpp ;) More details in #16366 by @MarcoFalke

  125. DrahtBot added the label Needs rebase on Oct 15, 2019
  126. hebasto force-pushed on Oct 16, 2019
  127. hebasto commented at 4:27 pm on October 16, 2019: member
    Rebased after #17138 has been merged.
  128. DrahtBot removed the label Needs rebase on Oct 16, 2019
  129. DrahtBot added the label Needs rebase on Oct 21, 2019
  130. hebasto force-pushed on Oct 26, 2019
  131. hebasto commented at 6:04 pm on October 26, 2019: member
    Rebased after #17070 has been merged.
  132. DrahtBot removed the label Needs rebase on Oct 26, 2019
  133. DrahtBot added the label Needs rebase on Oct 28, 2019
  134. hebasto force-pushed on Oct 29, 2019
  135. hebasto commented at 6:56 am on October 29, 2019: member
    Rebased after #17279 has been merged.
  136. DrahtBot removed the label Needs rebase on Oct 29, 2019
  137. DrahtBot added the label Needs rebase on Oct 29, 2019
  138. hebasto force-pushed on Oct 29, 2019
  139. hebasto commented at 1:39 pm on October 29, 2019: member
    Rebased after #17260 has been merged.
  140. DrahtBot removed the label Needs rebase on Oct 29, 2019
  141. DrahtBot added the label Needs rebase on Oct 30, 2019
  142. hebasto force-pushed on Oct 30, 2019
  143. hebasto commented at 6:56 pm on October 30, 2019: member
    Rebased after #16839 has been merged.
  144. DrahtBot removed the label Needs rebase on Oct 30, 2019
  145. DrahtBot added the label Needs rebase on Nov 4, 2019
  146. hebasto force-pushed on Nov 4, 2019
  147. hebasto commented at 4:39 pm on November 4, 2019: member
    Rebased after #17304 has been merged.
  148. DrahtBot removed the label Needs rebase on Nov 4, 2019
  149. DrahtBot added the label Needs rebase on Nov 5, 2019
  150. hebasto force-pushed on Nov 6, 2019
  151. hebasto commented at 3:13 pm on November 6, 2019: member
    Rebased after #16540 has been merged.
  152. DrahtBot removed the label Needs rebase on Nov 6, 2019
  153. in src/httpserver.cpp:179 in ffed46515d outdated
    175@@ -175,7 +176,7 @@ static bool InitHTTPAllowList()
    176         LookupSubNet(strAllow.c_str(), subnet);
    177         if (!subnet.IsValid()) {
    178             uiInterface.ThreadSafeMessageBox(
    179-                strprintf("Invalid -rpcallowip subnet specification: %s. Valid are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24).", strAllow),
    180+                strprintf(_("Invalid -rpcallowip subnet specification: %s. Valid are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24)."), strAllow),
    


    Sjors commented at 2:26 pm on November 20, 2019:
    nit: make this NoTranslate. All relevant documentation is in English anyway.

    laanwj commented at 2:54 pm on November 20, 2019:
    Agree. This is a terrible message to translate.

    hebasto commented at 6:21 pm on November 21, 2019:
    Done.

    MarcoFalke commented at 6:57 pm on May 4, 2020:
    This has not yet been addressed

    MarcoFalke commented at 6:58 pm on May 4, 2020:
    I’d say we should leave all new translations for a later pull. You can blindly mark everything Untranslated for now

    hebasto commented at 2:09 am on May 5, 2020:
  154. Sjors commented at 2:36 pm on November 20, 2019: member

    The end result ffed46515d556c0dbc8535548d0a485a62306106 looks good, lightly tested on macOS.

    But the individual commits are too confusing atm, they would be easier to review if you:

    1. the first commit 05b20f6 as is
    2. introduce Untranslated earlier, with just {return original}
    3. the next commit moves .translated to ThreadSafeMessageBox
    4. a commit where you introduce newly translated strings _(
    5. a commit that drops the redundant return false from calls to InitError (although otherwise unrelated)
    6. (maybe a few more things, to keep 7 focussed)
    7. switch to bilingual_str

    I don’t mind if this PR adds or removes a few translations, if that makes things easier. I also suspect there’s more places where we can add Untranslated, but this could be done in a followup.

  155. laanwj commented at 2:54 pm on November 20, 2019: member

    ACK ffed46515d556c0dbc8535548d0a485a62306106

    I like that this has a by-effect of introducing a type for GUI-facing messages versus internal ones. An explicit Untranslated instead of having bilingual_str implicitly constructed is a good idea. I also like that you put the translation-related stuff in a separate header.

  156. DrahtBot added the label Needs rebase on Nov 20, 2019
  157. hebasto force-pushed on Nov 21, 2019
  158. hebasto commented at 6:18 pm on November 21, 2019: member

    Rebased after #17444 has been merged.

    Also, @Sjors’s comment has been addressed.

  159. hebasto commented at 6:29 pm on November 21, 2019: member

    @Sjors

    But the individual commits are too confusing atm, they would be easier to review if you …

    Sorry, but I’d prefer to leave the commit order as is for the following reasons: (a) it helps me to keep this PR rebased; (b) other reviewers have ACKed already. The intrinsic logic of each commit is: a functional change plus other changes to compile successfully.

    I also suspect there’s more places where we can add Untranslated, but this could be done in a followup.

    Totally agree with you.

  160. DrahtBot removed the label Needs rebase on Nov 21, 2019
  161. DrahtBot added the label Needs rebase on Jan 8, 2020
  162. hebasto force-pushed on Jan 8, 2020
  163. hebasto commented at 5:19 pm on January 8, 2020: member
    Rebased after #16963 has been merged.
  164. DrahtBot removed the label Needs rebase on Jan 8, 2020
  165. DrahtBot added the label Needs rebase on Jan 17, 2020
  166. hebasto force-pushed on Jan 18, 2020
  167. DrahtBot removed the label Needs rebase on Jan 18, 2020
  168. hebasto commented at 2:49 pm on January 18, 2020: member
    Rebased after #17943 has been merged.
  169. DrahtBot added the label Needs rebase on Jan 22, 2020
  170. Sjors commented at 5:19 pm on January 22, 2020: member
    Needs a rebase now that #17943 was reverted.
  171. hebasto force-pushed on Jan 23, 2020
  172. hebasto commented at 6:08 pm on January 23, 2020: member
    Rebased after #17754 and #17965 have been merged.
  173. DrahtBot removed the label Needs rebase on Jan 23, 2020
  174. DrahtBot added the label Needs rebase on Jan 30, 2020
  175. hebasto force-pushed on Jan 30, 2020
  176. hebasto commented at 5:24 pm on January 30, 2020: member
    Rebased after #16702 and #17261 have been merged.
  177. DrahtBot removed the label Needs rebase on Jan 30, 2020
  178. DrahtBot added the label Needs rebase on Mar 5, 2020
  179. hebasto force-pushed on Mar 5, 2020
  180. hebasto commented at 7:49 pm on March 5, 2020: member
    Rebased due to #17812.
  181. DrahtBot removed the label Needs rebase on Mar 5, 2020
  182. hebasto force-pushed on Mar 5, 2020
  183. hebasto commented at 8:52 pm on March 5, 2020: member
    Rebased due to #17812. Now fixed.
  184. emilengler commented at 5:10 pm on March 13, 2020: contributor

    This is probably a low level error but running HEAD on german with --datadir=/tmp/no results in grafik

    I miss the English message there

  185. hebasto commented at 6:51 pm on March 13, 2020: member

    @emilengler

    This is probably a low level error but running HEAD on german with --datadir=/tmp/no results in grafik

    I miss the English message there

    This is due to the following line: https://github.com/bitcoin/bitcoin/blob/d600529cf44cde00212028f91c9ded5c4550d9ff/src/interfaces/node.cpp#L56

    And I think this made intentionally after merging #16366. See some comments:

  186. laanwj removed this from the milestone 0.20.0 on Mar 25, 2020
  187. laanwj added this to the milestone 0.21.0 on Mar 25, 2020
  188. DrahtBot added the label Needs rebase on Apr 2, 2020
  189. hebasto force-pushed on Apr 11, 2020
  190. hebasto commented at 3:51 pm on April 11, 2020: member
    Rebased d600529cf44cde00212028f91c9ded5c4550d9ff -> 4bcdc3f4d9a5386b69142ca72ad500c64f9eab24 due to the conflict with #17737.
  191. DrahtBot removed the label Needs rebase on Apr 11, 2020
  192. Sjors commented at 11:45 am on April 12, 2020: member
    tACK 4bcdc3f
  193. DrahtBot added the label Needs rebase on Apr 14, 2020
  194. hebasto force-pushed on Apr 16, 2020
  195. hebasto commented at 9:24 pm on April 16, 2020: member
    Rebased 4bcdc3f4d9a5386b69142ca72ad500c64f9eab24 -> 5ca0c77bae59f33dc122305d5f68077a70153af7 due to the conflict with #17954.
  196. hebasto commented at 9:35 pm on April 16, 2020: member

    @ryanofsky @MarcoFalke @practicalswift @promag @laanwj @jonasschnelli @Sjors @emilengler

    Mind re-reviewing this PR to give it some–I hope final–(re)ACKs :)

  197. DrahtBot removed the label Needs rebase on Apr 16, 2020
  198. DrahtBot added the label Needs rebase on Apr 19, 2020
  199. in src/wallet/load.cpp:56 in 5ca0c77bae outdated
    48@@ -49,14 +49,15 @@ bool VerifyWallets(interfaces::Chain& chain, const std::vector<std::string>& wal
    49         WalletLocation location(wallet_file);
    50 
    51         if (!wallet_paths.insert(location.GetPath()).second) {
    52-            chain.initError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified.").translated, wallet_file));
    53+            chain.initError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified."), wallet_file));
    54             return false;
    55         }
    56 
    57+        // TODO: error_string and warning_string should be bilingual strings.
    


    MarcoFalke commented at 1:51 pm on April 19, 2020:
    I have a slight preference to get #18699 in first, which fixes this TODO

    hebasto commented at 2:02 pm on April 19, 2020:
    Agree.
  200. MarcoFalke approved
  201. MarcoFalke commented at 1:53 pm on April 19, 2020: member
    Concept ACK
  202. Sjors commented at 2:04 pm on April 19, 2020: member
    Looks like it needs another rebase.
  203. hebasto force-pushed on Apr 20, 2020
  204. hebasto commented at 4:05 pm on April 20, 2020: member
    Rebased 5ca0c77bae59f33dc122305d5f68077a70153af7 -> cb041d501ac478a39ef73df86c3bce3b084cae18 due to the conflict with #15761.
  205. DrahtBot removed the label Needs rebase on Apr 20, 2020
  206. Sjors commented at 4:47 pm on April 23, 2020: member

    re-tACK cb041d5

    Can you update the PR description with an example that actually works? E.g. bitcoin-qt -lang=nl -uacomment="\\"

  207. hebasto commented at 2:16 pm on April 24, 2020: member

    @Sjors

    re-tACK cb041d5

    Can you update the PR description with an example that actually works? E.g. bitcoin-qt -lang=nl -uacomment="\\"

    Thank you! Updated.

  208. DrahtBot added the label Needs rebase on Apr 27, 2020
  209. hebasto force-pushed on Apr 27, 2020
  210. hebasto commented at 3:46 am on April 27, 2020: member
    Rebased cb041d501ac478a39ef73df86c3bce3b084cae18 -> https://github.com/bitcoin/bitcoin/commit/0ea49f4c28ca9dd7cf5ba81c66041d2c2f7b2e92 due to the conflict with #16528.
  211. DrahtBot removed the label Needs rebase on Apr 27, 2020
  212. Sjors commented at 7:21 pm on April 27, 2020: member
    utACK 0ea49f4c28ca9dd7cf5ba81c66041d2c2f7b2e92 rebase
  213. DrahtBot added the label Needs rebase on May 1, 2020
  214. hebasto force-pushed on May 1, 2020
  215. hebasto commented at 7:59 pm on May 1, 2020: member
    Rebased 0ea49f4c28ca9dd7cf5ba81c66041d2c2f7b2e92 -> 1078fad9c517059d3752d01cdca189994fac0d4b due to the conflicts with #16426 and #18727.
  216. DrahtBot removed the label Needs rebase on May 1, 2020
  217. Sjors commented at 10:17 am on May 4, 2020: member
    Travis didn’t run. Make sure your account didn’t accidentally get flagged.
  218. hebasto commented at 10:20 am on May 4, 2020: member

    Travis didn’t run. Make sure your account didn’t accidentally get flagged.

    Verified. It seems ok.

  219. Sjors commented at 10:43 am on May 4, 2020: member
    Ok, maybe just try another rebase?
  220. hebasto force-pushed on May 4, 2020
  221. hebasto commented at 10:47 am on May 4, 2020: member

    Ok, maybe just try another rebase?

    Rebased 1078fad9c517059d3752d01cdca189994fac0d4b -> 101ff19cdc0743c48ec76d9a39855be632de7956.

  222. MarcoFalke commented at 2:41 pm on May 4, 2020: member
    Needs rebase, but diff should be slightly smaller because of the merge of #18699
  223. DrahtBot added the label Needs rebase on May 4, 2020
  224. hebasto force-pushed on May 4, 2020
  225. hebasto commented at 4:40 pm on May 4, 2020: member
    Rebased 101ff19cdc0743c48ec76d9a39855be632de7956 -> 5ff042d4955ab0f8a0dd8ed2522cf0da17f5b00d due to the conflict with #18699.
  226. DrahtBot removed the label Needs rebase on May 4, 2020
  227. Sjors commented at 6:43 pm on May 4, 2020: member
    re-tACK 5ff042d
  228. gui: Add detailed text to BitcoinGUI::message 23b9fa2e5e
  229. Make ThreadSafe{MessageBox|Question} bilingual 917ca93553
  230. Make InitError bilingual 7e923d47ba
  231. doc: Do not translate technical or extremely rare errors e95e658b8e
  232. util: Cleanup translation.h 18bd83b1fe
  233. hebasto force-pushed on May 5, 2020
  234. hebasto commented at 2:08 am on May 5, 2020: member

    Updated 5ff042d4955ab0f8a0dd8ed2522cf0da17f5b00d -> 18bd83b1fee2eb47ed4ad05c91f2d6cc311fc9ad:

    I’d say we should leave all new translations for a later pull. You can blindly mark everything Untranslated for now

  235. Sjors commented at 3:19 pm on May 8, 2020: member
    re-tACK 18bd83b1fee2eb47ed4ad05c91f2d6cc311fc9ad
  236. MarcoFalke commented at 4:00 pm on May 8, 2020: member

    ACK 18bd83b1fee2eb47ed4ad05c91f2d6cc311fc9ad 🐦

    Thanks for finally making the debug log of international users readable. I found it painful to translate the debug log in bug reports back to English.

    I checked that no new translations are added, but did not run the GUI.

    Signature:

     0-----BEGIN PGP SIGNED MESSAGE-----
     1Hash: SHA512
     2
     3ACK 18bd83b1fee2eb47ed4ad05c91f2d6cc311fc9ad 🐦
     4
     5Thanks for finally making the debug log of international users readable. I
     6found it painful to translate the debug log in bug reports back to English.
     7
     8I checked that no new translations are added, but did not run the GUI.
     9-----BEGIN PGP SIGNATURE-----
    10
    11iQGzBAEBCgAdFiEE+rVPoUahrI9sLGYTzit1aX5ppUgFAlwqrYAACgkQzit1aX5p
    12pUiI8wwAnm6ab4DxH44gY+MYdYKbbQe+Qayc2wuMw1wvpNfYdJDZ2xK2N5ZWCIoc
    13grA4eVeluZggMf30d8pKP+HFofQVugYFyTB/lG/9PnSl//WAgezClqkxnW1YE0pm
    14xfVfKC1f7RBGswfcm+Rrq7m0LfzWEjoGgCCbcjQm86kAP+Mt8phmjQRNc43FycFJ
    15dLO7DFZMiqjSIhLi4bbSqiynUXuTY2tMbjv4e23gHWKFcnvndBE3QjfirsRlcp4f
    16Ly5lvEFCABOdnMQ0K8/9bSn2XqHwWyZxXJ+Yj1twkCchcjmcnHTfAmTJXs0Vahqd
    17vapzAw2X0dk6x8JWZcu+am7rFSzZu+tAHWnDC1DgjgsnDZMMTI4rjPbtBP9X01ka
    18C6SjRDt91NZdm2x+jXrHKEhmQdQ3FDVU2hGb6g3cjxe/RJAyxZ3W5ZTTYqvQXOjh
    19992J7pQOtQjQHovjFWyQ4WSxlTXPd7PFhZ1NyOJE2UCJD8rdUtav2nxzbh0q3SX2
    20Seu4nsii
    21=xXpH
    22-----END PGP SIGNATURE-----
    

    Timestamp of file with hash 1fd623baf008aff28a965813df642d958b9fc77a22a30025ff01d55db57e248e -

  237. MarcoFalke merged this on May 8, 2020
  238. MarcoFalke closed this on May 8, 2020

  239. hebasto deleted the branch on May 8, 2020
  240. domob1812 referenced this in commit e2470922f5 on May 11, 2020
  241. MarcoFalke referenced this in commit e45fb7e0d2 on May 12, 2020
  242. sidhujag referenced this in commit fc9f727a08 on May 12, 2020
  243. sidhujag referenced this in commit f21e1a5217 on May 12, 2020
  244. MarcoFalke referenced this in commit 4b30c41b4e on Jun 16, 2020
  245. sidhujag referenced this in commit f3dc64f18d on Jul 7, 2020
  246. monstrobishi referenced this in commit b197d184be on Sep 6, 2020
  247. jasonbcox referenced this in commit 4ca53cf009 on Oct 20, 2020
  248. jasonbcox referenced this in commit 44c87af6b5 on Oct 20, 2020
  249. jasonbcox referenced this in commit 5b1bc64e8e on Oct 20, 2020
  250. deadalnix referenced this in commit 8ad96feb52 on Oct 20, 2020
  251. jasonbcox referenced this in commit 626a4fc628 on Oct 20, 2020
  252. PastaPastaPasta referenced this in commit f83dd4f290 on Apr 5, 2022
  253. PastaPastaPasta referenced this in commit 7a6f894184 on Apr 5, 2022
  254. kittywhiskers referenced this in commit adea612e84 on Apr 7, 2022
  255. kittywhiskers referenced this in commit 1b3f3a0176 on Apr 7, 2022
  256. PastaPastaPasta referenced this in commit af00598c9a on Apr 7, 2022
  257. DrahtBot locked this on Aug 16, 2022

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-18 06:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me