From f1ca0a8fc3c865f9529aba999259e1539c16133c Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Thu, 16 May 2024 20:25:46 +0200 Subject: [PATCH 01/34] Fix for clang --- logdoctor/modules/craplog/modules/formats/parse.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/logdoctor/modules/craplog/modules/formats/parse.cpp b/logdoctor/modules/craplog/modules/formats/parse.cpp index 1f01e3b..24d6ece 100644 --- a/logdoctor/modules/craplog/modules/formats/parse.cpp +++ b/logdoctor/modules/craplog/modules/formats/parse.cpp @@ -7,6 +7,7 @@ #include "utilities/strings.h" #include +#include using simple_fields_umap_t = std::unordered_map; -- GitLab From b1f800bc15e4225083946ccfdba8c44e332c60dd Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Thu, 16 May 2024 20:26:18 +0200 Subject: [PATCH 02/34] Fix for BSD --- logdoctor/modules/crapview/datatypes/warning_stats.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logdoctor/modules/crapview/datatypes/warning_stats.cpp b/logdoctor/modules/crapview/datatypes/warning_stats.cpp index 56abff4..84f89e6 100644 --- a/logdoctor/modules/crapview/datatypes/warning_stats.cpp +++ b/logdoctor/modules/crapview/datatypes/warning_stats.cpp @@ -11,7 +11,7 @@ #include "utilities/strings.h" #include "utilities/vectors.h" -#if defined( Q_OS_MACOS ) +#if defined( Q_OS_MACOS ) || defined( Q_OS_BSD4 ) #include "workarounds/ranges_join.h" #else #include @@ -292,7 +292,7 @@ int WarningData::insertForHour( std::vector>& bars ) const void WarningData::insertInTable( QTableWidget*const table, const QColor& warning_color ) const { - #if defined( Q_OS_MACOS ) + #if defined( Q_OS_MACOS ) || defined( Q_OS_BSD4 ) const auto flattened_data{ Workarounds::join( Workarounds::join(data) ) }; for ( const WarningDatum* datum : flattened_data ) { datum->insertInTable( table, warning_color ); -- GitLab From cbdc2da2b1f75abd3ca2687273a84eaa5a607f14 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:28:23 +0200 Subject: [PATCH 03/34] Updated Docker build scripts --- scripts/DOCKER_build_install.sh | 2 +- scripts/DOCKER_build_update.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/DOCKER_build_install.sh b/scripts/DOCKER_build_install.sh index f87ce71..081b72b 100644 --- a/scripts/DOCKER_build_install.sh +++ b/scripts/DOCKER_build_install.sh @@ -44,7 +44,7 @@ if [[ "$?" == "0" ]] then while : do - echo -e "A $(tput bold)debian:latest$(tput sgr0) image is already installed\nIt is recomended to build LogDoctor on top of an updated image\nPull the latest updates? [y/n] : " + printf "A $(tput bold)debian:latest$(tput sgr0) image is already installed\nIt is recomended to build LogDoctor on top of an updated image\nPull the latest updates? [y/n] : " read agree case "$agree" in diff --git a/scripts/DOCKER_build_update.sh b/scripts/DOCKER_build_update.sh index 566b383..6d1e19b 100644 --- a/scripts/DOCKER_build_update.sh +++ b/scripts/DOCKER_build_update.sh @@ -44,7 +44,7 @@ if [[ "$?" == "0" ]] then while : do - echo -e "A $(tput bold)debian:latest$(tput sgr0) image is already installed\nIt is recomended to build LogDoctor on top of an updated image\nPull the latest updates? [y/n] : " + printf "A $(tput bold)debian:latest$(tput sgr0) image is already installed\nIt is recomended to build LogDoctor on top of an updated image\nPull the latest updates? [y/n] : " read agree case "$agree" in -- GitLab From 2f6180c0053d789f3bbbbe3295fbc04ca1097003 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:29:03 +0200 Subject: [PATCH 04/34] Updated UI Added page in the Configs for security related options. Added option to allow or deny following symlinks. --- logdoctor/mainwindow.ui | 824 ++++++++++++++++++++++------------------ 1 file changed, 464 insertions(+), 360 deletions(-) diff --git a/logdoctor/mainwindow.ui b/logdoctor/mainwindow.ui index 53f9f6f..78d316c 100644 --- a/logdoctor/mainwindow.ui +++ b/logdoctor/mainwindow.ui @@ -62,10 +62,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Sunken + QFrame::Shadow::Sunken 0 @@ -182,7 +182,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -206,7 +206,7 @@ - 0 + 2 @@ -231,7 +231,7 @@ - Qt::NoFocus + Qt::FocusPolicy::NoFocus 0 @@ -406,7 +406,7 @@ - QTextEdit::NoWrap + QTextEdit::LineWrapMode::NoWrap @@ -422,7 +422,7 @@ li.checked::marker { content: "\2612"; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + Qt::TextInteractionFlag::TextSelectableByKeyboard|Qt::TextInteractionFlag::TextSelectableByMouse false @@ -459,10 +459,10 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -529,7 +529,7 @@ li.checked::marker { content: "\2612"; } - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers true @@ -620,10 +620,10 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -666,7 +666,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -714,7 +714,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -779,7 +779,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -827,7 +827,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -873,7 +873,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -924,7 +924,7 @@ li.checked::marker { content: "\2612"; } - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -960,7 +960,7 @@ li.checked::marker { content: "\2612"; } - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -970,7 +970,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1021,7 +1021,7 @@ li.checked::marker { content: "\2612"; } - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1057,7 +1057,7 @@ li.checked::marker { content: "\2612"; } - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1067,7 +1067,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1104,7 +1104,7 @@ li.checked::marker { content: "\2612"; } PointingHandCursor - Qt::TabFocus + Qt::FocusPolicy::TabFocus Start parsing the selected files @@ -1117,7 +1117,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1168,7 +1168,7 @@ li.checked::marker { content: "\2612"; } - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1204,7 +1204,7 @@ li.checked::marker { content: "\2612"; } - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1214,7 +1214,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1242,7 +1242,7 @@ li.checked::marker { content: "\2612"; } Average speed, in parsed data size per second - QFrame::Raised + QFrame::Shadow::Raised @@ -1268,7 +1268,7 @@ li.checked::marker { content: "\2612"; } - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1304,7 +1304,7 @@ li.checked::marker { content: "\2612"; } - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -1314,7 +1314,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1336,7 +1336,7 @@ li.checked::marker { content: "\2612"; } - Qt::NoFocus + Qt::FocusPolicy::NoFocus false @@ -1394,10 +1394,10 @@ li.checked::marker { content: "\2612"; } - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Sunken + QFrame::Shadow::Sunken @@ -1435,7 +1435,7 @@ li.checked::marker { content: "\2612"; } Select a Web Server - QComboBox::AdjustToContents + QComboBox::SizeAdjustPolicy::AdjustToContents @@ -1460,7 +1460,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -1484,7 +1484,7 @@ li.checked::marker { content: "\2612"; } Year - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -1499,7 +1499,7 @@ li.checked::marker { content: "\2612"; } Month - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -1514,14 +1514,14 @@ li.checked::marker { content: "\2612"; } Day - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - Qt::Vertical + Qt::Orientation::Vertical @@ -1539,7 +1539,7 @@ li.checked::marker { content: "\2612"; } - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Hour @@ -1624,7 +1624,7 @@ li.checked::marker { content: "\2612"; } - + false @@ -1696,14 +1696,14 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical - Qt::Vertical + Qt::Orientation::Vertical @@ -1713,7 +1713,7 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical @@ -1722,7 +1722,7 @@ li.checked::marker { content: "\2612"; } - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers false @@ -1731,10 +1731,10 @@ li.checked::marker { content: "\2612"; } false - QAbstractItemView::ScrollPerPixel + QAbstractItemView::ScrollMode::ScrollPerPixel - QAbstractItemView::ScrollPerPixel + QAbstractItemView::ScrollMode::ScrollPerPixel true @@ -1969,7 +1969,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -2002,7 +2002,7 @@ li.checked::marker { content: "\2612"; } Select a Web Server - QComboBox::AdjustToContents + QComboBox::SizeAdjustPolicy::AdjustToContents @@ -2024,7 +2024,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -2043,7 +2043,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -2133,7 +2133,7 @@ li.checked::marker { content: "\2612"; } Year - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2148,7 +2148,7 @@ li.checked::marker { content: "\2612"; } Month - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2163,7 +2163,7 @@ li.checked::marker { content: "\2612"; } Day - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2176,7 +2176,7 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical @@ -2185,7 +2185,7 @@ li.checked::marker { content: "\2612"; } - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers false @@ -2194,10 +2194,10 @@ li.checked::marker { content: "\2612"; } false - QAbstractItemView::ScrollPerPixel + QAbstractItemView::ScrollMode::ScrollPerPixel - QAbstractItemView::ScrollPerPixel + QAbstractItemView::ScrollMode::ScrollPerPixel true @@ -2378,7 +2378,7 @@ li.checked::marker { content: "\2612"; } Protocol: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2397,7 +2397,7 @@ li.checked::marker { content: "\2612"; } Method: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2468,7 +2468,7 @@ Use '!', '=','<' or '>' to declare what to use Response: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2487,7 +2487,7 @@ Use '!', '=','<' or '>' to declare what to use Query: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2532,7 +2532,7 @@ Use '!', '=','<' or '>' to declare what to use URI: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -2590,7 +2590,7 @@ Use '!', '=','<' or '>' to declare what to use Filters - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -2616,7 +2616,7 @@ Use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical @@ -2625,7 +2625,7 @@ Use '!', '=','<' or '>' to declare what to use - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers false @@ -2634,10 +2634,10 @@ Use '!', '=','<' or '>' to declare what to use false - QAbstractItemView::ScrollPerPixel + QAbstractItemView::ScrollMode::ScrollPerPixel - QAbstractItemView::ScrollPerPixel + QAbstractItemView::ScrollMode::ScrollPerPixel true @@ -2716,13 +2716,13 @@ Use '!', '=','<' or '>' to declare what to use - QFrame::NoFrame + QFrame::Shape::NoFrame - Qt::ScrollBarAlwaysOff + Qt::ScrollBarPolicy::ScrollBarAlwaysOff - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop @@ -3064,7 +3064,7 @@ Use '!', '=','<' or '>' to declare what to use Select a Web Server - QComboBox::AdjustToContents + QComboBox::SizeAdjustPolicy::AdjustToContents @@ -3092,14 +3092,14 @@ Use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - Qt::Horizontal + Qt::Orientation::Horizontal @@ -3171,7 +3171,7 @@ Use '!', '=','<' or '>' to declare what to use Day - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3186,7 +3186,7 @@ Use '!', '=','<' or '>' to declare what to use Year - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3225,7 +3225,7 @@ Use '!', '=','<' or '>' to declare what to use Month - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3235,10 +3235,10 @@ Use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -3251,7 +3251,7 @@ Use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -3292,10 +3292,10 @@ Use '!', '=','<' or '>' to declare what to use - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Sunken + QFrame::Shadow::Sunken @@ -3309,7 +3309,7 @@ Use '!', '=','<' or '>' to declare what to use Month - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3324,7 +3324,7 @@ Use '!', '=','<' or '>' to declare what to use Day - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3339,7 +3339,7 @@ Use '!', '=','<' or '>' to declare what to use From: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3411,7 +3411,7 @@ Use '!', '=','<' or '>' to declare what to use Year - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3576,7 +3576,7 @@ Use '!', '=','<' or '>' to declare what to use Field: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3591,14 +3591,14 @@ Use '!', '=','<' or '>' to declare what to use Filter: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - Qt::Horizontal + Qt::Orientation::Horizontal @@ -3636,10 +3636,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -3655,7 +3655,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical @@ -3695,17 +3695,17 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -3738,7 +3738,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Select a Web Server - QComboBox::AdjustToContents + QComboBox::SizeAdjustPolicy::AdjustToContents @@ -3797,7 +3797,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical @@ -3830,7 +3830,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Select a Web Server - QComboBox::AdjustToContents + QComboBox::SizeAdjustPolicy::AdjustToContents @@ -3878,7 +3878,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use From: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -3992,7 +3992,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use To: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -4116,10 +4116,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Sunken + QFrame::Shadow::Sunken @@ -4139,7 +4139,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Filter: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -4270,7 +4270,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Field: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -4291,7 +4291,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Filter: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -4312,7 +4312,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Field: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -4322,7 +4322,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical @@ -4354,7 +4354,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -4505,7 +4505,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -4527,7 +4527,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal 8 @@ -4537,7 +4537,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical 8 @@ -4582,7 +4582,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4603,7 +4603,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Protocol - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4624,7 +4624,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4645,7 +4645,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4666,7 +4666,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Method - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4687,14 +4687,14 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter - Qt::Vertical + Qt::Orientation::Vertical @@ -4721,7 +4721,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4742,7 +4742,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use URI - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4763,7 +4763,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4773,7 +4773,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -4797,7 +4797,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use User-agent - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4818,7 +4818,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4839,7 +4839,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4849,7 +4849,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -4874,7 +4874,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Most recurrent - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4899,7 +4899,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Most trafficked - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4938,7 +4938,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Date ever - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4959,7 +4959,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -4980,7 +4980,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5007,7 +5007,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Day of the week - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5028,7 +5028,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5049,7 +5049,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5076,7 +5076,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Hour of the day - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5097,7 +5097,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5118,7 +5118,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use 0 - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5128,14 +5128,14 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - Qt::Horizontal + Qt::Orientation::Horizontal @@ -5148,7 +5148,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical 8 @@ -5176,7 +5176,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -5200,7 +5200,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Time taken - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5221,7 +5221,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5242,7 +5242,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5269,7 +5269,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Bytes sent - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5290,7 +5290,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5311,7 +5311,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5338,7 +5338,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Bytes received - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5359,7 +5359,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5380,7 +5380,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5390,7 +5390,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -5415,7 +5415,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Mean/Max performances - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5458,7 +5458,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Bytes sent - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5479,7 +5479,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5489,7 +5489,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -5513,7 +5513,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Requests received - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5534,7 +5534,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5561,7 +5561,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Time taken - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5582,7 +5582,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5592,7 +5592,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -5617,7 +5617,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Total work - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -5663,7 +5663,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -5704,10 +5704,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Minimum + QSizePolicy::Policy::Minimum @@ -5748,10 +5748,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Minimum + QSizePolicy::Policy::Minimum @@ -5792,10 +5792,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Minimum + QSizePolicy::Policy::Minimum @@ -5836,10 +5836,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Minimum + QSizePolicy::Policy::Minimum @@ -5880,10 +5880,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Minimum + QSizePolicy::Policy::Minimum @@ -5924,7 +5924,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -5956,7 +5956,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal false @@ -5968,13 +5968,13 @@ With numbers, use '!', '=','<' or '>' to declare what to use - QFrame::NoFrame + QFrame::Shape::NoFrame - QFrame::Plain + QFrame::Shadow::Plain - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers false @@ -6039,6 +6039,11 @@ With numbers, use '!', '=','<' or '>' to declare what to use Databases + + + Security + + @@ -6145,10 +6150,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -6299,7 +6304,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -6312,10 +6317,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -6334,10 +6339,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -6350,7 +6355,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -6438,7 +6443,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Vertical + Qt::Orientation::Vertical @@ -6464,10 +6469,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -6503,14 +6508,14 @@ With numbers, use '!', '=','<' or '>' to declare what to use Normal - Qt::AlignBottom|Qt::AlignHCenter + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter - Qt::Horizontal + Qt::Orientation::Horizontal @@ -6526,10 +6531,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -6590,10 +6595,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use 2 - Qt::Horizontal + Qt::Orientation::Horizontal - QSlider::TicksBothSides + QSlider::TickPosition::TicksBothSides 1 @@ -6603,10 +6608,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -6667,10 +6672,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use 2 - Qt::Horizontal + Qt::Orientation::Horizontal - QSlider::TicksBothSides + QSlider::TickPosition::TicksBothSides 1 @@ -6728,10 +6733,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use 2 - Qt::Horizontal + Qt::Orientation::Horizontal - QSlider::TicksAbove + QSlider::TickPosition::TicksAbove 1 @@ -6794,7 +6799,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use Essential - Qt::AlignBottom|Qt::AlignHCenter + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter @@ -6824,14 +6829,14 @@ With numbers, use '!', '=','<' or '>' to declare what to use Explanatory - Qt::AlignBottom|Qt::AlignHCenter + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter - Qt::Vertical + Qt::Orientation::Vertical @@ -6854,10 +6859,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -6907,7 +6912,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -6962,7 +6967,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7019,10 +7024,10 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7035,7 +7040,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7193,7 +7198,7 @@ All the values falling inside the same interval will be merged and the mean valu - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7233,10 +7238,10 @@ All the values falling inside the same interval will be merged and the mean valu - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7278,7 +7283,7 @@ All the values falling inside the same interval will be merged and the mean valu - Qt::Vertical + Qt::Orientation::Vertical @@ -7298,10 +7303,10 @@ All the values falling inside the same interval will be merged and the mean valu - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7314,7 +7319,7 @@ All the values falling inside the same interval will be merged and the mean valu - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7366,10 +7371,10 @@ All the values falling inside the same interval will be merged and the mean valu - QAbstractSpinBox::PlusMinus + QAbstractSpinBox::ButtonSymbols::PlusMinus - QAbstractSpinBox::CorrectToNearestValue + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue 0.400000000000000 @@ -7394,10 +7399,10 @@ All the values falling inside the same interval will be merged and the mean valu - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7410,7 +7415,7 @@ All the values falling inside the same interval will be merged and the mean valu - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7463,10 +7468,10 @@ Exceeding slices will be grouped into one comprehensive slice. - QAbstractSpinBox::PlusMinus + QAbstractSpinBox::ButtonSymbols::PlusMinus - QAbstractSpinBox::CorrectToNearestValue + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue 1 @@ -7485,7 +7490,7 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Vertical + Qt::Orientation::Vertical @@ -7505,7 +7510,7 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7571,10 +7576,10 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7590,7 +7595,7 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Vertical + Qt::Orientation::Vertical @@ -7610,10 +7615,10 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7668,7 +7673,7 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7714,10 +7719,10 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7843,7 +7848,7 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7883,10 +7888,10 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -7914,7 +7919,7 @@ Exceeding slices will be grouped into one comprehensive slice. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -7963,7 +7968,7 @@ Exceeding slices will be grouped into one comprehensive slice. false - QTextEdit::NoWrap + QTextEdit::LineWrapMode::NoWrap <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -7986,7 +7991,7 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical @@ -8006,10 +8011,10 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -8022,10 +8027,10 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -8267,7 +8272,7 @@ li.checked::marker { content: "\2612"; } ... - QToolButton::InstantPopup + QToolButton::ToolButtonPopupMode::InstantPopup @@ -8314,7 +8319,7 @@ li.checked::marker { content: "\2612"; } ... - QToolButton::InstantPopup + QToolButton::ToolButtonPopupMode::InstantPopup @@ -8358,7 +8363,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -8395,10 +8400,10 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -8440,7 +8445,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -8456,10 +8461,10 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -8471,6 +8476,105 @@ li.checked::marker { content: "\2612"; } + + + + + + + + + Qt::Orientation::Horizontal + + + QSizePolicy::Policy::Fixed + + + + 16 + 32 + + + + + + + + + 128 + 32 + + + + + 16777215 + 32 + + + + + 16 + + + + Paths + + + + + + + + 0 + 0 + + + + + 0 + 32 + + + + + 16777215 + 32 + + + + + 13 + + + + Whether it is allowed or denied to follow symlinks occuring in a path + + + Follow symlinks + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Expanding + + + + 665 + 427 + + + + + + @@ -8479,10 +8583,10 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -8597,10 +8701,10 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -8665,10 +8769,10 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -8723,7 +8827,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -8778,10 +8882,10 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -8847,10 +8951,10 @@ li.checked::marker { content: "\2612"; } - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - QAbstractSpinBox::PlusMinus + QAbstractSpinBox::ButtonSymbols::PlusMinus MiB @@ -8866,7 +8970,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -8882,10 +8986,10 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -8929,7 +9033,7 @@ li.checked::marker { content: "\2612"; } ... - QToolButton::InstantPopup + QToolButton::ToolButtonPopupMode::InstantPopup @@ -9041,10 +9145,10 @@ li.checked::marker { content: "\2612"; } - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -9147,7 +9251,7 @@ li.checked::marker { content: "\2612"; } - Qt::Horizontal + Qt::Orientation::Horizontal @@ -9183,10 +9287,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::ScrollBarAlwaysOff + Qt::ScrollBarPolicy::ScrollBarAlwaysOff - Qt::ScrollBarAlwaysOn + Qt::ScrollBarPolicy::ScrollBarAlwaysOn true @@ -9236,10 +9340,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -9255,7 +9359,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical @@ -9283,7 +9387,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Horizontal + Qt::Orientation::Horizontal @@ -9319,7 +9423,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Open an help window - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft Help @@ -9374,10 +9478,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -9423,7 +9527,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Add the current line to the list - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9481,7 +9585,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Remove the selected item from the list - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9497,7 +9601,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers @@ -9530,7 +9634,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9572,7 +9676,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9588,7 +9692,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical @@ -9635,10 +9739,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -9684,7 +9788,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Add line - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9747,7 +9851,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Remove selection - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9768,7 +9872,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers @@ -9801,7 +9905,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9848,7 +9952,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -9869,7 +9973,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical @@ -9916,7 +10020,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log ... - QToolButton::InstantPopup + QToolButton::ToolButtonPopupMode::InstantPopup @@ -10028,10 +10132,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -10057,10 +10161,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::ScrollBarAlwaysOff + Qt::ScrollBarPolicy::ScrollBarAlwaysOff - Qt::ScrollBarAlwaysOn + Qt::ScrollBarPolicy::ScrollBarAlwaysOn true @@ -10129,10 +10233,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -10187,7 +10291,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Horizontal + Qt::Orientation::Horizontal @@ -10242,7 +10346,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Vertical + Qt::Orientation::Vertical @@ -10270,7 +10374,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Horizontal + Qt::Orientation::Horizontal @@ -10306,7 +10410,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Open an help window - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft Help @@ -10361,10 +10465,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -10410,7 +10514,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Add line - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10473,7 +10577,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Remove selection - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10494,7 +10598,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers @@ -10527,7 +10631,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10574,7 +10678,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10595,7 +10699,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Vertical + Qt::Orientation::Vertical @@ -10642,10 +10746,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -10691,7 +10795,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Add line - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10754,7 +10858,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Remove selection - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10775,7 +10879,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers @@ -10808,7 +10912,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10855,7 +10959,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -10876,7 +10980,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Vertical + Qt::Orientation::Vertical @@ -10923,7 +11027,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' ... - QToolButton::InstantPopup + QToolButton::ToolButtonPopupMode::InstantPopup @@ -11035,10 +11139,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -11219,7 +11323,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::Horizontal + Qt::Orientation::Horizontal @@ -11255,10 +11359,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED' - Qt::ScrollBarAlwaysOff + Qt::ScrollBarPolicy::ScrollBarAlwaysOff - Qt::ScrollBarAlwaysOn + Qt::ScrollBarPolicy::ScrollBarAlwaysOn true @@ -11308,10 +11412,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -11327,7 +11431,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical @@ -11355,7 +11459,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Horizontal + Qt::Orientation::Horizontal @@ -11391,7 +11495,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Open an help window - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft Help @@ -11446,10 +11550,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -11495,7 +11599,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Add line - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11558,7 +11662,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Remove selection - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11579,7 +11683,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers @@ -11612,7 +11716,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11659,7 +11763,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11680,7 +11784,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical @@ -11727,10 +11831,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -11776,7 +11880,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Add line - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11839,7 +11943,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Remove selection - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11860,7 +11964,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers @@ -11893,7 +11997,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11940,7 +12044,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log Move the selected item down - Qt::RightToLeft + Qt::LayoutDirection::RightToLeft @@ -11961,7 +12065,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Qt::Vertical + Qt::Orientation::Vertical @@ -12063,7 +12167,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log :/flags/flags/gb.png:/flags/flags/gb.png - English + &English English @@ -12078,7 +12182,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log :/flags/flags/es.png:/flags/flags/es.png - Español + E&spañol Español @@ -12093,7 +12197,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log :/flags/flags/fr.png:/flags/flags/fr.png - Francais + &Francais Francais @@ -12108,7 +12212,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log :/flags/flags/it.png:/flags/flags/it.png - Italiano + &Italiano Italiano @@ -12116,7 +12220,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Check updates + Check &updates Perform a version-check @@ -12124,7 +12228,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Infos + &Infos Show some info about LogDoctor @@ -12132,7 +12236,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - BlockNote + &BlockNote Open a block-note like window to write temporary text @@ -12140,7 +12244,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - CrissCross + &CrissCross Play CrissCross @@ -12148,7 +12252,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - Snake + &Snake Play Snake @@ -12175,12 +12279,12 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log :/flags/flags/br.png:/flags/flags/br.png - Português + &Português - Changelog + &Changelog Show the changelog -- GitLab From 436ebfc22c82da1675faf9f386f00a79f24bc46e Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:30:32 +0200 Subject: [PATCH 05/34] Updated resources Added icons for the new Configs page --- logdoctor/resources/icons/dark/conf_security.png | Bin 0 -> 944 bytes .../resources/icons/dark_native/conf_security.png | Bin 0 -> 934 bytes logdoctor/resources/icons/light/conf_security.png | Bin 0 -> 662 bytes .../icons/light_native/conf_security.png | Bin 0 -> 680 bytes logdoctor/resources/resources.qrc | 4 ++++ 5 files changed, 4 insertions(+) create mode 100644 logdoctor/resources/icons/dark/conf_security.png create mode 100644 logdoctor/resources/icons/dark_native/conf_security.png create mode 100644 logdoctor/resources/icons/light/conf_security.png create mode 100644 logdoctor/resources/icons/light_native/conf_security.png diff --git a/logdoctor/resources/icons/dark/conf_security.png b/logdoctor/resources/icons/dark/conf_security.png new file mode 100644 index 0000000000000000000000000000000000000000..a716aa55ddd37c51e9913d8ac1e41264b8f2a006 GIT binary patch literal 944 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANOK<(@8%ArXh)PWR7<2^Be3 zfB($vm({|vX0jM=$+&-dfx^pEzm`XwJrojRa8=6jN>f6)UTDaX)(-2tJ9PDS3536L z5f>A=6trSd!mf-7VV>=3CCQyLJ9E<}%`|_%d>8xP`$1K^$CCF)C3S?wrtNaPc<#*m4<8=+bEp~gDWsa!NnUPy+HoRq=I$%j zOw2b;p56*}67EoM+?V?xjz!Hku2LPTuaC74yCeXf=F=y{v<8P;9y zG~sz};5#d6e&D(PdrTXb)b}UNa(eUk_I!>v)y*bca7e*3-9 zY)i$TmumBcr##=6l^y48vLQ(;uaqhLnuF=3$bDPAgkO6-*VeyvUm^H-zW;$`uYIfZ z^UC7&vtkPh9w&!?t#M~kJ7===+s}HrI+f1CE$a?&|EVn9_?dHx@co3aoGI5lih}Pf z^;(+Qz51>9wm(KumnSdu-)=Zb_u7;bJWXXb9UQrxpjBNqm-;ktzwq)0opp- zW-R&J<7DUlhHZD>WDCF4ja$C1T>7`?PD0{aw$Iu-Zo2Qv6f0^D?v1`sU)~Tt=s-bA6`;bHS$alS?OQU^W*`~)kpbrlkZ>E z-~OL_iTJBSyVJaE+lMP$zsmuG%u{PR+mUeMZe<-?9gTZ28m zUvG}zTJfjQYkK`+M&=mjx literal 0 HcmV?d00001 diff --git a/logdoctor/resources/icons/dark_native/conf_security.png b/logdoctor/resources/icons/dark_native/conf_security.png new file mode 100644 index 0000000000000000000000000000000000000000..15f2540e34de551e019a3ea267a562d0e15ca13e GIT binary patch literal 934 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/resources.qrc b/logdoctor/resources/resources.qrc index a17162b..e4f5fda 100644 --- a/logdoctor/resources/resources.qrc +++ b/logdoctor/resources/resources.qrc @@ -36,6 +36,7 @@ icons/dark/conf_on.png icons/dark/conf_path.png icons/dark/conf_relational.png + icons/dark/conf_security.png icons/dark/conf_speed.png icons/dark/conf_textbrowser.png icons/dark/conf_warnlists.png @@ -92,6 +93,7 @@ icons/dark_native/conf_on.png icons/dark_native/conf_path.png icons/dark_native/conf_relational.png + icons/dark_native/conf_security.png icons/dark_native/conf_speed.png icons/dark_native/conf_textbrowser.png icons/dark_native/conf_warnlists.png @@ -153,6 +155,7 @@ icons/light/conf_on.png icons/light/conf_path.png icons/light/conf_relational.png + icons/light/conf_security.png icons/light/conf_speed.png icons/light/conf_textbrowser.png icons/light/conf_warnlists.png @@ -209,6 +212,7 @@ icons/light_native/conf_on.png icons/light_native/conf_path.png icons/light_native/conf_relational.png + icons/light_native/conf_security.png icons/light_native/conf_speed.png icons/light_native/conf_textbrowser.png icons/light_native/conf_warnlists.png -- GitLab From 0ac75c0f122f2d2a88ec6afefd558e36d539edb3 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:32:09 +0200 Subject: [PATCH 06/34] Updated GlobalConfigs namespace Added Security nested namespace --- logdoctor/globals/CMakeLists.txt | 2 ++ logdoctor/globals/security.cpp | 10 ++++++++++ logdoctor/globals/security.h | 17 +++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 logdoctor/globals/security.cpp create mode 100644 logdoctor/globals/security.h diff --git a/logdoctor/globals/CMakeLists.txt b/logdoctor/globals/CMakeLists.txt index dc1820f..bd80cf6 100644 --- a/logdoctor/globals/CMakeLists.txt +++ b/logdoctor/globals/CMakeLists.txt @@ -4,4 +4,6 @@ target_sources(LogDoctor PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/db_names.cpp ${CMAKE_CURRENT_SOURCE_DIR}/global_configs.h ${CMAKE_CURRENT_SOURCE_DIR}/global_configs.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/security.h + ${CMAKE_CURRENT_SOURCE_DIR}/security.cpp ) diff --git a/logdoctor/globals/security.cpp b/logdoctor/globals/security.cpp new file mode 100644 index 0000000..f57e75d --- /dev/null +++ b/logdoctor/globals/security.cpp @@ -0,0 +1,10 @@ + +#include "security.h" + + +namespace GlobalConfigs::Security +{ + +bool follow_symlinks = false; + +} // namespace GlobalConfigs::Security diff --git a/logdoctor/globals/security.h b/logdoctor/globals/security.h new file mode 100644 index 0000000..7be2b10 --- /dev/null +++ b/logdoctor/globals/security.h @@ -0,0 +1,17 @@ +#ifndef LOGDOCTOR__GLOBALS__SECURITY_H +#define LOGDOCTOR__GLOBALS__SECURITY_H + + +//! Security +/*! + Globally shared configurations about security +*/ +namespace GlobalConfigs::Security +{ + +extern bool follow_symlinks; + +} // namespace SecurityOptions::Security + + +#endif // LOGDOCTOR__GLOBALS__SECURITY_H -- GitLab From 08a12f543073cbbd7957832b9e42d7e608bd6c3a Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:35:40 +0200 Subject: [PATCH 07/34] Introduced PathHandler class Wrapper class to enforce checking paths before accessing them --- logdoctor/modules/CMakeLists.txt | 1 + logdoctor/modules/security/CMakeLists.txt | 5 + logdoctor/modules/security/path.cpp | 109 ++++++++++++++++++++++ logdoctor/modules/security/path.h | 82 ++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 logdoctor/modules/security/CMakeLists.txt create mode 100644 logdoctor/modules/security/path.cpp create mode 100644 logdoctor/modules/security/path.h diff --git a/logdoctor/modules/CMakeLists.txt b/logdoctor/modules/CMakeLists.txt index 5538d39..bf4ef16 100644 --- a/logdoctor/modules/CMakeLists.txt +++ b/logdoctor/modules/CMakeLists.txt @@ -19,4 +19,5 @@ add_subdirectory(crapup) add_subdirectory(crapview) add_subdirectory(database) add_subdirectory(dialogs) +add_subdirectory(security) add_subdirectory(warnlists) diff --git a/logdoctor/modules/security/CMakeLists.txt b/logdoctor/modules/security/CMakeLists.txt new file mode 100644 index 0000000..0eab55f --- /dev/null +++ b/logdoctor/modules/security/CMakeLists.txt @@ -0,0 +1,5 @@ + +target_sources(LogDoctor PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/path.h + ${CMAKE_CURRENT_SOURCE_DIR}/path.cpp +) diff --git a/logdoctor/modules/security/path.cpp b/logdoctor/modules/security/path.cpp new file mode 100644 index 0000000..c128c92 --- /dev/null +++ b/logdoctor/modules/security/path.cpp @@ -0,0 +1,109 @@ + +#include "path.h" + +#include "globals/security.h" + +#include "modules/exceptions.h" +#include "modules/dialogs.h" + + +using reason_t = InvalidPath::Reason; +using components_t = std::vector; +using invalid_t = std::optional>; + + +namespace /*private*/ +{ + +path_t makeAbsolute( path_t&& path ) +{ + return std::filesystem::absolute( path ); +} + +components_t getComponents( const path_t& path ) +{ + path_t path_slice; + components_t components; + for ( const auto& component : path ) { + path_slice /= component; + components.push_back( path_slice ); + } + return components; +} + +invalid_t checkIsValid( const components_t& components ) +{ + const bool symlink_denied{ ! GlobalConfigs::Security::follow_symlinks }; + + for ( const path_t& component : components ) { + if ( ! std::filesystem::exists( component ) ) { + return std::make_tuple( component, reason_t::NotExists ); + } else if ( symlink_denied && std::filesystem::is_symlink( component ) ) { + return std::make_tuple( component, reason_t::IsSymlink ); + } + } + return std::nullopt; +} + +} // namespace (private) + + +PathHandler::PathHandler( path_t&& path_ ) + : path{std::move(path_)}, components{getComponents(this->path)} +{ +} + +PathHandler::PathHandler( const std::string& path_ ) + : path{makeAbsolute(path_)}, components{getComponents(this->path)} +{ +} + +PathHandler::PathHandler( std::string&& path_ ) + : path{makeAbsolute(std::move(path_))}, components{getComponents(this->path)} +{ +} + +PathHandler PathHandler::operator/( const std::string& path_ ) const +{ + return PathHandler( this->path / path_ ); +} + +std::string PathHandler::toString() const +{ + return this->path.string(); +} + +std::expected PathHandler::getPath() const +{ + const invalid_t invalid_reason{ checkIsValid( this->components ) }; + if ( invalid_reason.has_value() ) { + const auto [c,r]{ invalid_reason.value() }; + return std::unexpected(InvalidPath( this->path, c, r )); + } + return this->path; +} + +const path_t& PathHandler::getPathUnchecked() const +{ + return this->path; +} + +const path_t PathHandler::getParentUnchecked() const +{ + return this->path.parent_path(); +} + + +void InvalidPath::showDialogMessage() const +{ + const QString fp( this->full_path.c_str() ); + const QString ic( this->invalid_component.c_str() ); + switch ( this->reason ) { + case Reason::NotExists: + DialogSec::errPathNotExists( fp, ic ); + break; + case Reason::IsSymlink: + DialogSec::errPathHasSymlink( fp, ic ); + break; + } +} diff --git a/logdoctor/modules/security/path.h b/logdoctor/modules/security/path.h new file mode 100644 index 0000000..49f0aa3 --- /dev/null +++ b/logdoctor/modules/security/path.h @@ -0,0 +1,82 @@ +#ifndef LOGDOCTOR__MODULES__SECURITY__PATH_H +#define LOGDOCTOR__MODULES__SECURITY__PATH_H + + +#include +#include +#include + + +using path_t = std::filesystem::path; + + +class InvalidPath; + + +//! PathHandler +/*! + Handles a path, enforcing checks when access to the resource is requested +*/ +class PathHandler final +{ + path_t path; + std::vector components; + +public: + PathHandler() = default; + PathHandler( PathHandler&& ) = default; + PathHandler( const PathHandler& ) = default; + PathHandler& operator=( PathHandler&& ) = default; + PathHandler& operator=( const PathHandler& ) = default; + + PathHandler( path_t&& path_ ); + PathHandler( const std::string& path_ ); + PathHandler( std::string&& path_ ); + + PathHandler operator/( const std::string& path_ ) const; + + //! Convenience function that returns the path as string, without checks + std::string toString() const; + + //! Returns the path if it is valid, throws otherwise + /*! + Checks every component of the path to determine whether it is valid. + For a path to be valid, all of its components must exist on the filesystem + and they must follow the security configuration about the symlinks. + \throw VoidException + */ + std::expected getPath() const; + + //! Convenience function that just returns the path, skipping all the checks + const path_t& getPathUnchecked() const; + + //! Convenience function that just returns the parent path, skipping all the checks + const path_t getParentUnchecked() const; +}; + + +struct InvalidPath final +{ + enum class Reason { + NotExists, + IsSymlink, + }; + + const path_t full_path; + const path_t invalid_component; + const Reason reason; + + InvalidPath( const path_t& p, const path_t& c, const Reason r ) + : full_path{p}, invalid_component{c}, reason{r} {} + + bool isReasonExistence() const + { return reason == Reason::NotExists; } + + bool isReasonSymlink() const + { return reason == Reason::IsSymlink; } + + void showDialogMessage() const; +}; + + +#endif // LOGDOCTOR__MODULES__SECURITY__PATH_H -- GitLab From f6500cfc7178b90022b84971ab00dd926a9a3e63 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:37:57 +0200 Subject: [PATCH 08/34] Upgrade to C++23 Needed for std::expected --- logdoctor/cmake/project.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logdoctor/cmake/project.cmake b/logdoctor/cmake/project.cmake index cad32ac..8d7d1c2 100644 --- a/logdoctor/cmake/project.cmake +++ b/logdoctor/cmake/project.cmake @@ -7,7 +7,7 @@ macro(logdoc_set_cmake_options) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) - set(CMAKE_CXX_STANDARD 20) + set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) endmacro() -- GitLab From 0edda06d783a8a5fc63ccbc0f6b32e1193e63859 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:40:08 +0200 Subject: [PATCH 09/34] Code improvements and updates Updated MainWindow --- logdoctor/mainwindow.cpp | 2025 +++++++++++++++--------------- logdoctor/mainwindow.h | 29 +- logdoctor/modules/crapconf/lib.h | 29 +- 3 files changed, 1054 insertions(+), 1029 deletions(-) diff --git a/logdoctor/mainwindow.cpp b/logdoctor/mainwindow.cpp index d1ae9dd..ed36b77 100644 --- a/logdoctor/mainwindow.cpp +++ b/logdoctor/mainwindow.cpp @@ -6,6 +6,7 @@ #include "globals/db_names.h" #include "globals/global_configs.h" +#include "globals/security.h" #include "customs/logfile_treewidgetitem.h" #include "customs/models/logfields_listmodel.h" @@ -229,9 +230,9 @@ MainWindow::MainWindow(QWidget *parent) this->ui->spinBox_ConfCharts_Count_MaxSlices->setValue( this->crapview.getCountMaxSlices() ); this->ui->box_ConfCharts_Relat_TimeFormat->setCurrentText( this->crapview.getRelatTimeFormat() ); // databases - this->ui->inLine_ConfDatabases_Data_Path->setText( QString::fromStdString( this->db_data_path ) ); + this->ui->inLine_ConfDatabases_Data_Path->setText( QString::fromStdString( this->db_data_path.toString() ) ); this->ui->button_ConfDatabases_Data_Save->setEnabled( false ); - this->ui->inLine_ConfDatabases_Hashes_Path->setText( QString::fromStdString( this->db_hashes_path ) ); + this->ui->inLine_ConfDatabases_Hashes_Path->setText( QString::fromStdString( this->db_hashes_path.toString() ) ); this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false ); this->ui->spinBox_ConfDatabases_NumBackups->setValue( this->db_backups_number ); this->ui->checkBox_ConfDatabases_DoBackup->setChecked( this->db_do_backup ); @@ -244,7 +245,7 @@ MainWindow::MainWindow(QWidget *parent) this->ui->checkBox_ConfControl_Size->setChecked( false ); } // apache paths - this->ui->inLine_ConfApache_Path_String->setText( QString::fromStdString(this->craplog.getLogsPath( WS_APACHE )) ); + this->ui->inLine_ConfApache_Path_String->setText( QString::fromStdString(this->craplog.getLogsPath( WS_APACHE ).toString()) ); this->ui->button_ConfApache_Path_Save->setEnabled( false ); // apache formats this->ui->inLine_ConfApache_Format_String->setText( QString::fromStdString( this->craplog.getLogsFormatString( WS_APACHE ) ) ); @@ -254,7 +255,7 @@ MainWindow::MainWindow(QWidget *parent) // apache blacklists this->on_box_ConfApache_Blacklist_Field_currentTextChanged( this->ui->box_ConfApache_Blacklist_Field->currentText() ); // nginx paths - this->ui->inLine_ConfNginx_Path_String->setText( QString::fromStdString(this->craplog.getLogsPath( WS_NGINX )) ); + this->ui->inLine_ConfNginx_Path_String->setText( QString::fromStdString(this->craplog.getLogsPath( WS_NGINX ).toString()) ); this->ui->button_ConfNginx_Path_Save->setEnabled( false ); // nginx formats this->ui->inLine_ConfNginx_Format_String->setText( QString::fromStdString( this->craplog.getLogsFormatString( WS_NGINX ) ) ); @@ -264,7 +265,7 @@ MainWindow::MainWindow(QWidget *parent) // nginx blacklists this->on_box_ConfNginx_Blacklist_Field_currentTextChanged( this->ui->box_ConfNginx_Blacklist_Field->currentText() ); // iis paths - this->ui->inLine_ConfIis_Path_String->setText( QString::fromStdString(this->craplog.getLogsPath( WS_IIS )) ); + this->ui->inLine_ConfIis_Path_String->setText( QString::fromStdString(this->craplog.getLogsPath( WS_IIS ).toString()) ); this->ui->button_ConfIis_Path_Save->setEnabled( false ); // iis formats this->ui->inLine_ConfIis_Format_String->setText( QString::fromStdString( this->craplog.getLogsFormatString( WS_IIS ) ) ); @@ -325,22 +326,16 @@ void MainWindow::closeEvent( QCloseEvent *event ) void MainWindow::defineOSspec() { #if defined( Q_OS_LINUX ) || defined( Q_OS_BSD4 ) - /*this->configs_path = home_path + "/.config/LogDoctor/logdoctor.conf"; - this->logdoc_path = home_path + "/.local/share/LogDoctor";*/ - this->db_data_path = this->home_path + "/.local/share/LogDoctor"; - this->db_hashes_path = this->home_path + "/.local/share/LogDoctor"; + this->db_data_path = PathHandler( this->home_path + "/.local/share/LogDoctor" ); + this->db_hashes_path = PathHandler( this->home_path + "/.local/share/LogDoctor" ); #elif defined( Q_OS_WINDOWS ) - /*this->configs_path = home_path + "/AppData/Local/LogDoctor/logdoctor.conf"; - this->logdoc_path = home_path + "/AppData/Local/LogDoctor";*/ - this->db_data_path = this->logdoc_path; - this->db_hashes_path = this->logdoc_path; + this->db_data_path = PathHandler( this->logdoc_path ); + this->db_hashes_path = PathHandler( this->logdoc_path ); #elif defined( Q_OS_MACOS ) - /*this->configs_path = home_path + "/Lybrary/Preferences/LogDoctor/logdoctor.conf"; - this->logdoc_path = home_path + "/Lybrary/Application Support/LogDoctor";*/ - this->db_data_path = this->logdoc_path; - this->db_hashes_path = this->logdoc_path; + this->db_data_path = PathHandler( this->logdoc_path ); + this->db_hashes_path = PathHandler( this->logdoc_path ); #else // shouldn't be here @@ -350,587 +345,577 @@ void MainWindow::defineOSspec() void MainWindow::readConfigs() { - bool proceed{ true }; std::error_code err; + bool proceed{true}; QString err_msg; - // check the file - if ( IOutils::exists( this->configs_path ) ) { - if ( IOutils::checkFile( this->configs_path ) ) { - if ( ! IOutils::checkFile( this->configs_path, true ) ) { - // file not readable, try to assign permissions - std::filesystem::permissions( this->configs_path, - std::filesystem::perms::owner_read, - std::filesystem::perm_options::add, - err ); - if ( err.value() ) { - proceed &= false; + + if ( const auto path_exp{ this->configs_path.getPath() }; + !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + const auto& invalid{ path_exp.error() }; + QString invalid_component; + if ( this->dialogs_level > DL_ESSENTIAL ) { + invalid_component = QString( invalid.full_path.c_str() ); + } + DialogSec::errConfPathHasSymlink( QString( invalid.full_path.c_str() ), invalid_component ); + proceed &= false; + } else { + const path_t& conf_file{ this->configs_path.getPathUnchecked() }; + if ( IOutils::exists( conf_file ) ) { + if ( IOutils::checkFile( conf_file ) ) { + if ( ! IOutils::checkFile( conf_file, true ) ) { + // file not readable QString file; if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString::fromStdString( this->configs_path ); - err_msg = QString::fromStdString( err.message() ); + file = QString( conf_file.c_str() ); } DialogSec::errConfFileNotReadable( file, err_msg ); + proceed &= false; } - } - } else { - // the given path doesn't point to a file - proceed = DialogSec::choiceFileNotFile( QString::fromStdString( this->configs_path ) ); - if ( proceed ) { - proceed = IOutils::renameAsCopy( this->configs_path, err ); - if ( ! proceed ) { - QString path; - if ( this->dialogs_level > DL_ESSENTIAL ) { - path = QString::fromStdString( this->configs_path ); - if ( err.value() ) { + } else { + // the given path doesn't point to a file + const QString path_msg{ conf_file.c_str() }; + if ( DialogSec::choiceFileNotFile( path_msg ) ) { + if ( ! IOutils::renameAsCopy( conf_file, err ) ) { + if ( this->dialogs_level > DL_ESSENTIAL ) { err_msg = QString::fromStdString( err.message() ); } + DialogSec::errRenaming( path_msg, err_msg ); } - DialogSec::errRenaming( QString::fromStdString( this->configs_path ), err_msg ); } + proceed &= false; + } + } else { + // configuration file not found + QString file; + if ( this->dialogs_level == DL_EXPLANATORY ) { + file = QString( conf_file.c_str() ); } + DialogSec::warnConfFileNotFound( file ); + proceed &= false; } - } else { - // configuration file not found - proceed &= false; - QString file; - if ( this->dialogs_level == DL_EXPLANATORY ) { - file = QString::fromStdString( this->configs_path ); + } + if ( ! proceed ) { + if ( ! DialogSec::choiceFailedApplyingConfigs( err_msg ) ) { + // choosed to abort + std::exit( 1 ); } - DialogSec::warnConfFileNotFound( file ); + return; } - if ( proceed ) { - err_msg.clear(); - QStringList invalid_lines; - std::vector aux, configs; - try { - bool iis_module_set{ false }; - std::string iis_format_w3c; - const std::string iis_format_ncsa{ "c-ip s-sitename s-computername [date:time] sc-status sc-bytes" }; - const std::string iis_format_iis{ "c-ip, cs-username, date, time, s-sitename, s-computername, s-ip, time-taken, cs-bytes, sc-bytes, sc-status, sc-win32-status, cs-method, cs-uri-stem, cs-uri-query," }; - const auto apply_iis_format{ [this,&invalid_lines](const std::string& line, const std::string& format, const IISLogsModule module) - { - if ( ! this->craplog.setIisLogFormat( format, module ) ) { - invalid_lines.append( QString::fromStdString( line ) ); - } - } - }; - - std::string content; - IOutils::readFile( this->configs_path, content ); - StringOps::splitrip( configs, content ); - for ( const std::string& line : configs ) { - if ( StringOps::startsWith( line, '[') ) { - // section descriptor - continue; - } - aux.clear(); - StringOps::splitrip( aux, line, '=' ); - if ( aux.size() < 2 ) { - // nothing to do - continue; + QStringList invalid_lines; + try { + bool iis_module_set{ false }; + std::string iis_format_w3c; + const std::string iis_format_ncsa{ "c-ip s-sitename s-computername [date:time] sc-status sc-bytes" }; + const std::string iis_format_iis{ "c-ip, cs-username, date, time, s-sitename, s-computername, s-ip, time-taken, cs-bytes, sc-bytes, sc-status, sc-win32-status, cs-method, cs-uri-stem, cs-uri-query," }; + const auto apply_iis_format{ [this,&invalid_lines](const std::string& line, const std::string& format, const IISLogsModule module) + { + if ( ! this->craplog.setIisLogFormat( format, module ) ) { + invalid_lines.append( QString::fromStdString( line ) ); } - // if here, a value is present - const std::string& var{ aux.at( 0 ) }; - const std::string& val{ aux.at( 1 ) }; + } + }; + + std::string content; + IOutils::readFile( this->configs_path.getPathUnchecked(), content ); + std::vector configs; + StringOps::splitrip( configs, content ); + for ( const std::string& line : configs ) { + if ( StringOps::startsWith( line, '[') ) { + // section descriptor + continue; + } + std::vector aux; + StringOps::splitrip( aux, line, '=' ); + if ( aux.size() < 2 ) { + // nothing to do + continue; + } + // if here, a value is present + const std::string& var{ aux.at( 0 ) }; + const std::string& val{ aux.at( 1 ) }; - if ( val.empty() ) { - // nothing to do, no value stored - continue; - } + if ( val.empty() ) { + // nothing to do, no value stored + continue; + } - if ( var == "Language" ) { - if ( val.size() != 5 ) { - // not a valid locale, keep the default - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errLangLocaleInvalid( QString::fromStdString( val ) ); + if ( var == "Language" ) { + if ( val.size() != 5 ) { + // not a valid locale, keep the default + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errLangLocaleInvalid( QString::fromStdString( val ) ); + } else { + if ( val == "en_GB" || val == "es_ES" || val == "fr_FR" || val == "it_IT" || val == "ja_JP" || val == "pt_BR" ) { + this->language = val; } else { - if ( val == "en_GB" || val == "es_ES" || val == "fr_FR" || val == "it_IT" || val == "ja_JP" || val == "pt_BR" ) { - this->language = val; - } else { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errLangNotAccepted( QString::fromStdString( val ) ); - } - } - - } else if ( var == "RememberGeometry" ) { - try { - this->remember_window = this->s2b.at( val ); - } catch ( const std::exception& ) { invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errLangNotAccepted( QString::fromStdString( val ) ); } + } - } else if ( var == "Geometry" ) { - this->setGeometryFromString( val ); + } else if ( var == "RememberGeometry" ) { + try { + this->remember_window = this->s2b.at( val ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "WindowTheme" ) { - try { - GlobalConfigs::window_theme = static_cast( std::stoi( val ) ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "Geometry" ) { + this->setGeometryFromString( val ); - } else if ( var == "IconsTheme" ) { - try { - GlobalConfigs::icons_theme = static_cast( std::stoi( val ) ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "WindowTheme" ) { + try { + GlobalConfigs::window_theme = static_cast( std::stoi( val ) ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "ChartsTheme" ) { - try { - GlobalConfigs::charts_theme = static_cast( std::stoi( val ) ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "IconsTheme" ) { + try { + GlobalConfigs::icons_theme = static_cast( std::stoi( val ) ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "MainDialogsLevel" ) { - try { - this->setDialogsLevelFromString( val ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "ChartsTheme" ) { + try { + GlobalConfigs::charts_theme = static_cast( std::stoi( val ) ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "DefaultWebServer" ) { - try { - this->setWebServerFromString( val ); - } catch ( const GenericException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - TR::tr("Unexpected WebServer"), - QString::fromStdString( val ) ) ); - } + } else if ( var == "MainDialogsLevel" ) { + try { + this->setDialogsLevelFromString( val ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "DatabaseDataPath" ) { - this->db_data_path = this->resolvePath( val ); - if ( this->db_data_path.empty() ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "DefaultWebServer" ) { + try { + this->setWebServerFromString( val ); + } catch ( const GenericException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + TR::tr("Unexpected WebServer"), + QString::fromStdString( val ) ) ); + } - } else if ( var == "DatabaseHashesPath" ) { - this->db_hashes_path = this->resolvePath( val ); - if ( this->db_hashes_path.empty() ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "DatabaseDataPath" ) { + this->db_data_path = PathHandler( val ); - } else if ( var == "DatabaseDoBackup" ) { - try { - this->db_do_backup = this->s2b.at( val ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "DatabaseHashesPath" ) { + this->db_hashes_path = PathHandler( val ); - } else if ( var == "DatabaseBackupsNumber" ) { - try { - this->db_backups_number = std::stoi( val ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "DatabaseDoBackup" ) { + try { + this->db_do_backup = this->s2b.at( val ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "Font" ) { - try { - this->on_box_ConfTextBrowser_Font_currentIndexChanged( std::stoi( val ) ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "DatabaseBackupsNumber" ) { + try { + this->db_backups_number = std::stoi( val ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "WideLines" ) { - try { - this->TB.setWideLinesUsage( this->s2b.at( val ) ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "Font" ) { + try { + this->on_box_ConfTextBrowser_Font_currentIndexChanged( std::stoi( val ) ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "ColorScheme" ) { - try { - const int v{ std::stoi( val ) }; - GlobalConfigs::colors_scheme = static_cast( v ); - this->on_box_ConfTextBrowser_ColorScheme_currentIndexChanged( v ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "WideLines" ) { + try { + this->TB.setWideLinesUsage( this->s2b.at( val ) ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "CraplogDialogsLevel" ) { - try { - this->craplog.setDialogsLevel( this->dialogsLevelFromInt( std::stoi( val ) ) ); - } catch ( ... ) { // std::exception / GenericException - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "ColorScheme" ) { + try { + const int v{ std::stoi( val ) }; + GlobalConfigs::colors_scheme = static_cast( v ); + this->on_box_ConfTextBrowser_ColorScheme_currentIndexChanged( v ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "HideUsedFiles" ) { - try { - hide_used_files = this->s2b.at( val ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "CraplogDialogsLevel" ) { + try { + this->craplog.setDialogsLevel( this->dialogsLevelFromInt( std::stoi( val ) ) ); + } catch ( ... ) { // std::exception / GenericException + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "WarningSize" ) { - try { - this->craplog.setWarningSize( std::stoul( val ) ); - } catch ( const std::exception& ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "HideUsedFiles" ) { + try { + hide_used_files = this->s2b.at( val ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "ApacheLogsPath" ) { - this->craplog.setLogsPath( WS_APACHE, this->resolvePath( val ) ); - if ( this->craplog.getLogsPath( WS_APACHE ).empty() ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "WarningSize" ) { + try { + this->craplog.setWarningSize( std::stoul( val ) ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "ApacheLogsFormat" ) { - if ( ! this->craplog.setApacheLogFormat( val ) ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "ApacheLogsPath" ) { + this->craplog.setLogsPath( WS_APACHE, PathHandler( val ) ); - } else if ( var == "ApacheWarnlistMethod" ) { - try { - this->warnlists.setList( WS_APACHE, WarnlistField::Method, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Apache -> %1 (%2)").arg( - TR::tr(FIELDS__METHOD.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "ApacheLogsFormat" ) { + if ( ! this->craplog.setApacheLogFormat( val ) ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "ApacheWarnlistMethodUsed" ) { - this->warnlists.setUsed( WS_APACHE, WarnlistField::Method, this->s2b.at( val ) ); + } else if ( var == "ApacheWarnlistMethod" ) { + try { + this->warnlists.setList( WS_APACHE, WarnlistField::Method, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Apache -> %1 (%2)").arg( + TR::tr(FIELDS__METHOD.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "ApacheWarnlistURI" ) { - try { - this->warnlists.setList( WS_APACHE, WarnlistField::Uri, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Apache -> %1 (%2)").arg( - TR::tr(FIELDS__URI.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "ApacheWarnlistMethodUsed" ) { + this->warnlists.setUsed( WS_APACHE, WarnlistField::Method, this->s2b.at( val ) ); - } else if ( var == "ApacheWarnlistURIUsed" ) { - this->warnlists.setUsed( WS_APACHE, WarnlistField::Uri, this->s2b.at( val ) ); + } else if ( var == "ApacheWarnlistURI" ) { + try { + this->warnlists.setList( WS_APACHE, WarnlistField::Uri, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Apache -> %1 (%2)").arg( + TR::tr(FIELDS__URI.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "ApacheWarnlistClient" ) { - try { - this->warnlists.setList( WS_APACHE, WarnlistField::Client, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Apache -> %1 (%2)").arg( - TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "ApacheWarnlistURIUsed" ) { + this->warnlists.setUsed( WS_APACHE, WarnlistField::Uri, this->s2b.at( val ) ); - } else if ( var == "ApacheWarnlistClientUsed" ) { - this->warnlists.setUsed( WS_APACHE, WarnlistField::Client, this->s2b.at( val ) ); + } else if ( var == "ApacheWarnlistClient" ) { + try { + this->warnlists.setList( WS_APACHE, WarnlistField::Client, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Apache -> %1 (%2)").arg( + TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "ApacheWarnlistUserAgent" ) { - try { - this->warnlists.setList( WS_APACHE, WarnlistField::UserAgent, this->string2list( val, true ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Apache -> %1 (%2)").arg( - TR::tr(FIELDS__USER_AGENT.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "ApacheWarnlistClientUsed" ) { + this->warnlists.setUsed( WS_APACHE, WarnlistField::Client, this->s2b.at( val ) ); - } else if ( var == "ApacheWarnlistUserAgentUsed" ) { - this->warnlists.setUsed( WS_APACHE, WarnlistField::UserAgent, this->s2b.at( val ) ); + } else if ( var == "ApacheWarnlistUserAgent" ) { + try { + this->warnlists.setList( WS_APACHE, WarnlistField::UserAgent, this->string2list( val, true ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Apache -> %1 (%2)").arg( + TR::tr(FIELDS__USER_AGENT.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "ApacheBlacklistClient" ) { - try { - this->blacklists.setList( WS_APACHE, BlacklistField::Client, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Apache -> %1 (%2)").arg( - TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("blacklist") ) ) ); - } + } else if ( var == "ApacheWarnlistUserAgentUsed" ) { + this->warnlists.setUsed( WS_APACHE, WarnlistField::UserAgent, this->s2b.at( val ) ); - } else if ( var == "ApacheBlacklistClientUsed" ) { - this->blacklists.setUsed( WS_APACHE, BlacklistField::Client, this->s2b.at( val ) ); + } else if ( var == "ApacheBlacklistClient" ) { + try { + this->blacklists.setList( WS_APACHE, BlacklistField::Client, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Apache -> %1 (%2)").arg( + TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("blacklist") ) ) ); + } - } else if ( var == "NginxLogsPath" ) { - this->craplog.setLogsPath( WS_NGINX, this->resolvePath( val ) ); - if ( this->craplog.getLogsPath( WS_NGINX ).empty() ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "ApacheBlacklistClientUsed" ) { + this->blacklists.setUsed( WS_APACHE, BlacklistField::Client, this->s2b.at( val ) ); - } else if ( var == "NginxLogsFormat" ) { - if ( ! this->craplog.setNginxLogFormat( val ) ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "NginxLogsPath" ) { + this->craplog.setLogsPath( WS_NGINX, PathHandler( val ) ); - } else if ( var == "NginxWarnlistMethod" ) { - try { - this->warnlists.setList( WS_NGINX, WarnlistField::Method, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Nginx -> %1 (%2)").arg( - TR::tr(FIELDS__METHOD.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "NginxLogsFormat" ) { + if ( ! this->craplog.setNginxLogFormat( val ) ) { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "NginxWarnlistMethodUsed" ) { - this->warnlists.setUsed( WS_NGINX, WarnlistField::Method, this->s2b.at( val ) ); + } else if ( var == "NginxWarnlistMethod" ) { + try { + this->warnlists.setList( WS_NGINX, WarnlistField::Method, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Nginx -> %1 (%2)").arg( + TR::tr(FIELDS__METHOD.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "NginxWarnlistURI" ) { - try { - this->warnlists.setList( WS_NGINX, WarnlistField::Uri, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Nginx -> %1 (%2)").arg( - TR::tr(FIELDS__URI.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "NginxWarnlistMethodUsed" ) { + this->warnlists.setUsed( WS_NGINX, WarnlistField::Method, this->s2b.at( val ) ); - } else if ( var == "NginxWarnlistURIUsed" ) { - this->warnlists.setUsed( WS_NGINX, WarnlistField::Uri, this->s2b.at( val ) ); + } else if ( var == "NginxWarnlistURI" ) { + try { + this->warnlists.setList( WS_NGINX, WarnlistField::Uri, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Nginx -> %1 (%2)").arg( + TR::tr(FIELDS__URI.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "NginxWarnlistClient" ) { - try { - this->warnlists.setList( WS_NGINX, WarnlistField::Client, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Nginx -> %1 (%2)").arg( - TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "NginxWarnlistURIUsed" ) { + this->warnlists.setUsed( WS_NGINX, WarnlistField::Uri, this->s2b.at( val ) ); - } else if ( var == "NginxWarnlistClientUsed" ) { - this->warnlists.setUsed( WS_NGINX, WarnlistField::Client, this->s2b.at( val ) ); + } else if ( var == "NginxWarnlistClient" ) { + try { + this->warnlists.setList( WS_NGINX, WarnlistField::Client, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Nginx -> %1 (%2)").arg( + TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "NginxWarnlistUserAgent" ) { - try { - this->warnlists.setList( WS_NGINX, WarnlistField::UserAgent, this->string2list( val, true ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Nginx -> %1 (%2)").arg( - TR::tr(FIELDS__USER_AGENT.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "NginxWarnlistClientUsed" ) { + this->warnlists.setUsed( WS_NGINX, WarnlistField::Client, this->s2b.at( val ) ); - } else if ( var == "NginxWarnlistUserAgentUsed" ) { - this->warnlists.setUsed( WS_NGINX, WarnlistField::UserAgent, this->s2b.at( val ) ); + } else if ( var == "NginxWarnlistUserAgent" ) { + try { + this->warnlists.setList( WS_NGINX, WarnlistField::UserAgent, this->string2list( val, true ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Nginx -> %1 (%2)").arg( + TR::tr(FIELDS__USER_AGENT.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "NginxBlacklistClient" ) { - try { - this->blacklists.setList( WS_NGINX, BlacklistField::Client, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("Nginx -> %1 (%2)").arg( - TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("blacklist") ) ) ); - } + } else if ( var == "NginxWarnlistUserAgentUsed" ) { + this->warnlists.setUsed( WS_NGINX, WarnlistField::UserAgent, this->s2b.at( val ) ); - } else if ( var == "NginxBlacklistClientUsed" ) { - this->blacklists.setUsed( WS_NGINX, BlacklistField::Client, this->s2b.at( val ) ); + } else if ( var == "NginxBlacklistClient" ) { + try { + this->blacklists.setList( WS_NGINX, BlacklistField::Client, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("Nginx -> %1 (%2)").arg( + TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("blacklist") ) ) ); + } - } else if ( var == "IisLogsPath" ) { - this->craplog.setLogsPath( WS_IIS, this->resolvePath( val ) ); - if ( this->craplog.getLogsPath( WS_IIS ).empty() ) { - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "NginxBlacklistClientUsed" ) { + this->blacklists.setUsed( WS_NGINX, BlacklistField::Client, this->s2b.at( val ) ); - } else if ( var == "IisLogsModule" ) { - if ( val == "0" ) { - this->ui->radio_ConfIis_Format_W3C->setChecked( true ); - if ( ! iis_format_w3c.empty() ) { - apply_iis_format( line, iis_format_w3c, IISLogsModule::W3C ); - } - } else if ( val == "1" ) { + } else if ( var == "IisLogsPath" ) { + this->craplog.setLogsPath( WS_IIS, PathHandler( val ) ); + + } else if ( var == "IisLogsModule" ) { + if ( val == "0" ) { + this->ui->radio_ConfIis_Format_W3C->setChecked( true ); + if ( ! iis_format_w3c.empty() ) { + apply_iis_format( line, iis_format_w3c, IISLogsModule::W3C ); + } + } else if ( val == "1" ) { + iis_format_w3c.clear(); + this->ui->radio_ConfIis_Format_NCSA->setChecked( true ); + apply_iis_format( line, iis_format_ncsa, IISLogsModule::NCSA ); + } else if ( val == "2" ) { + iis_format_w3c.clear(); + this->ui->radio_ConfIis_Format_IIS->setChecked( true ); + apply_iis_format( line, iis_format_iis, IISLogsModule::IIS ); + } else { + invalid_lines.append( QString::fromStdString( line ) ); + iis_module_set &= false; + continue; + } + iis_module_set |= true; + + } else if ( var == "IisLogsFormat" ) { + iis_format_w3c = val; + if ( iis_module_set ) { + if ( this->ui->radio_ConfIis_Format_W3C->isChecked() ) { + apply_iis_format( line, iis_format_w3c, IISLogsModule::W3C ); + } else if ( this->ui->radio_ConfIis_Format_NCSA->isChecked() ) { iis_format_w3c.clear(); - this->ui->radio_ConfIis_Format_NCSA->setChecked( true ); apply_iis_format( line, iis_format_ncsa, IISLogsModule::NCSA ); - } else if ( val == "2" ) { + } else if ( this->ui->radio_ConfIis_Format_IIS->isChecked() ) { iis_format_w3c.clear(); - this->ui->radio_ConfIis_Format_IIS->setChecked( true ); apply_iis_format( line, iis_format_iis, IISLogsModule::IIS ); } else { - invalid_lines.append( QString::fromStdString( line ) ); - iis_module_set &= false; - continue; - } - iis_module_set |= true; - - } else if ( var == "IisLogsFormat" ) { - iis_format_w3c = val; - if ( iis_module_set ) { - if ( this->ui->radio_ConfIis_Format_W3C->isChecked() ) { - apply_iis_format( line, iis_format_w3c, IISLogsModule::W3C ); - } else if ( this->ui->radio_ConfIis_Format_NCSA->isChecked() ) { - iis_format_w3c.clear(); - apply_iis_format( line, iis_format_ncsa, IISLogsModule::NCSA ); - } else if ( this->ui->radio_ConfIis_Format_IIS->isChecked() ) { - iis_format_w3c.clear(); - apply_iis_format( line, iis_format_iis, IISLogsModule::IIS ); - } else { - // ... wtf? - throw("No radio button checked for the IIS logs module"); - } + // ... wtf? + throw("No radio button checked for the IIS logs module"); } + } - } else if ( var == "IisWarnlistMethod" ) { - try { - this->warnlists.setList( WS_IIS, WarnlistField::Method, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("IIS -> %1 (%2)").arg( - TR::tr(FIELDS__METHOD.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "IisWarnlistMethod" ) { + try { + this->warnlists.setList( WS_IIS, WarnlistField::Method, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("IIS -> %1 (%2)").arg( + TR::tr(FIELDS__METHOD.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "IisWarnlistMethodUsed" ) { - this->warnlists.setUsed( WS_IIS, WarnlistField::Method, this->s2b.at( val ) ); + } else if ( var == "IisWarnlistMethodUsed" ) { + this->warnlists.setUsed( WS_IIS, WarnlistField::Method, this->s2b.at( val ) ); - } else if ( var == "IisWarnlistURI" ) { - try { - this->warnlists.setList( WS_IIS, WarnlistField::Uri, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("IIS -> %1 (%2)").arg( - TR::tr(FIELDS__URI.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "IisWarnlistURI" ) { + try { + this->warnlists.setList( WS_IIS, WarnlistField::Uri, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("IIS -> %1 (%2)").arg( + TR::tr(FIELDS__URI.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "IisWarnlistURIUsed" ) { - this->warnlists.setUsed( WS_IIS, WarnlistField::Uri, this->s2b.at( val ) ); + } else if ( var == "IisWarnlistURIUsed" ) { + this->warnlists.setUsed( WS_IIS, WarnlistField::Uri, this->s2b.at( val ) ); - } else if ( var == "IisWarnlistClient" ) { - try { - this->warnlists.setList( WS_IIS, WarnlistField::Client, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("IIS -> %1 (%2)").arg( - TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "IisWarnlistClient" ) { + try { + this->warnlists.setList( WS_IIS, WarnlistField::Client, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("IIS -> %1 (%2)").arg( + TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "IisWarnlistClientUsed" ) { - this->warnlists.setUsed( WS_IIS, WarnlistField::Client, this->s2b.at( val ) ); + } else if ( var == "IisWarnlistClientUsed" ) { + this->warnlists.setUsed( WS_IIS, WarnlistField::Client, this->s2b.at( val ) ); - } else if ( var == "IisWarnlistUserAgent" ) { - try { - this->warnlists.setList( WS_IIS, WarnlistField::UserAgent, this->string2list( val, true ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("IIS -> %1 (%2)").arg( - TR::tr(FIELDS__USER_AGENT.c_str()), MainWindow::tr("warnlist") ) ) ); - } + } else if ( var == "IisWarnlistUserAgent" ) { + try { + this->warnlists.setList( WS_IIS, WarnlistField::UserAgent, this->string2list( val, true ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("IIS -> %1 (%2)").arg( + TR::tr(FIELDS__USER_AGENT.c_str()), MainWindow::tr("warnlist") ) ) ); + } - } else if ( var == "IisWarnlistUserAgentUsed" ) { - this->warnlists.setUsed( WS_IIS, WarnlistField::UserAgent, this->s2b.at( val ) ); + } else if ( var == "IisWarnlistUserAgentUsed" ) { + this->warnlists.setUsed( WS_IIS, WarnlistField::UserAgent, this->s2b.at( val ) ); - } else if ( var == "IisBlacklistClient" ) { - try { - this->blacklists.setList( WS_IIS, BlacklistField::Client, this->string2list( val ) ); - } catch ( const BWlistException& ) { - invalid_lines.append( QString::fromStdString( line ) ); - DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( - DialogSec::tr("One of the lists has an invalid item"), - QStringLiteral("IIS -> %1 (%2)").arg( - TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("blacklist") ) ) ); - } - - } else if ( var == "IisBlacklistClientUsed" ) { - this->blacklists.setUsed( WS_IIS, BlacklistField::Client, this->s2b.at( val ) ); + } else if ( var == "IisBlacklistClient" ) { + try { + this->blacklists.setList( WS_IIS, BlacklistField::Client, this->string2list( val ) ); + } catch ( const BWlistException& ) { + invalid_lines.append( QString::fromStdString( line ) ); + DialogSec::errFailedApplyingConfigsItem( QStringLiteral("%1:\n%2").arg( + DialogSec::tr("One of the lists has an invalid item"), + QStringLiteral("IIS -> %1 (%2)").arg( + TR::tr(FIELDS__CLIENT.c_str()), MainWindow::tr("blacklist") ) ) ); + } - } else if ( var == "CrapviewDialogsLevel" ) { - try { - this->crapview.setDialogsLevel( this->dialogsLevelFromInt( std::stoi( val ) ) ); - } catch ( ... ) { // std::exception / GenericException - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "IisBlacklistClientUsed" ) { + this->blacklists.setUsed( WS_IIS, BlacklistField::Client, this->s2b.at( val ) ); - } else if ( var == "CrapviewSpeedTimeInterval" ) { - try { - const qint64 value{ std::stoll( val ) }; - if ( const int index{this->ui->box_ConfCharts_Speed_TimeInterval->findText( QString::fromStdString( val ) )}; index >= 0 ) { - this->crapview.setSpeedTimeInterval( value ); - } else { - invalid_lines.append( QString::fromStdString( line ) ); - } - } catch ( ... ) { // std::exception - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "CrapviewDialogsLevel" ) { + try { + this->crapview.setDialogsLevel( this->dialogsLevelFromInt( std::stoi( val ) ) ); + } catch ( ... ) { // std::exception / GenericException + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "CrapviewSpeedTimeFormat" ) { - if ( val == "hh:mm" || val == "hh" ) { - this->crapview.setSpeedTimeFormat( QString::fromStdString( val ) ); + } else if ( var == "CrapviewSpeedTimeInterval" ) { + try { + const qint64 value{ std::stoll( val ) }; + if ( const int index{this->ui->box_ConfCharts_Speed_TimeInterval->findText( QString::fromStdString( val ) )}; index >= 0 ) { + this->crapview.setSpeedTimeInterval( value ); } else { invalid_lines.append( QString::fromStdString( line ) ); } + } catch ( ... ) { // std::exception + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "CrapviewCountPieSize" ) { - try { - const qreal value{ std::stod( val ) }; - if ( value >= 0.6 && value <= 0.8 ) { - this->crapview.setCountPieSize( value ); - } else { - invalid_lines.append( QString::fromStdString( line ) ); - } - } catch ( ... ) { // std::exception - invalid_lines.append( QString::fromStdString( line ) ); - } + } else if ( var == "CrapviewSpeedTimeFormat" ) { + if ( val == "hh:mm" || val == "hh" ) { + this->crapview.setSpeedTimeFormat( QString::fromStdString( val ) ); + } else { + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "CrapviewCountMaxSlices" ) { - try { - const int value{ std::stoi( val ) }; - if ( value >= 1 && value <= 31 ) { - this->crapview.setCountMaxSlices( value ); - } else { - invalid_lines.append( QString::fromStdString( line ) ); - } - } catch ( ... ) { // std::exception + } else if ( var == "CrapviewCountPieSize" ) { + try { + const qreal value{ std::stod( val ) }; + if ( value >= 0.6 && value <= 0.8 ) { + this->crapview.setCountPieSize( value ); + } else { invalid_lines.append( QString::fromStdString( line ) ); } + } catch ( ... ) { // std::exception + invalid_lines.append( QString::fromStdString( line ) ); + } - } else if ( var == "CrapviewRelationalTimeFormat" ) { - if ( val == "hh:mm" || val == "hh" ) { - this->crapview.setRelatTimeFormat( QString::fromStdString( val ) ); + } else if ( var == "CrapviewCountMaxSlices" ) { + try { + const int value{ std::stoi( val ) }; + if ( value >= 1 && value <= 31 ) { + this->crapview.setCountMaxSlices( value ); } else { invalid_lines.append( QString::fromStdString( line ) ); } + } catch ( ... ) { // std::exception + invalid_lines.append( QString::fromStdString( line ) ); + } - }/* else { - // not valid - }*/ - } + } else if ( var == "CrapviewRelationalTimeFormat" ) { + if ( val == "hh:mm" || val == "hh" ) { + this->crapview.setRelatTimeFormat( QString::fromStdString( val ) ); + } else { + invalid_lines.append( QString::fromStdString( line ) ); + } - } catch ( const std::ios_base::failure& ) { - // failed reading - proceed &= false; - invalid_lines.clear(); - err_msg = DialogSec::tr("An error occured while reading the configuration file"); - } catch ( const LogDoctorException& ) { - // something failed - proceed &= false; - invalid_lines.clear(); - err_msg = DialogSec::tr("An error occured while parsing configuration file's data"); + }/* else { + // not valid + }*/ } - if ( ! invalid_lines.isEmpty() ) { - proceed &= false; - DialogSec::warnInvalidConfigsList( invalid_lines ); - err_msg = DialogSec::tr("An error occured while parsing configuration file's data"); - } - if ( ! proceed ) { - if ( ! DialogSec::choiceFailedApplyingConfigs( err_msg ) ) { - // choosed to abort - std::exit( 1 ); - } + } catch ( const std::ios_base::failure& ) { + // failed reading + proceed &= false; + invalid_lines.clear(); + err_msg = DialogSec::tr("An error occured while reading the configuration file"); + } catch ( const LogDoctorException& ) { + // something failed + proceed &= false; + invalid_lines.clear(); + err_msg = DialogSec::tr("An error occured while parsing configuration file's data"); + } + + if ( ! invalid_lines.isEmpty() ) { + proceed &= false; + DialogSec::warnInvalidConfigsList( invalid_lines ); + err_msg = DialogSec::tr("An error occured while parsing configuration file's data"); + } + if ( ! proceed ) { + if ( ! DialogSec::choiceFailedApplyingConfigs( err_msg ) ) { + // choosed to abort + std::exit( 1 ); } } } @@ -938,286 +923,329 @@ void MainWindow::readConfigs() void MainWindow::writeConfigs() { std::error_code err; - bool proceed{true}, msg_shown{false}; + bool proceed{true}; QString msg, err_msg; - // check the file first - if ( IOutils::exists( this->configs_path ) ) { - if ( IOutils::checkFile( this->configs_path ) ) { - if ( ! IOutils::checkFile( this->configs_path, false, true ) ) { - // file not writable, try to assign permissions - std::filesystem::permissions( this->configs_path, - std::filesystem::perms::owner_write, - std::filesystem::perm_options::add, - err ); - if ( err.value() ) { - proceed &= false; + + if ( const auto path_exp{ this->configs_path.getPath() }; + !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + const auto& invalid{ path_exp.error() }; + QString invalid_component; + if ( this->dialogs_level > DL_ESSENTIAL ) { + invalid_component = QString( invalid.full_path.c_str() ); + } + DialogSec::errConfPathHasSymlink( QString( invalid.full_path.c_str() ), invalid_component ); + proceed &= false; + } else { + const path_t& conf_file{ this->configs_path.getPathUnchecked() }; + if ( IOutils::exists( conf_file ) ) { + if ( IOutils::checkFile( conf_file ) ) { + if ( ! IOutils::checkFile( conf_file, false, true ) ) { + // file not writable QString file; if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString::fromStdString( this->configs_path ); - err_msg = QString::fromStdString( err.message() ); + file = QString( conf_file.c_str() ); } DialogSec::errConfFileNotWritable( file, err_msg ); - msg_shown |= true; + return; } - } - } else { - // the given path doesn't point to a file - proceed = DialogSec::choiceFileNotFile( QString::fromStdString( this->configs_path ) ); - if ( proceed ) { - proceed = IOutils::renameAsCopy( this->configs_path, err ); - if ( ! proceed ) { - QString path; - if ( this->dialogs_level > DL_ESSENTIAL ) { - path = QString::fromStdString( this->configs_path ); - if ( err.value() ) { + } else { + // the given path doesn't point to a file + const QString path_msg{ conf_file.c_str() }; + if ( DialogSec::choiceFileNotFile( path_msg ) ) { + if ( ! IOutils::renameAsCopy( conf_file, err ) ) { + if ( this->dialogs_level > DL_ESSENTIAL ) { err_msg = QString::fromStdString( err.message() ); } + DialogSec::errRenaming( path_msg, err_msg ); + return; } - DialogSec::errRenaming( path, err_msg ); - msg_shown |= true; + } else { + // choosed not to rename the entry as '.copy' + msg = DialogSec::tr("Failed to create the configuration file"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path_msg ); + } + proceed &= false; } } - } - } else { - // file does not exists, check if at least the folder exists - const std::string base_path{ this->parentPath( this->configs_path ) }; - if ( IOutils::exists( base_path ) ) { - if ( IOutils::isDir( base_path ) ) { - if ( ! IOutils::checkDir( base_path, false, true ) ) { - // directory not writable, try to assign permissions - std::filesystem::permissions( base_path, - std::filesystem::perms::owner_write, - std::filesystem::perm_options::add, - err ); - if ( err.value() ) { - proceed &= false; + } else { + // file does not exists, check if at least the folder exists + const auto base_path{ this->configs_path.getParentUnchecked() }; + if ( IOutils::exists( base_path ) ) { + if ( IOutils::isDir( base_path ) ) { + if ( ! IOutils::checkDir( base_path, false, true ) ) { QString file; if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString::fromStdString( base_path ); - err_msg = QString::fromStdString( err.message() ); + file = QString( base_path.c_str() ); } DialogSec::errConfDirNotWritable( file, err_msg ); - msg_shown |= true; + proceed &= false; } - } - } else { - // not a directory - proceed = DialogSec::choiceDirNotDir( QString::fromStdString( base_path ) ); - if ( proceed ) { - proceed = IOutils::renameAsCopy( base_path, err ); - if ( ! proceed ) { - QString path; - if ( this->dialogs_level > DL_ESSENTIAL ) { - path = QString::fromStdString( base_path ); - err_msg = QString::fromStdString( err.message() ); - } - DialogSec::errRenaming( path, err_msg ); - msg_shown |= true; - } else { - // make the new folder - proceed = IOutils::makeDir( base_path, err ); - if ( ! proceed ) { - msg = DialogSec::tr("Failed to create the configuration file's directory"); + } else { + // not a directory + const QString path_msg{ base_path.c_str() }; + if ( DialogSec::choiceDirNotDir( path_msg ) ) { + if ( ! IOutils::renameAsCopy( base_path, err ) ) { if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += ":\n"+QString::fromStdString( base_path ); err_msg = QString::fromStdString( err.message() ); } + DialogSec::errRenaming( path_msg, err_msg ); + proceed &= false; + } else { + // make the new folder + if ( ! IOutils::makeDir( base_path, err ) ) { + msg = DialogSec::tr("Failed to create the configuration file's directory"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path_msg ); + err_msg = QString::fromStdString( err.message() ); + } + proceed &= false; + } + } + } else { + // choosed not to rename the entry as '.copy' + msg = DialogSec::tr("Failed to create the configuration file"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path_msg ); } + proceed &= false; } } - } - } else { - // the folder does not exist too - proceed = IOutils::makeDir( base_path, err ); - if ( ! proceed ) { - msg = DialogSec::tr("Failed to create the configuration file's directory"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += ":\n"+QString::fromStdString( base_path ); - err_msg = QString::fromStdString( err.message() ); + } else { + // the configs folder does not exist too + if ( ! IOutils::makeDir( base_path, err ) ) { + msg = DialogSec::tr("Failed to create the configuration file's directory"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( base_path.c_str() ); + err_msg = QString::fromStdString( err.message() ); + } + proceed &= false; } } } } - if ( !proceed && !msg_shown ) { + if ( !proceed ) { DialogSec::errConfFailedWriting( msg, err_msg ); + return; } - if ( proceed ) { - //// USER INTERFACE //// - std::string configs; - configs += "\n\n[UI]"; - configs += "\nLanguage=" + this->language; - configs += "\nRememberGeometry=" + this->b2s.at( this->remember_window ); - configs += "\nGeometry=" + this->geometryToString(); - configs += "\nWindowTheme=" + std::to_string( static_cast(GlobalConfigs::window_theme) ); - configs += "\nIconsTheme=" + std::to_string( static_cast(GlobalConfigs::icons_theme) ); - configs += "\nChartsTheme=" + std::to_string( static_cast(GlobalConfigs::charts_theme) ); - configs += "\nMainDialogsLevel=" + toString( this->dialogs_level ); - configs += "\nDefaultWebServer=" + toString( this->default_web_server ); - configs += "\nDatabaseDataPath=" + this->db_data_path; - configs += "\nDatabaseHashesPath=" + this->db_hashes_path; - configs += "\nDatabaseDoBackup=" + this->b2s.at( this->db_do_backup ); - configs += "\nDatabaseBackupsNumber=" + std::to_string( this->db_backups_number ); - //// TEXT BROWSER //// - configs += "\n\n[TextBrowser]"; - configs += "\nFont=" + std::to_string( this->ui->box_ConfTextBrowser_Font->currentIndex() ); - configs += "\nWideLines=" + this->b2s.at( this->TB.getWideLinesUsage() ); - configs += "\nColorScheme=" + std::to_string( static_cast(GlobalConfigs::colors_scheme) ); - //// CRAPLOG //// - configs += "\n\n[Craplog]"; - configs += "\nCraplogDialogsLevel=" + toString( this->craplog.getDialogsLevel() ); - configs += "\nHideUsedFiles=" + this->b2s.at( this->hide_used_files ); - configs += "\nWarningSize=" + std::to_string( this->craplog.getWarningSize() ); - //// APACHE2 //// - configs += "\n\n[Apache2]"; - configs += "\nApacheLogsPath=" + this->craplog.getLogsPath( WS_APACHE ); - configs += "\nApacheLogsFormat=" + this->craplog.getLogsFormatString( WS_APACHE ); - configs += "\nApacheWarnlistMethod=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::Method ) ); - configs += "\nApacheWarnlistMethodUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::Method ) ); - configs += "\nApacheWarnlistURI=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::Uri ) ); - configs += "\nApacheWarnlistURIUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::Uri ) ); - configs += "\nApacheWarnlistClient=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::Client ) ); - configs += "\nApacheWarnlistClientUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::Client ) ); - configs += "\nApacheWarnlistUserAgent=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::UserAgent ), true ); - configs += "\nApacheWarnlistUserAgentUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::UserAgent ) ); - configs += "\nApacheBlacklistClient=" + this->list2string( this->blacklists.getListConst( WS_APACHE, BlacklistField::Client ) ); - configs += "\nApacheBlacklistClientUsed=" + this->b2s.at( this->blacklists.isUsed( WS_APACHE, BlacklistField::Client ) ); - //// NGINX //// - configs += "\n\n[Nginx]"; - configs += "\nNginxLogsPath=" + this->craplog.getLogsPath( WS_NGINX ); - configs += "\nNginxLogsFormat=" + this->craplog.getLogsFormatString( WS_NGINX ); - configs += "\nNginxWarnlistMethod=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::Method ) ); - configs += "\nNginxWarnlistMethodUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::Method ) ); - configs += "\nNginxWarnlistURI=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::Uri ) ); - configs += "\nNginxWarnlistURIUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::Uri ) ); - configs += "\nNginxWarnlistClient=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::Client ) ); - configs += "\nNginxWarnlistClientUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::Client ) ); - configs += "\nNginxWarnlistUserAgent=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::UserAgent ), true ); - configs += "\nNginxWarnlistUserAgentUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::UserAgent ) ); - configs += "\nNginxBlacklistClient=" + this->list2string( this->blacklists.getListConst( WS_NGINX, BlacklistField::Client ) ); - configs += "\nNginxBlacklistClientUsed=" + this->b2s.at( this->blacklists.isUsed( WS_NGINX, BlacklistField::Client ) ); - //// IIS //// - configs += "\n\n[IIS]"; - configs += "\nIisLogsPath=" + this->craplog.getLogsPath( WS_IIS ); - std::string module{ "0" }; - if ( this->ui->radio_ConfIis_Format_NCSA->isChecked() ) { - module = "1"; - } else if ( this->ui->radio_ConfIis_Format_IIS->isChecked() ) { - module = "2"; - } - configs += "\nIisLogsModule=" + module; - configs += "\nIisLogsFormat=" + this->craplog.getLogsFormatString( WS_IIS ); - configs += "\nIisWarnlistMethod=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::Method ) ); - configs += "\nIisWarnlistMethodUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::Method ) ); - configs += "\nIisWarnlistURI=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::Uri ) ); - configs += "\nIisWarnlistURIUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::Uri ) ); - configs += "\nIisWarnlistClient=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::Client ) ); - configs += "\nIisWarnlistClientUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::Client ) ); - configs += "\nIisWarnlistUserAgent=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::UserAgent ), true ); - configs += "\nIisWarnlistUserAgentUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::UserAgent ) ); - configs += "\nIisBlacklistClient=" + this->list2string( this->blacklists.getListConst( WS_IIS, BlacklistField::Client ) ); - configs += "\nIisBlacklistClientUsed=" + this->b2s.at( this->blacklists.isUsed( WS_IIS, BlacklistField::Client ) ); - //// CRAPVIEW //// - configs += "\n\n[Crapview]"; - configs += "\nCrapviewDialogsLevel=" + toString( this->crapview.getDialogsLevel() ); - configs += "\nCrapviewSpeedTimeInterval=" + std::to_string( this->crapview.getSpeedTimeInterval() ); - configs += "\nCrapviewSpeedTimeFormat=" + this->crapview.getSpeedTimeFormat().toStdString(); - configs += "\nCrapviewCountPieSize=" + std::to_string( this->crapview.getCountPieSize() ); - configs += "\nCrapviewCountMaxSlices=" + std::to_string( this->crapview.getCountMaxSlices() ); - configs += "\nCrapviewRelationalTimeFormat=" + this->crapview.getRelatTimeFormat().toStdString(); - - // write on file - try { - IOutils::writeOnFile( this->configs_path, configs ); - - } catch ( const std::ios_base::failure&/* err*/ ) { - // failed writing - DialogSec::errGeneric( DialogSec::tr("An error occured while writing the configuration file") ); - } catch (...) { - // something failed - DialogSec::errGeneric( DialogSec::tr("An error occured while preparing the configuration file's data") ); - } + //// USER INTERFACE //// + std::string configs; + configs += "\n\n[UI]"; + configs += "\nLanguage=" + this->language; + configs += "\nRememberGeometry=" + this->b2s.at( this->remember_window ); + configs += "\nGeometry=" + this->geometryToString(); + configs += "\nWindowTheme=" + std::to_string( static_cast(GlobalConfigs::window_theme) ); + configs += "\nIconsTheme=" + std::to_string( static_cast(GlobalConfigs::icons_theme) ); + configs += "\nChartsTheme=" + std::to_string( static_cast(GlobalConfigs::charts_theme) ); + configs += "\nMainDialogsLevel=" + toString( this->dialogs_level ); + configs += "\nDefaultWebServer=" + toString( this->default_web_server ); + configs += "\nDatabaseDataPath=" + this->db_data_path.toString(); + configs += "\nDatabaseHashesPath=" + this->db_hashes_path.toString(); + configs += "\nDatabaseDoBackup=" + this->b2s.at( this->db_do_backup ); + configs += "\nDatabaseBackupsNumber=" + std::to_string( this->db_backups_number ); + //// TEXT BROWSER //// + configs += "\n\n[TextBrowser]"; + configs += "\nFont=" + std::to_string( this->ui->box_ConfTextBrowser_Font->currentIndex() ); + configs += "\nWideLines=" + this->b2s.at( this->TB.getWideLinesUsage() ); + configs += "\nColorScheme=" + std::to_string( static_cast(GlobalConfigs::colors_scheme) ); + //// CRAPLOG //// + configs += "\n\n[Craplog]"; + configs += "\nCraplogDialogsLevel=" + toString( this->craplog.getDialogsLevel() ); + configs += "\nHideUsedFiles=" + this->b2s.at( this->hide_used_files ); + configs += "\nWarningSize=" + std::to_string( this->craplog.getWarningSize() ); + //// APACHE2 //// + configs += "\n\n[Apache2]"; + configs += "\nApacheLogsPath=" + this->craplog.getLogsPath( WS_APACHE ).getPathUnchecked().string(); + configs += "\nApacheLogsFormat=" + this->craplog.getLogsFormatString( WS_APACHE ); + configs += "\nApacheWarnlistMethod=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::Method ) ); + configs += "\nApacheWarnlistMethodUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::Method ) ); + configs += "\nApacheWarnlistURI=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::Uri ) ); + configs += "\nApacheWarnlistURIUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::Uri ) ); + configs += "\nApacheWarnlistClient=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::Client ) ); + configs += "\nApacheWarnlistClientUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::Client ) ); + configs += "\nApacheWarnlistUserAgent=" + this->list2string( this->warnlists.getListConst( WS_APACHE, WarnlistField::UserAgent ), true ); + configs += "\nApacheWarnlistUserAgentUsed=" + this->b2s.at( this->warnlists.isUsed( WS_APACHE, WarnlistField::UserAgent ) ); + configs += "\nApacheBlacklistClient=" + this->list2string( this->blacklists.getListConst( WS_APACHE, BlacklistField::Client ) ); + configs += "\nApacheBlacklistClientUsed=" + this->b2s.at( this->blacklists.isUsed( WS_APACHE, BlacklistField::Client ) ); + //// NGINX //// + configs += "\n\n[Nginx]"; + configs += "\nNginxLogsPath=" + this->craplog.getLogsPath( WS_NGINX ).getPathUnchecked().string(); + configs += "\nNginxLogsFormat=" + this->craplog.getLogsFormatString( WS_NGINX ); + configs += "\nNginxWarnlistMethod=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::Method ) ); + configs += "\nNginxWarnlistMethodUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::Method ) ); + configs += "\nNginxWarnlistURI=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::Uri ) ); + configs += "\nNginxWarnlistURIUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::Uri ) ); + configs += "\nNginxWarnlistClient=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::Client ) ); + configs += "\nNginxWarnlistClientUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::Client ) ); + configs += "\nNginxWarnlistUserAgent=" + this->list2string( this->warnlists.getListConst( WS_NGINX, WarnlistField::UserAgent ), true ); + configs += "\nNginxWarnlistUserAgentUsed=" + this->b2s.at( this->warnlists.isUsed( WS_NGINX, WarnlistField::UserAgent ) ); + configs += "\nNginxBlacklistClient=" + this->list2string( this->blacklists.getListConst( WS_NGINX, BlacklistField::Client ) ); + configs += "\nNginxBlacklistClientUsed=" + this->b2s.at( this->blacklists.isUsed( WS_NGINX, BlacklistField::Client ) ); + //// IIS //// + configs += "\n\n[IIS]"; + configs += "\nIisLogsPath=" + this->craplog.getLogsPath( WS_IIS ).getPathUnchecked().string(); + std::string module{ "0" }; + if ( this->ui->radio_ConfIis_Format_NCSA->isChecked() ) { + module = "1"; + } else if ( this->ui->radio_ConfIis_Format_IIS->isChecked() ) { + module = "2"; + } + configs += "\nIisLogsModule=" + module; + configs += "\nIisLogsFormat=" + this->craplog.getLogsFormatString( WS_IIS ); + configs += "\nIisWarnlistMethod=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::Method ) ); + configs += "\nIisWarnlistMethodUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::Method ) ); + configs += "\nIisWarnlistURI=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::Uri ) ); + configs += "\nIisWarnlistURIUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::Uri ) ); + configs += "\nIisWarnlistClient=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::Client ) ); + configs += "\nIisWarnlistClientUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::Client ) ); + configs += "\nIisWarnlistUserAgent=" + this->list2string( this->warnlists.getListConst( WS_IIS, WarnlistField::UserAgent ), true ); + configs += "\nIisWarnlistUserAgentUsed=" + this->b2s.at( this->warnlists.isUsed( WS_IIS, WarnlistField::UserAgent ) ); + configs += "\nIisBlacklistClient=" + this->list2string( this->blacklists.getListConst( WS_IIS, BlacklistField::Client ) ); + configs += "\nIisBlacklistClientUsed=" + this->b2s.at( this->blacklists.isUsed( WS_IIS, BlacklistField::Client ) ); + //// CRAPVIEW //// + configs += "\n\n[Crapview]"; + configs += "\nCrapviewDialogsLevel=" + toString( this->crapview.getDialogsLevel() ); + configs += "\nCrapviewSpeedTimeInterval=" + std::to_string( this->crapview.getSpeedTimeInterval() ); + configs += "\nCrapviewSpeedTimeFormat=" + this->crapview.getSpeedTimeFormat().toStdString(); + configs += "\nCrapviewCountPieSize=" + std::to_string( this->crapview.getCountPieSize() ); + configs += "\nCrapviewCountMaxSlices=" + std::to_string( this->crapview.getCountMaxSlices() ); + configs += "\nCrapviewRelationalTimeFormat=" + this->crapview.getRelatTimeFormat().toStdString(); + + try { + IOutils::writeOnFile( this->configs_path.getPath().value(), configs ); + + } catch ( const std::bad_expected_access& /*err*/ ) { + // invalid path + DialogSec::errGeneric( DialogSec::tr("An error occured while writing the configuration file") ); + } catch ( const std::ios_base::failure& /*err*/ ) { + // failed writing + DialogSec::errGeneric( DialogSec::tr("An error occured while writing the configuration file") ); + } catch (...) { + // something failed + DialogSec::errGeneric( DialogSec::tr("An error occured while preparing the configuration file's data") ); } } void MainWindow::backupDatabase() const { - bool proceed{ true }; std::error_code err; QString err_msg; - if ( IOutils::checkFile( this->db_data_path+"/"+DatabasesNames::data ) ) { - // db exists and is a file - const std::string path{ this->db_data_path+"/backups" }; - if ( std::filesystem::exists( path ) ) { - if ( !std::filesystem::is_directory( path, err ) ) { - // exists but it's not a directory, rename as copy and make a new one - proceed = DialogSec::choiceDirNotDir( QString::fromStdString( path ) ); - if ( proceed ) { - proceed = IOutils::renameAsCopy( path, err ); - if ( ! proceed ) { - QString p; - if ( this->dialogs_level > DL_ESSENTIAL ) { - p = QString::fromStdString( path ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errRenaming( p, err_msg ); - } else { - // sucesfully renamed, make the new one - proceed = IOutils::makeDir( path, err ); - if ( ! proceed ) { - QString msg = DialogSec::tr("Failed to create the database backups' directory"); + const PathHandler db_path{ this->db_data_path / std::string(DatabasesNames::data) }; + const auto path_exp{ db_path.getPath() }; + if ( ! path_exp.has_value() ) { + if ( const auto invalid{ path_exp.error() }; invalid.isReasonSymlink() ) { + QString invalid_component; + if ( this->dialogs_level > DL_ESSENTIAL ) { + invalid_component = QString( invalid.full_path.c_str() ); + } + DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), invalid_component, false ); + return; + } + } else { + const path_t& db_file{ path_exp.value() }; + if ( IOutils::checkFile( db_file ) ) { + const path_t& backups_dir{ this->db_data_path.getPathUnchecked() / "backups" }; + if ( std::filesystem::is_symlink( backups_dir ) ) { + DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), QString( backups_dir.c_str() ), false ); + return; + } else if ( std::filesystem::exists( backups_dir ) ) { + if ( !std::filesystem::is_directory( backups_dir, err ) ) { + // exists but it's not a directory, rename as copy and make a new one + if ( DialogSec::choiceDirNotDir( QString( backups_dir.c_str() ) ) ) { + if ( ! IOutils::renameAsCopy( backups_dir, err ) ) { + QString path_msg; if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += ":\n"+QString::fromStdString( path ); + path_msg = QString( backups_dir.c_str() ); if ( err.value() ) { err_msg = QString::fromStdString( err.message() ); } } - DialogSec::errFailedMakeDir( msg, err_msg ); + DialogSec::errRenaming( path_msg, err_msg ); + DialogSec::errDatabaseFailedBackup( QString(), QString() ); + return; + } else { + // sucesfully renamed, make the new one + if ( ! IOutils::makeDir( backups_dir, err ) ) { + QString msg = DialogSec::tr("Failed to create the database backups' directory"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( backups_dir.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); + } + } + DialogSec::errFailedMakeDir( msg, err_msg ); + DialogSec::errDatabaseFailedBackup( QString(), QString() ); + return; + } + } + } else { + // choosed not to rename the entry as '.copy' + DialogSec::errDatabaseFailedBackup( QString(), QString() ); + return; + } + } + } else { + // backups directory doesn't exists, make it + if ( ! IOutils::makeDir( backups_dir, err ) ) { + QString msg = DialogSec::tr("Failed to create the database backups' directory"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( backups_dir.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); } } + DialogSec::errFailedMakeDir( msg, err_msg ); + DialogSec::errDatabaseFailedBackup( QString(), QString() ); + return; } } } else { - // backups directory doesn't exists, make it - proceed = IOutils::makeDir( path, err ); - if ( ! proceed ) { - QString msg = DialogSec::tr("Failed to create the database backups' directory"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += ":\n"+QString::fromStdString( path ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errFailedMakeDir( msg, err_msg ); + // database file does not exists or is not a file + QString file; + if ( this->dialogs_level > DL_ESSENTIAL ) { + file = QString( db_file.c_str() ); } + DialogSec::errDatabaseFailedBackup( DialogSec::tr("The file does not exist"), file, false ); + return; } + } - }/* else { - // db doesn't exists or is not a file - }*/ - - if ( proceed ) { - // copy the database to a new file - proceed = std::filesystem::copy_file( - this->db_data_path+"/"+DatabasesNames::data, - this->db_data_path+"/backups/"+DatabasesNames::data+".0", - std::filesystem::copy_options::update_existing, - err ); - if ( ! proceed ) { - // failed to copy + bool proceed = std::filesystem::copy_file( + this->db_data_path.getPathUnchecked() / DatabasesNames::data, + (this->db_data_path.getPathUnchecked() / "backups" / DatabasesNames::data).concat(".0"), + std::filesystem::copy_options::update_existing, + err ); + if ( ! proceed ) { + // failed to copy + if ( this->dialogs_level > DL_ESSENTIAL && err.value() ) { + err_msg = QString::fromStdString( err.message() ); + } + DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to copy the database file" ), err_msg ); + } else { + // succesfully copied, now rename the already existing copies (up to the choosen number of copies) + const path_t base_file{ this->db_data_path.getPathUnchecked() / "backups" / DatabasesNames::data }; + const path_t backup_file{ path_t(base_file).replace_extension(std::to_string(this->db_backups_number)) }; + if ( std::filesystem::exists( backup_file ) ) { + std::ignore = std::filesystem::remove_all( backup_file, err ); if ( err.value() ) { err_msg = QString::fromStdString( err.message() ); + proceed &= false; + } else { + proceed = ! std::filesystem::exists( backup_file ); } - DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to copy the database file" ), err_msg ); - } else { - // succesfully copied, now rename the already existing copies (up to the choosen number of copies) - std::string path{ this->db_data_path+"/backups/"+DatabasesNames::data+"."+std::to_string(this->db_backups_number) }; - std::string new_path; + if ( ! proceed ) { + DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to update the backups" ), err_msg ); + return; + } + } + // cascade rename + for ( int n=this->db_backups_number-1; n>=0; --n ) { + const path_t path{ path_t(base_file).replace_extension(std::to_string(n)) }; if ( std::filesystem::exists( path ) ) { - std::ignore = std::filesystem::remove_all( path, err ); + const path_t new_path{ path_t(base_file).replace_extension(std::to_string(n+1)) }; + std::filesystem::rename( path, new_path, err ); if ( err.value() ) { err_msg = QString::fromStdString( err.message() ); proceed &= false; @@ -1226,27 +1254,7 @@ void MainWindow::backupDatabase() const } if ( ! proceed ) { DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to update the backups" ), err_msg ); - } - } - if ( proceed ) { - // cascade rename - for ( int n=this->db_backups_number-1; n>=0; --n ) { - path = this->db_data_path+"/backups/"+DatabasesNames::data+"."+std::to_string( n ); - if ( std::filesystem::exists( path ) ) { - new_path = this->db_data_path+"/backups/"+DatabasesNames::data+"."+std::to_string( n+1 ); - std::filesystem::rename( path, new_path, err ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - proceed &= false; - } else { - proceed = ! std::filesystem::exists( path ); - } - } - if ( ! proceed ) { - // seems it failed to rename - DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to update the backups" ), err_msg ); - break; - } + return; } } } @@ -1513,6 +1521,8 @@ void MainWindow::updateUiIcons() icon_name += "conf_textbrowser"; } else if ( text == tr("Databases") ) { icon_name += "conf_databases"; + } else if ( text == tr("Security") ) { + icon_name += "conf_security"; } else if ( text == tr("Logs") ) { icon_name += "conf_logs"; } else if ( text == tr("Defaults") ) { @@ -2000,159 +2010,132 @@ void MainWindow::waitActiveWindow() } void MainWindow::makeInitialChecks() { - bool ok{ true }; std::error_code err; QString err_msg; // check that the sqlite plugin is available if ( ! this->dbHandler.checkDriver() ) { // checks failed, abort DialogSec::errSqlDriverNotFound( "QSQLITE" ); - ok &= false; - } - - if ( ok ) { - // check LogDoctor's folders paths - for ( const std::string& path : {this->parentPath(this->configs_path), this->logdoc_path, this->db_data_path, this->db_hashes_path} ) { - if ( IOutils::exists( path ) ) { - if ( IOutils::isDir( path ) ) { - if ( ! IOutils::checkDir( path, true ) ) { - // directory not readable, try to assign permissions - std::filesystem::permissions( path, - std::filesystem::perms::owner_read, - std::filesystem::perm_options::add, - err ); - if ( err.value() ) { - ok &= false; - err_msg = QString::fromStdString( err.message() ); - DialogSec::errDirNotReadable( QString::fromStdString( path ), err_msg ); - } - } - if ( ok ) { - if ( ! IOutils::checkDir( path, false, true ) ) { - // directory not writable, try to assign permissions - std::filesystem::permissions( path, - std::filesystem::perms::owner_write, - std::filesystem::perm_options::add, - err ); + std::exit( 1 ); + } + + // check LogDoctor's folders paths + const std::vector paths{ + PathHandler(this->configs_path.getParentUnchecked()), + this->logdoc_path, + this->db_data_path, + this->db_hashes_path + }; + for ( const auto& path_handler : paths ) { + if ( const auto path_exp{ path_handler.getPath() }; + !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + path_exp.error().showDialogMessage(); + std::exit( 1 ); + } else if ( const auto&path{path_exp.value()}; IOutils::exists( path ) ) { + if ( IOutils::isDir( path ) ) { + if ( ! IOutils::checkDir( path, true ) ) { + DialogSec::errDirNotReadable( QString( path.c_str() ), err_msg ); + std::exit( 1 ); + } else if ( ! IOutils::checkDir( path, false, true ) ) { + DialogSec::errDirNotWritable( QString( path.c_str() ), err_msg ); + std::exit( 1 ); + } + + } else { + // not a directory, rename as copy a make a new one + if ( DialogSec::choiceDirNotDir( QString( path.c_str() ) ) ) { + if ( ! IOutils::renameAsCopy( path, err ) ) { + QString p; + if ( this->dialogs_level > DL_ESSENTIAL ) { + p = QString( path.c_str() ); if ( err.value() ) { - ok &= false; err_msg = QString::fromStdString( err.message() ); - DialogSec::errDirNotWritable( QString::fromStdString( path ), err_msg ); } } - } - - } else { - // not a directory, rename as copy a make a new one - ok = DialogSec::choiceDirNotDir( QString::fromStdString( path ) ); - if ( ok ) { - ok = IOutils::renameAsCopy( path, err ); - if ( ! ok ) { - QString p; - if ( this->dialogs_level > DL_ESSENTIAL ) { - p = QString::fromStdString( path ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errRenaming( p, err_msg ); - } else { - ok = IOutils::makeDir( path, err ); - if ( ! ok ) { - QString msg = DialogSec::tr("Failed to create the directory"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += ":\n"+QString::fromStdString( path ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errFailedMakeDir( msg, err_msg ); + DialogSec::errRenaming( p, err_msg ); + std::exit( 1 ); + } else if ( ! IOutils::makeDir( path, err ) ) { + QString msg{ DialogSec::tr("Failed to create the directory") }; + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); } } + DialogSec::errFailedMakeDir( msg, err_msg ); + std::exit( 1 ); } + } else { + // choosed not to rename the entry as '.copy' + std::exit( 1 ); } + } - } else { - ok = IOutils::makeDir( path, err ); - if ( ! ok ) { - QString msg = DialogSec::tr("Failed to create the directory"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += ":\n"+QString::fromStdString( path ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } + } else { + if ( ! IOutils::makeDir( path, err ) ) { + QString msg{ DialogSec::tr("Failed to create the directory") }; + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); } - DialogSec::errFailedMakeDir( msg, err_msg ); } - } - if ( ! ok ) { - break; + DialogSec::errFailedMakeDir( msg, err_msg ); + std::exit( 1 ); } } } - if ( ok ) { - // statistics' database - if ( ! CheckSec::checkCollectionDatabase( this->db_data_path + "/" + DatabasesNames::data ) ) { - // checks failed, abort - ok &= false; - } else { - this->crapview.setDbPath( this->db_data_path ); - this->craplog.setStatsDatabasePath( this->db_data_path ); - // used-files' hashes' database - if ( ! CheckSec::checkHashesDatabase( this->db_hashes_path + "/" + DatabasesNames::hashes ) ) { - // checks failed, abort - ok &= false; - } else { - this->craplog.setHashesDatabasePath( this->db_hashes_path ); - this->craplog.hasher.loadUsedHashesLists( this->db_hashes_path + "/" + DatabasesNames::hashes ); - } - } + // statistics' database + if ( ! CheckSec::checkCollectionDatabase( this->db_data_path.getPathUnchecked() / DatabasesNames::data ) + || ! CheckSec::checkHashesDatabase( this->db_hashes_path.getPathUnchecked() / DatabasesNames::hashes ) ) { + std::exit( 1 ); } - if ( ! ok ) { - this->close(); - //QCoreApplication::exit(0); - //this->destroy(); - } else { - // get available stats dates - this->refreshStatsDates(); - // get a fresh list of log files - this->on_button_LogFiles_RefreshList_clicked(); - // set the default WS as the current one - switch ( this->craplog.getCurrentWebServer() ) { - case WS_APACHE: - this->ui->box_StatsWarn_WebServer->setCurrentIndex( 0 ); - this->ui->box_StatsCount_WebServer->setCurrentIndex( 0 ); - this->ui->box_StatsSpeed_WebServer->setCurrentIndex( 0 ); - this->ui->box_StatsDay_WebServer->setCurrentIndex( 0 ); - this->ui->box_StatsRelat_WebServer->setCurrentIndex( 0 ); - break; - case WS_NGINX: - this->ui->box_StatsWarn_WebServer->setCurrentIndex( 1 ); - this->ui->box_StatsCount_WebServer->setCurrentIndex( 1 ); - this->ui->box_StatsSpeed_WebServer->setCurrentIndex( 1 ); - this->ui->box_StatsDay_WebServer->setCurrentIndex( 1 ); - this->ui->box_StatsRelat_WebServer->setCurrentIndex( 1 ); - break; - case WS_IIS: - this->ui->box_StatsWarn_WebServer->setCurrentIndex( 2 ); - this->ui->box_StatsCount_WebServer->setCurrentIndex( 2 ); - this->ui->box_StatsSpeed_WebServer->setCurrentIndex( 2 ); - this->ui->box_StatsDay_WebServer->setCurrentIndex( 2 ); - this->ui->box_StatsRelat_WebServer->setCurrentIndex( 2 ); - break; - default: - // shouldn't be here - throw DoNotCatchException( "Unexpected WebServer", std::to_string(static_cast(this->default_web_server)) ); - } - this->initiating &= false; - // effectively check if draw buttons can be enabled - this->checkStatsWarnDrawable(); - this->checkStatsSpeedDrawable(); - this->checkStatsCountDrawable(); - this->checkStatsDayDrawable(); - this->checkStatsRelatDrawable(); + this->crapview.setDbPath( this->db_data_path ); + this->craplog.setStatsDatabasePath( this->db_data_path ); + this->craplog.setHashesDatabasePath( this->db_hashes_path ); + if ( ! this->craplog.hasher.loadUsedHashesLists( this->db_hashes_path.getPathUnchecked() / DatabasesNames::hashes ) ) { + std::exit( 1 ); + } + + // get available stats dates + this->refreshStatsDates(); + // get a fresh list of log files + this->on_button_LogFiles_RefreshList_clicked(); + // set the default WS as the current one + switch ( this->craplog.getCurrentWebServer() ) { + case WS_APACHE: + this->ui->box_StatsWarn_WebServer->setCurrentIndex( 0 ); + this->ui->box_StatsCount_WebServer->setCurrentIndex( 0 ); + this->ui->box_StatsSpeed_WebServer->setCurrentIndex( 0 ); + this->ui->box_StatsDay_WebServer->setCurrentIndex( 0 ); + this->ui->box_StatsRelat_WebServer->setCurrentIndex( 0 ); + break; + case WS_NGINX: + this->ui->box_StatsWarn_WebServer->setCurrentIndex( 1 ); + this->ui->box_StatsCount_WebServer->setCurrentIndex( 1 ); + this->ui->box_StatsSpeed_WebServer->setCurrentIndex( 1 ); + this->ui->box_StatsDay_WebServer->setCurrentIndex( 1 ); + this->ui->box_StatsRelat_WebServer->setCurrentIndex( 1 ); + break; + case WS_IIS: + this->ui->box_StatsWarn_WebServer->setCurrentIndex( 2 ); + this->ui->box_StatsCount_WebServer->setCurrentIndex( 2 ); + this->ui->box_StatsSpeed_WebServer->setCurrentIndex( 2 ); + this->ui->box_StatsDay_WebServer->setCurrentIndex( 2 ); + this->ui->box_StatsRelat_WebServer->setCurrentIndex( 2 ); + break; + default: + // shouldn't be here + throw DoNotCatchException( "Unexpected WebServer", std::to_string(static_cast(this->default_web_server)) ); } + this->initiating &= false; + // effectively check if draw buttons can be enabled + this->checkStatsWarnDrawable(); + this->checkStatsSpeedDrawable(); + this->checkStatsCountDrawable(); + this->checkStatsDayDrawable(); + this->checkStatsRelatDrawable(); } @@ -2162,8 +2145,12 @@ bool MainWindow::checkDataDB() return false; } - const std::string path{ this->db_data_path + "/" + DatabasesNames::data }; - if ( ! CheckSec::checkCollectionDatabase( path ) ) { + const auto path{ this->db_data_path / DatabasesNames::data }; + const auto path_exp{ path.getPath() }; + if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + path_exp.error().showDialogMessage(); + return false; + } else if ( ! CheckSec::checkCollectionDatabase( path ) ) { // db invalid and failed to create a new one or user refused to do so this->crapview.clearDates(); this->ui->box_StatsWarn_Year->clear(); @@ -2216,19 +2203,6 @@ WebServer MainWindow::wsEnumFromIndex( const int index ) const } } -std::string MainWindow::resolvePath( const std::string& path ) const noexcept -{ - try { - return std::filesystem::canonical( StringOps::strip( path ) ).string(); - } catch (...) { - return std::string(); - } -} -std::string MainWindow::parentPath( const std::string& path ) const -{ - return path.substr( 0, path.rfind( '/' ) ); -} - ////////////// //// HELP //// @@ -2237,35 +2211,41 @@ void MainWindow::showHelp( const std::string& file_name ) { bool fallback{ false }; const QString link{ "https://github.com/elB4RTO/LogDoctor/tree/main/installation_stuff/logdocdata/help/" }; - const std::string path{ this->logdoc_path+"/help/"+this->language+"/"+file_name+".html" }; - if ( IOutils::exists( path ) ) { - if ( IOutils::isFile( path ) ) { - if ( IOutils::checkFile( path, true ) ) { - // everything ok, open a new window - this->craphelp.reset( new Craphelp() ); - this->craphelp->helpLogsFormat( - path, - this->TB.getFont(), - this->TB.getColorSchemeID() ); - if ( this->isMaximized() ) { - this->craphelp->showMaximized(); + const auto path_exp{ (this->logdoc_path / "help" / this->language/ (file_name+".html")).getPath() }; + if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + path_exp.error().showDialogMessage(); + fallback |= true; + } else { + const path_t& file_path{ path_exp.value() }; + if ( IOutils::exists( file_path ) ) { + if ( IOutils::isFile( file_path ) ) { + if ( IOutils::checkFile( file_path, true ) ) { + // everything ok, open a new window + this->craphelp.reset( new Craphelp() ); + this->craphelp->helpLogsFormat( + file_path, + this->TB.getFont(), + this->TB.getColorSchemeID() ); + if ( this->isMaximized() ) { + this->craphelp->showMaximized(); + } else { + this->craphelp->show(); + } } else { - this->craphelp->show(); + // resource not readable + DialogSec::errHelpNotReadable( link ); + fallback |= true; } } else { - // resource not readable - DialogSec::errHelpNotReadable( link ); + // resource is not a file + DialogSec::errHelpFailed( link, DialogSec::tr("Unrecognized entry") ); fallback |= true; } } else { - // resource is not a file - DialogSec::errHelpFailed( link, DialogSec::tr("Unrecognized entry") ); + // resource not found + DialogSec::errHelpNotFound( link ); fallback |= true; } - } else { - // resource not found - DialogSec::errHelpNotFound( link ); - fallback |= true; } if ( fallback ) { // help file not found for the current locale, fallback to the default version @@ -2402,9 +2382,9 @@ void MainWindow::menu_actionInfos_triggered() } else { this->crapinfo.reset( new Crapinfo( QString::number( this->version ), - QString::fromStdString( this->resolvePath( "./" ) ), - QString::fromStdString( this->configs_path ), - QString::fromStdString( this->logdoc_path ) ) ); + QString::fromStdString( PathHandler(std::string("./")).toString() ), + QString::fromStdString( this->configs_path.toString() ), + QString::fromStdString( this->logdoc_path.toString() ) ) ); this->crapinfo->show(); } } @@ -2692,8 +2672,10 @@ bool MainWindow::dbUsable() { if ( ! this->db_working ) { if ( this->db_ok ) { - const std::string path{ this->db_data_path + "/" + DatabasesNames::data }; - return IOutils::checkFile( path, true ); + const auto path_exp{ (this->db_data_path / DatabasesNames::data).getPath() }; + if ( path_exp.has_value() ) { + return IOutils::checkFile( path_exp.value(), true ); + } } else { return this->checkDataDB(); // db is invalid, attempt to renew } @@ -2907,16 +2889,16 @@ void MainWindow::on_button_LogFiles_ViewFile_clicked() // display the selected item if ( ! this->ui->listLogFiles->selectedItems().isEmpty() ) { bool proceed{ true }; + const QString item_name{ this->ui->listLogFiles->selectedItems().takeFirst()->text(0) }; LogFile item; // retrieve the file item try { - item = this->craplog.getLogFileItem( - this->ui->listLogFiles->selectedItems().takeFirst()->text(0) ); + item = this->craplog.getLogFileItem( item_name ); } catch ( const GenericException& ) { // failed to find file proceed &= false; - DialogSec::errFileNotFound( QString::fromStdString( item.path() ), true ); + DialogSec::errFileNotFound( item_name, true ); } // check the size @@ -2937,23 +2919,36 @@ void MainWindow::on_button_LogFiles_ViewFile_clicked() } } // ask the user what to do - proceed = DialogSec::choiceFileSizeWarning2( msg ); - if ( ! proceed ) { + if ( ! DialogSec::choiceFileSizeWarning2( msg ) ) { + QString rich_text; + RichText::richLogsDefault( rich_text ); + this->ui->textLogFiles->setText( rich_text ); + this->ui->textLogFiles->setAlignment( Qt::AlignHCenter ); return; } } } } + // check the path + if ( proceed ) { + const auto path_exp{ item.path().getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + proceed &= false; + } + } + if ( proceed ) { // get the current log format const LogsFormat& format{ this->craplog.getCurrentLogFormat() }; // read the content std::string content; + const path_t path{ item.path().getPathUnchecked() }; try { try { // try reading as gzip compressed file - GZutils::readFile( item.path(), content ); + GZutils::readFile( path, content ); } catch ( const GenericException& ) { // failed closing file pointer @@ -2964,7 +2959,7 @@ void MainWindow::on_button_LogFiles_ViewFile_clicked() if ( content.size() > 0 ) { content.clear(); } - IOutils::readFile( item.path(), content ); + IOutils::readFile( path, content ); } } catch ( const GenericException& ) { @@ -4532,6 +4527,8 @@ void MainWindow::on_tree_ConfSections_itemClicked(QTreeWidgetItem *item, int col this->setConfigsPage( General_TextBrowser ); } else if ( section == tr("Databases") ) { this->setConfigsPage( General_Databases ); + } else if ( section == tr("Security") ) { + this->setConfigsPage( General_Security ); } else if ( section == tr("Logs") ) { return; } else if ( section == tr("Defaults") ) { @@ -4846,10 +4843,10 @@ void MainWindow::on_tool_ConfDatabases_Data_Dialog_clicked() const QString current_path{ this->ui->inLine_ConfDatabases_Data_Path->text() }; if ( ! current_path.isEmpty() ) { crappath->setDirectory( current_path ); - } else if ( ! this->db_data_path.empty() ) { - crappath->setDirectory( QString::fromStdString( this->db_data_path ) ); + } else if ( ! this->db_data_path.getPathUnchecked().empty() ) { + crappath->setDirectory( QString::fromStdString( this->db_data_path.toString() ) ); } else { - crappath->setDirectory( QString::fromStdString( this->home_path ) ); + crappath->setDirectory( QString( this->home_path.c_str() ) ); } if ( crappath->exec() ) { @@ -4862,13 +4859,13 @@ void MainWindow::on_tool_ConfDatabases_Data_Dialog_clicked() void MainWindow::on_inLine_ConfDatabases_Data_Path_textChanged(const QString& arg1) { if ( ! arg1.isEmpty() ) { - std::string path{ this->resolvePath( arg1.toStdString() ) }; - if ( IOutils::checkDir( path ) ) { - this->ui->icon_ConfDatabases_Data_Wrong->setVisible( false ); - this->ui->button_ConfDatabases_Data_Save->setEnabled( true ); - } else { + const auto path{ PathHandler( arg1.toStdString() ).getPath() }; + if ( !( path.has_value() && IOutils::checkDir( path.value() ) ) ) { this->ui->icon_ConfDatabases_Data_Wrong->setVisible( true ); this->ui->button_ConfDatabases_Data_Save->setEnabled( false ); + } else { + this->ui->icon_ConfDatabases_Data_Wrong->setVisible( false ); + this->ui->button_ConfDatabases_Data_Save->setEnabled( true ); } } else { this->ui->icon_ConfDatabases_Data_Wrong->setVisible( true ); @@ -4882,27 +4879,31 @@ void MainWindow::on_inLine_ConfDatabases_Data_Path_returnPressed() void MainWindow::on_button_ConfDatabases_Data_Save_clicked() { if ( ! this->ui->icon_ConfDatabases_Data_Wrong->isVisible() ) { - // set the paths - std::string path{ this->resolvePath( this->ui->inLine_ConfDatabases_Data_Path->text().toStdString() ) }; - if ( StringOps::endsWith( path, '/' ) ) { - path = StringOps::rstrip( path, '/' ); + const auto path_handler{ PathHandler( this->ui->inLine_ConfDatabases_Data_Path->text().toStdString() ) }; + const auto path_exp{ path_handler.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + this->ui->icon_ConfDatabases_Data_Wrong->setVisible( true ); + this->ui->button_ConfDatabases_Data_Save->setEnabled( false ); + return; } + const path_t& path{ path_exp.value() }; if ( ! IOutils::checkDir( path, true ) ) { DialogSec::warnDirNotReadable( nullptr ); } if ( ! IOutils::checkDir( path, false, true ) ) { DialogSec::warnDirNotWritable( nullptr ); } - this->db_data_path = path; - this->craplog.setStatsDatabasePath( path ); - this->crapview.setDbPath( path ); - this->ui->inLine_ConfDatabases_Data_Path->setText( QString::fromStdString( path ) ); + this->db_data_path = path_handler; + this->craplog.setStatsDatabasePath( path_handler ); + this->crapview.setDbPath( path_handler ); + this->ui->inLine_ConfDatabases_Data_Path->setText( QString( path.c_str() ) ); } this->ui->inLine_ConfDatabases_Data_Path->setFocus(); this->ui->button_ConfDatabases_Data_Save->setEnabled( false ); } -// usef files hashes +// used files hashes void MainWindow::on_tool_ConfDatabases_Hashes_Dialog_clicked() { this->crappath.reset( new Crappath( this ) ); @@ -4910,10 +4911,10 @@ void MainWindow::on_tool_ConfDatabases_Hashes_Dialog_clicked() const QString current_path{ this->ui->inLine_ConfDatabases_Hashes_Path->text() }; if ( ! current_path.isEmpty() ) { crappath->setDirectory( current_path ); - } else if ( ! this->db_hashes_path.empty() ) { - crappath->setDirectory( QString::fromStdString( this->db_hashes_path ) ); + } else if ( ! this->db_hashes_path.getPathUnchecked().empty() ) { + crappath->setDirectory( QString::fromStdString( this->db_hashes_path.toString() ) ); } else { - crappath->setDirectory( QString::fromStdString( this->home_path ) ); + crappath->setDirectory( QString( this->home_path.c_str() ) ); } if ( crappath->exec() ) { @@ -4926,13 +4927,13 @@ void MainWindow::on_tool_ConfDatabases_Hashes_Dialog_clicked() void MainWindow::on_inLine_ConfDatabases_Hashes_Path_textChanged(const QString& arg1) { if ( ! arg1.isEmpty() ) { - std::string path{ this->resolvePath( arg1.toStdString() ) }; - if ( IOutils::checkDir( path ) ) { - this->ui->icon_ConfDatabases_Hashes_Wrong->setVisible( false ); - this->ui->button_ConfDatabases_Hashes_Save->setEnabled( true ); - } else { + const auto path{ PathHandler( arg1.toStdString() ).getPath() }; + if ( !( path.has_value() && IOutils::checkDir( path.value() ) ) ) { this->ui->icon_ConfDatabases_Hashes_Wrong->setVisible( true ); this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false ); + } else { + this->ui->icon_ConfDatabases_Hashes_Wrong->setVisible( false ); + this->ui->button_ConfDatabases_Hashes_Save->setEnabled( true ); } } else { this->ui->icon_ConfDatabases_Hashes_Wrong->setVisible( true ); @@ -4946,20 +4947,24 @@ void MainWindow::on_inLine_ConfDatabases_Hashes_Path_returnPressed() void MainWindow::on_button_ConfDatabases_Hashes_Save_clicked() { if ( ! this->ui->icon_ConfDatabases_Hashes_Wrong->isVisible() ) { - // set the paths - std::string path{ this->resolvePath( this->ui->inLine_ConfDatabases_Hashes_Path->text().toStdString() ) }; - if ( StringOps::endsWith( path, '/' ) ) { - path = StringOps::rstrip( path, '/' ); + const auto path_handler{ PathHandler( this->ui->inLine_ConfDatabases_Hashes_Path->text().toStdString() ) }; + const auto path_exp{ path_handler.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + this->ui->icon_ConfDatabases_Hashes_Wrong->setVisible( true ); + this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false ); + return; } + const path_t& path{ path_exp.value() }; if ( ! IOutils::checkDir( path, true ) ) { DialogSec::warnDirNotReadable( nullptr ); } if ( ! IOutils::checkDir( path, false, true ) ) { DialogSec::warnDirNotWritable( nullptr ); } - this->db_hashes_path = path; - this->craplog.setHashesDatabasePath( path ); - this->ui->inLine_ConfDatabases_Hashes_Path->setText( QString::fromStdString( path ) ); + this->db_hashes_path = path_handler; + this->craplog.setHashesDatabasePath( path_handler ); + this->ui->inLine_ConfDatabases_Hashes_Path->setText( QString( path.c_str() ) ); } this->ui->inLine_ConfDatabases_Hashes_Path->setFocus(); this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false ); @@ -4989,6 +4994,14 @@ void MainWindow::on_spinBox_ConfDatabases_NumBackups_valueChanged(int arg1) } +////////////////// +//// SECURITY //// +void MainWindow::on_checkBox_ConfSecurity_Paths_Symlinks_toggled(bool checked) +{ + GlobalConfigs::Security::follow_symlinks = checked; +} + + ////////////// //// LOGS //// ////////////// @@ -5045,11 +5058,11 @@ void MainWindow::on_tool_ConfApache_Path_Dialog_clicked() this->crappath.reset( new Crappath( this ) ); const QString current_path{ this->ui->inLine_ConfApache_Path_String->text() }; - const std::string& logs_path{ this->craplog.getLogsPath( WS_APACHE ) }; + const PathHandler& logs_path{ this->craplog.getLogsPath( WS_APACHE ) }; if ( ! current_path.isEmpty() ) { crappath->setDirectory( current_path ); - } else if ( ! logs_path.empty() ) { - crappath->setDirectory( QString::fromStdString( logs_path ) ); + } else if ( logs_path.getPath().has_value() ) { + crappath->setDirectory( QString::fromStdString( logs_path.toString() ) ); } else { crappath->setDirectory( QString::fromStdString( this->home_path ) ); } @@ -5064,13 +5077,13 @@ void MainWindow::on_tool_ConfApache_Path_Dialog_clicked() void MainWindow::on_inLine_ConfApache_Path_String_textChanged(const QString& arg1) { if ( arg1.size() > 0 ) { - std::string path{ this->resolvePath( arg1.toStdString() ) }; - if ( IOutils::checkDir( path ) ) { - this->ui->icon_ConfApache_Path_Wrong->setVisible( false ); - this->ui->button_ConfApache_Path_Save->setEnabled( true ); - } else { + const auto path{ PathHandler( arg1.toStdString() ).getPath() }; + if ( !( path.has_value() && IOutils::checkDir( path.value() ) ) ) { this->ui->icon_ConfApache_Path_Wrong->setVisible( true ); this->ui->button_ConfApache_Path_Save->setEnabled( false ); + } else { + this->ui->icon_ConfApache_Path_Wrong->setVisible( false ); + this->ui->button_ConfApache_Path_Save->setEnabled( true ); } } else { this->ui->icon_ConfApache_Path_Wrong->setVisible( true ); @@ -5084,16 +5097,20 @@ void MainWindow::on_inLine_ConfApache_Path_String_returnPressed() void MainWindow::on_button_ConfApache_Path_Save_clicked() { if ( ! this->ui->icon_ConfApache_Path_Wrong->isVisible() ) { - // set the paths - std::string path{ this->resolvePath( this->ui->inLine_ConfApache_Path_String->text().toStdString() ) }; - if ( StringOps::endsWith( path, '/' ) ) { - path = StringOps::rstrip( path, '/' ); + const auto path_handler{ PathHandler( this->ui->inLine_ConfApache_Path_String->text().toStdString() ) }; + const auto path_exp{ path_handler.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + this->ui->icon_ConfApache_Path_Wrong->setVisible( true ); + this->ui->button_ConfApache_Path_Save->setEnabled( false ); + return; } + const path_t& path{ path_exp.value() }; if ( ! IOutils::checkDir( path, true ) ) { DialogSec::warnDirNotReadable( nullptr ); } - this->craplog.setLogsPath( WS_APACHE, path ); - this->ui->inLine_ConfApache_Path_String->setText( QString::fromStdString( path ) ); + this->craplog.setLogsPath( WS_APACHE, path_handler ); + this->ui->inLine_ConfApache_Path_String->setText( QString( path.c_str() ) ); } this->ui->button_ConfApache_Path_Save->setEnabled( false ); } @@ -5437,11 +5454,11 @@ void MainWindow::on_tool_ConfNginx_Path_Dialog_clicked() this->crappath.reset( new Crappath( this ) ); const QString current_path{ this->ui->inLine_ConfNginx_Path_String->text() }; - const std::string& logs_path{ this->craplog.getLogsPath( WS_NGINX ) }; + const PathHandler& logs_path{ this->craplog.getLogsPath( WS_NGINX ) }; if ( ! current_path.isEmpty() ) { crappath->setDirectory( current_path ); - } else if ( ! logs_path.empty() ) { - crappath->setDirectory( QString::fromStdString( logs_path ) ); + } else if ( logs_path.getPath().has_value() ) { + crappath->setDirectory( QString::fromStdString( logs_path.toString() ) ); } else { crappath->setDirectory( QString::fromStdString( this->home_path ) ); } @@ -5456,13 +5473,13 @@ void MainWindow::on_tool_ConfNginx_Path_Dialog_clicked() void MainWindow::on_inLine_ConfNginx_Path_String_textChanged(const QString& arg1) { if ( ! arg1.isEmpty() ) { - std::string path{ this->resolvePath( arg1.toStdString() ) }; - if ( IOutils::checkDir( path ) ) { - this->ui->icon_ConfNginx_Path_Wrong->setVisible( false ); - this->ui->button_ConfNginx_Path_Save->setEnabled( true ); - } else { + const auto path{ PathHandler( arg1.toStdString() ).getPath() }; + if ( !( path.has_value() && IOutils::checkDir( path.value() ) ) ) { this->ui->icon_ConfNginx_Path_Wrong->setVisible( true ); this->ui->button_ConfNginx_Path_Save->setEnabled( false ); + } else { + this->ui->icon_ConfNginx_Path_Wrong->setVisible( false ); + this->ui->button_ConfNginx_Path_Save->setEnabled( true ); } } else { this->ui->icon_ConfNginx_Path_Wrong->setVisible( true ); @@ -5476,16 +5493,20 @@ void MainWindow::on_inLine_ConfNginx_Path_String_returnPressed() void MainWindow::on_button_ConfNginx_Path_Save_clicked() { if ( ! this->ui->icon_ConfNginx_Path_Wrong->isVisible() ) { - // set the paths - std::string path{ this->resolvePath( this->ui->inLine_ConfNginx_Path_String->text().toStdString() ) }; - if ( StringOps::endsWith( path, '/' ) ) { - path = StringOps::rstrip( path, '/' ); + const auto path_handler{ PathHandler( this->ui->inLine_ConfNginx_Path_String->text().toStdString() ) }; + const auto path_exp{ path_handler.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + this->ui->icon_ConfNginx_Path_Wrong->setVisible( true ); + this->ui->button_ConfNginx_Path_Save->setEnabled( false ); + return; } + const path_t& path{ path_exp.value() }; if ( ! IOutils::checkDir( path, true ) ) { DialogSec::warnDirNotReadable( nullptr ); } - this->craplog.setLogsPath( WS_NGINX, path ); - this->ui->inLine_ConfNginx_Path_String->setText( QString::fromStdString( path ) ); + this->craplog.setLogsPath( WS_NGINX, path_handler ); + this->ui->inLine_ConfNginx_Path_String->setText( QString( path.c_str() ) ); } this->ui->button_ConfNginx_Path_Save->setEnabled( false ); } @@ -5829,11 +5850,11 @@ void MainWindow::on_tool_ConfIis_Path_Dialog_clicked() this->crappath.reset( new Crappath( this ) ); const QString current_path{ this->ui->inLine_ConfIis_Path_String->text() }; - const std::string& logs_path{ this->craplog.getLogsPath( WS_IIS ) }; + const PathHandler& logs_path{ this->craplog.getLogsPath( WS_IIS ) }; if ( ! current_path.isEmpty() ) { crappath->setDirectory( current_path ); - } else if ( ! logs_path.empty() ) { - crappath->setDirectory( QString::fromStdString( logs_path ) ); + } else if ( logs_path.getPath().has_value() ) { + crappath->setDirectory( QString::fromStdString( logs_path.toString() ) ); } else { crappath->setDirectory( QString::fromStdString( this->home_path ) ); } @@ -5848,13 +5869,13 @@ void MainWindow::on_tool_ConfIis_Path_Dialog_clicked() void MainWindow::on_inLine_ConfIis_Path_String_textChanged(const QString& arg1) { if ( ! arg1.isEmpty() ) { - std::string path{ this->resolvePath( arg1.toStdString() ) }; - if ( IOutils::checkDir( path ) ) { - this->ui->icon_ConfIis_Path_Wrong->setVisible( false ); - this->ui->button_ConfIis_Path_Save->setEnabled( true ); - } else { + const auto path{ PathHandler( arg1.toStdString() ).getPath() }; + if ( !( path.has_value() && IOutils::checkDir( path.value() ) ) ) { this->ui->icon_ConfIis_Path_Wrong->setVisible( true ); this->ui->button_ConfIis_Path_Save->setEnabled( false ); + } else { + this->ui->icon_ConfIis_Path_Wrong->setVisible( false ); + this->ui->button_ConfIis_Path_Save->setEnabled( true ); } } else { this->ui->icon_ConfIis_Path_Wrong->setVisible( true ); @@ -5868,16 +5889,20 @@ void MainWindow::on_inLine_ConfIis_Path_String_returnPressed() void MainWindow::on_button_ConfIis_Path_Save_clicked() { if ( ! this->ui->icon_ConfIis_Path_Wrong->isVisible() ) { - // set the paths - std::string path{ this->resolvePath( this->ui->inLine_ConfIis_Path_String->text().toStdString() ) }; - if ( StringOps::endsWith( path, '/' ) ) { - path = StringOps::rstrip( path, '/' ); + const auto path_handler{ PathHandler( this->ui->inLine_ConfIis_Path_String->text().toStdString() ) }; + const auto path_exp{ path_handler.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + this->ui->icon_ConfIis_Path_Wrong->setVisible( true ); + this->ui->button_ConfIis_Path_Save->setEnabled( false ); + return; } + const path_t& path{ path_exp.value() }; if ( ! IOutils::checkDir( path, true ) ) { DialogSec::warnDirNotReadable( nullptr ); } - this->craplog.setLogsPath( WS_IIS, path ); - this->ui->inLine_ConfIis_Path_String->setText( QString::fromStdString( path ) ); + this->craplog.setLogsPath( WS_IIS, path_handler ); + this->ui->inLine_ConfIis_Path_String->setText( QString( path.c_str() ) ); } this->ui->button_ConfIis_Path_Save->setEnabled( false ); } diff --git a/logdoctor/mainwindow.h b/logdoctor/mainwindow.h index eb8c183..67f19f3 100644 --- a/logdoctor/mainwindow.h +++ b/logdoctor/mainwindow.h @@ -8,6 +8,8 @@ #include "modules/tb.h" +#include "modules/security/path.h" + #include "modules/database/database.h" #include "modules/blacklists/blacklists.h" @@ -347,6 +349,10 @@ private slots: void on_spinBox_ConfDatabases_NumBackups_valueChanged(int arg1); + //// SECURITY //// + + void on_checkBox_ConfSecurity_Paths_Symlinks_toggled(bool checked); + //// LOGS DEFAULTS //// void on_radio_ConfDefaults_Apache_toggled(bool checked); @@ -588,14 +594,14 @@ private: // 1: linux/bsd, 2:windows, 3:mac #if defined( Q_OS_MACOS ) - const std::string configs_path { this->home_path + "/Lybrary/Preferences/LogDoctor/logdoctor.conf" }; - const std::string logdoc_path { this->home_path + "/Lybrary/Application Support/LogDoctor" }; + const PathHandler configs_path { this->home_path + "/Lybrary/Preferences/LogDoctor/logdoctor.conf" }; + const PathHandler logdoc_path { this->home_path + "/Lybrary/Application Support/LogDoctor" }; #elif defined( Q_OS_WINDOWS ) - const std::string configs_path { this->home_path + "/AppData/Local/LogDoctor/logdoctor.conf" }; - const std::string logdoc_path { this->home_path + "/AppData/Local/LogDoctor" }; + const PathHandler configs_path { this->home_path + "/AppData/Local/LogDoctor/logdoctor.conf" }; + const PathHandler logdoc_path { this->home_path + "/AppData/Local/LogDoctor" }; #elif defined( Q_OS_LINUX ) || defined( Q_OS_BSD4 ) - const std::string configs_path { this->home_path + "/.config/LogDoctor/logdoctor.conf" }; - const std::string logdoc_path { "/usr/share/LogDoctor" }; + const PathHandler configs_path { this->home_path + "/.config/LogDoctor/logdoctor.conf" }; + const PathHandler logdoc_path { std::string("/usr/share/LogDoctor") }; #else #error "System not supported" #endif @@ -752,13 +758,6 @@ private: /*std::chrono::system_clock::duration waiter_timer_elapsed;*/ - //! Resolves the given path and returns the canonical path - std::string resolvePath( const std::string& path ) const noexcept; - - //! Returns the parent folder of the given path - std::string parentPath( const std::string& path ) const; - - //////////////// //// CHECKS //// //////////////// @@ -787,8 +786,8 @@ private: //! Backs-up the logs data collection database void backupDatabase() const; - std::string db_data_path; - std::string db_hashes_path; + PathHandler db_data_path; + PathHandler db_hashes_path; // true when a process is working on a db bool db_working{ false }; diff --git a/logdoctor/modules/crapconf/lib.h b/logdoctor/modules/crapconf/lib.h index 9cbeb72..97af717 100644 --- a/logdoctor/modules/crapconf/lib.h +++ b/logdoctor/modules/crapconf/lib.h @@ -11,20 +11,21 @@ enum ConfigsPage : unsigned char { General_Charts_Relational = 5, General_TextBrowser = 6, General_Databases = 7, - Logs_Defaults = 8, - Logs_Control = 9, - Logs_Apache2_Path = 10, - Logs_Apache2_Format = 11, - Logs_Apache2_Warnlists = 12, - Logs_Apache2_Blacklists = 13, - Logs_Nginx_Path = 14, - Logs_Nginx_Format = 15, - Logs_Nginx_Warnlists = 16, - Logs_Nginx_Blacklists = 17, - Logs_IIS_Path = 18, - Logs_IIS_Format = 19, - Logs_IIS_Warnlists = 20, - Logs_IIS_Blacklists = 21, + General_Security = 8, + Logs_Defaults = 9, + Logs_Control = 10, + Logs_Apache2_Path = 11, + Logs_Apache2_Format = 12, + Logs_Apache2_Warnlists = 13, + Logs_Apache2_Blacklists = 14, + Logs_Nginx_Path = 15, + Logs_Nginx_Format = 16, + Logs_Nginx_Warnlists = 17, + Logs_Nginx_Blacklists = 18, + Logs_IIS_Path = 19, + Logs_IIS_Format = 20, + Logs_IIS_Warnlists = 21, + Logs_IIS_Blacklists = 22, }; -- GitLab From f6eb0440bdebe3f723075bae8186646cbcc38a93 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:41:13 +0200 Subject: [PATCH 10/34] Updates Updated Craplog --- logdoctor/modules/craplog/craplog.cpp | 28 ++++++------ logdoctor/modules/craplog/craplog.h | 20 ++++----- logdoctor/modules/craplog/modules/hasher.cpp | 36 +++++++++++---- logdoctor/modules/craplog/modules/hasher.h | 7 +-- logdoctor/modules/craplog/modules/lib.h | 8 ++-- logdoctor/modules/craplog/workers/lib.h | 1 + logdoctor/modules/craplog/workers/lister.cpp | 25 +++++++---- logdoctor/modules/craplog/workers/lister.h | 5 ++- logdoctor/modules/craplog/workers/parser.cpp | 46 +++++++++++++++----- logdoctor/modules/craplog/workers/parser.h | 8 ++-- 10 files changed, 122 insertions(+), 62 deletions(-) diff --git a/logdoctor/modules/craplog/craplog.cpp b/logdoctor/modules/craplog/craplog.cpp index 6e67e93..02c3e19 100644 --- a/logdoctor/modules/craplog/craplog.cpp +++ b/logdoctor/modules/craplog/craplog.cpp @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -58,11 +57,11 @@ Craplog::Craplog() this->current_log_format = this->logs_formats.at( WS_APACHE ); // apache2 access/error logs location - this->logs_paths.emplace( WS_APACHE, std::string{} ); + this->logs_paths.emplace( WS_APACHE, PathHandler() ); // nginx access/error logs location - this->logs_paths.emplace( WS_NGINX, std::string{} ); + this->logs_paths.emplace( WS_NGINX, PathHandler() ); // iis access/error logs location - this->logs_paths.emplace( WS_IIS, std::string{} ); + this->logs_paths.emplace( WS_IIS, PathHandler() ); // apache2 access/error log files' names this->logs_base_names.emplace( WS_APACHE, LogName{ .starts = "access.log.", @@ -91,22 +90,22 @@ void Craplog::setDialogsLevel( const DialogsLevel new_level ) noexcept this->hasher.setDialogLevel( new_level ); } -const std::string& Craplog::getStatsDatabasePath() const noexcept +const PathHandler& Craplog::getStatsDatabasePath() const noexcept { return this->db_stats_path; } -const std::string& Craplog::getHashesDatabasePath() const noexcept +const PathHandler& Craplog::getHashesDatabasePath() const noexcept { return this->db_hashes_path; } -void Craplog::setStatsDatabasePath( const std::string& path ) noexcept +void Craplog::setStatsDatabasePath( const PathHandler& path ) noexcept { - this->db_stats_path = path + "/" + DatabasesNames::data; + this->db_stats_path = path / DatabasesNames::data; } -void Craplog::setHashesDatabasePath( const std::string& path ) noexcept +void Craplog::setHashesDatabasePath( const PathHandler& path ) noexcept { - this->db_hashes_path = path + "/" + DatabasesNames::hashes; + this->db_hashes_path = path / DatabasesNames::hashes; } size_t Craplog::getWarningSize() const noexcept @@ -234,11 +233,11 @@ const LogsFormat& Craplog::getCurrentLogFormat() const noexcept /////////////////// //// LOGS PATH //// -const std::string& Craplog::getLogsPath( const WebServer& web_server ) const noexcept +const PathHandler& Craplog::getLogsPath( const WebServer& web_server ) const noexcept { return this->logs_paths.at( web_server ); } -void Craplog::setLogsPath( const WebServer& web_server, const std::string& new_path ) noexcept +void Craplog::setLogsPath( const WebServer& web_server, const PathHandler& new_path ) noexcept { this->logs_paths.at( web_server ) = new_path; } @@ -610,6 +609,9 @@ void Craplog::showWorkerDialog( const WorkerDialog dialog_type, const QStringLis case WorkerDialog::errDirNotExists: DialogSec::errDirNotExists( args.at(0) ); break; + case WorkerDialog::errPathHasSymlink: + DialogSec::errPathHasSymlink( args.at(0), args.at(1) ); + break; case WorkerDialog::errFailedDefiningLogType: DialogSec::errFailedDefiningLogType( args.at(0) ); break; @@ -657,7 +659,7 @@ void Craplog::startWorking( const Blacklists& blacklists ) } void Craplog::hireWorker( const Blacklists& blacklists ) const { - std::vector files; + std::vector files; files.reserve( this->log_files_to_use.size() ); std::transform( this->log_files_to_use.cbegin(), this->log_files_to_use.cend(), std::back_inserter(files), diff --git a/logdoctor/modules/craplog/craplog.h b/logdoctor/modules/craplog/craplog.h index 1b1f585..6ef26b6 100644 --- a/logdoctor/modules/craplog/craplog.h +++ b/logdoctor/modules/craplog/craplog.h @@ -45,22 +45,22 @@ public: //// DATABASES //// //! Returns the path of the logs Collection database - const std::string& getStatsDatabasePath() const noexcept; + const PathHandler& getStatsDatabasePath() const noexcept; //! Returns the path of the log files' Hashes database - const std::string& getHashesDatabasePath() const noexcept; + const PathHandler& getHashesDatabasePath() const noexcept; //! Sets the new path for the logs Collection database /*! \param The new path of the database file */ - void setStatsDatabasePath( const std::string& path ) noexcept; + void setStatsDatabasePath( const PathHandler& path ) noexcept; //! Sets the new path for the log files' Hashes database /*! \param The new path of the database file */ - void setHashesDatabasePath( const std::string& path ) noexcept; + void setHashesDatabasePath( const PathHandler& path ) noexcept; //////////////////////// @@ -100,14 +100,14 @@ public: \param web_server The Web Server \return The path of the logs' folder */ - const std::string& getLogsPath( const WebServer& web_server ) const noexcept; + const PathHandler& getLogsPath( const WebServer& web_server ) const noexcept; //! Sets a new path for the given Web Server to search the logs in /*! \param web_server The Web Server \param new_path The new path */ - void setLogsPath( const WebServer& web_server, const std::string& new_path ) noexcept; + void setLogsPath( const WebServer& web_server, const PathHandler& new_path ) noexcept; /////////////////// @@ -335,8 +335,8 @@ private: /////////////////// //// DATABASES //// - std::string db_stats_path; - std::string db_hashes_path; + PathHandler db_stats_path; + PathHandler db_hashes_path; ////////////// @@ -368,7 +368,7 @@ private: //// LOGS ITEMS //// // the selected log files to be parsed during the process - std::vector> log_files_to_use; + std::vector> log_files_to_use; // used files hashes std::vector used_files_hashes; @@ -387,7 +387,7 @@ private: // currently used web server WebServer current_web_server{ WS_APACHE }; - std::unordered_map logs_paths; + std::unordered_map logs_paths; //! Web Server specific file names criterions /*! diff --git a/logdoctor/modules/craplog/modules/hasher.cpp b/logdoctor/modules/craplog/modules/hasher.cpp index ee487c0..14f9ca4 100644 --- a/logdoctor/modules/craplog/modules/hasher.cpp +++ b/logdoctor/modules/craplog/modules/hasher.cpp @@ -14,6 +14,7 @@ #include "modules/exceptions.h" #include "modules/database/database.h" +#include "modules/security/path.h" #include @@ -27,8 +28,14 @@ void Hasher::setDialogLevel( const DialogsLevel new_level ) noexcept // reads the database holding the already used hashes -bool Hasher::loadUsedHashesLists( const std::string& db_path ) noexcept +bool Hasher::loadUsedHashesLists( const PathHandler& db_path ) noexcept { + const auto path_exp{ db_path.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + return false; + } + DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Hashes ) }; db.open( db_path, this->dialogs_level==DL_EXPLANATORY ); @@ -56,13 +63,20 @@ bool Hasher::loadUsedHashesLists( const std::string& db_path ) noexcept // returns the hash -void Hasher::digestFile( const std::string& file_path, std::string& hash ) +void Hasher::digestFile( const PathHandler& file_path, std::string& hash ) { std::string content; try { + const auto path_exp{ file_path.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + throw ""; + } + const path_t& path{ path_exp.value() }; + try { // try reading as gzip compressed file - GZutils::readFile( file_path, content ); + GZutils::readFile( path, content ); } catch ( const GenericException& ) { // failed closing file pointer @@ -73,7 +87,7 @@ void Hasher::digestFile( const std::string& file_path, std::string& hash ) if ( ! content.empty() ) { content.clear(); } - IOutils::readFile( file_path, content ); + IOutils::readFile( path, content ); } // re-catched in craplog @@ -81,21 +95,21 @@ void Hasher::digestFile( const std::string& file_path, std::string& hash ) // failed closing gzip file pointer throw GenericException( QStringLiteral("%1:\n%2").arg( DialogSec::tr("An error occured while reading the gzipped file"), - QString::fromStdString( file_path ) + QString::fromStdString( file_path.toString() ) ).toStdString() ); } catch ( const std::ios_base::failure& ) { // failed reading as text throw GenericException( QStringLiteral("%1:\n%2").arg( DialogSec::tr("An error occured while reading the file"), - QString::fromStdString( file_path ) + QString::fromStdString( file_path.toString() ) ).toStdString() ); } catch (...) { // failed somehow throw GenericException( QStringLiteral("%1:\n%2").arg( DialogSec::tr("Something failed while handling the file"), - QString::fromStdString( file_path ) + QString::fromStdString( file_path.toString() ) ).toStdString() ); } @@ -119,11 +133,17 @@ bool Hasher::hasBeenUsed( const std::string &file_hash, const WebServer& web_ser } -void Hasher::insertUsedHashes( const std::string& db_path, const std::vector& hashes, const WebServer& web_server ) +void Hasher::insertUsedHashes( const PathHandler& db_path, const std::vector& hashes, const WebServer& web_server ) { const bool explain_msg{ this->dialogs_level > DL_ESSENTIAL }; const bool explain_err{ this->dialogs_level == DL_EXPLANATORY }; + const auto path_exp{ db_path.getPath() }; + if ( ! path_exp.has_value() ) { + path_exp.error().showDialogMessage(); + throw VoidException(); + } + DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Hashes ) }; db.open( db_path, explain_err ); diff --git a/logdoctor/modules/craplog/modules/hasher.h b/logdoctor/modules/craplog/modules/hasher.h index 7d7a173..c9f38cb 100644 --- a/logdoctor/modules/craplog/modules/hasher.h +++ b/logdoctor/modules/craplog/modules/hasher.h @@ -12,6 +12,7 @@ enum class WebServer; +class PathHandler; class QSqlQuery; @@ -32,7 +33,7 @@ public: \return Whether the operation has been successful or not \throw VoidException */ - bool loadUsedHashesLists( const std::string& db_path ) noexcept; + bool loadUsedHashesLists( const PathHandler& db_path ) noexcept; //! Returns the hash resulting from the content of the given file /*! @@ -41,7 +42,7 @@ public: \throw GenericException \see SHA256 */ - static void digestFile( const std::string& file_path, std::string& hash ); + static void digestFile( const PathHandler& file_path, std::string& hash ); //! Checks if the given hash equals one which is already in the list /*! @@ -58,7 +59,7 @@ public: \param web_server_id The ID of the Web Server which generated the file \throw VoidException */ - void insertUsedHashes( const std::string& db_path, const std::vector& hashes, const WebServer& web_server ); + void insertUsedHashes( const PathHandler& db_path, const std::vector& hashes, const WebServer& web_server ); private: diff --git a/logdoctor/modules/craplog/modules/lib.h b/logdoctor/modules/craplog/modules/lib.h index 4d2d96e..dc923fc 100644 --- a/logdoctor/modules/craplog/modules/lib.h +++ b/logdoctor/modules/craplog/modules/lib.h @@ -2,6 +2,8 @@ #define LOGDOCTOR__CRAPLOG__MODULES__LIB_H +#include "modules/security/path.h" + #include #include @@ -25,7 +27,7 @@ enum class LogType : int8_t struct LogFile final { explicit LogFile() noexcept = default; - explicit LogFile(const bool sel,const bool used,const size_t sz,const QString& nm,const std::string& hs,const std::string& pt) noexcept + explicit LogFile(const bool sel,const bool used,const size_t sz,const QString& nm,const std::string& hs,const PathHandler& pt) noexcept :selected{sel},used_already{used},size_{sz},name_{nm},hash_{hs},path_{pt}{} LogFile(LogFile&& other) noexcept = default; LogFile& operator=(LogFile&& other) noexcept = default; @@ -54,7 +56,7 @@ struct LogFile final inline const std::string& hash() const noexcept { return this->hash_; } //! Returns the path of the file, including the file name - inline const std::string& path() const noexcept + inline const PathHandler& path() const noexcept { return this->path_; } private: bool selected; @@ -62,7 +64,7 @@ private: size_t size_; QString name_; std::string hash_; - std::string path_; + PathHandler path_; }; Q_DECLARE_METATYPE( LogFile ) diff --git a/logdoctor/modules/craplog/workers/lib.h b/logdoctor/modules/craplog/workers/lib.h index 049f22e..19daf47 100644 --- a/logdoctor/modules/craplog/workers/lib.h +++ b/logdoctor/modules/craplog/workers/lib.h @@ -9,6 +9,7 @@ enum class WorkerDialog { errGeneric, // 1 arg errDirNotExists, // 1 arg + errPathHasSymlink, // 1 arg errFailedDefiningLogType, // 1 arg errFailedParsingLogs, // 1 arg errDatabaseFileNotFound, // 1 arg diff --git a/logdoctor/modules/craplog/workers/lister.cpp b/logdoctor/modules/craplog/workers/lister.cpp index 3093da3..6995a2c 100644 --- a/logdoctor/modules/craplog/workers/lister.cpp +++ b/logdoctor/modules/craplog/workers/lister.cpp @@ -13,7 +13,7 @@ #include "modules/craplog/workers/lib.h" -CraplogLister::CraplogLister( const WebServer web_server, const DialogsLevel dialogs_level, const std::string& logs_path, const LogsFormat& logs_format, const Hasher& hasher, const std::function check_filename, QObject* parent ) +CraplogLister::CraplogLister( const WebServer web_server, const DialogsLevel dialogs_level, const PathHandler& logs_path, const LogsFormat& logs_format, const Hasher& hasher, const std::function check_filename, QObject* parent ) : QObject { parent } , web_server { web_server } , dialogs_level { dialogs_level } @@ -22,7 +22,6 @@ CraplogLister::CraplogLister( const WebServer web_server, const DialogsLevel dia , hasher { hasher } , check_filename { check_filename } { - } @@ -34,13 +33,23 @@ void CraplogLister::quit() void CraplogLister::work() { - const std::string& logs_path{ this->logs_path }; - if ( ! IOutils::isDir( logs_path ) ) { - // this directory doesn't exists - if ( ! logs_path.empty() ) { + const auto path_exp{ this->logs_path.getPath() }; + if ( ! path_exp.has_value() ) { + if ( path_exp.error().isReasonSymlink() ) { + emit this->showDialog( WorkerDialog::errPathHasSymlink, + {QString( path_exp.error().invalid_component.c_str() ), + QString( path_exp.error().full_path.c_str() )} ); + this->quit(); + return; + } else { emit this->showDialog( WorkerDialog::errDirNotExists, - {QString::fromStdString( logs_path )} ); + {QString::fromStdString( this->logs_path.toString() )} ); + this->quit(); + return; } + } else if ( ! IOutils::isDir( path_exp.value() ) ) { + emit this->showDialog( WorkerDialog::errDirNotExists, + {QString::fromStdString( this->logs_path.toString() )} ); this->quit(); return; } @@ -48,7 +57,7 @@ void CraplogLister::work() QString name; std::string path; // iterate over entries in the logs folder - for ( const auto& dir_entry : std::filesystem::directory_iterator{logs_path}) { + for ( const auto& dir_entry : std::filesystem::directory_iterator{path_exp.value()}) { // get the attributes path = dir_entry.path().string(); name = QString::fromStdString( dir_entry.path().filename().string() ); diff --git a/logdoctor/modules/craplog/workers/lister.h b/logdoctor/modules/craplog/workers/lister.h index 2181697..a7e8676 100644 --- a/logdoctor/modules/craplog/workers/lister.h +++ b/logdoctor/modules/craplog/workers/lister.h @@ -6,6 +6,7 @@ #include +class PathHandler; struct LogsFormat; struct LogFile; class Hasher; @@ -22,7 +23,7 @@ public: explicit CraplogLister( const WebServer web_server, const DialogsLevel dialogs_level, - const std::string& logs_path, + const PathHandler& logs_path, const LogsFormat& logs_format, const Hasher& hasher, const std::function check_filename, @@ -51,7 +52,7 @@ private: const DialogsLevel dialogs_level; - const std::string& logs_path; + const PathHandler& logs_path; const LogsFormat& logs_format; diff --git a/logdoctor/modules/craplog/workers/parser.cpp b/logdoctor/modules/craplog/workers/parser.cpp index 3222d13..1947b07 100644 --- a/logdoctor/modules/craplog/workers/parser.cpp +++ b/logdoctor/modules/craplog/workers/parser.cpp @@ -23,7 +23,7 @@ #include -CraplogParser::CraplogParser( const WebServer web_server, const DialogsLevel dialogs_level, const LogsFormat& logs_format, const Blacklist& blacklist, worker_files_t&& log_files, const std::string& data_db_path, QObject* parent ) +CraplogParser::CraplogParser( const WebServer web_server, const DialogsLevel dialogs_level, const LogsFormat& logs_format, const Blacklist& blacklist, worker_files_t&& log_files, const PathHandler& data_db_path, QObject* parent ) : QObject { parent } , web_server { web_server } , dialogs_level { dialogs_level } @@ -33,7 +33,6 @@ CraplogParser::CraplogParser( const WebServer web_server, const DialogsLevel dia , logs_format { logs_format } , files_to_use { std::move( log_files ) } { - } CraplogParser::~CraplogParser() @@ -109,6 +108,11 @@ void CraplogParser::work() {e.what()} ); this->proceed &= false; + } catch ( InvalidPathException& e ) { + emit this->showDialog( WorkerDialog::errPathHasSymlink, + e.what() ); + this->proceed &= false; + } // send the final data if ( ! this->proceed ) { @@ -152,9 +156,18 @@ void CraplogParser::joinLogLines() // try reading content.clear(); aux.clear(); + + const auto path_exp{ file_path.getPath() }; + if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + const auto& invalid{ path_exp.error() }; + throw InvalidPathException( {QString(invalid.invalid_component.c_str()), + QString(invalid.full_path.c_str())} ); + } + const path_t& path{ path_exp.value() }; + try { // try as gzip compressed archive first - GZutils::readFile( file_path, aux ); + GZutils::readFile( path, aux ); } catch ( const GenericException& ) { // failed closing file pointer @@ -165,7 +178,7 @@ void CraplogParser::joinLogLines() if ( ! aux.empty() ) { aux.clear(); } - IOutils::readFile( file_path, aux ); + IOutils::readFile( path, aux ); } StringOps::splitrip( content, aux ); @@ -181,21 +194,21 @@ void CraplogParser::joinLogLines() // failed closing gzip file pointer throw GenericException( QStringLiteral("%1:\n%2").arg( DialogSec::tr("An error occured while reading the gzipped file"), - QString::fromStdString( file_path ) + QString::fromStdString( file_path.toString() ) ).toStdString() ); } catch ( const std::ios_base::failure& ) { // failed reading as text throw GenericException( QStringLiteral("%1:\n%2").arg( DialogSec::tr("An error occured while reading the file"), - QString::fromStdString( file_path ) + QString::fromStdString( file_path.toString() ) ).toStdString() ); } catch (...) { // failed somehow throw GenericException( QStringLiteral("%1:\n%2").arg( DialogSec::tr("Something failed while handling the file"), - QString::fromStdString( file_path ) + QString::fromStdString( file_path.toString() ) ).toStdString() ); } @@ -266,7 +279,7 @@ void CraplogParser::parseLogLines() void CraplogParser::storeLogLines( QSqlDatabase& db ) { - db.setDatabaseName( QString::fromStdString( this->db_path ) ); + db.setDatabaseName( QString::fromStdString( this->db_path.toString() ) ); if ( ! this->checkDatabaseFile() ) [[unlikely]] { this->proceed &= false; @@ -468,16 +481,25 @@ bool CraplogParser::storeData( QSqlDatabase& db ) bool CraplogParser::checkDatabaseFile() noexcept { - if ( ! IOutils::exists( this->db_path ) ) { + const auto path_exp{ this->db_path.getPath() }; + if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + const auto& invalid{ path_exp.error() }; + emit this->showDialog( WorkerDialog::errPathHasSymlink, + {QString(invalid.invalid_component.c_str()), + QString(invalid.full_path.c_str())} ); + return false; + } + const path_t& path{ path_exp.value() }; + if ( ! IOutils::exists( path ) ) { emit this->showDialog( WorkerDialog::errDatabaseFileNotFound, {this->db_name} ); return false; - } else if ( ! IOutils::isFile( this->db_path ) ) { + } else if ( ! IOutils::isFile( path ) ) { emit this->showDialog( WorkerDialog::errDatabaseFileNotFile, {this->db_name} ); return false; - } else if ( ! IOutils::checkFile( this->db_path, true ) ) { + } else if ( ! IOutils::checkFile( path, true ) ) { emit this->showDialog( WorkerDialog::errDatabaseFileNotReadable, {this->db_name} ); return false; - } else if ( ! IOutils::checkFile( this->db_path, false, true ) ) { + } else if ( ! IOutils::checkFile( path, false, true ) ) { emit this->showDialog( WorkerDialog::errDatabaseFileNotWritable, {this->db_name} ); return false; } diff --git a/logdoctor/modules/craplog/workers/parser.h b/logdoctor/modules/craplog/workers/parser.h index 51a7a5d..40f3533 100644 --- a/logdoctor/modules/craplog/workers/parser.h +++ b/logdoctor/modules/craplog/workers/parser.h @@ -4,6 +4,8 @@ #include "main_lib.h" +#include "modules/security/path.h" + #include "modules/craplog/modules/lib.h" #include "modules/blacklists/modules/blacklist.h" @@ -28,7 +30,7 @@ class CraplogParser final : public QObject { Q_OBJECT - using worker_files_t = std::vector; + using worker_files_t = std::vector; public: @@ -38,7 +40,7 @@ public: const LogsFormat& logs_format, const Blacklist& blacklist, worker_files_t&& log_files, - const std::string& data_db_path, + const PathHandler& data_db_path, QObject* parent=nullptr ); @@ -90,7 +92,7 @@ private: bool db_edited{ false }; - std::string db_path; + PathHandler db_path; const QString db_name; const QString db_conn_name{ QStringLiteral("Parser_LogsData") }; -- GitLab From 25c380cdedac0b8400dfeb86444128450ac56b78 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:41:34 +0200 Subject: [PATCH 11/34] Updates Updated Crapview --- logdoctor/modules/crapview/crapview.cpp | 5 +++-- logdoctor/modules/crapview/crapview.h | 2 +- logdoctor/modules/crapview/modules/fetcher.cpp | 4 ++-- logdoctor/modules/crapview/modules/fetcher.h | 7 +++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/logdoctor/modules/crapview/crapview.cpp b/logdoctor/modules/crapview/crapview.cpp index 91d7944..5c70ad9 100644 --- a/logdoctor/modules/crapview/crapview.cpp +++ b/logdoctor/modules/crapview/crapview.cpp @@ -13,6 +13,7 @@ #include "modules/dialogs.h" #include "modules/exceptions.h" +#include "modules/security/path.h" #include "modules/warnlists/modules/warnlist.h" @@ -30,9 +31,9 @@ void Crapview::setDialogsLevel( const DialogsLevel new_level ) noexcept } -void Crapview::setDbPath( const std::string& path ) noexcept +void Crapview::setDbPath( const PathHandler& path ) noexcept { - this->fetcher.setDbPath( path + "/" + DatabasesNames::data ); + this->fetcher.setDbPath( path / DatabasesNames::data ); } diff --git a/logdoctor/modules/crapview/crapview.h b/logdoctor/modules/crapview/crapview.h index 371ce1d..4d89973 100644 --- a/logdoctor/modules/crapview/crapview.h +++ b/logdoctor/modules/crapview/crapview.h @@ -43,7 +43,7 @@ public: /*! \see Fetcher::setDbPath() */ - void setDbPath( const std::string& path ) noexcept; + void setDbPath( const PathHandler& path ) noexcept; //! Returns the month number corresponding to the given printable month diff --git a/logdoctor/modules/crapview/modules/fetcher.cpp b/logdoctor/modules/crapview/modules/fetcher.cpp index e1dd248..256f3d9 100644 --- a/logdoctor/modules/crapview/modules/fetcher.cpp +++ b/logdoctor/modules/crapview/modules/fetcher.cpp @@ -24,10 +24,10 @@ void Fetcher::setDialogLevel( const DialogsLevel new_level ) noexcept this->dialog_level = new_level; } -void Fetcher::setDbPath( std::string&& path ) noexcept +void Fetcher::setDbPath( PathHandler&& path ) noexcept { this->db_path = std::move(path); - this->db_name = QString::fromStdString( this->db_path.substr( this->db_path.find_last_of( '/' ) + 1ul ) ); + this->db_name = QString( this->db_path.getPathUnchecked().filename().c_str() ); } diff --git a/logdoctor/modules/crapview/modules/fetcher.h b/logdoctor/modules/crapview/modules/fetcher.h index 1025e9b..9d37f26 100644 --- a/logdoctor/modules/crapview/modules/fetcher.h +++ b/logdoctor/modules/crapview/modules/fetcher.h @@ -4,6 +4,7 @@ #include "main_lib.h" #include "modules/shared.h" +#include "modules/security/path.h" #include "modules/crapview/lib.h" #include "modules/crapview/datatypes/fwd.h" @@ -66,9 +67,7 @@ public: /*! \see Crapview::setDbPath() */ - void setDbPath( std::string&& path ) noexcept; - - /*const std::string getDbPath( const int web_server );*/ + void setDbPath( PathHandler&& path ) noexcept; //! Refreshes the dates which are available in the database @@ -237,7 +236,7 @@ private: // quantity of information to display throught dialogs DialogsLevel dialog_level{ DL_NORMAL }; - std::string db_path; + PathHandler db_path; QString db_name; // convert log fields to database fields -- GitLab From 431140ee772e92ae0ec83f0525628bd5d3e40a90 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:41:53 +0200 Subject: [PATCH 12/34] Updates Updated modules --- logdoctor/modules/database/database.cpp | 13 +- logdoctor/modules/database/database.h | 3 +- logdoctor/modules/dialogs.cpp | 224 +++++++++++++++--------- logdoctor/modules/dialogs.h | 29 ++- logdoctor/modules/exceptions.cpp | 16 +- logdoctor/modules/exceptions.h | 16 +- 6 files changed, 201 insertions(+), 100 deletions(-) diff --git a/logdoctor/modules/database/database.cpp b/logdoctor/modules/database/database.cpp index 50669f0..7e7f362 100644 --- a/logdoctor/modules/database/database.cpp +++ b/logdoctor/modules/database/database.cpp @@ -4,6 +4,7 @@ #include "globals/db_names.h" #include "modules/dialogs.h" +#include "modules/security/path.h" #include "utilities/checks.h" @@ -39,14 +40,16 @@ DatabaseWrapper::~DatabaseWrapper() } } -void DatabaseWrapper::open( const std::string& path, const bool explain_err ) +void DatabaseWrapper::open( const PathHandler& path, const bool explain_err ) { - this->db.setDatabaseName( QString::fromStdString( path )); if ( ! CheckSec::checkDatabaseFile( path, this->db_name ) ) { throw VoidException(); - } else if ( ! this->db.open() ) { - DialogSec::errDatabaseFailedOpening( this->db_name, explain_err ? this->db.lastError().text() : QString{} ); - throw VoidException(); + } else { + this->db.setDatabaseName( QString::fromStdString( path.toString() )); + if ( ! this->db.open() ) { + DialogSec::errDatabaseFailedOpening( this->db_name, explain_err ? this->db.lastError().text() : QString{} ); + throw VoidException(); + } } } diff --git a/logdoctor/modules/database/database.h b/logdoctor/modules/database/database.h index ef0d9ed..49bbeea 100644 --- a/logdoctor/modules/database/database.h +++ b/logdoctor/modules/database/database.h @@ -9,6 +9,7 @@ #include +class PathHandler; class QueryWrapper; @@ -52,7 +53,7 @@ public: Throws if the file cannot be opened or if opening fails \throw VoidException */ - void open( const std::string& path, const bool explain_err ); + void open( const PathHandler& path, const bool explain_err ); //! Opens the database file at the given path /*! diff --git a/logdoctor/modules/dialogs.cpp b/logdoctor/modules/dialogs.cpp index d2f842c..d75795c 100644 --- a/logdoctor/modules/dialogs.cpp +++ b/logdoctor/modules/dialogs.cpp @@ -13,7 +13,7 @@ void DialogSec::errLangLocaleInvalid( const QString& locale, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Invalid locale"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("Unexpected locale format"), locale, DialogSec::tr("If you haven't manually edited the configuration file,\nplease report this issue") ), @@ -24,7 +24,7 @@ void DialogSec::errLangNotAccepted( const QString& locale, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Invalid locale"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The given locale is not an accepted language"), locale, DialogSec::tr("If you'd like to have this locale in LogDoctor,\nplease follow the instruction on the repository page") ), @@ -41,60 +41,74 @@ void DialogSec::warnConfFileNotFound( const QString& file, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Configuration file not found"), - QStringLiteral("%1%2\n\n%3").arg( + QLatin1String("%1%2\n\n%3").arg( DialogSec::tr("Unable to retrieve the configuration file"), - (file.isEmpty()) ? file : ":\n"+file, + file.isEmpty() ? file : QLatin1String(":\n%1").arg(file), DialogSec::tr("Skipping") ), QString(), MsgType::Warning, parent }; std::ignore = dialog.exec(); } -void DialogSec::errConfFailedWriting( const QString& msg, const QString& err, QWidget* parent ) +void DialogSec::errHandlingConfFile( const QString& title, const QString& message, const QString& additional, const MsgType type, QWidget* parent ) { DialogMsg dialog{ - DialogSec::tr("Failed to write the configuration file"), - QStringLiteral("%1%2\n\n%3").arg( + title, + QLatin1String("%1%2").arg( DialogSec::tr("An error occured while handling the configuration file"), - (msg.isEmpty()) ? msg : ":\n"+msg, - DialogSec::tr("Current configuration not saved") ), - err, MsgType::Warning, parent }; + message ), + additional, type, parent }; std::ignore = dialog.exec(); } +void DialogSec::errConfFailedWriting( const QString& msg, const QString& err, QWidget* parent ) +{ + errHandlingConfFile( + DialogSec::tr("Failed to write the configuration file"), + QLatin1String("%1\n\n%2").arg( + msg.isEmpty() ? msg : QLatin1String(":\n%1").arg(msg), + DialogSec::tr("Current configuration not saved") ), + err, MsgType::Warning, parent ); +} + void DialogSec::errConfFileNotReadable( const QString& file, const QString& err, QWidget* parent ) { - DialogMsg dialog{ + errHandlingConfFile( DialogSec::tr("File not readable"), - QStringLiteral("%1\n\n%2%3").arg( - DialogSec::tr("An error occured while handling the configuration file"), + QLatin1String("\n\n%1%2").arg( DialogSec::tr("The file is not readable"), - (file.isEmpty()) ? file : ":\n"+file ), - err, MsgType::Error, parent }; - std::ignore = dialog.exec(); + file.isEmpty() ? file : QLatin1String(":\n%1").arg(file) ), + err, MsgType::Error, parent ); } void DialogSec::errConfFileNotWritable( const QString& file, const QString& err, QWidget* parent ) { - DialogMsg dialog{ + errHandlingConfFile( DialogSec::tr("File not writable"), - QStringLiteral("%1\n\n%2%3").arg( - DialogSec::tr("An error occured while handling the configuration file"), + QLatin1String("\n\n%1%2").arg( DialogSec::tr("The file is not writable"), - (file.isEmpty()) ? file : ":\n"+file ), - err, MsgType::Error, parent }; - std::ignore = dialog.exec(); + file.isEmpty() ? file : QLatin1String(":\n%1").arg(file) ), + err, MsgType::Error, parent ); } void DialogSec::errConfDirNotWritable( const QString& dir, const QString& err, QWidget* parent ) { - DialogMsg dialog{ + errHandlingConfFile( DialogSec::tr("Directory not writable"), - QStringLiteral("%1\n\n%2%3").arg( - DialogSec::tr("An error occured while handling the configuration file"), + QLatin1String("\n\n%1%2").arg( DialogSec::tr("The directory is not writable"), - (dir.isEmpty()) ? dir : ":\n"+dir ), - err, MsgType::Error, parent }; - std::ignore = dialog.exec(); + dir.isEmpty() ? dir : QLatin1String(":\n%1").arg(dir) ), + err, MsgType::Error, parent ); +} + + +void DialogSec::errConfPathHasSymlink( const QString& full_path, const QString& symlink, QWidget* parent ) +{ + errHandlingConfFile( + DialogSec::tr("Invalid path"), + QLatin1String("\n\n%1%2").arg( + DialogSec::tr("The path contains a symlink"), + full_path.isEmpty() ? full_path : QLatin1String(":\n%1").arg(full_path) ), + symlink, MsgType::Error, parent ); } @@ -102,8 +116,8 @@ void DialogSec::errFailedApplyingConfigsItem( const QString& msg, QWidget* paren { DialogMsg dialog{ DialogSec::tr("Failed applying configuration"), - QStringLiteral("%1\n%2").arg( - (msg.isEmpty()) ? msg : QString(msg).append(QLatin1Char('\n')), + QLatin1String("%1\n%2").arg( + msg.isEmpty() ? msg : QLatin1String("%1\n").arg(msg), DialogSec::tr("Skipping") ), QString(), MsgType::Error, parent }; std::ignore = dialog.exec(); @@ -114,7 +128,7 @@ void DialogSec::warnInvalidConfigsList( const QStringList& list, QWidget* parent { DialogMsg dialog{ DialogSec::tr("Invalid configuration lines"), - QStringLiteral("%1\n%2").arg( + QLatin1String("%1\n%2").arg( DialogSec::tr("Has not been possible to apply some of the configurations"), DialogSec::tr("If you haven't manually edited the configuration file,\nplease report this issue") ), list.join('\n'), @@ -127,7 +141,7 @@ bool DialogSec::choiceFailedApplyingConfigs( const QString& msg, QWidget* parent { DialogBool dialog{ DialogSec::tr("Failed applying configuration"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( msg, DialogSec::tr("If you choose to proceed, all of the unapplied configurations will be lost\nContinue?") ), parent }; @@ -143,11 +157,11 @@ void DialogSec::errHelpFailed( const QString& link, const QString& msg, QWidget* { DialogMsg dialog{ DialogSec::tr("Failed to retrieve the help file"), - QStringLiteral("%1%2\n\n%3%4").arg( + QLatin1String("%1%2\n\n%3%4").arg( DialogSec::tr("An error occured while getting the help file"), - (msg.isEmpty()) ? msg : ":\n"+msg, + msg.isEmpty() ? msg : QLatin1String(":\n%1").arg(msg), DialogSec::tr("Additional resources can be downloaded from the git repo"), - (link.isEmpty()) ? link : ":\n"+link ), + link.isEmpty() ? link : QLatin1String(":\n%1").arg(link) ), QString(), MsgType::Error, parent }; std::ignore = dialog.exec(); } @@ -191,7 +205,7 @@ void DialogSec::errSqlDriverNotFound( const QString& driver, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("QSql driver not found"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("Failed to retrieve the driver needed to handle the database"), driver, DialogSec::tr("Aborting") ), @@ -203,7 +217,7 @@ bool DialogSec::choiceDatabaseNotFound( const QString& db_name, QWidget* parent { DialogBool dialog{ DialogSec::tr("File not found"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("Failed to retrieve the database file"), db_name, DialogSec::tr("Create a new database?") ), @@ -265,7 +279,7 @@ bool DialogSec::choiceDatabaseRenew( const QString& title, const QString& msg, Q { DialogBool dialog{ title, - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( msg, DialogSec::tr("This database will be renamed with a trailing '.copy' and a new one will be created.\nContinue?") ), parent }; @@ -275,7 +289,7 @@ void DialogSec::msgDatabaseCreated( const QString& db_name, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Database created"), - QStringLiteral("%1:\n%2").arg( + QLatin1String("%1:\n%2").arg( DialogSec::tr("Successfully created a new database"), db_name ), QString(), MsgType::Info, parent }; @@ -286,7 +300,7 @@ void DialogSec::errDatabaseNotFound( const QString& db_name, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("File not found"), - QStringLiteral("%1:\n%2").arg( + QLatin1String("%1:\n%2").arg( DialogSec::tr("Failed to retrieve the database file"), db_name ), QString(), MsgType::Error, parent }; @@ -297,7 +311,7 @@ void DialogSec::errDatabaseNotFile( const QString& db_name, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Not a file"), - QStringLiteral("%1\n\n%2:\n%3\n\n%4").arg( + QLatin1String("%1\n\n%2:\n%3\n\n%4").arg( DialogSec::tr("Failed to retrieve the database file"), DialogSec::tr("The path was supposed to point to a file, but it doesn't"), db_name, @@ -310,7 +324,7 @@ void DialogSec::errDatabaseNotReadable( const QString& db_name, QWidget* parent { DialogMsg dialog{ DialogSec::tr("File not readable"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The database file is not readable"), db_name, DialogSec::tr("Please set the proper permissions and retry\nIf this error persists, please report this issue") ), @@ -322,7 +336,7 @@ void DialogSec::errDatabaseNotWritable( const QString& db_name, QWidget* parent { DialogMsg dialog{ DialogSec::tr("File not writable"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The database file is not writable"), db_name, DialogSec::tr("Please set the proper permissions and retry\nIf this error persists, please report this issue") ), @@ -330,11 +344,23 @@ void DialogSec::errDatabaseNotWritable( const QString& db_name, QWidget* parent std::ignore = dialog.exec(); } +void DialogSec::errDatabasePathHasSymlink( const QString& full_path, const QString& symlink, QWidget* parent ) +{ + DialogMsg dialog{ + DialogSec::tr("Invalid database path"), + QLatin1String("%1:\n%2\n\n%3").arg( + DialogSec::tr("The path contains a symlink"), + full_path, + DialogSec::tr("Aborting") ), + symlink, MsgType::Error, parent }; + std::ignore = dialog.exec(); +} + void DialogSec::errDatabaseFailedCreating( const QString& db_name, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Failed creating database"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("An error occured while creating the database"), db_name, DialogSec::tr("Aborting") ), @@ -346,7 +372,7 @@ void DialogSec::errDatabaseFailedOpening( const QString& db_name, const QString& { DialogMsg dialog{ DialogSec::tr("Failed opening database"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("An error occured while opening the database"), db_name, DialogSec::tr("Aborting") ), @@ -358,22 +384,22 @@ void DialogSec::errDatabaseFailedExecuting( const QString& db_name, const QStrin { DialogMsg dialog{ DialogSec::tr("Failed executing on database"), - QStringLiteral("%1:\n%2%3\n\n%4").arg( + QLatin1String("%1:\n%2%3\n\n%4").arg( DialogSec::tr("An error occured while executing a statement on the database"), db_name, - !statement.isEmpty() ? "\n"+statement : QString(), + !statement.isEmpty() ? QLatin1String(":\n%1").arg(statement) : QString(), DialogSec::tr("Aborting") ), err, MsgType::Error, parent }; std::ignore = dialog.exec(); } -void DialogSec::errDatabaseFailedBackup( const QString& msg, const QString& err, QWidget* parent ) +void DialogSec::errDatabaseFailedBackup( const QString& msg, const QString& err, const bool report, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Failed to backup database"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1%2").arg( msg, - DialogSec::tr("Please report this issue") ), + report ? QLatin1String("\n\n%1").arg(DialogSec::tr("Please report this issue") ) : QString() ), err, MsgType::Error, parent }; std::ignore = dialog.exec(); } @@ -405,7 +431,7 @@ void DialogSec::errLogFormatNoFields( QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Misconfigured log format"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( DialogSec::tr("No log field has been set in the current logs format,\nmaking it useless to parse logs"), DialogSec::tr("Please set up a format which contains at least one field") ), QString(), MsgType::Error, parent }; @@ -416,7 +442,7 @@ void DialogSec::errLogFormatNoSeparators( QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Misconfigured log format"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( DialogSec::tr("A separator is missing between one or more fields,\nmaking it hard to establish net bounds,\nand possibly leading to store incorrect data"), DialogSec::tr("Please set up a format which contains separators between fields") ), QString(), MsgType::Error, parent }; @@ -427,7 +453,7 @@ bool DialogSec::choiceLogFormatMissingField( const QString& field, QWidget* pare { DialogBool dialog{ DialogSec::tr("Missing field in log format"), - QStringLiteral("%1:\n%2\n\n%3\n%4").arg( + QLatin1String("%1:\n%2\n\n%3\n%4").arg( DialogSec::tr("An important field is missing from the provided format:"), field, DialogSec::tr("The quality of the statistics may be seriously compromized"), @@ -440,7 +466,7 @@ bool DialogSec::choiceLogFormatWithCarriageReturn( QWidget* parent ) { DialogBool dialog{ DialogSec::tr("'Carriage Return' in log format"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( DialogSec::tr("The provided format contains the 'Carriage Return'.\nThis may lead to data losses or crashes if not used with caution"), DialogSec::tr("Proceed anyway?") ), parent }; @@ -465,7 +491,7 @@ void DialogSec::errFailedDefiningLogType( const QString& file, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Failed defining type"), - QStringLiteral("%1:\n%2").arg( + QLatin1String("%1:\n%2").arg( DialogSec::tr("Failed to determine the log type"), file ), QString(), MsgType::Error, parent }; @@ -477,7 +503,7 @@ int DialogSec::choiceFileAlreadyUsed( const QString& msg, QWidget* parent ) { DialogIda dialog{ DialogSec::tr("File already used"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The file has probably been used already"), msg, DialogSec::tr("Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process?") ), @@ -490,7 +516,7 @@ int DialogSec::choiceDuplicateFile( const QString& msg, QWidget* parent ) { DialogIda dialog{ DialogSec::tr("Duplicate file"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The file appears twice in the list of selections"), msg, DialogSec::tr("Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process?") ), @@ -502,7 +528,7 @@ void DialogSec::errFailedInsertUsedHashes( QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Failed updating hashes"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( DialogSec::tr("An error occured while inserting the parsed files hashes into the database"), DialogSec::tr("Aborting") ), QString(), MsgType::Error, parent }; @@ -514,7 +540,7 @@ int DialogSec::choiceFileSizeWarning( const QString& msg, QWidget* parent ) { DialogIda dialog{ DialogSec::tr("File exceeds warning size"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The file's size exceeds the warning size"), msg, DialogSec::tr("Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process?") ), @@ -525,7 +551,7 @@ bool DialogSec::choiceFileSizeWarning2( const QString& msg, QWidget* parent ) { DialogBool dialog{ DialogSec::tr("File exceeds warning size"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The file's size exceeds the warning size"), msg, DialogSec::tr("Proceed anyway?") ), @@ -537,7 +563,7 @@ void DialogSec::msgNotEnoughMemory( const QString& msg, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Not enough memory"), - QStringLiteral("%1%2\n\n%3").arg( + QLatin1String("%1%2\n\n%3").arg( DialogSec::tr("The total size of the selected files exceeds the available memory"), msg, DialogSec::tr("Please free some resources, parse the files in different steps or split them into smaller units") ), @@ -550,7 +576,7 @@ void DialogSec::errFailedReadFile( const QString& file , const bool skipping, QW { DialogMsg dialog{ DialogSec::tr("Failed reading"), - QStringLiteral("%1:\n%2%3").arg( + QLatin1String("%1:\n%2%3").arg( DialogSec::tr("An error occured while reading the file"), file, skipping ? DialogSec::tr("Skipping").prepend("\n\n") : QString() ), @@ -562,10 +588,10 @@ void DialogSec::errFailedReadFile( const QString& file , const bool skipping, QW { DialogMsg dialog{ DialogSec::tr("Failed writing"), - QStringLiteral("%1:\n%2%3").arg( + QLatin1String("%1:\n%2%3").arg( DialogSec::tr("An error occured while writing the file"), file, - (skipping) ? QStringLiteral("\n\n%1").arg(DialogSec::tr("Skipping")) : QString() ), + (skipping) ? QLatin1String("\n\n%1").arg(DialogSec::tr("Skipping")) : QString() ), QString(), MsgType::Error, parent }; std::ignore = dialog.exec(); }*/ @@ -575,7 +601,7 @@ void DialogSec::warnEmptyFile( const QString& file, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("File is empty"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The file is blank"), file, DialogSec::tr("Skipping") ), @@ -587,7 +613,7 @@ void DialogSec::errFileNotFound( const QString& file , const bool report, QWidge { DialogMsg dialog{ DialogSec::tr("File not found"), - QStringLiteral("%1:\n%2%3").arg( + QLatin1String("%1:\n%2%3").arg( DialogSec::tr("Unable to retrieve the file"), file, report ? DialogSec::tr("Please report this issue").prepend("\n\n") : QString() ), @@ -599,7 +625,7 @@ void DialogSec::warnFileNotReadable( const QString& file, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("File not readable"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The file is not readable"), file, DialogSec::tr("Skipping") ), @@ -613,7 +639,7 @@ int DialogSec::choiceSelectedFileNotFound( const QString& file, QWidget* parent { DialogIda dialog{ DialogSec::tr("File not found"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("Failed to retrieve the selected file"), file, DialogSec::tr("Discard it and continue, or Abort all and exit?") ), @@ -625,7 +651,7 @@ void DialogSec::msgNoFileToParse( QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("No file to parse"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( DialogSec::tr("The list of files to parse is empty"), DialogSec::tr("Aborting") ), QString(), MsgType::Error, parent }; @@ -641,7 +667,7 @@ void DialogSec::errDirNotExists( const QString& dir, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Directory not found"), - QStringLiteral("%1:\n%2").arg( + QLatin1String("%1:\n%2").arg( DialogSec::tr("The directory does not exists"), dir ), QString(), MsgType::Error, parent }; @@ -652,7 +678,7 @@ void DialogSec::errDirNotExists( const QString& dir, QWidget* parent ) { DialogDia dialog{ DialogSec::tr("Directory not found"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The directory does not exists"), dir, DialogSec::tr("Discard it and continue, or Abort all and exit?") ), @@ -665,7 +691,7 @@ void DialogSec::errDirNotReadable( const QString& dir, const QString& err, QWidg { DialogMsg dialog{ DialogSec::tr("Directory not readable"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The directory is not readable"), dir, DialogSec::tr("Please set the proper permissions and retry\nIf this error persists, please report this issue") ), @@ -676,7 +702,7 @@ void DialogSec::warnDirNotReadable( QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Directory not readable"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( DialogSec::tr("The directory is not readable"), DialogSec::tr("Please set the proper permissions before to start") ), QString(), MsgType::Warning, parent }; @@ -687,7 +713,7 @@ void DialogSec::errDirNotWritable( const QString& dir, const QString& err, QWidg { DialogMsg dialog{ DialogSec::tr("Directory not writable"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The directory is not writable"), dir, DialogSec::tr("Please set the proper permissions and retry\nIf this error persists, please report this issue") ), @@ -698,7 +724,7 @@ void DialogSec::warnDirNotWritable( QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("Directory not writable"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( DialogSec::tr("The directory is not writable"), DialogSec::tr("Please set the proper permissions before to start") ), QString(), MsgType::Warning, parent }; @@ -709,7 +735,7 @@ void DialogSec::errFailedMakeDir( const QString& msg, const QString& err, QWidge { DialogMsg dialog{ DialogSec::tr("Failed creating directory"), - QStringLiteral("%1\n\n%2").arg( + QLatin1String("%1\n\n%2").arg( msg, DialogSec::tr("Please set the proper permissions and retry\nIf this error persists, please report this issue") ), err, MsgType::Error, parent }; @@ -717,6 +743,32 @@ void DialogSec::errFailedMakeDir( const QString& msg, const QString& err, QWidge } +/////////////// +//// PATHS //// +/////////////// +void DialogSec::errPathNotExists( const QString& component, const QString& path, QWidget* parent ) +{ + DialogMsg dialog{ + DialogSec::tr("Invalid path"), + QLatin1String("%1:\n%2").arg( + DialogSec::tr("The path does not exists"), + component ), + path, MsgType::Error, parent }; + std::ignore = dialog.exec(); +} + +void DialogSec::errPathHasSymlink( const QString& component, const QString& path, QWidget* parent ) +{ + DialogMsg dialog{ + DialogSec::tr("Invalid path"), + QLatin1String("%1:\n%2").arg( + DialogSec::tr("The path contains a symlink"), + component ), + path, MsgType::Error, parent }; + std::ignore = dialog.exec(); +} + + ////////////// //// DATA //// ////////////// @@ -724,7 +776,7 @@ void DialogSec::errConvertingData( const QString& fromType, const QString& intoT { DialogMsg dialog{ DialogSec::tr("Data conversion failed"), - QStringLiteral("%1:\n%2").arg( + QLatin1String("%1:\n%2").arg( DialogSec::tr("Failed to convert from '%1' to '%2'").arg( fromType, intoType ), value ), @@ -762,7 +814,7 @@ bool DialogSec::choiceDirNotDir( const QString& path, QWidget* parent ) { DialogBool dialog{ DialogSec::tr("Not a folder"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The path was supposed to point to a folder, but it doesn't"), path, DialogSec::tr("The entry will be renamed with a trailing '.copy' and a new one will be created.\nContinue?") ), @@ -773,7 +825,7 @@ bool DialogSec::choiceFileNotFile( const QString& path, QWidget* parent ) { DialogBool dialog{ DialogSec::tr("Not a file"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1:\n%2\n\n%3").arg( DialogSec::tr("The path was supposed to point to a file, but it doesn't"), path, DialogSec::tr("The entry will be renamed with a trailing '.copy' and a new one will be created.\nContinue?") ), @@ -787,11 +839,11 @@ bool DialogSec::choiceFileNotFile( const QString& path, QWidget* parent ) { QString footer; if ( report_msg ) { - footer += "\n\n" + DialogSec::tr("Please report this issue"); + footer = QLatin1String("\n\n%1").arg( DialogSec::tr("Please report this issue") ); } DialogMsg dialog{ DialogSec::tr("An error occured"), - QStringLiteral("%1%2").arg( + QLatin1String("%1%2").arg( msg, footer ), QString(), MsgType::Warning, parent }; std::ignore = dialog.exec(); @@ -799,13 +851,13 @@ bool DialogSec::choiceFileNotFile( const QString& path, QWidget* parent ) -void DialogSec::errGeneric( const QString& msg, const bool report_msg, QWidget* parent ) +void DialogSec::errGeneric( const QString& msg, const bool report, QWidget* parent ) { DialogMsg dialog{ DialogSec::tr("An error occured"), - QStringLiteral("%1%2").arg( + QLatin1String("%1%2").arg( msg, - report_msg ? DialogSec::tr("Please report this issue").prepend("\n\n") : QString() ), + report ? DialogSec::tr("Please report this issue").prepend("\n\n") : QString() ), QString(), MsgType::Error, parent }; std::ignore = dialog.exec(); } @@ -816,9 +868,9 @@ void DialogSec::errRenaming( const QString& path, const QString& err, QWidget* p { DialogMsg dialog{ DialogSec::tr("Failed renaming"), - QStringLiteral("%1:\n%2\n\n%3").arg( + QLatin1String("%1%2\n\n%3").arg( DialogSec::tr("An error occured while renaming"), - path, + path.isEmpty() ? path : QLatin1String(":\n%1").arg(path), DialogSec::tr("Aborting") ), err, MsgType::Error, parent }; std::ignore = dialog.exec(); diff --git a/logdoctor/modules/dialogs.h b/logdoctor/modules/dialogs.h index 4a76d58..724aaaa 100644 --- a/logdoctor/modules/dialogs.h +++ b/logdoctor/modules/dialogs.h @@ -5,6 +5,9 @@ #include +enum class MsgType; + + //! DialogSec /*! Implements various dialog models @@ -20,10 +23,10 @@ public: ///////////////// //// GENERIC //// - /*static void warnGeneric( const QString& message, const bool report_msg=false, QWidget* parent=nullptr );*/ + /*static void warnGeneric( const QString& message, const bool report=false, QWidget* parent=nullptr );*/ //! Generic error message - static void errGeneric( const QString& message, const bool report_msg=false, QWidget* parent=nullptr ); + static void errGeneric( const QString& message, const bool report=false, QWidget* parent=nullptr ); //! Error while renaming static void errRenaming( const QString& path, const QString& err, QWidget* parent=nullptr ); @@ -57,6 +60,9 @@ public: //! Missing read permission for the configuration file's directory static void errConfDirNotWritable( const QString& dir, const QString& err, QWidget* parent=nullptr ); + //! The path of the configuration file contains a symlink + static void errConfPathHasSymlink( const QString& full_path, const QString& symlink, QWidget* parent=nullptr ); + //! An error occured while applying the value retrieved from the conf file static void errFailedApplyingConfigsItem( const QString& msg, QWidget* parent=nullptr ); @@ -116,6 +122,9 @@ public: //! Missing write permission for a database static void errDatabaseNotWritable( const QString& db_name, QWidget* parent=nullptr ); + //! The path of a database file contains a symlink + static void errDatabasePathHasSymlink( const QString& full_path, const QString& symlink, QWidget* parent=nullptr ); + //! Successfully created a new database static void msgDatabaseCreated( const QString& db_name, QWidget* parent=nullptr ); @@ -129,7 +138,7 @@ public: static void errDatabaseFailedExecuting( const QString& db_name, const QString& statement, const QString& err, QWidget* parent=nullptr ); //! Failed to backup a database - static void errDatabaseFailedBackup( const QString& msg, const QString& err, QWidget* parent=nullptr ); + static void errDatabaseFailedBackup( const QString& msg, const QString& err, const bool report=true, QWidget* parent=nullptr ); /////////////////// @@ -261,12 +270,23 @@ public: static void errFailedMakeDir( const QString& msg, const QString& err, QWidget* parent=nullptr ); + /////////////// + //// PATHS //// + + //! A component of the path does not extst + static void errPathNotExists( const QString& component, const QString& path, QWidget* parent=nullptr ); + + //! A component of the path is a symlink + static void errPathHasSymlink( const QString& component, const QString& path, QWidget* parent=nullptr ); + + ////////////// //// DATA //// //! Failed to convert some data from one type into another static void errConvertingData( const QString& fromType, const QString& intoType, const QString& value, QWidget* parent=nullptr ); + ///////////////// //// CHOICES //// @@ -283,6 +303,9 @@ private: //! Asks to renew a database static bool choiceDatabaseRenew( const QString& title, const QString& msg, QWidget* parent=nullptr ); + //! Display an error message about the configuration file/folder/path + static void errHandlingConfFile( const QString& title, const QString& message, const QString& additional, const MsgType type, QWidget* parent=nullptr ); + }; diff --git a/logdoctor/modules/exceptions.cpp b/logdoctor/modules/exceptions.cpp index ba6b8bf..7ad1e8c 100644 --- a/logdoctor/modules/exceptions.cpp +++ b/logdoctor/modules/exceptions.cpp @@ -3,8 +3,6 @@ #include -#include - DoNotCatchException::DoNotCatchException( const char* header, const std::string& body ) { @@ -17,7 +15,6 @@ DoNotCatchException::DoNotCatchException( const char* header, const std::string& GenericException::GenericException( const std::string& msg ) : msg{ QString::fromStdString( msg ) } { - } const QString& GenericException::what() { @@ -74,9 +71,20 @@ BWlistException::BWlistException( const std::string& msg ) DatabaseException::DatabaseException( QString&& msg ) : msg{ std::move(msg) } { - } const QString& DatabaseException::what() const noexcept { return msg; } + + +/////////////// +//// PATHS //// +InvalidPathException::InvalidPathException( QStringList&& msg ) + : msg{ std::move(msg) } +{ +} +const QStringList& InvalidPathException::what() const noexcept +{ + return msg; +} diff --git a/logdoctor/modules/exceptions.h b/logdoctor/modules/exceptions.h index c3d350d..fff14a3 100644 --- a/logdoctor/modules/exceptions.h +++ b/logdoctor/modules/exceptions.h @@ -2,7 +2,7 @@ #define LOGDOCTOR__EXCEPTIONS_H -#include +#include //! VoidException @@ -108,4 +108,18 @@ private: }; +//! InvalidPathException +/*! + Exception related to a path +*/ +class InvalidPathException final : public LogDoctorException { +public: + explicit InvalidPathException( QStringList&& msg ); + const QStringList& what() const noexcept; + +private: + QStringList msg; +}; + + #endif // LOGDOCTOR__EXCEPTIONS_H -- GitLab From e42316f897be346b1527bc039bfd02c7a1684307 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:42:21 +0200 Subject: [PATCH 13/34] Updates Updated utilities --- logdoctor/utilities/checks.cpp | 86 +++++++++++++++++++++------------- logdoctor/utilities/checks.h | 8 ++-- logdoctor/utilities/gzip.cpp | 2 +- logdoctor/utilities/gzip.h | 4 +- logdoctor/utilities/io.cpp | 22 ++++----- logdoctor/utilities/io.h | 25 +++++----- 6 files changed, 84 insertions(+), 63 deletions(-) diff --git a/logdoctor/utilities/checks.cpp b/logdoctor/utilities/checks.cpp index b72194d..75d1514 100644 --- a/logdoctor/utilities/checks.cpp +++ b/logdoctor/utilities/checks.cpp @@ -6,6 +6,7 @@ #include "modules/dialogs.h" #include "modules/database/database.h" +#include "modules/security/path.h" #include "utilities/io.h" @@ -85,11 +86,11 @@ bool checkDatabaseTablesNames( QueryWrapper query ) \return The result of the operation \see checkCollectionDatabase(), checkHashesDatabase() */ -bool newCollectionDatabase( DatabaseWrapper db, const std::string& db_path, const std::vector& ws_names ) noexcept +bool newCollectionDatabase( DatabaseWrapper db, const PathHandler& db_path, const std::vector& ws_names ) noexcept { try { - db.openNew( db_path ); + db.openNew( db_path.toString() ); // succesfully creted database file, now create the tables const QString stmt{ QStringLiteral(R"( @@ -146,11 +147,11 @@ bool newCollectionDatabase( DatabaseWrapper db, const std::string& db_path, cons \return The result of the operation \see checkCollectionDatabase(), checkHashesDatabase() */ -bool newHashesDatabase( DatabaseWrapper db, const std::string& db_path, const std::vector& ws_names ) noexcept +bool newHashesDatabase( DatabaseWrapper db, const PathHandler& db_path, const std::vector& ws_names ) noexcept { try { - db.openNew( db_path ); + db.openNew( db_path.toString() ); // succesfully creted database file, now create the tables const QString stmt{ QStringLiteral(R"( @@ -185,7 +186,7 @@ bool newHashesDatabase( DatabaseWrapper db, const std::string& db_path, const st } // namespace (private) -bool checkCollectionDatabase( const std::string& db_path ) noexcept +bool checkCollectionDatabase( const PathHandler& db_path ) noexcept { const std::vector ws_names{ "apache", "nginx", "iis" }; @@ -193,15 +194,19 @@ bool checkCollectionDatabase( const std::string& db_path ) noexcept DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data ) }; - if ( ! IOutils::exists( db_path ) ) { - // ask to create a new one - if ( DialogSec::choiceDatabaseNotFound( db.name() ) ) { - // choosed to create it - throw MakeNewDatabase{}; + const auto path_exp{ db_path.getPath() }; + if ( ! path_exp.has_value() ) { + if ( path_exp.error().isReasonSymlink() ) { + const auto& invalid{ path_exp.error() }; + DialogSec::errDatabasePathHasSymlink( + QString(invalid.invalid_component.c_str()), + QString(invalid.full_path.c_str()) ); } else { - // refused to create it, abort - return false; + if ( DialogSec::choiceDatabaseNotFound( db.name() ) ) { + throw MakeNewDatabase{}; + } } + return false; } // check file type and permissions @@ -210,7 +215,7 @@ bool checkCollectionDatabase( const std::string& db_path ) noexcept } // file seems ok, try to open - db.open( db_path, true ); + db.open( db_path.toString(), true ); // check the tables if ( ! checkDatabaseTablesNames( db.getQuery() ) ) { @@ -308,16 +313,17 @@ bool checkCollectionDatabase( const std::string& db_path ) noexcept } catch (const MakeNewDatabase&) { - if ( IOutils::exists( db_path ) ) { + const auto path{ db_path.getPathUnchecked() }; + if ( IOutils::exists( path ) ) { // a database already exists, try rename it std::error_code err; - if ( ! IOutils::renameAsCopy( db_path, err ) ) { + if ( ! IOutils::renameAsCopy( path, err ) ) { // failed to rename QString err_msg; if ( err ) { err_msg = QString::fromStdString( err.message() ); } - DialogSec::errRenaming( QString::fromStdString(db_path), err_msg ); + DialogSec::errRenaming( QString(path.c_str()), err_msg ); return false; } } @@ -331,7 +337,7 @@ bool checkCollectionDatabase( const std::string& db_path ) noexcept } -bool checkHashesDatabase( const std::string& db_path ) noexcept +bool checkHashesDatabase( const PathHandler& db_path ) noexcept { const std::vector ws_names { "apache", "nginx", "iis" }; @@ -339,15 +345,19 @@ bool checkHashesDatabase( const std::string& db_path ) noexcept DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Hashes ) }; - if ( ! IOutils::exists( db_path ) ) { - // database does not exist, yet, ask to create a new one - if ( DialogSec::choiceDatabaseNotFound( db.name() ) ) { - // choosed to create it - throw MakeNewDatabase{}; + const auto path_exp{ db_path.getPath() }; + if ( ! path_exp.has_value() ) { + if ( path_exp.error().isReasonSymlink() ) { + const auto& invalid{ path_exp.error() }; + DialogSec::errDatabasePathHasSymlink( + QString(invalid.invalid_component.c_str()), + QString(invalid.full_path.c_str()) ); } else { - // refused to create it, abort - return false; + if ( DialogSec::choiceDatabaseNotFound( db.name() ) ) { + throw MakeNewDatabase{}; + } } + return false; } // check file type and permissions @@ -356,7 +366,7 @@ bool checkHashesDatabase( const std::string& db_path ) noexcept } // file seems ok, try to open - db.open( db_path, true ); + db.open( db_path.toString(), true ); // check the tables if ( ! checkDatabaseTablesNames( db.getQuery() ) ) { @@ -401,16 +411,17 @@ bool checkHashesDatabase( const std::string& db_path ) noexcept } catch (const MakeNewDatabase&) { - if ( IOutils::exists( db_path ) ) { + const auto path{ db_path.getPathUnchecked() }; + if ( IOutils::exists( path ) ) { // a database already exists, try rename it std::error_code err; - if ( ! IOutils::renameAsCopy( db_path, err ) ) { + if ( ! IOutils::renameAsCopy( path, err ) ) { // failed to rename QString err_msg; if ( err ) { err_msg = QString::fromStdString( err.message() ); } - DialogSec::errRenaming( QString::fromStdString(db_path), err_msg ); + DialogSec::errRenaming( QString(path.c_str()), err_msg ); return false; } } @@ -424,21 +435,30 @@ bool checkHashesDatabase( const std::string& db_path ) noexcept } -bool checkDatabaseFile( const std::string& db_path, const QString& db_name ) noexcept +bool checkDatabaseFile( const PathHandler& db_path, const QString& db_name ) noexcept { - if ( ! IOutils::exists( db_path ) ) { + const auto path_exp{ db_path.getPath() }; + if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + const auto& invalid{ path_exp.error() }; + DialogSec::errDatabasePathHasSymlink( + QString(invalid.invalid_component.c_str()), + QString(invalid.full_path.c_str()) ); + return false; + } + const path_t& path{ path_exp.value() }; + if ( ! IOutils::exists( path ) ) { // path doesn't exists DialogSec::errDatabaseNotFound( db_name ); return false; - } else if ( ! IOutils::isFile( db_path ) ) { + } else if ( ! IOutils::isFile( path ) ) { // path doesn't point to a file DialogSec::errDatabaseNotFile( db_name ); return false; - } else if ( ! IOutils::checkFile( db_path, true ) ) { + } else if ( ! IOutils::checkFile( path, true ) ) { // database not readable, abort DialogSec::errDatabaseNotReadable( db_name ); return false; - } else if ( ! IOutils::checkFile( db_path, false, true ) ) { + } else if ( ! IOutils::checkFile( path, false, true ) ) { // database not writable, abort DialogSec::errDatabaseNotWritable( db_name ); return false; diff --git a/logdoctor/utilities/checks.h b/logdoctor/utilities/checks.h index c91dc65..2b5699b 100644 --- a/logdoctor/utilities/checks.h +++ b/logdoctor/utilities/checks.h @@ -4,6 +4,8 @@ #include +class PathHandler; + class QString; @@ -21,7 +23,7 @@ namespace CheckSec \return The result of the check \see IOutils::exists(), IOutils::isFile(), IOutils::checkFile() */ -bool checkDatabaseFile( const std::string& db_path, const QString& db_name ) noexcept; +bool checkDatabaseFile( const PathHandler& db_path, const QString& db_name ) noexcept; //! Checks the structure's integrity of the Collection database /*! @@ -29,7 +31,7 @@ bool checkDatabaseFile( const std::string& db_path, const QString& db_name ) noe \return The result of the check \see checkDatabaseTablesNames(), newCollectionDatabase(), newHashesDatabase() */ -bool checkCollectionDatabase( const std::string& db_path ) noexcept; +bool checkCollectionDatabase( const PathHandler& db_path ) noexcept; //! Checks the structure's integrity of the Hashes database /*! @@ -37,7 +39,7 @@ bool checkCollectionDatabase( const std::string& db_path ) noexcept; \return The result of the check \see checkDatabaseTablesNames(), newCollectionDatabase(), newHashesDatabase() */ -bool checkHashesDatabase( const std::string& db_path ) noexcept; +bool checkHashesDatabase( const PathHandler& db_path ) noexcept; } // namespace CheckSec diff --git a/logdoctor/utilities/gzip.cpp b/logdoctor/utilities/gzip.cpp index 8dc6e81..af86f26 100644 --- a/logdoctor/utilities/gzip.cpp +++ b/logdoctor/utilities/gzip.cpp @@ -83,7 +83,7 @@ public: namespace GZutils { -void readFile( const std::string& path, std::string& content ) +void readFile( const std::filesystem::path& path, std::string& content ) { bool successful{ true }; diff --git a/logdoctor/utilities/gzip.h b/logdoctor/utilities/gzip.h index fb49db0..76bdaee 100644 --- a/logdoctor/utilities/gzip.h +++ b/logdoctor/utilities/gzip.h @@ -2,7 +2,7 @@ #define LOGDOCTOR__UTILITIES__GZIP_H -#include +#include //! GZUtils @@ -17,7 +17,7 @@ namespace GZutils \param path The path of the file \param content Will hold the content of the file */ -void readFile( const std::string& path, std::string& content ); +void readFile( const std::filesystem::path& path, std::string& content ); } // namespace GZutils diff --git a/logdoctor/utilities/io.cpp b/logdoctor/utilities/io.cpp index 34265b6..d128647 100644 --- a/logdoctor/utilities/io.cpp +++ b/logdoctor/utilities/io.cpp @@ -20,7 +20,7 @@ class FileHandler final Stream file; public: - explicit FileHandler( const std::string& path ) + explicit FileHandler( const std::filesystem::path& path ) : file{ path } { if ( ! this->file.is_open() ) { @@ -58,7 +58,7 @@ public: namespace IOutils { -bool checkFile( std::string_view path, const bool readable, const bool writable ) noexcept +bool checkFile( const std::filesystem::path& path, const bool readable, const bool writable ) noexcept { if ( isFile( path ) ) { // check the needed permissions @@ -79,7 +79,7 @@ bool checkFile( std::string_view path, const bool readable, const bool writable } -bool checkDir( std::string_view path, const bool readable, const bool writable ) noexcept +bool checkDir( const std::filesystem::path& path, const bool readable, const bool writable ) noexcept { if ( isDir( path ) ) { // check the needed permissions @@ -100,7 +100,7 @@ bool checkDir( std::string_view path, const bool readable, const bool writable ) } -bool makeDir( std::string_view path, std::error_code& err ) noexcept +bool makeDir( const std::filesystem::path& path, std::error_code& err ) noexcept { try { const bool failed{ !std::filesystem::create_directories( path, err ) }; @@ -115,14 +115,14 @@ bool makeDir( std::string_view path, std::error_code& err ) noexcept // rename an entry with a trailing '.copy' -bool renameAsCopy( std::string_view path, std::error_code& err ) noexcept +bool renameAsCopy( const std::filesystem::path& path, std::error_code& err ) noexcept { try { - std::string new_path{ path }; + std::filesystem::path new_path{ path }; // loop until a valid name is found while (true) { - new_path += ".copy"; - if ( ! exists( new_path ) ) { + new_path.concat(".copy"); + if ( ! IOutils::exists( new_path ) ) { // available name found break; } @@ -138,7 +138,7 @@ bool renameAsCopy( std::string_view path, std::error_code& err ) noexcept } -void readFile( const std::string& path, std::string& content ) +void readFile( const std::filesystem::path& path, std::string& content ) { // read the whole file try { @@ -160,7 +160,7 @@ void readFile( const std::string& path, std::string& content ) } -void randomLines( const std::string& path, std::vector& lines, const size_t n_lines, const bool strip_lines ) +void randomLines( const std::filesystem::path& path, std::vector& lines, const size_t n_lines, const bool strip_lines ) { // read rhe first N lines only try { @@ -244,7 +244,7 @@ void randomLines( const std::string& path, std::vector& lines, cons } -void writeOnFile( const std::string& path, std::string_view content ) +void writeOnFile( const std::filesystem::path& path, std::string_view content ) { try { FileHandler file{ path }; // throws std::ios_base::failure on failure diff --git a/logdoctor/utilities/io.h b/logdoctor/utilities/io.h index 28307b4..1c41aa0 100644 --- a/logdoctor/utilities/io.h +++ b/logdoctor/utilities/io.h @@ -2,7 +2,6 @@ #define LOGDOCTOR__UTILITIES__IO_H -#include #include #include @@ -19,7 +18,7 @@ namespace IOutils \param path The path of the entry \return The result of the check */ -inline bool exists( std::string_view path ) noexcept +inline bool exists( const std::filesystem::path& path ) noexcept { return path.empty() ? false @@ -31,9 +30,9 @@ inline bool exists( std::string_view path ) noexcept \param path The path of the entry \return The result of the check */ -inline bool isFile( std::string_view path ) noexcept +inline bool isFile( const std::filesystem::path& path ) noexcept { - return exists( path ) + return IOutils::exists( path ) ? std::filesystem::is_regular_file( path ) : false; } @@ -43,9 +42,9 @@ inline bool isFile( std::string_view path ) noexcept \param path The path of the entry \return The result of the checks */ -inline bool isDir( std::string_view path ) noexcept +inline bool isDir( const std::filesystem::path& path ) noexcept { - return exists( path ) + return IOutils::exists( path ) ? std::filesystem::is_directory( path ) : false; } @@ -57,7 +56,7 @@ inline bool isDir( std::string_view path ) noexcept \param writable Set to true to check for writability \return The result of the checks */ -bool checkFile( std::string_view path, const bool readable=false, const bool writable=false ) noexcept; +bool checkFile( const std::filesystem::path& path, const bool readable=false, const bool writable=false ) noexcept; //! Checks if a path exists, if it points to a folder and if the user has read and/or write permissions on it /*! @@ -66,14 +65,14 @@ bool checkFile( std::string_view path, const bool readable=false, const bool wri \param writable Set to true to check for writability \return The result of the checks */ -bool checkDir( std::string_view path, const bool readable=false, const bool writable=false ) noexcept; +bool checkDir( const std::filesystem::path& path, const bool readable=false, const bool writable=false ) noexcept; //! Creates a directory /*! \param path The path of the new entry \return Wheter the operation was successful or not */ -bool makeDir( std::string_view path, std::error_code& err ) noexcept; +bool makeDir( const std::filesystem::path& path, std::error_code& err ) noexcept; //! Renames an entry with a trailing '.copy' /*! @@ -81,7 +80,7 @@ bool makeDir( std::string_view path, std::error_code& err ) noexcept; \param err Will hold the error, if any \return Wheter the operation was successful or not */ -bool renameAsCopy( std::string_view path, std::error_code& err ) noexcept; +bool renameAsCopy( const std::filesystem::path& path, std::error_code& err ) noexcept; //! Randomly pick lines from a file /*! @@ -90,21 +89,21 @@ bool renameAsCopy( std::string_view path, std::error_code& err ) noexcept; \param n_lines The number of lines to pick \param strip_lines Whether to strip control-characters away from the lines */ -void randomLines( const std::string& path, std::vector& lines, const size_t n_lines=16ul, const bool strip_lines=true ); +void randomLines( const std::filesystem::path& path, std::vector& lines, const size_t n_lines=16ul, const bool strip_lines=true ); //! Reads the content of a file /*! \param path The path of the file to read from \param content Will hold the content of the file */ -void readFile( const std::string& path, std::string& content ); +void readFile( const std::filesystem::path& path, std::string& content ); //! Writes a string on file /*! \param path The path of the file to write on \param content The string to write */ -void writeOnFile( const std::string& path, std::string_view content ); +void writeOnFile( const std::filesystem::path& path, std::string_view content ); } // namespace IOutils -- GitLab From 9396461dedc216a928d268b886cbad90cbbf76f5 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 19 May 2024 19:53:29 +0200 Subject: [PATCH 14/34] Updates Updated conf file. Updated readConfigs and writeConfigs methods. --- installation_stuff/logdoctor.conf | 3 +++ logdoctor/mainwindow.cpp | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/installation_stuff/logdoctor.conf b/installation_stuff/logdoctor.conf index b95efd1..c7ffafd 100644 --- a/installation_stuff/logdoctor.conf +++ b/installation_stuff/logdoctor.conf @@ -12,6 +12,9 @@ DatabaseHashesPath= DatabaseDoBackup=true DatabaseBackupsNumber=3 +[Security] +FollowSymlinks=false + [TextBrowser] Font=0 WideLines=true diff --git a/logdoctor/mainwindow.cpp b/logdoctor/mainwindow.cpp index ed36b77..2c5f99a 100644 --- a/logdoctor/mainwindow.cpp +++ b/logdoctor/mainwindow.cpp @@ -236,6 +236,8 @@ MainWindow::MainWindow(QWidget *parent) this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false ); this->ui->spinBox_ConfDatabases_NumBackups->setValue( this->db_backups_number ); this->ui->checkBox_ConfDatabases_DoBackup->setChecked( this->db_do_backup ); + // security + this->ui->checkBox_ConfSecurity_Paths_Symlinks->setChecked( GlobalConfigs::Security::follow_symlinks ); // logs control this->ui->checkBox_ConfControl_Usage->setChecked( this->hide_used_files ); this->ui->spinBox_ConfControl_Size->setValue( static_cast(this->craplog.getWarningSize() / 1'048'576ul) ); @@ -522,6 +524,13 @@ void MainWindow::readConfigs() invalid_lines.append( QString::fromStdString( line ) ); } + } else if ( var == "FollowSymlinks" ) { + try { + GlobalConfigs::Security::follow_symlinks = this->s2b.at( val ); + } catch ( const std::exception& ) { + invalid_lines.append( QString::fromStdString( line ) ); + } + } else if ( var == "Font" ) { try { this->on_box_ConfTextBrowser_Font_currentIndexChanged( std::stoi( val ) ); @@ -1031,7 +1040,7 @@ void MainWindow::writeConfigs() //// USER INTERFACE //// std::string configs; - configs += "\n\n[UI]"; + configs += "\n[UI]"; configs += "\nLanguage=" + this->language; configs += "\nRememberGeometry=" + this->b2s.at( this->remember_window ); configs += "\nGeometry=" + this->geometryToString(); @@ -1044,6 +1053,9 @@ void MainWindow::writeConfigs() configs += "\nDatabaseHashesPath=" + this->db_hashes_path.toString(); configs += "\nDatabaseDoBackup=" + this->b2s.at( this->db_do_backup ); configs += "\nDatabaseBackupsNumber=" + std::to_string( this->db_backups_number ); + //// SECURITY //// + configs += "\n\n[Security]"; + configs += "\nFollowSymlinks=" + this->b2s.at(GlobalConfigs::Security::follow_symlinks); //// TEXT BROWSER //// configs += "\n\n[TextBrowser]"; configs += "\nFont=" + std::to_string( this->ui->box_ConfTextBrowser_Font->currentIndex() ); -- GitLab From ec0c2f8f3eeeb6c65bc7c9cf34b4cea1c81986d2 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sat, 27 Jul 2024 21:09:21 +0200 Subject: [PATCH 15/34] Code improvements --- logdoctor/mainwindow.cpp | 809 ++++++++++++++++++--------------------- 1 file changed, 366 insertions(+), 443 deletions(-) diff --git a/logdoctor/mainwindow.cpp b/logdoctor/mainwindow.cpp index 2c5f99a..b2abbfa 100644 --- a/logdoctor/mainwindow.cpp +++ b/logdoctor/mainwindow.cpp @@ -327,18 +327,18 @@ void MainWindow::closeEvent( QCloseEvent *event ) // os definition void MainWindow::defineOSspec() { - #if defined( Q_OS_LINUX ) || defined( Q_OS_BSD4 ) - this->db_data_path = PathHandler( this->home_path + "/.local/share/LogDoctor" ); - this->db_hashes_path = PathHandler( this->home_path + "/.local/share/LogDoctor" ); - - #elif defined( Q_OS_WINDOWS ) + #if defined( Q_OS_MACOS ) this->db_data_path = PathHandler( this->logdoc_path ); this->db_hashes_path = PathHandler( this->logdoc_path ); - #elif defined( Q_OS_MACOS ) + #elif defined( Q_OS_WINDOWS ) this->db_data_path = PathHandler( this->logdoc_path ); this->db_hashes_path = PathHandler( this->logdoc_path ); + #elif defined( Q_OS_LINUX ) || defined( Q_OS_BSD4 ) + this->db_data_path = PathHandler( this->home_path + "/.local/share/LogDoctor" ); + this->db_hashes_path = PathHandler( this->home_path + "/.local/share/LogDoctor" ); + #else // shouldn't be here static_assert( false, "Unexpected OS" ); @@ -362,31 +362,7 @@ void MainWindow::readConfigs() proceed &= false; } else { const path_t& conf_file{ this->configs_path.getPathUnchecked() }; - if ( IOutils::exists( conf_file ) ) { - if ( IOutils::checkFile( conf_file ) ) { - if ( ! IOutils::checkFile( conf_file, true ) ) { - // file not readable - QString file; - if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( conf_file.c_str() ); - } - DialogSec::errConfFileNotReadable( file, err_msg ); - proceed &= false; - } - } else { - // the given path doesn't point to a file - const QString path_msg{ conf_file.c_str() }; - if ( DialogSec::choiceFileNotFile( path_msg ) ) { - if ( ! IOutils::renameAsCopy( conf_file, err ) ) { - if ( this->dialogs_level > DL_ESSENTIAL ) { - err_msg = QString::fromStdString( err.message() ); - } - DialogSec::errRenaming( path_msg, err_msg ); - } - } - proceed &= false; - } - } else { + if ( ! IOutils::exists( conf_file ) ) { // configuration file not found QString file; if ( this->dialogs_level == DL_EXPLANATORY ) { @@ -394,6 +370,29 @@ void MainWindow::readConfigs() } DialogSec::warnConfFileNotFound( file ); proceed &= false; + + } else if ( ! IOutils::checkFile( conf_file ) ) { + // the given path doesn't point to a file + const QString path_msg{ conf_file.c_str() }; + if ( DialogSec::choiceFileNotFile( path_msg ) ) { + if ( IOutils::renameAsCopy( conf_file, err ) ) { + return; + } + if ( this->dialogs_level > DL_ESSENTIAL ) { + err_msg = QString::fromStdString( err.message() ); + } + DialogSec::errRenaming( path_msg, err_msg ); + } + proceed &= false; + + } else if ( ! IOutils::checkFile( conf_file, true ) ) { + // file not readable + QString file; + if ( this->dialogs_level > DL_ESSENTIAL ) { + file = QString( conf_file.c_str() ); + } + DialogSec::errConfFileNotReadable( file, err_msg ); + proceed &= false; } } if ( ! proceed ) { @@ -946,27 +945,40 @@ void MainWindow::writeConfigs() proceed &= false; } else { const path_t& conf_file{ this->configs_path.getPathUnchecked() }; - if ( IOutils::exists( conf_file ) ) { - if ( IOutils::checkFile( conf_file ) ) { - if ( ! IOutils::checkFile( conf_file, false, true ) ) { - // file not writable - QString file; + if ( ! IOutils::exists( conf_file ) ) { + // file does not exists, check if at least the folder exists + const auto base_path{ this->configs_path.getParentUnchecked() }; + if ( ! IOutils::exists( base_path ) ) { + // the configs folder does not exist too + if ( ! IOutils::makeDir( base_path, err ) ) { + msg = DialogSec::tr("Failed to create the configuration file's directory"); if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( conf_file.c_str() ); + msg += QLatin1String(":\n%1").arg( base_path.c_str() ); + err_msg = QString::fromStdString( err.message() ); } - DialogSec::errConfFileNotWritable( file, err_msg ); - return; + proceed &= false; } - } else { - // the given path doesn't point to a file - const QString path_msg{ conf_file.c_str() }; - if ( DialogSec::choiceFileNotFile( path_msg ) ) { - if ( ! IOutils::renameAsCopy( conf_file, err ) ) { + + } else if ( ! IOutils::isDir( base_path ) ) { + // not a directory + const QString path_msg{ base_path.c_str() }; + if ( DialogSec::choiceDirNotDir( path_msg ) ) { + if ( ! IOutils::renameAsCopy( base_path, err ) ) { if ( this->dialogs_level > DL_ESSENTIAL ) { err_msg = QString::fromStdString( err.message() ); } DialogSec::errRenaming( path_msg, err_msg ); - return; + proceed &= false; + } else { + // make the new folder + if ( ! IOutils::makeDir( base_path, err ) ) { + msg = DialogSec::tr("Failed to create the configuration file's directory"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path_msg ); + err_msg = QString::fromStdString( err.message() ); + } + proceed &= false; + } } } else { // choosed not to rename the entry as '.copy' @@ -976,61 +988,44 @@ void MainWindow::writeConfigs() } proceed &= false; } - } - } else { - // file does not exists, check if at least the folder exists - const auto base_path{ this->configs_path.getParentUnchecked() }; - if ( IOutils::exists( base_path ) ) { - if ( IOutils::isDir( base_path ) ) { - if ( ! IOutils::checkDir( base_path, false, true ) ) { - QString file; - if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( base_path.c_str() ); - } - DialogSec::errConfDirNotWritable( file, err_msg ); - proceed &= false; - } - } else { - // not a directory - const QString path_msg{ base_path.c_str() }; - if ( DialogSec::choiceDirNotDir( path_msg ) ) { - if ( ! IOutils::renameAsCopy( base_path, err ) ) { - if ( this->dialogs_level > DL_ESSENTIAL ) { - err_msg = QString::fromStdString( err.message() ); - } - DialogSec::errRenaming( path_msg, err_msg ); - proceed &= false; - } else { - // make the new folder - if ( ! IOutils::makeDir( base_path, err ) ) { - msg = DialogSec::tr("Failed to create the configuration file's directory"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += QLatin1String(":\n%1").arg( path_msg ); - err_msg = QString::fromStdString( err.message() ); - } - proceed &= false; - } - } - } else { - // choosed not to rename the entry as '.copy' - msg = DialogSec::tr("Failed to create the configuration file"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += QLatin1String(":\n%1").arg( path_msg ); - } - proceed &= false; - } + + } else if ( ! IOutils::checkDir( base_path, false, true ) ) { + QString file; + if ( this->dialogs_level > DL_ESSENTIAL ) { + file = QString( base_path.c_str() ); } - } else { - // the configs folder does not exist too - if ( ! IOutils::makeDir( base_path, err ) ) { - msg = DialogSec::tr("Failed to create the configuration file's directory"); + DialogSec::errConfDirNotWritable( file, err_msg ); + proceed &= false; + } + + } else if ( ! IOutils::checkFile( conf_file ) ) { + // the given path doesn't point to a file + const QString path_msg{ conf_file.c_str() }; + if ( DialogSec::choiceFileNotFile( path_msg ) ) { + if ( ! IOutils::renameAsCopy( conf_file, err ) ) { if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += QLatin1String(":\n%1").arg( base_path.c_str() ); err_msg = QString::fromStdString( err.message() ); } - proceed &= false; + DialogSec::errRenaming( path_msg, err_msg ); + return; } + } else { + // choosed not to rename the entry as '.copy' + msg = DialogSec::tr("Failed to create the configuration file"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path_msg ); + } + proceed &= false; } + + } else if ( ! IOutils::checkFile( conf_file, false, true ) ) { + // file not writable + QString file; + if ( this->dialogs_level > DL_ESSENTIAL ) { + file = QString( conf_file.c_str() ); + } + DialogSec::errConfFileNotWritable( file, err_msg ); + return; } } if ( !proceed ) { @@ -1147,7 +1142,8 @@ void MainWindow::backupDatabase() const const PathHandler db_path{ this->db_data_path / std::string(DatabasesNames::data) }; const auto path_exp{ db_path.getPath() }; if ( ! path_exp.has_value() ) { - if ( const auto invalid{ path_exp.error() }; invalid.isReasonSymlink() ) { + const auto invalid{ path_exp.error() }; + if ( invalid.isReasonSymlink() ) { QString invalid_component; if ( this->dialogs_level > DL_ESSENTIAL ) { invalid_component = QString( invalid.full_path.c_str() ); @@ -1155,78 +1151,74 @@ void MainWindow::backupDatabase() const DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), invalid_component, false ); return; } - } else { - const path_t& db_file{ path_exp.value() }; - if ( IOutils::checkFile( db_file ) ) { - const path_t& backups_dir{ this->db_data_path.getPathUnchecked() / "backups" }; - if ( std::filesystem::is_symlink( backups_dir ) ) { - DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), QString( backups_dir.c_str() ), false ); - return; - } else if ( std::filesystem::exists( backups_dir ) ) { - if ( !std::filesystem::is_directory( backups_dir, err ) ) { - // exists but it's not a directory, rename as copy and make a new one - if ( DialogSec::choiceDirNotDir( QString( backups_dir.c_str() ) ) ) { - if ( ! IOutils::renameAsCopy( backups_dir, err ) ) { - QString path_msg; - if ( this->dialogs_level > DL_ESSENTIAL ) { - path_msg = QString( backups_dir.c_str() ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errRenaming( path_msg, err_msg ); - DialogSec::errDatabaseFailedBackup( QString(), QString() ); - return; - } else { - // sucesfully renamed, make the new one - if ( ! IOutils::makeDir( backups_dir, err ) ) { - QString msg = DialogSec::tr("Failed to create the database backups' directory"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += QLatin1String(":\n%1").arg( backups_dir.c_str() ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errFailedMakeDir( msg, err_msg ); - DialogSec::errDatabaseFailedBackup( QString(), QString() ); - return; - } - } - } else { - // choosed not to rename the entry as '.copy' - DialogSec::errDatabaseFailedBackup( QString(), QString() ); - return; + } + const path_t& db_file{ path_exp.value() }; + if ( ! IOutils::checkFile( db_file ) ) { + // database file does not exists or is not a file + QString file; + if ( this->dialogs_level > DL_ESSENTIAL ) { + file = QString( db_file.c_str() ); + } + DialogSec::errDatabaseFailedBackup( DialogSec::tr("The file does not exist"), file, false ); + return; + } + const path_t backups_dir{ this->db_data_path.getPathUnchecked() / "backups" }; + if ( IOutils::isSymlink( backups_dir ) ) { + DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), QString( backups_dir.c_str() ), false ); + return; + } else if ( ! IOutils::exists( backups_dir ) ) { + // backups directory doesn't exists, make it + if ( ! IOutils::makeDir( backups_dir, err ) ) { + QString msg = DialogSec::tr("Failed to create the database backups' directory"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( backups_dir.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); + } + } + DialogSec::errFailedMakeDir( msg, err_msg ); + DialogSec::errDatabaseFailedBackup( QString(), QString() ); + return; + } + } else if ( ! IOutils::isDir( backups_dir ) ) { + // exists but it's not a directory, rename as copy and make a new one + if ( DialogSec::choiceDirNotDir( QString( backups_dir.c_str() ) ) ) { + if ( ! IOutils::renameAsCopy( backups_dir, err ) ) { + QString path_msg; + if ( this->dialogs_level > DL_ESSENTIAL ) { + path_msg = QString( backups_dir.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); } } - } else { - // backups directory doesn't exists, make it - if ( ! IOutils::makeDir( backups_dir, err ) ) { - QString msg = DialogSec::tr("Failed to create the database backups' directory"); - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += QLatin1String(":\n%1").arg( backups_dir.c_str() ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } + DialogSec::errRenaming( path_msg, err_msg ); + DialogSec::errDatabaseFailedBackup( QString(), QString() ); + return; + } + // sucesfully renamed, make the new one + if ( ! IOutils::makeDir( backups_dir, err ) ) { + QString msg = DialogSec::tr("Failed to create the database backups' directory"); + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( backups_dir.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); } - DialogSec::errFailedMakeDir( msg, err_msg ); - DialogSec::errDatabaseFailedBackup( QString(), QString() ); - return; } + DialogSec::errFailedMakeDir( msg, err_msg ); + DialogSec::errDatabaseFailedBackup( QString(), QString() ); + return; } } else { - // database file does not exists or is not a file - QString file; - if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( db_file.c_str() ); - } - DialogSec::errDatabaseFailedBackup( DialogSec::tr("The file does not exist"), file, false ); + // choosed not to rename the entry as '.copy' + DialogSec::errDatabaseFailedBackup( QString(), QString() ); return; } } + const path_t base_file{(backups_dir / DatabasesNames::data).concat(".0") }; bool proceed = std::filesystem::copy_file( - this->db_data_path.getPathUnchecked() / DatabasesNames::data, - (this->db_data_path.getPathUnchecked() / "backups" / DatabasesNames::data).concat(".0"), + db_file, + base_file, std::filesystem::copy_options::update_existing, err ); if ( ! proceed ) { @@ -1235,48 +1227,48 @@ void MainWindow::backupDatabase() const err_msg = QString::fromStdString( err.message() ); } DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to copy the database file" ), err_msg ); - } else { - // succesfully copied, now rename the already existing copies (up to the choosen number of copies) - const path_t base_file{ this->db_data_path.getPathUnchecked() / "backups" / DatabasesNames::data }; - const path_t backup_file{ path_t(base_file).replace_extension(std::to_string(this->db_backups_number)) }; - if ( std::filesystem::exists( backup_file ) ) { - std::ignore = std::filesystem::remove_all( backup_file, err ); + return; + } + + // succesfully copied, now rename the already existing copies (up to the choosen number of copies) + const path_t backup_file{ path_t(base_file).replace_extension(std::to_string(this->db_backups_number)) }; + if ( std::filesystem::exists( backup_file ) ) { + std::ignore = std::filesystem::remove_all( backup_file, err ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); + proceed &= false; + } else { + proceed = ! std::filesystem::exists( backup_file ); + } + if ( ! proceed ) { + DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to update the backups" ), err_msg ); + return; + } + } + // cascade rename + for ( int n=this->db_backups_number-1; n>=0; --n ) { + const path_t path{ path_t(base_file).replace_extension(std::to_string(n)) }; + if ( std::filesystem::exists( path ) ) { + const path_t new_path{ path_t(base_file).replace_extension(std::to_string(n+1)) }; + std::filesystem::rename( path, new_path, err ); if ( err.value() ) { err_msg = QString::fromStdString( err.message() ); proceed &= false; } else { - proceed = ! std::filesystem::exists( backup_file ); + proceed = ! std::filesystem::exists( path ); } if ( ! proceed ) { DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to update the backups" ), err_msg ); return; } } - // cascade rename - for ( int n=this->db_backups_number-1; n>=0; --n ) { - const path_t path{ path_t(base_file).replace_extension(std::to_string(n)) }; - if ( std::filesystem::exists( path ) ) { - const path_t new_path{ path_t(base_file).replace_extension(std::to_string(n+1)) }; - std::filesystem::rename( path, new_path, err ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - proceed &= false; - } else { - proceed = ! std::filesystem::exists( path ); - } - if ( ! proceed ) { - DialogSec::errDatabaseFailedBackup( DialogSec::tr( "Failed to update the backups" ), err_msg ); - return; - } - } - } } } std::string MainWindow::geometryToString() const { - QRect geometry{ this->geometry() }; + const QRect& geometry{ this->geometry() }; std::string string; string += std::to_string( geometry.x() ); string += ","; @@ -2024,9 +2016,9 @@ void MainWindow::makeInitialChecks() { std::error_code err; QString err_msg; + // check that the sqlite plugin is available if ( ! this->dbHandler.checkDriver() ) { - // checks failed, abort DialogSec::errSqlDriverNotFound( "QSQLITE" ); std::exit( 1 ); } @@ -2039,52 +2031,41 @@ void MainWindow::makeInitialChecks() this->db_hashes_path }; for ( const auto& path_handler : paths ) { - if ( const auto path_exp{ path_handler.getPath() }; - !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { + const auto path_exp{ path_handler.getPath() }; + if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { path_exp.error().showDialogMessage(); std::exit( 1 ); - } else if ( const auto&path{path_exp.value()}; IOutils::exists( path ) ) { - if ( IOutils::isDir( path ) ) { - if ( ! IOutils::checkDir( path, true ) ) { - DialogSec::errDirNotReadable( QString( path.c_str() ), err_msg ); - std::exit( 1 ); - } else if ( ! IOutils::checkDir( path, false, true ) ) { - DialogSec::errDirNotWritable( QString( path.c_str() ), err_msg ); - std::exit( 1 ); - } - - } else { - // not a directory, rename as copy a make a new one - if ( DialogSec::choiceDirNotDir( QString( path.c_str() ) ) ) { - if ( ! IOutils::renameAsCopy( path, err ) ) { - QString p; - if ( this->dialogs_level > DL_ESSENTIAL ) { - p = QString( path.c_str() ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errRenaming( p, err_msg ); - std::exit( 1 ); - } else if ( ! IOutils::makeDir( path, err ) ) { - QString msg{ DialogSec::tr("Failed to create the directory") }; - if ( this->dialogs_level > DL_ESSENTIAL ) { - msg += QLatin1String(":\n%1").arg( path.c_str() ); - if ( err.value() ) { - err_msg = QString::fromStdString( err.message() ); - } - } - DialogSec::errFailedMakeDir( msg, err_msg ); - std::exit( 1 ); + } + const auto& path{ path_exp.value() }; + if ( ! IOutils::exists( path ) ) { + if ( ! IOutils::makeDir( path, err ) ) { + QString msg{ DialogSec::tr("Failed to create the directory") }; + if ( this->dialogs_level > DL_ESSENTIAL ) { + msg += QLatin1String(":\n%1").arg( path.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); } - } else { - // choosed not to rename the entry as '.copy' - std::exit( 1 ); } + DialogSec::errFailedMakeDir( msg, err_msg ); + std::exit( 1 ); } - } else { - if ( ! IOutils::makeDir( path, err ) ) { + } else if ( ! IOutils::isDir( path ) ) { + // not a directory, rename as copy a make a new one + if ( ! DialogSec::choiceDirNotDir( QString( path.c_str() ) ) ) { + // choosed not to rename the entry as '.copy' + std::exit( 1 ); + } else if ( ! IOutils::renameAsCopy( path, err ) ) { + QString p; + if ( this->dialogs_level > DL_ESSENTIAL ) { + p = QString( path.c_str() ); + if ( err.value() ) { + err_msg = QString::fromStdString( err.message() ); + } + } + DialogSec::errRenaming( p, err_msg ); + std::exit( 1 ); + } else if ( ! IOutils::makeDir( path, err ) ) { QString msg{ DialogSec::tr("Failed to create the directory") }; if ( this->dialogs_level > DL_ESSENTIAL ) { msg += QLatin1String(":\n%1").arg( path.c_str() ); @@ -2095,6 +2076,14 @@ void MainWindow::makeInitialChecks() DialogSec::errFailedMakeDir( msg, err_msg ); std::exit( 1 ); } + + } else if ( ! IOutils::checkDir( path, true ) ) { + DialogSec::errDirNotReadable( QString( path.c_str() ), err_msg ); + std::exit( 1 ); + + } else if ( ! IOutils::checkDir( path, false, true ) ) { + DialogSec::errDirNotWritable( QString( path.c_str() ), err_msg ); + std::exit( 1 ); } } @@ -2229,34 +2218,28 @@ void MainWindow::showHelp( const std::string& file_name ) fallback |= true; } else { const path_t& file_path{ path_exp.value() }; - if ( IOutils::exists( file_path ) ) { - if ( IOutils::isFile( file_path ) ) { - if ( IOutils::checkFile( file_path, true ) ) { - // everything ok, open a new window - this->craphelp.reset( new Craphelp() ); - this->craphelp->helpLogsFormat( - file_path, - this->TB.getFont(), - this->TB.getColorSchemeID() ); - if ( this->isMaximized() ) { - this->craphelp->showMaximized(); - } else { - this->craphelp->show(); - } - } else { - // resource not readable - DialogSec::errHelpNotReadable( link ); - fallback |= true; - } - } else { - // resource is not a file - DialogSec::errHelpFailed( link, DialogSec::tr("Unrecognized entry") ); - fallback |= true; - } - } else { - // resource not found + if ( ! IOutils::exists( file_path ) ) { DialogSec::errHelpNotFound( link ); fallback |= true; + } else if ( ! IOutils::isFile( file_path ) ) { + DialogSec::errHelpFailed( link, DialogSec::tr("Unrecognized entry") ); + fallback |= true; + } else if ( ! IOutils::checkFile( file_path, true ) ) { + DialogSec::errHelpNotReadable( link ); + fallback |= true; + } else { + // everything ok, open a new window + this->craphelp.reset( new Craphelp() ); + this->craphelp->helpLogsFormat( + file_path, + this->TB.getFont(), + this->TB.getColorSchemeID() ); + if ( this->isMaximized() ) { + this->craphelp->showMaximized(); + } else { + this->craphelp->show(); + } + return; } } if ( fallback ) { @@ -2298,78 +2281,63 @@ WarnlistField MainWindow::warnlistFieldFromString( const QString& str ) -/*************************************************************** - * MainWindow'S OPERATIONS START FROM HERE - ***************************************************************/ +/**************************************************************** + ************** UI HANDLING LOGIC START FROM HERE *************** + ****************************************************************/ ////////////// //// MENU //// -/// ////////// +////////////// // switch language -void MainWindow::menu_actionEnglishGb_triggered() +void MainWindow::uncheckAllLanguageMenuEntries() { - this->ui->actionEnglishGb->setChecked( true ); + this->ui->actionEnglishGb->setChecked( false ); this->ui->actionEspanolEs->setChecked( false ); this->ui->actionFrancaisFr->setChecked( false ); this->ui->actionItalianoIt->setChecked( false ); this->ui->actionJapaneseJp->setChecked( false ); this->ui->actionPortuguesBr->setChecked( false ); +} +void MainWindow::menu_actionEnglishGb_triggered() +{ + this->uncheckAllLanguageMenuEntries(); + this->ui->actionEnglishGb->setChecked( true ); this->language = "en_GB"; this->updateUiLanguage(); } void MainWindow::menu_actionEspanolEs_triggered() { - this->ui->actionEnglishGb->setChecked( false ); - this->ui->actionEspanolEs->setChecked( true ); - this->ui->actionFrancaisFr->setChecked( false ); - this->ui->actionItalianoIt->setChecked( false ); - this->ui->actionJapaneseJp->setChecked( false ); - this->ui->actionPortuguesBr->setChecked( false ); + this->uncheckAllLanguageMenuEntries(); + this->ui->actionEspanolEs->setChecked( true ); this->language = "es_ES"; this->updateUiLanguage(); } void MainWindow::menu_actionFrancaisFr_triggered() { - this->ui->actionEnglishGb->setChecked( false ); - this->ui->actionEspanolEs->setChecked( false ); - this->ui->actionFrancaisFr->setChecked( true ); - this->ui->actionItalianoIt->setChecked( false ); - this->ui->actionJapaneseJp->setChecked( false ); - this->ui->actionPortuguesBr->setChecked( false ); + this->uncheckAllLanguageMenuEntries(); + this->ui->actionFrancaisFr->setChecked( true ); this->language = "fr_FR"; this->updateUiLanguage(); } void MainWindow::menu_actionItalianoIt_triggered() { - this->ui->actionEnglishGb->setChecked( false ); - this->ui->actionEspanolEs->setChecked( false ); - this->ui->actionFrancaisFr->setChecked( false ); - this->ui->actionItalianoIt->setChecked( true ); - this->ui->actionJapaneseJp->setChecked( false ); - this->ui->actionPortuguesBr->setChecked( false ); + this->uncheckAllLanguageMenuEntries(); + this->ui->actionItalianoIt->setChecked( true ); this->language = "it_IT"; this->updateUiLanguage(); } void MainWindow::menu_actionJapaneseJp_triggered() { - this->ui->actionEnglishGb->setChecked( false ); - this->ui->actionEspanolEs->setChecked( false ); - this->ui->actionFrancaisFr->setChecked( false ); - this->ui->actionItalianoIt->setChecked( false ); - this->ui->actionJapaneseJp->setChecked( true ); - this->ui->actionPortuguesBr->setChecked( false ); + this->uncheckAllLanguageMenuEntries(); + this->ui->actionJapaneseJp->setChecked( true ); this->language = "ja_JP"; this->updateUiLanguage(); } void MainWindow::menu_actionPortuguesBr_triggered() { - this->ui->actionEnglishGb->setChecked( false ); - this->ui->actionEspanolEs->setChecked( false ); - this->ui->actionFrancaisFr->setChecked( false ); - this->ui->actionItalianoIt->setChecked( false ); - this->ui->actionJapaneseJp->setChecked( false ); - this->ui->actionPortuguesBr->setChecked( true ); + this->uncheckAllLanguageMenuEntries(); + this->ui->actionPortuguesBr->setChecked( true ); this->language = "pt_BR"; this->updateUiLanguage(); } @@ -2682,15 +2650,16 @@ void MainWindow::setDbWorkingState( const bool working ) bool MainWindow::dbUsable() { - if ( ! this->db_working ) { - if ( this->db_ok ) { - const auto path_exp{ (this->db_data_path / DatabasesNames::data).getPath() }; - if ( path_exp.has_value() ) { - return IOutils::checkFile( path_exp.value(), true ); - } - } else { - return this->checkDataDB(); // db is invalid, attempt to renew - } + if ( this->db_working ) { + return false; + } else if ( ! this->db_ok ) { + // db is invalid, attempt to renew + return this->checkDataDB(); + } + + const auto path_exp{ (this->db_data_path / DatabasesNames::data).getPath() }; + if ( path_exp.has_value() ) { + return IOutils::checkFile( path_exp.value(), true ); } return false; } @@ -2717,7 +2686,6 @@ void MainWindow::checkMakeStats_Makable() { bool state{ false }; if ( this->dbUsable() ) { - // db is not busy if ( this->ui->checkBox_LogFiles_CheckAll->checkState() == Qt::CheckState::Checked ) { // all checked state |= true; @@ -3101,24 +3069,20 @@ void MainWindow::on_button_MakeStats_Start_clicked() void MainWindow::resetPerfsLabels() { - // reset to default this->ui->label_MakeStats_Size->setText( "0 B" ); this->ui->label_MakeStats_Lines->setText( "0" ); - // time and speed this->ui->label_MakeStats_Time->setText( "00:00" ); this->ui->label_MakeStats_Speed->setText( "0 B/s" ); } void MainWindow::updatePerfsLabels() { - // update values if ( this->craplog.isParsing() || this->force_updating_labels ) { const size_t size{ this->craplog.getParsedSize() }; this->ui->label_MakeStats_Size->setText( PrintSec::printableSize( size ) ); this->ui->label_MakeStats_Lines->setText( QString::number( this->craplog.getParsedLines() ) ); this->ui->label_MakeStats_Speed->setText( this->craplog.getParsingSpeed() ); } - // time and speed std::chrono::duration timer_elapsed = std::chrono::system_clock::now() - this->waiter_timer_start; this->ui->label_MakeStats_Time->setText( @@ -3128,11 +3092,8 @@ void MainWindow::updatePerfsLabels() void MainWindow::craplogStarted() { - // reset perfs this->resetPerfsLabels(); - // disable the LogFiles section this->ui->stackedPages_Logs->setEnabled( false ); - // disable things which needs database access this->setDbWorkingState( true ); } @@ -3166,14 +3127,10 @@ void MainWindow::craplogFinished() void MainWindow::afterCraplogFinished() { - // enable the LogFiles section this->ui->stackedPages_Logs->setEnabled( true ); - // enable back this->setDbWorkingState( false ); if ( this->craplog.editedDatabase() ) { - // refresh the logs list this->on_button_LogFiles_RefreshList_clicked(); - // get a fresh collection of available stats dates this->refreshStatsDates(); } } @@ -3199,20 +3156,12 @@ void MainWindow::refreshStatsDates() //// WARN //// void MainWindow::checkStatsWarnDrawable() { - if ( this->dbUsable() ) { - if ( this->ui->box_StatsWarn_Year->currentIndex() >= 0 - && this->ui->box_StatsWarn_Month->currentIndex() >= 0 - && this->ui->box_StatsWarn_Day->currentIndex() >= 0 ) { - // enable the draw button - this->ui->button_StatsWarn_Draw->setEnabled( true ); - } else { - // disable the draw button - this->ui->button_StatsWarn_Draw->setEnabled( false ); - } - } else { - // db busy - this->ui->button_StatsWarn_Draw->setEnabled( false ); - } + this->ui->button_StatsWarn_Draw->setEnabled( + this->dbUsable() + && this->ui->box_StatsWarn_Year->currentIndex() >= 0 + && this->ui->box_StatsWarn_Month->currentIndex() >= 0 + && this->ui->box_StatsWarn_Day->currentIndex() >= 0 + ); } void MainWindow::on_box_StatsWarn_WebServer_currentIndexChanged(int index) @@ -3351,25 +3300,17 @@ void MainWindow::drawStatsWarn() //// SPEED //// void MainWindow::checkStatsSpeedDrawable() { - if ( this->dbUsable() ) { - if ( this->ui->box_StatsSpeed_Year->currentIndex() >= 0 - && this->ui->box_StatsSpeed_Month->currentIndex() >= 0 - && this->ui->box_StatsSpeed_Day->currentIndex() >= 0 - && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Protocol->text() ).has_value() - && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Method->text() ).has_value() - && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Uri->text() ).has_value() - && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Query->text() ).has_value() - && FilterOps::parseNumericFilter( this->ui->inLine_StatsSpeed_Response->text() ).has_value() ) { - // enable the draw button - this->ui->button_StatsSpeed_Draw->setEnabled( true ); - } else { - // disable the draw button - this->ui->button_StatsSpeed_Draw->setEnabled( false ); - } - } else { - // db busy - this->ui->button_StatsSpeed_Draw->setEnabled( false ); - } + this->ui->button_StatsSpeed_Draw->setEnabled( + this->dbUsable() + && this->ui->box_StatsSpeed_Year->currentIndex() >= 0 + && this->ui->box_StatsSpeed_Month->currentIndex() >= 0 + && this->ui->box_StatsSpeed_Day->currentIndex() >= 0 + && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Protocol->text() ).has_value() + && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Method->text() ).has_value() + && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Uri->text() ).has_value() + && FilterOps::parseTextualFilter( this->ui->inLine_StatsSpeed_Query->text() ).has_value() + && FilterOps::parseNumericFilter( this->ui->inLine_StatsSpeed_Response->text() ).has_value() + ); } void MainWindow::on_box_StatsSpeed_WebServer_currentIndexChanged(int index) @@ -3540,20 +3481,12 @@ void MainWindow::drawStatsSpeed() //// COUNT //// void MainWindow::checkStatsCountDrawable() { - if ( this->dbUsable() ) { - if ( this->ui->box_StatsCount_Year->currentIndex() >= 0 - && this->ui->box_StatsCount_Month->currentIndex() >= 0 - && this->ui->box_StatsCount_Day->currentIndex() >= 0 ) { - // enable the draw button - this->ui->scrollArea_StatsCount->setEnabled( true ); - } else { - // disable the draw button - this->ui->scrollArea_StatsCount->setEnabled( false ); - } - } else { - // db busy - this->ui->scrollArea_StatsCount->setEnabled( false ); - } + this->ui->scrollArea_StatsCount->setEnabled( + this->dbUsable() + && this->ui->box_StatsCount_Year->currentIndex() >= 0 + && this->ui->box_StatsCount_Month->currentIndex() >= 0 + && this->ui->box_StatsCount_Day->currentIndex() >= 0 + ); } void MainWindow::on_box_StatsCount_WebServer_currentIndexChanged(int index) @@ -3782,57 +3715,56 @@ void MainWindow::drawStatsCount() //// DAY //// void MainWindow::checkStatsDayDrawable() { - if ( this->dbUsable() ) { - bool aux{ true }; - // secondary date (period) - if ( this->ui->checkBox_StatsDay_Period->isChecked() ) { - if ( this->ui->box_StatsDay_ToYear->currentIndex() < 0 - && this->ui->box_StatsDay_ToMonth->currentIndex() < 0 - && this->ui->box_StatsDay_ToDay->currentIndex() < 0 ) { + if ( ! this->dbUsable() ) { + this->ui->button_StatsDay_Draw->setEnabled( false ); + return; + } + + bool aux{ true }; + // primary date + if ( this->ui->box_StatsDay_FromYear->currentIndex() < 0 + || this->ui->box_StatsDay_FromMonth->currentIndex() < 0 + || this->ui->box_StatsDay_FromDay->currentIndex() < 0 ) { + aux &= false; + } + // secondary date (period) + if ( this->ui->checkBox_StatsDay_Period->isChecked() ) { + if ( this->ui->box_StatsDay_ToYear->currentIndex() < 0 + || this->ui->box_StatsDay_ToMonth->currentIndex() < 0 + || this->ui->box_StatsDay_ToDay->currentIndex() < 0 ) { + aux &= false; + } else { + int a{ this->ui->box_StatsDay_ToYear->currentText().toInt() }; + int b{ this->ui->box_StatsDay_FromYear->currentText().toInt() }; + if ( a < b ) { + // year 'to' is less than 'from' aux &= false; - } else { - int a{ this->ui->box_StatsDay_ToYear->currentText().toInt() }; - int b{ this->ui->box_StatsDay_FromYear->currentText().toInt() }; + } else if ( a == b ) { + a = this->crapview.getMonthNumber( this->ui->box_StatsDay_ToMonth->currentText() ); + b = this->crapview.getMonthNumber( this->ui->box_StatsDay_FromMonth->currentText() ); if ( a < b ) { - // year 'to' is less than 'from' + // month 'to' is less than 'from' aux &= false; } else if ( a == b ) { - a = this->crapview.getMonthNumber( this->ui->box_StatsDay_ToMonth->currentText() ); - b = this->crapview.getMonthNumber( this->ui->box_StatsDay_FromMonth->currentText() ); + a = this->ui->box_StatsDay_ToDay->currentText().toInt(); + b = this->ui->box_StatsDay_FromDay->currentText().toInt(); if ( a < b ) { - // month 'to' is less than 'from' + // day 'to' is less than 'from' aux &= false; - } else if ( a == b ) { - a = this->ui->box_StatsDay_ToDay->currentText().toInt(); - b = this->ui->box_StatsDay_FromDay->currentText().toInt(); - if ( a < b ) { - // day 'to' is less than 'from' - aux &= false; - } } } } } - // primary date - if ( this->ui->box_StatsDay_FromYear->currentIndex() < 0 - && this->ui->box_StatsDay_FromMonth->currentIndex() < 0 - && this->ui->box_StatsDay_FromDay->currentIndex() < 0 ) { - aux &= false; - } - // check log field validity - if ( this->ui->box_StatsDay_LogsField->currentIndex() < 0 ) { - aux &= false; - } - // check filter string validity - if ( ! this->getStatsDayParsedFilter().has_value() ) { - aux &= false; - } - this->ui->button_StatsDay_Draw->setEnabled( aux ); - - } else { - // db busy - this->ui->button_StatsDay_Draw->setEnabled( false ); } + // check log field validity + if ( this->ui->box_StatsDay_LogsField->currentIndex() < 0 ) { + aux &= false; + } + // check filter string validity + if ( ! this->getStatsDayParsedFilter().has_value() ) { + aux &= false; + } + this->ui->button_StatsDay_Draw->setEnabled( aux ); } LogField MainWindow::getStatsDayLogField() const @@ -4072,55 +4004,53 @@ void MainWindow::drawStatsDay() //// RELATIONAL //// void MainWindow::checkStatsRelatDrawable() { - if ( this->dbUsable() ) { - bool aux{ true }; - if ( this->ui->box_StatsRelat_FromYear->currentIndex() >= 0 - && this->ui->box_StatsRelat_FromMonth->currentIndex() >= 0 - && this->ui->box_StatsRelat_FromDay->currentIndex() >= 0 - && this->ui->box_StatsRelat_ToYear->currentIndex() >= 0 - && this->ui->box_StatsRelat_ToMonth->currentIndex() >= 0 - && this->ui->box_StatsRelat_ToDay->currentIndex() >= 0 ) { - // check period validity - int a{ this->ui->box_StatsRelat_ToYear->currentText().toInt() }; - int b{ this->ui->box_StatsRelat_FromYear->currentText().toInt() }; + if ( ! this->dbUsable() ) { + this->ui->button_StatsRelat_Draw->setEnabled( false ); + return; + } + + bool aux{ true }; + if ( this->ui->box_StatsRelat_FromYear->currentIndex() < 0 + || this->ui->box_StatsRelat_FromMonth->currentIndex() < 0 + || this->ui->box_StatsRelat_FromDay->currentIndex() < 0 + || this->ui->box_StatsRelat_ToYear->currentIndex() < 0 + || this->ui->box_StatsRelat_ToMonth->currentIndex() < 0 + || this->ui->box_StatsRelat_ToDay->currentIndex() < 0 ) { + aux &= false; + } else { + // check period validity + int a{ this->ui->box_StatsRelat_ToYear->currentText().toInt() }; + int b{ this->ui->box_StatsRelat_FromYear->currentText().toInt() }; + if ( a < b ) { + // year 'to' is less than 'from' + aux &= false; + } else if ( a == b ) { + a = this->crapview.getMonthNumber( this->ui->box_StatsRelat_ToMonth->currentText() ); + b = this->crapview.getMonthNumber( this->ui->box_StatsRelat_FromMonth->currentText() ); if ( a < b ) { - // year 'to' is less than 'from' + // month 'to' is less than 'from' aux &= false; } else if ( a == b ) { - a = this->crapview.getMonthNumber( this->ui->box_StatsRelat_ToMonth->currentText() ); - b = this->crapview.getMonthNumber( this->ui->box_StatsRelat_FromMonth->currentText() ); + a = this->ui->box_StatsRelat_ToDay->currentText().toInt(); + b = this->ui->box_StatsRelat_FromDay->currentText().toInt(); if ( a < b ) { - // month 'to' is less than 'from' + // day 'to' is less than 'from' aux &= false; - } else if ( a == b ) { - a = this->ui->box_StatsRelat_ToDay->currentText().toInt(); - b = this->ui->box_StatsRelat_FromDay->currentText().toInt(); - if ( a < b ) { - // day 'to' is less than 'from' - aux &= false; - } } } - } else { - // disable the draw button - aux &= false; - } - // check log field validity - if ( this->ui->box_StatsRelat_LogsField_1->currentIndex() < 0 - || this->ui->box_StatsRelat_LogsField_2->currentIndex() < 0 ) { - aux &= false; - } - // check filter string validity - if ( !this->getStatsRelatParsedFilter( 1 ).has_value() - || !this->getStatsRelatParsedFilter( 2 ).has_value() ) { - aux &= false; } - this->ui->button_StatsRelat_Draw->setEnabled( aux ); - - } else { - // db busy - this->ui->button_StatsRelat_Draw->setEnabled( false ); } + // check log field validity + if ( this->ui->box_StatsRelat_LogsField_1->currentIndex() < 0 + || this->ui->box_StatsRelat_LogsField_2->currentIndex() < 0 ) { + aux &= false; + } + // check filter string validity + if ( !this->getStatsRelatParsedFilter( 1 ).has_value() + || !this->getStatsRelatParsedFilter( 2 ).has_value() ) { + aux &= false; + } + this->ui->button_StatsRelat_Draw->setEnabled( aux ); } @@ -4367,7 +4297,6 @@ void MainWindow::drawStatsRelat() //////////////// //// GLOBAL //// - void MainWindow::drawStatsGlobals() { std::vector> recur_list; @@ -4379,7 +4308,9 @@ void MainWindow::drawStatsGlobals() recur_list, traffic_list, perf_list, work_list, this->glob_ws ) }; - if ( result ) { + if ( ! result ) { + this->resetStatsGlob(); + } else { this->ui->label_StatsGlob_Recur_Protocol_String->setText( std::get<0>( recur_list.at(0) ) ); this->ui->label_StatsGlob_Recur_Protocol_Count->setText( std::get<1>( recur_list.at(0) ) ); this->ui->label_StatsGlob_Recur_Method_String->setText( std::get<0>( recur_list.at(1) ) ); @@ -4429,11 +4360,7 @@ void MainWindow::drawStatsGlobals() this->ui->button_StatsGlob_Nginx->setFlat( true ); } } - - } else { - this->resetStatsGlob(); } - // restore db state this->setDbWorkingState( false ); } @@ -4471,8 +4398,6 @@ void MainWindow::resetStatsGlob() this->ui->button_StatsGlob_Iis->setFlat( true ); } - - void MainWindow::makeStatsGlob() { this->setDbWorkingState( true ); @@ -4491,7 +4416,6 @@ void MainWindow::on_button_StatsGlob_Apache_clicked() } } - void MainWindow::on_button_StatsGlob_Nginx_clicked() { if ( this->dbUsable() && this->checkDataDB() ) { @@ -4500,7 +4424,6 @@ void MainWindow::on_button_StatsGlob_Nginx_clicked() } } - void MainWindow::on_button_StatsGlob_Iis_clicked() { if ( this->dbUsable() && this->checkDataDB() ) { -- GitLab From 33bc1282704334bd059042711f1e7559d03230bc Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sat, 27 Jul 2024 21:11:25 +0200 Subject: [PATCH 16/34] Updated IOutils namespace Added new function: isSymlink --- logdoctor/utilities/io.cpp | 2 +- logdoctor/utilities/io.h | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/logdoctor/utilities/io.cpp b/logdoctor/utilities/io.cpp index d128647..09113d7 100644 --- a/logdoctor/utilities/io.cpp +++ b/logdoctor/utilities/io.cpp @@ -51,7 +51,7 @@ public: } }; -} //namespace (private) +} // namespace (private) diff --git a/logdoctor/utilities/io.h b/logdoctor/utilities/io.h index 1c41aa0..b8f040c 100644 --- a/logdoctor/utilities/io.h +++ b/logdoctor/utilities/io.h @@ -49,6 +49,18 @@ inline bool isDir( const std::filesystem::path& path ) noexcept : false; } +//! Checks if a path exists and is a symlink +/*! + \param path The path of the entry + \return The result of the checks +*/ +inline bool isSymlink( const std::filesystem::path& path ) noexcept +{ + return IOutils::exists( path ) + ? std::filesystem::is_symlink( path ) + : false; +} + //! Checks if a path exists, if it points to a file and if the user has read and/or write permissions on it /*! \param path The path of the entry -- GitLab From fbba73cf40fcf148fa86d51618835eb3ee470564 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sat, 27 Jul 2024 21:12:01 +0200 Subject: [PATCH 17/34] Updated documentation comments --- logdoctor/mainwindow.h | 22 +++++++++++++++++++++- logdoctor/modules/security/path.h | 3 +-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/logdoctor/mainwindow.h b/logdoctor/mainwindow.h index 67f19f3..4928fd4 100644 --- a/logdoctor/mainwindow.h +++ b/logdoctor/mainwindow.h @@ -592,7 +592,6 @@ private: const std::string home_path{ StringOps::rstrip( QStandardPaths::locate( QStandardPaths::HomeLocation, "", QStandardPaths::LocateDirectory ).toStdString(), '/' ) }; - // 1: linux/bsd, 2:windows, 3:mac #if defined( Q_OS_MACOS ) const PathHandler configs_path { this->home_path + "/Lybrary/Preferences/LogDoctor/logdoctor.conf" }; const PathHandler logdoc_path { this->home_path + "/Lybrary/Application Support/LogDoctor" }; @@ -654,6 +653,9 @@ private: //! Translates the UI to the selected language void updateUiLanguage(); + //! Unchecks all the languages in the menu + void uncheckAllLanguageMenuEntries(); + ///////////////////////// //// WINDOW GEOMETRY //// @@ -666,6 +668,7 @@ private: //! Retrieves the window geometry from the given string /*! + \throw std::exception \see readConfigs() */ void setGeometryFromString( const std::string& geometry ); @@ -679,11 +682,15 @@ private: //! Retrieves the dialogs level from the given string /*! + \throw std::exception \see readConfigs() */ void setDialogsLevelFromString( const std::string& dialogs_level ); //! Returns the dialogs level corresponding to the given number + /*! + \throw DoNotCatchException + */ DialogsLevel dialogsLevelFromInt( const int dialogs_level ); @@ -695,6 +702,7 @@ private: //! Retrieves the Web Server from the given string /*! + \throw DoNotCatchException \see readConfigs() */ void setWebServerFromString( const std::string& web_server ); @@ -708,15 +716,27 @@ private: bool remember_window{ true }; //! Auto-detects the icon-set to use depending on the current window theme + /*! + \throw DoNotCatchException + */ void detectIconsTheme(); //! Updates the icons on the window + /*! + \throw DoNotCatchException + */ void updateUiIcons(); //! Updates the window theme + /*! + \throw DoNotCatchException + */ void updateUiTheme(); //! Updates the fonts on the window + /*! + \throw std::exception + */ void updateUiFonts(); const std::vector CHARTS_THEMES{ diff --git a/logdoctor/modules/security/path.h b/logdoctor/modules/security/path.h index 49f0aa3..5450cd8 100644 --- a/logdoctor/modules/security/path.h +++ b/logdoctor/modules/security/path.h @@ -38,12 +38,11 @@ public: //! Convenience function that returns the path as string, without checks std::string toString() const; - //! Returns the path if it is valid, throws otherwise + //! Returns the path if it is valid /*! Checks every component of the path to determine whether it is valid. For a path to be valid, all of its components must exist on the filesystem and they must follow the security configuration about the symlinks. - \throw VoidException */ std::expected getPath() const; -- GitLab From a414eb710a9844e38b26cab7817c245668c9ef18 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:42:37 +0200 Subject: [PATCH 18/34] Added translation script Automatizes translations by using the Argos Translate package --- scripts/dev/translate/__init__.py | 77 +++++++ scripts/dev/translate/translator.py | 302 ++++++++++++++++++++++++++++ 2 files changed, 379 insertions(+) create mode 100644 scripts/dev/translate/__init__.py create mode 100644 scripts/dev/translate/translator.py diff --git a/scripts/dev/translate/__init__.py b/scripts/dev/translate/__init__.py new file mode 100644 index 0000000..ef56170 --- /dev/null +++ b/scripts/dev/translate/__init__.py @@ -0,0 +1,77 @@ +import os +import argostranslate.package + +from translator import Translator + + +TRANSLATIONS = { + "ar_AR": ("en", "ar"), # Arabic (classic) + "az_AZ": ("en", "az"), # Azerbaijani (Azerbaijan) + "bg_BG": ("en", "bg"), # Bulgarian (Bulgaria) + "bn_BN": ("en", "bn"), # Bengali (Bangladesh) + "ca_SP": ("en", "ca"), # Catalan (Spain) + "cs_CZ": ("en", "cs"), # Czech (Czech Republic) + "da_DA": ("en", "da"), # Danish (Denmark) + "de_GE": ("en", "de"), # German (Germany) + "el_GR": ("en", "el"), # Greek (modern) (Greece) + "en_GB": ("en", "en"), # English (United Kingdom) + "eo_EO": ("en", "eo"), # Esperanto + "es_SP": ("en", "es"), # Spanish (Spain) + "et_ES": ("en", "et"), # Estonian (Estonia) + "fa_PE": ("en", "fa"), # Persian (Persia) + "fi_FI": ("en", "fi"), # Finnish (Finland) + "fr_FR": ("en", "fr"), # French (France) + "ga_IR": ("en", "ga"), # Irish (Ireland) + "he_HE": ("en", "he"), # Hebrew + "hi_IN": ("en", "hi"), # Hindi (India) + "hu_HU": ("en", "hu"), # Hungarian (Hungary) + "id_ID": ("en", "id"), # Indonesian (Indonesia) + "it_IT": ("en", "it"), # Italian (Italy) + "ja_JP": ("en", "ja"), # Japanese (Japan) + "ko_KO": ("en", "ko"), # Korean (Korea) + "lt_LI": ("en", "lt"), # Lithuanian (Lithuania) + "lv_LA": ("en", "lv"), # Latvian (Latvia) + "ms_MA": ("en", "ms"), # Malay (Malaysia) + "nb_NB": ("en", "nb"), # Norwegian (Norway) + "nl_NL": ("en", "nl"), # Dutch (Netherland) + "pl_PL": ("en", "pl"), # Polish (Poland) + "pt_BR": ("en", "pt"), # Portuguese (Brazil) + "pt_PT": ("en", "pt"), # Portuguese (Portugal) + "ro_RO": ("en", "ro"), # Romanian (Romania) + "ru_RU": ("en", "ru"), # Russian (Russia) + "sk_SK": ("en", "sk"), # Slovak (Slovakia) + "sl_SL": ("en", "sl"), # Slovenian (Slovenia) + "sq_AL": ("en", "sq"), # Albanian (Albania) + "sv_SV": ("en", "sv"), # Swedish (Sweden) + "th_TH": ("en", "th"), # Thai (Thailand) + "tl_PH": ("en", "tl"), # Tagalog (Philippines) + "tr_TR": ("en", "tr"), # Turkish (Turkey) + "uk_UK": ("en", "uk"), # Ukranian (Ukraine) + "ur_PA": ("en", "ur"), # Urdu (Pakistan) + "zh_CN": ("en", "zh"), # Chinese (cantonese) (China) + "zt_CN": ("en", "zt"), # Chinese (traditional) (China) +} + +PACKAGES = sorted([pkg.to_code + for pkg in argostranslate.package.get_installed_packages() + if pkg.from_code == "en"]) + + +def main(): + print("*** STARTING TRANSLATION ***") + project_root = os.path.abspath(os.path.abspath(__file__) + "/../../../..") + translations_path = project_root + "/logdoctor/translations" + for (locale, (code_from, code_to)) in TRANSLATIONS.items(): + if code_to != "en" and code_to not in PACKAGES: + print(f"Failed to translate '{locale}': missing package") + continue + file_path = f"{translations_path}/LogDoctor_{locale}.ts" + if not os.path.exists(file_path): + print(f"Cannot translate '{locale}': ts file not found") + continue + print(f"Updating 'logdoctor/translations/LogDoctor_{locale}.ts'...") + Translator(file_path, code_from, code_to).translate(locale) + + +if __name__ == "__main__": + main() diff --git a/scripts/dev/translate/translator.py b/scripts/dev/translate/translator.py new file mode 100644 index 0000000..cbe27ce --- /dev/null +++ b/scripts/dev/translate/translator.py @@ -0,0 +1,302 @@ +from os.path import exists +from argostranslate.translate import translate + + +MSG_DELIM_BEG = "" +MSG_DELIM_END = "" + +SRC_DELIM_BEG = "" +SRC_DELIM_END = "" + +TR_DELIM_BEG_FIN = "" +TR_DELIM_BEG_UFIN = "" +TR_DELIM_END = "" + +SANITIZATIONS = { + "&" : "&", + "'" : "'", + """ : '"', + "<" : "<", + ">" : ">", +} + + +class Translator: + """ + Used to process a '.ts' file + """ + + def __init__(self, tr_file:str, tr_from:str, tr_to:str): + """ + Initializes the translator + + Parameters + ---------- + tr_file : str + The path of the '.ts' file to parse and translate. + tr_from : str + The code of the language to translate from. + tr_to : str + The code of the language to translate to. + """ + self.file_path : str = tr_file + self.from_code : str = tr_from + self.to_code : str = tr_to + self.content : str = "" + + def translate(self, locale_code:str): + """ + Runs the translation process + + Parameters + ---------- + locale_code : str + The code of the locale (for display purposes only). + """ + if self._check_file_exists() is False: + return + self._read_file() + n_translations = self._parse_content() + if self._check_file_exists() is False: + return + self._write_file() + print(f" Translated {n_translations} new message(s)") + + def _check_file_exists(self) -> bool: + """ + Checks whether the '.ts' file exists on disk + + Returns + ------- + bool + True if the file exists, False otherwise. + """ + if exists(self.file_path) is False: + print(f" [Translator] File not found: '{self.file_path}'") + return False + return True + + def _read_file(self): + """ + Reads the content of the file + """ + with open(self.file_path, 'r') as file: + self.content = file.read() + + def _write_file(self): + """ + Writes the content on the file + """ + with open(self.file_path, 'w') as file: + file.write(self.content) + + def _parse_content(self) -> int: + """ + Parses and translates the content + + Returns + ------- + int + The number of translated messages. + """ + n_translations = 0 + start = stop = 0 + size = len(self.content) + while start < size: + (start,stop) = self._find_message(start) + if start is None: + break + elif stop is None: + continue + message = Message(self.content[start:stop], self.file_path) + new_content_slice = message.update(self.from_code, self.to_code) + if new_content_slice is not None: + self.content = self.content[:start] + new_content_slice + self.content[stop:] + old_content_len = stop - start + content_len_diff = len(new_content_slice) - old_content_len + stop += content_len_diff + size += content_len_diff + n_translations += 1 + start = stop + return n_translations + + def _find_message(self, idx:int) -> (int,int): + """ + Searches the indexes that delimit the next message structure + + Parameters + ---------- + idx : int + The index to start searching from. + + Returns + ------- + (int,int) + The indexes representing the beginning and the end of the next message structure. + Can be None. + """ + start = self.content.find(MSG_DELIM_BEG, idx) + if start == -1: + return (None,None) + stop = self.content.find(MSG_DELIM_END, start) + if stop == -1: + start += len(MSG_DELIM_BEG) + print(f" [Translator] Message end delimiter not found: '{self.file_path}'") + return (start,None) + stop += len(MSG_DELIM_END) + dupl = self.content.find(MSG_DELIM_BEG, start+len(MSG_DELIM_BEG), stop) + if dupl >= 0 and dupl < stop: + print(f" [Translator] Message end delimiter not found: '{self.file_path}'") + return (dupl,None) + return (start,stop) + + +class Message: + """ + Represents a message structure of a '.ts' file + """ + + def __init__(self, message:str, file:str): + """ + Initializes the message + + Parameters + ---------- + message : str + The original message structure. + file : str + The path of the origin file (for display purposes only). + """ + self.file_path : str = file + self.source : str = None + self.needs_translation : bool = False + self._process(message) + + def update(self, from_code:str, to_code:str) -> str: + """ + Updates the message by translating the source text if needed + + Parameters + ---------- + from_code : str + The language code of the source text. + to_code : str + The language code of the translation text. + + Returns + ------- + str + The updated message structure if an update is needed, + or None otherwise. + """ + if self.needs_translation is False or self.source is None: + return None + if to_code == "en": + translation = self.source + else: + _source = self._desanitize(self.source) + _translation = translate(_source, from_code, to_code) + translation = self._sanitize(_translation) + message = f"{MSG_DELIM_BEG}\n" + message += f" {SRC_DELIM_BEG}{self.source}{SRC_DELIM_END}\n" + message += f" {TR_DELIM_BEG_UFIN}{translation}{TR_DELIM_END}\n" + message += f" {MSG_DELIM_END}" + return message + + def _process(self, message:str): + """ + Processes a message structure + + Parameters + ---------- + message : str + The message structure. + """ + self._find_source_text(message) + if self.source is None: + return + self._check_translation(message) + + def _find_source_text(self, message:str): + """ + Searches for the source text + + Parameters + ---------- + message : str + The message structure. + """ + src_start = message.find(SRC_DELIM_BEG) + if src_start == -1: + print(f" [Translator] Source begin delimiter not found: '{self.file_path}'") + return + src_start += len(SRC_DELIM_BEG) + src_stop = message.find(SRC_DELIM_END, src_start) + if src_stop == -1: + print(f" [Translator] Source end delimiter not found: '{self.file_path}'") + return + self.source = message[src_start:src_stop] + + def _check_translation(self, message:str): + """ + Checks whether the message structure already contains a translation + + Parameters + ---------- + message : str + The message structure. + """ + beg_delim_len = len(TR_DELIM_BEG_FIN) + tr_start = message.find(TR_DELIM_BEG_FIN) + if tr_start == -1: + beg_delim_len = len(TR_DELIM_BEG_UFIN) + tr_start = message.find(TR_DELIM_BEG_UFIN) + if tr_start == -1: + self.needs_translation = True + return + tr_stop = message.find(TR_DELIM_END) + if tr_stop == -1: + print(f" [Translator] Translation end delimiter missing: '{self.file_path}'") + return + elif tr_start > tr_stop: + print(f" [Translator] Message is ill-formed: '{self.file_path}'") + return + tr_start += beg_delim_len + if tr_start == tr_stop: + self.needs_translation = True + + def _desanitize(self, text:str) -> str: + """ + De-sanitizes the given text + + Parameters + ---------- + text : str + The text to de-sanitize. + + Returns + ------- + str + The de-sanitezed text. + """ + for (code,plain) in SANITIZATIONS.items(): + text = text.replace(code, plain) + return text + + def _sanitize(self, text:str) -> str: + """ + Sanitizes the given text + + Parameters + ---------- + text : str + The text to sanitize. + + Returns + ------- + str + The sanitezed text. + """ + for (code,plain) in SANITIZATIONS.items(): + text = text.replace(plain, code) + return text -- GitLab From 0e1a1da8c2bffb93dae6b1e93f8869a4a47e25b8 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:44:49 +0200 Subject: [PATCH 19/34] Updated translation files --- logdoctor/translations/LogDoctor_ar_AR.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_az_AZ.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_bg_BG.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_bn_BN.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_ca_SP.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_cs_CZ.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_da_DA.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_de_GE.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_el_GR.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_en_GB.ts | 166 +- logdoctor/translations/LogDoctor_eo_EO.ts | 2177 +++++++++++++++++ ...{LogDoctor_es_ES.ts => LogDoctor_es_SP.ts} | 168 +- logdoctor/translations/LogDoctor_et_ES.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_fa_PE.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_fi_FI.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_fr_FR.ts | 168 +- logdoctor/translations/LogDoctor_ga_IR.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_he_HE.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_hi_IN.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_hu_HU.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_id_ID.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_it_IT.ts | 171 +- logdoctor/translations/LogDoctor_ja_JP.ts | 168 +- logdoctor/translations/LogDoctor_ko_KO.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_lt_LI.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_lv_LA.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_ms_MA.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_nb_NB.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_nl_NL.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_pl_PL.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_pt_BR.ts | 168 +- logdoctor/translations/LogDoctor_pt_PT.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_ro_RO.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_ru_RU.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_sk_SK.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_sl_SL.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_sq_AL.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_sv_SV.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_th_TH.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_tl_PH.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_tr_TR.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_uk_UK.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_ur_PA.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_zh_CN.ts | 2177 +++++++++++++++++ logdoctor/translations/LogDoctor_zt_CN.ts | 2175 ++++++++++++++++ 45 files changed, 85261 insertions(+), 649 deletions(-) create mode 100644 logdoctor/translations/LogDoctor_ar_AR.ts create mode 100644 logdoctor/translations/LogDoctor_az_AZ.ts create mode 100644 logdoctor/translations/LogDoctor_bg_BG.ts create mode 100644 logdoctor/translations/LogDoctor_bn_BN.ts create mode 100644 logdoctor/translations/LogDoctor_ca_SP.ts create mode 100644 logdoctor/translations/LogDoctor_cs_CZ.ts create mode 100644 logdoctor/translations/LogDoctor_da_DA.ts create mode 100644 logdoctor/translations/LogDoctor_de_GE.ts create mode 100644 logdoctor/translations/LogDoctor_el_GR.ts create mode 100644 logdoctor/translations/LogDoctor_eo_EO.ts rename logdoctor/translations/{LogDoctor_es_ES.ts => LogDoctor_es_SP.ts} (97%) create mode 100644 logdoctor/translations/LogDoctor_et_ES.ts create mode 100644 logdoctor/translations/LogDoctor_fa_PE.ts create mode 100644 logdoctor/translations/LogDoctor_fi_FI.ts create mode 100644 logdoctor/translations/LogDoctor_ga_IR.ts create mode 100644 logdoctor/translations/LogDoctor_he_HE.ts create mode 100644 logdoctor/translations/LogDoctor_hi_IN.ts create mode 100644 logdoctor/translations/LogDoctor_hu_HU.ts create mode 100644 logdoctor/translations/LogDoctor_id_ID.ts create mode 100644 logdoctor/translations/LogDoctor_ko_KO.ts create mode 100644 logdoctor/translations/LogDoctor_lt_LI.ts create mode 100644 logdoctor/translations/LogDoctor_lv_LA.ts create mode 100644 logdoctor/translations/LogDoctor_ms_MA.ts create mode 100644 logdoctor/translations/LogDoctor_nb_NB.ts create mode 100644 logdoctor/translations/LogDoctor_nl_NL.ts create mode 100644 logdoctor/translations/LogDoctor_pl_PL.ts create mode 100644 logdoctor/translations/LogDoctor_pt_PT.ts create mode 100644 logdoctor/translations/LogDoctor_ro_RO.ts create mode 100644 logdoctor/translations/LogDoctor_ru_RU.ts create mode 100644 logdoctor/translations/LogDoctor_sk_SK.ts create mode 100644 logdoctor/translations/LogDoctor_sl_SL.ts create mode 100644 logdoctor/translations/LogDoctor_sq_AL.ts create mode 100644 logdoctor/translations/LogDoctor_sv_SV.ts create mode 100644 logdoctor/translations/LogDoctor_th_TH.ts create mode 100644 logdoctor/translations/LogDoctor_tl_PH.ts create mode 100644 logdoctor/translations/LogDoctor_tr_TR.ts create mode 100644 logdoctor/translations/LogDoctor_uk_UK.ts create mode 100644 logdoctor/translations/LogDoctor_ur_PA.ts create mode 100644 logdoctor/translations/LogDoctor_zh_CN.ts create mode 100644 logdoctor/translations/LogDoctor_zt_CN.ts diff --git a/logdoctor/translations/LogDoctor_ar_AR.ts b/logdoctor/translations/LogDoctor_ar_AR.ts new file mode 100644 index 0000000..393aed5 --- /dev/null +++ b/logdoctor/translations/LogDoctor_ar_AR.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + الركائز + + + Version 4 + الفصل 4 + + + Version 3 + الشكل 3 + + + Version 2 + الفصل 2 + + + Version 1 + الفصل 1 + + + C++17 + C+17 + + + Qt5 + Qt5 + + + Build scripts + نصوص البناء + + + Cross-platform compatibility: + التوافق عبر الحدود: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + الإحصاءات: + + + Warnings + الإنذارات + + + Speed + السرعة + + + Counts + العد + + + Daytime + النهار + + + Relational + العلاقة + + + Globals + Globals + + + Translations: + الترجمة: + + + Italian + إيطاليا + + + Spanish + الإسبانية + + + French + الفرنسية + + + Tools: + الأدوات: + + + Block note + ملاحظة + + + Utilities: + المرافق: + + + Infos viewer + مشاهد معلومات + + + Updates checker + المستجدات + + + Themes: + المواضيع: + + + Dark + الظلام + + + Light + الضوء + + + Improvements and fixes + التحسينات والإصلاحات + + + New themes: + مواضيع جديدة: + + + Ash + آش + + + Candy + حلوى + + + Forest + الغابات + + + Powder + البارود + + + Restyled GUI + غيور مقيد + + + Restyled dialogs + أجهزة مجاورة + + + Doxygen documentation + وثائق Doxygen + + + Mini-Games: + ميني - جيمس: + + + Criss-cross + Criss-cross + + + Snake + ثعبان + + + Changed default paths + تغيير مسارات التقصير + + + New game modes for Snake + ألعاب جديدة لـ(سنيك) + + + Hunt + هنت + + + Battle + معركة + + + New translations: + ترجمة جديدة: + + + Japanese + اليابان + + + Portuguese + البرتغال + + + Code improvements + التحسينات المدونة + + + Performance improvements + تحسين الأداء + + + Added tests suite: + جناح الاختبارات المضافة: + + + white box tests + اختبارات الصندوق الأبيض + + + Customized charts themes + المخططات العرفية + + + Fixes + Fixes + + + Tests improvements + التحسينات في الاختبارات + + + Docker support + دعم دوكر + + + Upgrade to C++20 + Upgrade to C++20 + + + Upgrade to Qt6 + Upgrade to Qt6 + + + Restyled themes + المواضيع المقيدة + + + Redesigned configs section + قسم المقتنيات المعاد تصميمها + + + Stability improvements + تحسينات الاستقرار + + + Generating warnings dinamically + التحذيرات المولدة + + + New tool: + أداة جديدة: + + + Changelog + التغيير + + + Tweakable parameters for some of the charts: + (أ) المعايير البرمجية لبعض المخططات: + + + Improved project structure + تحسين هيكل المشاريع + + + Modernized Cmake usage + تحديث استخدام الكاريكات + + + + Crapinfo + + Version + Version + + + Currently installed version of the software + حاليا تركيب نسخة من البرمجيات + + + Repository links + وصلات الإيداع + + + Paths + Paths + + + The path of the executable file + مسار الملف القابل للتنفيذ + + + Executable + التنفيذ + + + The path where the configuration file gets saved and searched in + الطريق حيث يتم حفظ ملف التشكيلة وتفتيشها + + + Configuration file + ملف المفاوضة + + + The path where the application searches for extra resources + الطريق الذي يبحث فيه الطلب عن موارد إضافية + + + Application data + بيانات التطبيقات + + + + Crapnote + + Reduce the font size + تخفيض الحجم + + + Font size + حجم القوة + + + Increase the font size + زيادة الحجم + + + + Crappath + + Choose + الاختيار + + + Cancel + إلغاء + + + + Crapup + + Checking for updates + التحقق من المستجدات + + + New version available + نسخة جديدة متاحة + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + نسخة جديدة متاحة +يرجى زيارة مستودع لوج دوكتور غيت وتتبع التعليمات حول كيفية تحديث + + + No update found + No update found + + + LogDoctor is up-to-date + لوج دوكتور مستكمل + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + أنت تدير نسخة من المستقبل! +نسختك تتجاوز النسخة الحالية +هل تُدير اللوج دوكتور الأصلي؟ +يرجى زيارة مستودع لوج دوكتور والحصول على نسخة جديدة منه + + + Failed to establish a connection + فشل في إقامة صلة + + + Connection error, please try again later + خطأ في الاتصال، يرجى محاولة مرة أخرى في وقت لاحق + + + Connection timed out + تم توقيت الاتصال + + + Version check failed + فشل فحص الشيك + + + An error occured while parsing: +version mark not found + وحدث خطأ في حين كان يطغى: +لم يتم العثور على علامة + + + An error occured while parsing: +malformed version + وحدث خطأ في حين كان يطغى: +نسخة مشوهة + + + An error occured while comparing: +malformed upstream version + وحدث خطأ في مقارنة ما يلي: +نسخة مضللة من أعلى المجرى + + + + CrissCross + + Victory + النصر + + + You beated me! + لقد هزمتني! + + + This time you lost! + هذه المرة خسرت! + + + Draw + Draw + + + Nice match + مباراة رائعة + + + + DialogBool + + Yes + نعم + + + No + لا + + + + DialogIda + + Ignore + Ignore + + + Discard + Discard + + + Abort + الإجهاض + + + + DialogMsg + + Ok + حسناً + + + + DialogSec + + One of the lists has an invalid item + أحد القوائم لديه بند غير صحيح + + + An error occured while reading the configuration file + حدث خطأ أثناء قراءة ملف التشكيلة + + + An error occured while parsing configuration file's data + حدث خطأ في البيانات + + + Failed to create the configuration file's directory + فشل في إنشاء دليل ملف التكوين + + + Failed to create the configuration file + فشل في إنشاء ملف التشكيلة + + + An error occured while writing the configuration file + حدث خطأ أثناء كتابة ملف التشكيلة + + + An error occured while preparing the configuration file's data + حدث خطأ أثناء إعداد بيانات ملف التكوين + + + The path contains a symlink + الطريق يحتوي على نسيج + + + The file does not exist + الملف غير موجود + + + Failed to create the database backups' directory + فشل في إنشاء دليل دعم قاعدة البيانات + + + Failed to copy the database file + لم ينسخ ملف قاعدة البيانات + + + Failed to update the backups + لم يستكمل الدعم + + + Failed to create the directory + فشل في إنشاء الدليل + + + Unrecognized entry + الدخول غير المعترف به + + + Size of the file + حجم الملف + + + Warning size parameter + بارامتر حجم الإنذار + + + Failed to read gzipped file + لم يقرأ ملف مجهز + + + An error occured while parsing the format string + حدث خطأ في حين طابقت سلسلة الشكل + + + Available memory + الذاكرة المتاحة + + + Size of the logs + حجم السجلات + + + An error occured while reading the gzipped file + حدث خطأ أثناء قراءة الملف المجهول + + + An error occured while reading the file + حدث خطأ أثناء قراءة الملف + + + Something failed while handling the file + شيء ما فشل في التعامل مع الملف + + + An error occured while working on the database + حدث خطأ أثناء العمل على قاعدة البيانات + + + Aborting + الإجهاض + + + Invalid locale + محلية غير صالحة + + + Unexpected locale format + الشكل المحلي غير المتوقع + + + If you haven't manually edited the configuration file, +please report this issue + إذا لم تُحرر ملف التكوين يدوياً +يرجى الإبلاغ عن هذه المسألة + + + The given locale is not an accepted language + The given locale is not an accepted language + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + إذا كنت تريد أن يكون هذا المحلي في لوج دوكتور، +من فضلك اتبع التعليمات على صفحة المستودع + + + Configuration file not found + لم يعثر على ملف للتداول + + + Unable to retrieve the configuration file + غير قادر على استعادة ملف التشكيلة + + + Skipping + التزلج + + + An error occured while handling the configuration file + حدث خطأ أثناء معالجة ملف التشكيلة + + + Failed to write the configuration file + لم يكتب ملف التشكيلة + + + Current configuration not saved + التكوين الحالي لم يُنقذ + + + File not readable + لا يمكن قراءة الملف + + + The file is not readable + الملف غير قابل للقراءة + + + File not writable + ملف غير مكتوب + + + The file is not writable + الملف غير قابل للكتابة + + + Directory not writable + دليل لا يمكن كتابته + + + The directory is not writable + الدليل ليس مكتوباً + + + Invalid path + الطريق غير المستقر + + + Failed applying configuration + عدم تطبيق التشكيلة + + + Invalid configuration lines + خطوط التشكيل غير الصحيحة + + + Has not been possible to apply some of the configurations + لم يتسن تطبيق بعض التشكيلات + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + إذا اخترت المضي قدما، كل التشكيلات غير المطبقة سوف تضيع +أكمل؟ + + + Failed to retrieve the help file + فشل في استعادة ملف المساعدة + + + An error occured while getting the help file + حدث خطأ أثناء الحصول على ملف المساعدة + + + Additional resources can be downloaded from the git repo + ويمكن تنزيل موارد إضافية من نظام " غيت " + + + Unable to retrieve the file + غير قادر على استعادة الملف + + + Invalid string + الخيط الفاشل + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + الخيط المعطى غير صحيح ولا يمكن إضافته إلى القائمة + +من فضلك اصححها وارجع + + + QSql driver not found + سائق QSql لم يعثر عليه + + + Failed to retrieve the driver needed to handle the database + فشل في استرجاع السائق المطلوب للتعامل مع قاعدة البيانات + + + File not found + الملف لم يعثر عليه + + + Failed to retrieve the database file + فشل في استرجاع ملف قاعدة البيانات + + + Create a new database? + إنشاء قاعدة بيانات جديدة؟ + + + The database contains an unexpected table + وتتضمن قاعدة البيانات جدولا غير متوقع + + + Unexpected table + طاولة غير متوقعة + + + It seems that the database is missing a table + يبدو أن قاعدة البيانات مفقودة + + + Table not found + Table not found + + + The database contains an unexpected column + تحتوي قاعدة البيانات على عمود غير متوقع + + + Unexpected column + عمود غير متوقع + + + It seems that the table is missing a column + يبدو أن الطاولة مفقودة + + + Column not found + Column not found + + + A column has an unexpected data-type + العمود له نموذج غير متوقع للبيانات + + + Unexpected data-type + نوع البيانات غير المتوقعة + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + هذه قاعدة البيانات ستُعاد تسميتها بتتبع "النسخة" وواحدة جديدة ستُنشأ +أكمل؟ + + + Database created + إنشاء قاعدة بيانات + + + Successfully created a new database + صنع بنجاح قاعدة بيانات جديدة + + + Not a file + ليس ملف + + + The path was supposed to point to a file, but it doesn't + الطريق كان من المفترض أن يشير إلى ملف، لكنه لا + + + Please remove the conflict and retry + يرجى إزالة الصراع وإعادة التجفيف + + + The database file is not readable + لا يمكن قراءة ملف قاعدة البيانات + + + Please set the proper permissions and retry +If this error persists, please report this issue + الرجاء وضع الاذن الصحيحة واعادة البحث +إذا استمر هذا الخطأ، يرجى الإبلاغ عن هذه المسألة + + + The database file is not writable + ملف قاعدة البيانات غير قابل للكتابة + + + Invalid database path + مسار قاعدة البيانات غير المستقر + + + Failed creating database + فشل في إنشاء قاعدة بيانات + + + An error occured while creating the database + حدث خطأ أثناء إنشاء قاعدة البيانات + + + Failed opening database + عدم وجود قاعدة بيانات افتتاحية + + + An error occured while opening the database + حدث خطأ أثناء فتح قاعدة البيانات + + + Failed executing on database + عدم التنفيذ في قاعدة البيانات + + + An error occured while executing a statement on the database + وقع خطأ أثناء تنفيذ بيان بشأن قاعدة البيانات + + + Failed to backup database + فشل في قاعدة البيانات الاحتياطية + + + Please report this issue + يرجى الإبلاغ عن هذه المسألة + + + Invalid log format string + سلسلة سجلات غير صالحة + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + من فضلك تحقق من أنه لا يوجد خطأ في موقعك +إذا تم قبوله، يرجى التحقق من وجود تيبو هنا +إذا كان كل شيء على ما يرام، يرجى الإبلاغ عن هذه المسألة + + + Log format error + خطأ الشكل + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + The log format has not been set, or is invalid +يرجى إضافة نموذج صالح في التشكيلات + + + Misconfigured log format + الشكل الخاطئ للسجل + + + No log field has been set in the current logs format, +making it useless to parse logs + لم يتم تحديد أي مجال للسجلات في شكل السجلات الحالي، +جعلها عديمة الفائدة لقطع السجلات + + + Please set up a format which contains at least one field + يرجى وضع صيغة تتضمن ميدانا واحدا على الأقل + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + المفصل مفقود بين حقول أو أكثر +مما يجعل من الصعب إنشاء حدود صافية +وربما تؤدي إلى تخزين البيانات غير الصحيحة + + + Please set up a format which contains separators between fields + يرجى وضع شكل يتضمن انفصالا بين الحقول + + + Missing field in log format + ميدان مفقود في شكل سجل + + + An important field is missing from the provided format: + وهناك ميدان هام مفقود من الشكل المقدم: + + + The quality of the statistics may be seriously compromized + وقد تُخسّن نوعية الإحصاءات بشكل خطير + + + Proceed anyway? + على أية حال؟ + + + 'Carriage Return' in log format + "العودة في شكل سجل" + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + الشكل المقدّم يحتوي على "عودة الكريات". +وقد يؤدي ذلك إلى فقدان البيانات أو تحطمها إذا لم تستخدم بحذر + + + An error occured while parsing logs + حدث خطأ في سجلات الطرود + + + Failed defining type + النوع المعرّف + + + Failed to determine the log type + فشل في تحديد نوع السجل + + + File already used + الملف المستخدم بالفعل + + + The file has probably been used already + ربما استخدم الملف بالفعل + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + تجاهلوا التحذير واستخدموه على أي حال، تخلصوا منه واستمروا، أو اوقفوا العملية بأكملها؟ + + + Duplicate file + ملف مزدوج + + + The file appears twice in the list of selections + ويظهر الملف مرتين في قائمة الاختيارات + + + Failed updating hashes + تعطل التحديث + + + An error occured while inserting the parsed files hashes into the database + وحدث خطأ في حين أُدرج الملفات المجزأة في قاعدة البيانات + + + File exceeds warning size + File exceeds warning size + + + The file's size exceeds the warning size + حجم الملف يتجاوز حجم الإنذار + + + Not enough memory + ليس كافياً + + + The total size of the selected files exceeds the available memory + يتجاوز الحجم الإجمالي للملفات المختارة الذاكرة المتاحة + + + Please free some resources, parse the files in different steps or split them into smaller units + يرجى تحرير بعض الموارد، وقطع الملفات في خطوات مختلفة أو تقسيمها إلى وحدات أصغر حجما + + + Failed reading + فشل القراءة + + + File is empty + الملف فارغ + + + The file is blank + الملف فارغ + + + Failed to retrieve the selected file + فشل في استرجاع الملف المختار + + + Discard it and continue, or Abort all and exit? + نتخلص منه ونكمله، أو نلغي كل شيء ونخرج؟ + + + No file to parse + لا ملف للطرد + + + The list of files to parse is empty + قائمة الملفات المتجهة للطرد فارغة + + + Directory not found + لم يعثر على دليل + + + The directory does not exists + الدليل لا يوجد + + + Directory not readable + الدليل غير قابل للقراءة + + + The directory is not readable + الدليل غير قابل للقراءة + + + Please set the proper permissions before to start + الرجاء وضع الأذن المناسبة قبل البدء + + + Failed creating directory + فشل في وضع دليل + + + The path does not exists + الطريق لا يوجد + + + Data conversion failed + فشل تحويل البيانات + + + Failed to convert from '%1' to '%2' + فشل في التحول من %1 إلى %2 + + + Failed to create statistics + عدم إعداد الإحصاءات + + + An error occured while processing + حدث خطأ أثناء التجهيز + + + Cannot create statistics + لا يمكن أن يخلق إحصاءات + + + No data has been found that matches with the currently set parameters + لم يعثر على بيانات تتطابق مع المعايير المحددة حالياً + + + Not a folder + ليس ملف + + + The path was supposed to point to a folder, but it doesn't + الطريق كان من المفترض أن يشير إلى ملف، لكنه لا + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + سيعاد تسمية الدخول بتتبع "النسخة" و سيتم إنشاء واحدة جديدة +أكمل؟ + + + An error occured + حدث خطأ + + + Failed renaming + التخريب الفشل + + + An error occured while renaming + حدث خطأ أثناء إعادة تسميته + + + + GameDialog + + Ok + حسناً + + + + MainWindow + + Parse logs from the Apache2 web server + سجلات إطلاق النار من خادم شبكة Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + سجلات إطلاق النار من خادم شبكة نجينكس + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + سجلات إطلاق النار من خادم شبكة ميكروسوفت + + + IIS + IIS + + + Select/deselect all the files + اختيار/إرسال جميع الملفات + + + All + كل شيء + + + Inspect a log file + فحص ملف السجل + + + Name + الاسم + + + Size + الحجم + + + Refresh the list + تحديث القائمة + + + Total size of the parsed data + مجموع حجم البيانات المجزأة + + + Total number of parsed lines + مجموع عدد البنود + + + Start parsing the selected files + ابدأ بفرز الملفات المختارة + + + START + ستارت + + + Time elapsed since the start + الوقت انقضى منذ البداية + + + Average speed, in parsed data size per second + متوسط السرعة في حجم البيانات المقطوعة في الثانية + + + Web Server + خدمة الشبكة + + + Select a Web Server + اختيار خادم الشبكة + + + Year + السنة + + + Month + الشهر + + + Day + اليوم + + + Hour + Hour + + + Draw the chart + رسم الخريطة + + + Log line marked as Warning + خط لوج مسمّى بالتحذير + + + Date when the request arrived (YYYY-MM-DD) + تاريخ ورود الطلب (YYY-MMM-DD) + + + Time when the request arrived (hh:mm:ss) + الوقت الذي وصل فيه الطلب + + + Protocol of the request + بروتوكول الطلب + + + Method of the request + طريقة الطلب + + + URI of the requested page + URI of the requested page + + + Query carried along with the URI + Query carried along with the URI + + + Response code from the server + رمز الاستجابة من الخادم + + + User-agent of the client which made the request + مستعمل العميل الذي قدم الطلب + + + IP address of the Client which made the request + IP address of the Client which made the request + + + Cookie used for the request + كوكي اعتاد على الطلب + + + The URL which redirected the Client to the requested page + The URL which redirected the Client to the requested page + + + Size ib Bytes of the request, usually includes header and data + Size ib Bytes of the request, usually includes header and data + + + Size in Bytes of the served content, usually includes header and data + Size in Bytes of the served content, usually includes header and data + + + Time taken by the server to serve the content, in milliseconds + الوقت الذي يستغرقه الخادم لخدمة المحتوى في الألف ثانية + + + Only use lines in which the field is starting with this string + فقط خطوط الاستخدام التي يبدأ فيها الحقل بهذا الخيط + + + Protocol: + البروتوكول: + + + Method: + الطريقة: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + استخدم فقط الأسطر التي يتطابق فيها الحقل مع هذه العبارة. +استخدم '!', '=', '<' أو '>' للإعلان عن ما يجب استخدامه + + + Response: + الرد: + + + Query: + Query: + + + URI: + URI: + + + Filters + الأفلام + + + Count + الكونت + + + Number of occurrences + عدد الحالات + + + Item + البند + + + Value of the field + قيمة الميدان + + + From: + من: + + + To: + إلى: + + + Select a log field to view + اختيار حقل تسجيل + + + Field: + الميدان: + + + Filter: + المصور: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + مع الخيوط، فقط الخطوط التي يبدأ فيها الميدان بهذا الخيط سوف تستخدم +مع الارقام، استعملوا + + + Protocol + البروتوكول + + + Method + المنهجية + + + URI + URI + + + User-agent + عامل مستعمل + + + Most recurrent + معظم متكررة + + + Most trafficked + Most trafficked + + + Date ever + التاريخ + + + Day of the week + يوم الأسبوع + + + Hour of the day + ساعة اليوم + + + Time taken + الوقت المستغرق + + + Bytes sent + Bytes sent + + + Bytes received + Bytes received + + + Mean/Max performances + الأداء المتوسط/الضرائب + + + Requests received + الطلبات الواردة + + + Total work + مجموع العمل + + + General + معلومات عامة + + + Window + Window + + + Dialogs + Dialogs + + + Charts + Charts + + + Appearance + الإفادات + + + Speed + السرعة + + + Relational + العلاقة + + + TextBrowser + النص + + + Databases + قواعد البيانات + + + Security + الأمن + + + Logs + اللوز + + + Defaults + العجز + + + Control + الرقابة + + + Path + Path + + + Format + الشكل + + + Warnlists + القوائم الحربية + + + Blacklists + القائمة السوداء + + + Remember the window's position and size + تذكر موقع النافذة وحجمها + + + Remember position and size + تذكر الموقع والحجم + + + Remember window's position and size + تذكر موقع النافذة وحجمها + + + Geometry + Geometry + + + Theme to use for the window + موضوع استخدامه للنافذة + + + Theme + الموضوع + + + Native + Native + + + Light + الضوء + + + Dark + الظلام + + + Auto + Auto + + + Icons + Icons + + + Normal quantity of dialog messages shown + الكمية العادية للرسائل المتعلقة بالطلبات + + + Normal + المعيار + + + Dialogs from the main processes + البيانات المستمدة من العمليات الرئيسية + + + Dialogs emitted when parsing logs + الديالوغز المنبعثة عندما تقطع السجلات + + + Logs parser + قطع الغيار + + + Dialogs emitted when viewing statistics + الدلائل المنبعثة عند النظر إلى الإحصاءات + + + Statistics viewer + مشاهد الإحصاءات + + + Define the quantity of dialog mesages shown + تحديد كمية قياسات الكلى المبينة + + + Dialogs level + الرتبة + + + Reduced quantity of dialog messages shown + انخفاض كمية رسائل أجهزة الاتصال + + + Essential + الأساس + + + Augmented quantity of dialog messages shown + الكمية المبلّغ بها من رسائل الهاتف + + + Explanatory + التفسير + + + Theme to use for the Charts + "الموضوع الذي أستخدمه لـ "كرتس + + + Preview + Preview + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + يمثل خطوة في المحور الزمني في ثواني +وستندمج جميع القيم التي تقع في نفس الفترة وستستخدم القيمة الدنيوية. + + + Time interval + الفترات الزمنية + + + The format to use for the labels of the time axis. + الشكل الذي يستخدم لعلامات المحور الزمني. + + + Time format + الشكل الزمني + + + The size of the pie + حجم الفطيرة + + + Pie size + الحجم + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + أكبر عدد من القطع التي ستتكون منها الفطيرة +سيتم تجميع شرائح التفوق في شريحة شاملة واحدة. + + + Maximum slices + أقصى شريحة + + + Font to use for the Text Browser + Font to use for the Text Browser + + + Font + Font + + + Double-spaced lines + خطوط مساحتها مزدوجة + + + Use wide lines + استخدام خطوط واسعة + + + Define the spacing between lines + تحديد المباعدة بين الخطوط + + + Lines spacing + خطوط المباعدة + + + None + لا + + + Color scheme to use for the Text Browser + خطة كولور لاستخدامها في النص + + + Color scheme + مخطط العقيدة + + + The appearance of the Text Browser with the current settings + ظهـور مجمـع النص مع الظروف الراهنة + + + Insert the base path only, file name excluded + استبعد اسم الملف + + + The given path doen't exists, or doesn't point to a folder + الطريق الذي لا يوجد أو لا يشير إلى ملف + + + Path for the database files + مسار ملفات قاعدة البيانات + + + Paths + Paths + + + Apply the current path + تطبيق المسار الحالي + + + Select the path through a dialog window + إختار الطريق من خلال نافذة لهجة + + + Path where the logs data collection database is located + المكان الذي توجد فيه قاعدة بيانات جمع البيانات + + + Logs data + بيانات + + + Path where the used files hashes database is located + المكان الذي توجد فيه قاعدة البيانات المُستخدمة + + + Used files + الملفات المستخدمة + + + Backup options for the Logs Data database + خيارات الدعم لقاعدة بيانات لوغز + + + Backups + الدعم + + + A new backup is made when closing LogDoctor after having succesfully edited the database + يتم تقديم دعم جديد عند إغلاق لوغ دوكتور بعد أن قام بتحرير قاعدة البيانات بطريقة ناجحة + + + Backup the Logs Data database and keep + دعم قاعدة بيانات لوجز والاحتفاظ + + + Whether it is allowed or denied to follow symlinks occuring in a path + ما إذا كان مسموحاً أو محرماً من اتباع النسيج يحدث في طريق + + + Follow symlinks + أتبعوا صفائح + + + Default WebServer + حاسوب غير مستعمل + + + Usage control + مراقبة النقل + + + Hide already used files + إخفاء الملفات المستخدمة بالفعل + + + Size warnings + تحذيرات الحجم + + + Warn me when using files with a size exceeding: + أحذرني عندما أستخدم الملفات بحجم يفوق: + + + Logs folder + الملفات + + + Logs format string + سلسلة السلاسل + + + Format string + نموذج + + + Insert the format string you're using + أدمجي سلسلة الشكل التي تستخدمينها + + + Apply the current string + تطبيق الخيط الحالي + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + قم بإنشاء نموذج لسطر السجل من السلسلة المحفوظة حاليًا، للتحقق مما إذا تم تنسيقه بشكل صحيح. +سيظهر أي حقل لم يأخذه LogDoctor في الاعتبار كـ 'DISCARDED' + + + Generate sample + العينة الجينية + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + يرجى التحقق من صحة هذا الخط. +تم تحليل الحقول التي تحمل علامة 'DISCARDED' بشكل صحيح، ولكن لم يتم أخذها في الاعتبار بواسطة LogDoctor + + + Open an help window + افتح نافذة المساعدة + + + Help + النجدة + + + Select a log field + اختيار حقل السجل + + + Use warnlist for this field + استخدام قائمة تحذيرية لهذا الميدان + + + Add the current line to the list + يضاف الخط الحالي إلى القائمة + + + Remove the selected item from the list + إزالة البند المختار من القائمة + + + Move the selected item down + حرك البند المختار + + + Use blacklist for this field + استخدام القائمة السوداء في هذا المجال + + + Add line + السطر + + + Remove selection + الانتقاء + + + Language + اللغة + + + Utilities + المنافع + + + Tools + الأدوات + + + Games + الألعاب + + + Perform a version-check + إجراء فحص للنسخة + + + Show some info about LogDoctor + أظهر بعض المعلومات عن لوج دوكتور + + + Open a block-note like window to write temporary text + افتحي حاوية كنافذ لكتابة نص مؤقت + + + Play CrissCross + شغل كريس كروز + + + Play Snake + اعزفي + + + Show the changelog + أظهر التغيير + + + warnlist + التحذير + + + blacklist + القائمة السوداء + + + copy + نسخ + + + copies + نسخ + + + Check updates + التحديثات + + + Infos + المعلومات + + + BlockNote + BlockNote + + + CrissCross + كريسكروس + + + Snake + ثعبان + + + Changelog + التغيير + + + + RichText + + Select a file from the list + اختيار ملف من القائمة + + + to inspect its content + لتفتيش محتواها + + + Failed to read + لم يقرأ + + + + SnakeGame + + PLAY + PLAY + + + Classic + الكلاسيكية + + + Hunt + هنت + + + Battle + معركة + + + Game Over + اللعبة انتهت + + + Your adversary fell in the water! + خصمك سقط في الماء! + + + YOU WON! + ! + + + You fell in the water! + لقد سقطت في الماء! + + + YOU LOST! + لقد خسرت! + + + Your adversary ate itself! + خصمك أكل نفسه! + + + You ate yourself! + لقد أكلت نفسك! + + + Your adversary ate you! + خصمك أكلك! + + + You ate your adversary! + لقد أكلت خصمك! + + + You ate each other! + لقد أكلتما بعضكما! + + + MATCH IS DRAW! + ماتش هو DRAW! + + + + TR + + Unexpected WebServer + Unexpected WebServer + + + Logs Size Breakdown + قطع الحجم + + + Ignored + Ignored + + + Parsed + Parsed + + + Blacklisted + القائمة السوداء + + + Others + جهات أخرى + + + from + من + + + to + إلى + + + Log Lines Marked as Warning + خطوط لوج ماركت على أنها تحذير + + + Time Taken to Serve Requests + الوقت الذي يستغرقه تقديم الطلبات + + + Time of Day Count + وقت الكونت + + + Relational Count + الكونت النسبي + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + التاريخ + + + Year + السنة + + + Month + الشهر + + + Day + اليوم + + + Time + الوقت + + + Hour + Hour + + + Minute + دقيقة + + + Second + الثانية + + + Warning + تحذير + + + Protocol + البروتوكول + + + Method + المنهجية + + + URI + URI + + + Query + Query + + + Response code + رمز الرد + + + Time taken + الوقت المستغرق + + + Bytes sent + Bytes sent + + + Bytes received + Bytes received + + + Referrer + الإحالة + + + Cookie + كوكي + + + Client + العميل + + + User-agent + عامل مستعمل + + + January + كانون الثاني/يناير + + + February + شباط/فبراير + + + March + آذار/مارس + + + April + نيسان/أبريل + + + May + أيار/مايو + + + June + حزيران/يونيه + + + July + تموز/يوليه + + + August + آب/أغسطس + + + September + أيلول/سبتمبر + + + October + تشرين الأول/أكتوبر + + + November + تشرين الثاني/نوفمبر + + + December + كانون الأول/ديسمبر + + + Sunday + الأحد + + + Monday + الاثنين + + + Tuesday + الثلاثاء + + + Wednesday + الأربعاء + + + Thursday + الخميس + + + Friday + الجمعة + + + Saturday + السبت + + + diff --git a/logdoctor/translations/LogDoctor_az_AZ.ts b/logdoctor/translations/LogDoctor_az_AZ.ts new file mode 100644 index 0000000..76ca436 --- /dev/null +++ b/logdoctor/translations/LogDoctor_az_AZ.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Proqramlar + + + Version 4 + Version 4 + + + Version 3 + Version 3 + + + Version 2 + Proqram 2 + + + Version 1 + Version 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Build scripts + + + Cross-platform compatibility: + Cross-platform uyğunluğu: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistika: + + + Warnings + Qeydiyyat + + + Speed + Qaynaq + + + Counts + Qeydiyyat + + + Daytime + Gün + + + Relational + Re + + + Globals + Qarabağ + + + Translations: + Translation: + + + Italian + Rusiya + + + Spanish + İspaniya + + + French + Rusiya + + + Tools: + Elanlar: + + + Block note + Block + + + Utilities: + Utilities: + + + Infos viewer + İnformasiya + + + Updates checker + Proqramlar + + + Themes: + Theme: + + + Dark + Qızıl + + + Light + İşıq + + + Improvements and fixes + Yadda saxla + + + New themes: + Yeni mövzular: + + + Ash + Axtar + + + Candy + Oxunub + + + Forest + Oxunub + + + Powder + Toz + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Daxil ol + + + Doxygen documentation + Doxygen məlumatları + + + Mini-Games: + Mini-Games: + + + Criss-cross + Qeydiyyat + + + Snake + Qalereya + + + Changed default paths + dəyişdirilmiş yolları + + + New game modes for Snake + Snake üçün yeni oyun rejimi + + + Hunt + Avtomobil + + + Battle + Qeydiyyat + + + New translations: + Yeni çevirilər: + + + Japanese + Yapon + + + Portuguese + Portuguese + + + Code improvements + Sertifikatlaşdırma + + + Performance improvements + Performans inkişafları + + + Added tests suite: + Ekspertlər paketi: + + + white box tests + ağ qutusu test + + + Customized charts themes + Xüsusi charts mövzular + + + Fixes + Fix + + + Tests improvements + Proqramlar + + + Docker support + Docker məlumatı + + + Upgrade to C++20 + C++20 + + + Upgrade to Qt6 + Qt6 + + + Restyled themes + Daxil ol + + + Redesigned configs section + Redesigned configs section + + + Stability improvements + Stabillik inkişafı + + + Generating warnings dinamically + Dinamically + + + New tool: + Yeni alət: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + charts birin üçün Tweakable parametrləri: + + + Improved project structure + İnnovativ layihəsi + + + Modernized Cmake usage + Müasir Xidmət + + + + Crapinfo + + Version + Proqram + + + Currently installed version of the software + İndi proqram versiyası + + + Repository links + Qalereya + + + Paths + Yollar + + + The path of the executable file + executable fayl yolu + + + Executable + Qeydiyyat + + + The path where the configuration file gets saved and searched in + konfiqurasiya faylını qəbul edir və axtarır yolu + + + Configuration file + Konfiqurasiya + + + The path where the application searches for extra resources + Əlavə resurslar üçün proqram axtarışı yolu + + + Application data + Proqramlar + + + + Crapnote + + Reduce the font size + font ölçüsü azaldır + + + Font size + Font ölçüsü + + + Increase the font size + font ölçüsünü artırmaq + + + + Crappath + + Choose + Seçki + + + Cancel + Cancel + + + + Crapup + + Checking for updates + Yeniləmə + + + New version available + Yeni versiya mövcud + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Yeni versiya mövcuddur! +GirişDoctor'un filtrini ziyarət edin və yeniləməyiniz haqqında tətbiq edin + + + No update found + Yeniləndirilməsi + + + LogDoctor is up-to-date + LogDoctor up-to-date + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Gəncdən bir versiya işləyirsiniz! +Sizin versiyası cari upstream versiyasından daha çoxdur +Siz orijinal LogDoctor çalışan? +GirişDoctor'un depozitini ziyarət edin və onun yeni versiyasını almaq + + + Failed to establish a connection + Bir əlaqə yaratmaq + + + Connection error, please try again later + Yadda saxla + + + Connection timed out + Bağlantı vaxtı + + + Version check failed + Proqramlar + + + An error occured while parsing: +version mark not found + Parsing vasitəsində bir səs ortaya çıxdı: +versiya qeyd + + + An error occured while parsing: +malformed version + Parsing vasitəsində bir səs ortaya çıxdı: +xüsusi versiyası + + + An error occured while comparing: +malformed upstream version + Müqayisə dəyişikliklə çıxarılır: +avtomobil versiyası + + + + CrissCross + + Victory + Tarix + + + You beated me! + Oxunub! + + + This time you lost! + Siz bu vaxt! + + + Draw + Draw + + + Nice match + Nice match + + + + DialogBool + + Yes + Qeydiyyat + + + No + Noyabr + + + + DialogIda + + Ignore + Qeydiyyat + + + Discard + Daxil ol + + + Abort + Qeydiyyat + + + + DialogMsg + + Ok + Tarix + + + + DialogSec + + One of the lists has an invalid item + Qeydlərin biri qeydsiz maddə var + + + An error occured while reading the configuration file + Konfiqurasiya faylını oxumaq bir səviyyə ortaya çıxdı + + + An error occured while parsing configuration file's data + Konfiqurasiya faylının verilməsi zamanı bir məlumat meydana gətirilir + + + Failed to create the configuration file's directory + Konfiqurasiya faylını yaratmaq üçün başarısız oldu + + + Failed to create the configuration file + Konfiqurasiya faylını yaratmaq + + + An error occured while writing the configuration file + Konfiqurasiya faylını yazır zaman bir səhv ortaya çıxdı + + + An error occured while preparing the configuration file's data + Konfiqurasiya faylını hazırlayır zaman bir səhv meydana gətirilir + + + The path contains a symlink + Yol bir simlink daxildir + + + The file does not exist + fayl mövcud deyil + + + Failed to create the database backups' directory + Database backups' directory yaratmaq üçün başarısız oldu + + + Failed to copy the database file + Veritabanı faylını kopyalamaq üçün başarısız oldu + + + Failed to update the backups + backups yeniləndirilməsi + + + Failed to create the directory + Kataloq yaratmaq + + + Unrecognized entry + Tanınmış giriş + + + Size of the file + faylın ölçüsü + + + Warning size parameter + Yadda saxla + + + Failed to read gzipped file + Qızıl faylını oxuyun + + + An error occured while parsing the format string + format string parsing zaman bir səhv meydana gəlir + + + Available memory + Yadda saxla + + + Size of the logs + Girişlərin ölçüsü + + + An error occured while reading the gzipped file + Qızıllı fayl oxumaq çıxarılır + + + An error occured while reading the file + An error occured while reading the file + + + Something failed while handling the file + faylları işləyir + + + An error occured while working on the database + Veritabanında işləyir zaman bir hata meydana gətirilir + + + Aborting + Avtomobil + + + Invalid locale + Invalid yerli + + + Unexpected locale format + Xüsusi yerli format + + + If you haven't manually edited the configuration file, +please report this issue + Konfiqurasiya faylını elan etmədiyiniz zaman, +Yadda saxla + + + The given locale is not an accepted language + Verilmiş yerlie qəbul edilmiş dil deyil + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Siz LogDoctor bu yerlie olmaq istəyirsinizsə, +Daxil ol + + + Configuration file not found + Konfiqurasiya faylı tapılmadı + + + Unable to retrieve the configuration file + konfiqurasiya faylını almaq + + + Skipping + Tarix + + + An error occured while handling the configuration file + Konfiqurasiya faylını dəstəkləyir + + + Failed to write the configuration file + Konfiqurasiya faylını yazmaq + + + Current configuration not saved + Daxil olmaq + + + File not readable + Oxunub + + + The file is not readable + Fayl oxulmaz + + + File not writable + Qeydiyyat + + + The file is not writable + The file is not writable + + + Directory not writable + Qeydiyyat + + + The directory is not writable + Mərkəzi kateqoriya + + + Invalid path + Invalid yolu + + + Failed applying configuration + Qeyd olunan konfiqurasiya + + + Invalid configuration lines + Invalid konfiqurasiya xüsusiyyətləri + + + Has not been possible to apply some of the configurations + Konfiqurasiyaların birini tətbiq etmək mümkün deyil + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Başlamaq istəyirsinizsə, qeyd olunmamış konfiqurasiyaların bütün silinməz +Oxunub? + + + Failed to retrieve the help file + Yardım faylını almaq + + + An error occured while getting the help file + Yardım faylını almaq üçün bir səhv meydana gəlir + + + Additional resources can be downloaded from the git repo + Additional resources can be downloaded from the git repo + + + Unable to retrieve the file + fayl almaq üçün + + + Invalid string + Invalid string + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Verilmiş string qeyd edilir və siyahısı əlavə etmir + +Yadda saxla + + + QSql driver not found + QSql sürücü bulunamadı + + + Failed to retrieve the driver needed to handle the database + Veritabanını başa çatdırmaq üçün lazım olan sürücü almaq + + + File not found + Qeydiyyat + + + Failed to retrieve the database file + Veritabanı faylını almaq üçün başarısız oldu + + + Create a new database? + Yeni bazar yaradın? + + + The database contains an unexpected table + Qeydiyyatdan keçmiş masa + + + Unexpected table + Xüsusi masa + + + It seems that the database is missing a table + O görünür ki, baza bir masa itirir + + + Table not found + Qeydiyyat + + + The database contains an unexpected column + Qeydiyyatdan keçmiş sütuna malikdir + + + Unexpected column + Xüsusi sütun + + + It seems that the table is missing a column + O, masa bir sütun eksik görünür + + + Column not found + Sütun tapılmadı + + + A column has an unexpected data-type + Bir sütunun gözəl data tipli var + + + Unexpected data-type + Xüsusi veri tipli + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Bu baza ".copy" və yeni bir izləşdirilmiş olacaq. +Oxunub? + + + Database created + Database yaradılıb + + + Successfully created a new database + Müəyyən yeni bir baza yaradılıb + + + Not a file + Bir fayl deyil + + + The path was supposed to point to a file, but it doesn't + Yol bir fayl açıq idi, lakin bu deyil + + + Please remove the conflict and retry + Haqqımızda + + + The database file is not readable + Qeydiyyat faylları oxulmaz + + + Please set the proper permissions and retry +If this error persists, please report this issue + Daxil ol +Bu səhifə davam edirsə, bu məhsul hesabat verin + + + The database file is not writable + The database file is not writable + + + Invalid database path + Invalid baza yolu + + + Failed creating database + Qeyd yaratmaq + + + An error occured while creating the database + An error occured while creating the database + + + Failed opening database + İndi açılış bazası + + + An error occured while opening the database + An error occured while opening the database + + + Failed executing on database + Qeyd verilməsi + + + An error occured while executing a statement on the database + An error occured while executing a statement on the database + + + Failed to backup database + Sertifikat verilməsi + + + Please report this issue + Yadda saxla + + + Invalid log format string + Invalid log format string + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + WebServer tərəfindən heç bir məlumat atılır +Qeydiyyatdan keçdiyiniz zaman, burada bir tiponun varlığını gözləyin +Hər şey yolunda olursa, bu məhsul hesabat + + + Log format error + Yadda saxla + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Qeydiyyatdan keçirilmiş və ya qeyd olunmuşdur +Konfiqurasiyalarda mövcud bir əlavə edin + + + Misconfigured log format + Misconfigured log format + + + No log field has been set in the current logs format, +making it useless to parse logs + Heç bir giriş sahəsi cari logs formatında təşkil edilmişdir, +parse logs tapmaq + + + Please set up a format which contains at least one field + Ən azı bir sahə daxil olan bir format təşkil edin + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + A separator bir və ya daha çox sahəsindən silinir, +Net qurğular yaratmaq olaraq, +və əmlak məlumatları mağazaq + + + Please set up a format which contains separators between fields + Saytlar arasında sehrələri olan bir format təşkil edin + + + Missing field in log format + Daxil ol + + + An important field is missing from the provided format: + Sifarişli bir sahəsi təchiz edilmiş formatdan silinir: + + + The quality of the statistics may be seriously compromized + Statistikanın keyfiyyəti ciddi komponent ola bilər + + + Proceed anyway? + Hər halda təhlükəsiz? + + + 'Carriage Return' in log format + 'Carriage' log formatında + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Verilmiş format "Karriage Return" daxildir. +Bu, təhlükəsiz istifadə etmədiyiniz məlumatları və ya çökməyə qəbul edə bilər + + + An error occured while parsing logs + Daxil olmaqla bir səhv meydana gəlir + + + Failed defining type + Qeyd edilməsi + + + Failed to determine the log type + Qeydiyyat nömrəsinin təşkil edilməsi + + + File already used + Qalereya + + + The file has probably been used already + The file has probably been used already + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + İndi təhlükəsizlik və istifadə etmək, onu discard və davam, və ya bütün prosesi Abort? + + + Duplicate file + Qeydiyyat + + + The file appears twice in the list of selections + Fayl seçimi siyahısı ikidə görünür + + + Failed updating hashes + Qeyd edilən yeniləndirilməsi + + + An error occured while inserting the parsed files hashes into the database + Parsed faylları yerləşdirilməsində bir səhv meydana gətirdi + + + File exceeds warning size + Qeydiyyat ölçüsü + + + The file's size exceeds the warning size + fayl ölçüsü uyarı ölçüsündən çoxdur + + + Not enough memory + Oxunub + + + The total size of the selected files exceeds the available memory + Seçilmiş faylların ümumi ölçüsü mövcud yarpaqdan artıqdır + + + Please free some resources, parse the files in different steps or split them into smaller units + Xüsusi faylları pulsuz, müxtəlif addımlarda faylları parse edin və ya daha kiçik komponentlərdə bölünür + + + Failed reading + Qeydiyyat + + + File is empty + Fayl boş + + + The file is blank + fayl boş + + + Failed to retrieve the selected file + Seçilmiş fayl almaq + + + Discard it and continue, or Abort all and exit? + Discard it və davam, və ya Abort bütün və çıxış? + + + No file to parse + Pulsuz + + + The list of files to parse is empty + Parse faylları siyahısı boş + + + Directory not found + Qeydiyyat + + + The directory does not exists + Kataloq mövcud deyil + + + Directory not readable + Qeydiyyat + + + The directory is not readable + Kataloq oxulmaz + + + Please set the proper permissions before to start + Başlamadan əvvəl düzgün məlumatları qəbul edin + + + Failed creating directory + Kataloq yaratmaq + + + The path does not exists + Yol mövcud deyil + + + Data conversion failed + Data dönüşüm başarısız oldu + + + Failed to convert from '%1' to '%2' + '%1'dan '%2' qəsr etməyə çalışıb + + + Failed to create statistics + Statistika yaratmaq + + + An error occured while processing + Əməliyyat vasitəsində bir hata meydana gətirilir + + + Cannot create statistics + Statistika yaratmaq + + + No data has been found that matches with the currently set parameters + Şu anda set parametrləri ilə qazanmaq heç bir data tapılmadı + + + Not a folder + Bir qeyd + + + The path was supposed to point to a folder, but it doesn't + Yol bir qoymaq lazım idi, lakin bu deyil + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Giriş ".copy" və yeni bir yaradılmış olacaq. +Oxunub? + + + An error occured + Bir səhifə ortaya çıxdı + + + Failed renaming + İdman + + + An error occured while renaming + Renaming deyil zaman bir səhv meydana gəlir + + + + GameDialog + + Ok + Tarix + + + + MainWindow + + Parse logs from the Apache2 web server + Apache2 web serverindən parse logs + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Nginx web server + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Microsoft IIS web serverindən parse logs + + + IIS + IIS + + + Select/deselect all the files + Bütün faylları seçin + + + All + Bütün hüquqlar + + + Inspect a log file + Daxil ol + + + Name + Ad Soyad + + + Size + Qeydiyyat + + + Refresh the list + Kateqoriya + + + Total size of the parsed data + Parsed datanın ümumi ölçüsü + + + Total number of parsed lines + Parsed xüsusi sayı + + + Start parsing the selected files + Seçilmiş faylları pozmaq + + + START + Tarix + + + Time elapsed since the start + Başdan vaxt + + + Average speed, in parsed data size per second + Ortalama sürət, ikinci üçün parsed data ölçüsü + + + Web Server + Web Server + + + Select a Web Server + Web Server seçin + + + Year + İllik + + + Month + Aylıq + + + Day + Gün + + + Hour + Saatlar + + + Draw the chart + Qeydiyyatdan keçin + + + Log line marked as Warning + Xidmət xidmətləri + + + Date when the request arrived (YYYY-MM-DD) + Sorğu gəldi zaman (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + İstehlak zamanı (hhh:mm:s) + + + Protocol of the request + İstehsalçının protokolu + + + Method of the request + Sorğu metodu + + + URI of the requested page + İstehsalçının URI + + + Query carried along with the URI + URI + + + Response code from the server + serverdən cavab kodu + + + User-agent of the client which made the request + İstehsalçının istifadəsi + + + IP address of the Client which made the request + İstehsalçının IP ünvanı + + + Cookie used for the request + İstehsal üçün istifadə edilmiş Cookie + + + The URL which redirected the Client to the requested page + Yadda saxla + + + Size ib Bytes of the request, usually includes header and data + İstehlakçıların ölçüsü, ad və məlumat daxildir + + + Size in Bytes of the served content, usually includes header and data + Xidmət content Bytes haqqında ölçü, tez-tez və məlumat daxildir + + + Time taken by the server to serve the content, in milliseconds + Server tərəfindən alınan vaxt xüsusi xidmətlərinə xidmət etmək üçün xüsusi + + + Only use lines in which the field is starting with this string + Alan bu string ilə başlayan yalnız istifadə xüsusiyyətləri + + + Protocol: + Protokol: + + + Method: + Metod: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Alan bu məlumat uyğun olaraq yalnız istifadə xüsusiyyətləri. +İstifadə edin '!', '=', '<' və ya '>' istifadə etmək üçün istifadə etmək + + + Response: + Response: + + + Query: + Query: + + + URI: + URI: + + + Filters + Filters + + + Count + Qeydiyyat + + + Number of occurrences + Növbətlərin sayı + + + Item + Ümumi + + + Value of the field + Value of the field + + + From: + Oxunub: + + + To: + Oxunub: + + + Select a log field to view + Baxış sahəsi seçin + + + Field: + Tarix: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + iplərlə, bu string ilə başlayan sahəsin yalnız satırlar istifadə edilir. +nömrələrlə, istifadə edin '!', '=', '<' və ya '>' istifadə etmək üçün necə + + + Protocol + Protokol + + + Method + Metod + + + URI + URI + + + User-agent + Qeydiyyat + + + Most recurrent + Most recurrent + + + Most trafficked + Yüksək trafik + + + Date ever + Tarix + + + Day of the week + Həftə günü + + + Hour of the day + Günün saatı + + + Time taken + Vaxt + + + Bytes sent + Elanlar + + + Bytes received + Axtarış + + + Mean/Max performances + Axtarış + + + Requests received + Qeydiyyat + + + Total work + Ümumi iş + + + General + Ümumi + + + Window + Qeydiyyat + + + Dialogs + Dialoglar + + + Charts + Qeydiyyat + + + Appearance + Bakı + + + Speed + Qaynaq + + + Relational + Relational + + + TextBrowser + Axtarış + + + Databases + Qeydiyyat + + + Security + Elanlar + + + Logs + Qeydiyyat + + + Defaults + Qeydiyyat + + + Control + İdman + + + Path + Yol + + + Format + Qalereya + + + Warnlists + İdmançılar + + + Blacklists + Qadınlar + + + Remember the window's position and size + Mərkəzinin mövzu və ölçüsünü unutmayın + + + Remember position and size + Xüsusi və ölçüsü + + + Remember window's position and size + Mərkəzinin yeri və ölçüsünü unutmayın + + + Geometry + Geometri + + + Theme to use for the window + Sifariş üçün istifadə etmək + + + Theme + Axtarış + + + Native + Avtomobil + + + Light + İşıq + + + Dark + Qızıl + + + Auto + Avtomobil + + + Icons + Icons + + + Normal quantity of dialog messages shown + Saytın normal miqdarı + + + Normal + Normal + + + Dialogs from the main processes + Əsas proseslərdən Dialoglar + + + Dialogs emitted when parsing logs + Dialoglar parsing logs zaman yayılmış + + + Logs parser + parser + + + Dialogs emitted when viewing statistics + Dialoglar statistika baxış zaman + + + Statistics viewer + Statistika baxış + + + Define the quantity of dialog mesages shown + Saytın xəritəsi + + + Dialogs level + Dialoglar + + + Reduced quantity of dialog messages shown + Saytda saxla + + + Essential + Essential + + + Augmented quantity of dialog messages shown + Axtarış xüsusiyyətləri + + + Explanatory + Tarix + + + Theme to use for the Charts + Charts üçün istifadə etmək + + + Preview + Qeydiyyat + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + vaxtında bir addım, saniyə. +Bütün qiymətlər eyni interval daxil olacaq və söz dəyişi istifadə edəcək. + + + Time interval + Vaxt intervalı + + + The format to use for the labels of the time axis. + vaxtın etiketləri üçün istifadə format. + + + Time format + Vaxt formatı + + + The size of the pie + Tarixin ölçüsü + + + Pie size + Tarix ölçüsü + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Pastanın yaranacağı maksimum dilim. +Çıxış dilimləri bir geniş dilim qruplaşdırılır. + + + Maximum slices + Maksimum dilim + + + Font to use for the Text Browser + Text Browser üçün istifadə et + + + Font + Tarix + + + Double-spaced lines + Double-spaced lines + + + Use wide lines + Geniş xüsusiyyətlər istifadə edin + + + Define the spacing between lines + Saytlar arasında qazanmaq + + + Lines spacing + Avtomobil + + + None + Qeyd + + + Color scheme to use for the Text Browser + Text Browser üçün istifadə üçün rəng planı + + + Color scheme + Color scheme + + + The appearance of the Text Browser with the current settings + Text Browser-ın cari ayarları ilə görünüşü + + + Insert the base path only, file name excluded + Yalnız baza yol seçin, fayl adı istisna + + + The given path doen't exists, or doesn't point to a folder + Verilmiş yol doen't mövcud deyil, və ya bir qızıl qədər deyil + + + Path for the database files + Database faylları üçün yol + + + Paths + Yollar + + + Apply the current path + cari yol axtarış + + + Select the path through a dialog window + Bir diqqqoriya ilə yol seçin + + + Path where the logs data collection database is located + Path where the logs data collection database is located + + + Logs data + İnformasiya + + + Path where the used files hashes database is located + istifadə edilən fayllar bazası yerləşdirilir + + + Used files + Daxil ol + + + Backup options for the Logs Data database + Logs Data Database üçün Backup variantları + + + Backups + Daxil ol + + + A new backup is made when closing LogDoctor after having succesfully edited the database + LogDoctor dəyişdirdiyiniz zaman yeni bir backup hazırlanır + + + Backup the Logs Data database and keep + Logs Data bazası istifadə edin və saxlayın + + + Whether it is allowed or denied to follow symlinks occuring in a path + Əgər hansı bir yolda meydana gəlir və ya qeyd olunacaq + + + Follow symlinks + Qalereya + + + Default WebServer + WebServer + + + Usage control + Daxil olmaq + + + Hide already used files + Yadda saxla + + + Size warnings + Qeydiyyat + + + Warn me when using files with a size exceeding: + bir ölçüsü ilə faylları istifadə etdiyi zaman mövzu: + + + Logs folder + Qeydiyyat + + + Logs format string + Logs format string + + + Format string + Qalereya + + + Insert the format string you're using + istifadə etdiyiniz format stringini yazın + + + Apply the current string + cari stringin tətbiqi + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Şu anda qeyd olunan ipdən bir nümunə log line, düzgün formatlanırsa kontrol etmək. +LogDoctor tərəfindən heç bir sahib 'DISCARDED' olacaq + + + Generate sample + Genrate nümunə + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Bu xidmətin düzgünlığını kontrol edin. +'DISCARDED' olaraq qeyd edilmişdir, lakin LogDoctor tərəfindən deyil + + + Open an help window + Bir yardım penceresi açın + + + Help + Yardım + + + Select a log field + Daxil ol + + + Use warnlist for this field + Bu sahəsin üçün zəng siyahısı + + + Add the current line to the list + siyahısı siyahısı daxil edin + + + Remove the selected item from the list + Seçilmiş maddələri siyahısı siyahısı + + + Move the selected item down + Seçilmiş maddə aşağı + + + Use blacklist for this field + Bu sahib üçün siyahlist istifadə edin + + + Add line + Qeydiyyat + + + Remove selection + Seçki + + + Language + Qadın + + + Utilities + Uşaqlar + + + Tools + Elanlar + + + Games + Oyunlar + + + Perform a version-check + Bir versiyası bax + + + Show some info about LogDoctor + LogDoctor + + + Open a block-note like window to write temporary text + Daxili yazı yazmaq üçün bir blok-note açıq + + + Play CrissCross + E-poçt ünvanı + + + Play Snake + Oyunçular + + + Show the changelog + Show the changelog + + + warnlist + axtarış + + + blacklist + qadın + + + copy + copy + + + copies + copies + + + Check updates + Qeydiyyatları + + + Infos + Info + + + BlockNote + Bakı + + + CrissCross + Qeydiyyat + + + Snake + Qalereya + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Siyahıdan bir fayl seçin + + + to inspect its content + to inspect its content + + + Failed to read + Oxunub + + + + SnakeGame + + PLAY + Qalereya + + + Classic + Klassik + + + Hunt + Avtomobil + + + Battle + Qeydiyyat + + + Game Over + Oyun + + + Your adversary fell in the water! + Sizin müraciət su düşmüşdür! + + + YOU WON! + Qeydiyyat! + + + You fell in the water! + Suda düşdün! + + + YOU LOST! + Oxunub! + + + Your adversary ate itself! + Sizin səhifə öz! + + + You ate yourself! + Özünüzü axtarırsınız! + + + Your adversary ate you! + Sizin səhifəniz! + + + You ate your adversary! + Siz səhifənizi ate! + + + You ate each other! + Siz hər bir digər! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + WebServer + + + Logs Size Breakdown + Qeydiyyat + + + Ignored + Qeydiyyat + + + Parsed + Axtarış + + + Blacklisted + Qeydiyyat + + + Others + Elanlar + + + from + Qeydiyyatdan + + + to + Oxunub + + + Log Lines Marked as Warning + Giriş xidmətləri əlaqə saxlayın + + + Time Taken to Serve Requests + Vaxt İstehsalçıları + + + Time of Day Count + Vaxt + + + Relational Count + Relational Count + + + FALSE + Qalereya + + + TRUE + Qeydiyyat + + + Date + Tarix + + + Year + İllik + + + Month + Aylıq + + + Day + Gün + + + Time + Vaxt + + + Hour + Saatlar + + + Minute + Axtarış + + + Second + İdman + + + Warning + Qeydiyyat + + + Protocol + Protokol + + + Method + Metod + + + URI + URI + + + Query + Bakı + + + Response code + Kompüter kodu + + + Time taken + Vaxt + + + Bytes sent + Elanlar + + + Bytes received + Axtarış + + + Referrer + Proqram + + + Cookie + Cookie + + + Client + Qeydiyyat + + + User-agent + Qeydiyyat + + + January + Yanvar + + + February + Fevral + + + March + Bakı + + + April + Bakı + + + May + İyul + + + June + İyun + + + July + İyul + + + August + Avqust + + + September + Bakı + + + October + Bakı + + + November + Bakı + + + December + Bakı + + + Sunday + Bakı + + + Monday + Bakı + + + Tuesday + Bakı + + + Wednesday + Bakı + + + Thursday + Bakı + + + Friday + Bakı + + + Saturday + Bakı + + + diff --git a/logdoctor/translations/LogDoctor_bg_BG.ts b/logdoctor/translations/LogDoctor_bg_BG.ts new file mode 100644 index 0000000..1bcdd8a --- /dev/null +++ b/logdoctor/translations/LogDoctor_bg_BG.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Версия + + + Version 4 + Версия 4 + + + Version 3 + Версия 3 + + + Version 2 + Версия 2 + + + Version 1 + Версия 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Създаване на скриптове + + + Cross-platform compatibility: + Съвместимост на кръстосаната платформа: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Статистика: + + + Warnings + Предупреждения + + + Speed + Скорост + + + Counts + Броячи + + + Daytime + Дневно време + + + Relational + Относително + + + Globals + Глобали + + + Translations: + Преводи: + + + Italian + Италиански + + + Spanish + Испански + + + French + Френски + + + Tools: + Инструменти: + + + Block note + Блокирана бележка + + + Utilities: + Инструменти: + + + Infos viewer + Name + + + Updates checker + Обновяема проверка + + + Themes: + Теми: + + + Dark + Тъмно + + + Light + Светлина + + + Improvements and fixes + Подобрения и поправки + + + New themes: + Нови теми: + + + Ash + Пепел + + + Candy + Бонбони + + + Forest + Гора + + + Powder + Прах + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Рециклирани диалози + + + Doxygen documentation + Доксигенна документация + + + Mini-Games: + Мини игри: + + + Criss-cross + Criss-cross + + + Snake + Змия + + + Changed default paths + Променени пътища по подразбиране + + + New game modes for Snake + Нови режими на игра за Snake + + + Hunt + Лов + + + Battle + Битка + + + New translations: + Нови преводи: + + + Japanese + ЯпонскиName + + + Portuguese + португалски + + + Code improvements + Подобрения на кода + + + Performance improvements + Подобряване на ефективността + + + Added tests suite: + Добавен комплект за тестове: + + + white box tests + изпитвания на бяла кутия + + + Customized charts themes + Персонализирани диаграми теми + + + Fixes + Фиксации + + + Tests improvements + Подобрения на изпитванията + + + Docker support + Поддръжка на Docker + + + Upgrade to C++20 + Ъпгрейд до C++20 + + + Upgrade to Qt6 + Upgrade to Qt6 + + + Restyled themes + Реципрочна тематика + + + Redesigned configs section + Препроектиран раздел за конфигуриране + + + Stability improvements + Подобряване на стабилността + + + Generating warnings dinamically + Генериране на предупрежденията динамично + + + New tool: + Нов инструмент: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Подходящи параметри за някои от графиките: + + + Improved project structure + Подобрена проектна структура + + + Modernized Cmake usage + Модернизиран Използване на Cmake + + + + Crapinfo + + Version + Версия + + + Currently installed version of the software + В момента инсталирана версия на софтуера + + + Repository links + Справочници + + + Paths + Пътища + + + The path of the executable file + Път на изпълнимия файл + + + Executable + Изпълнение + + + The path where the configuration file gets saved and searched in + Пътят, в който конфигурационният файл се записва и претърсва + + + Configuration file + Настройване на файл + + + The path where the application searches for extra resources + Пътят, в който заявлението търси допълнителни ресурси + + + Application data + Данни за заявлението + + + + Crapnote + + Reduce the font size + Намаляване размера на шрифта + + + Font size + Размер на шрифта + + + Increase the font size + Увеличаване размера на шрифта + + + + Crappath + + Choose + Избор + + + Cancel + Отмяна + + + + Crapup + + Checking for updates + Проверка за актуализации + + + New version available + Нова версия на разположение + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Нова версия е достъпна! +Моля, посетете хранилището на LogDoctor и следвайте инструкциите за това как да се актуализира + + + No update found + Не е намерена актуализация + + + LogDoctor is up-to-date + LogDoctor е актуална + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Управляваш версия от бъдещето! +Вашата версия е отвъд текущата версия нагоре по веригата +Ти ли ръководиш оригиналния Логдоктор? +Моля, посетете хранилището на LogDoctor и вземете нова версия на него + + + Failed to establish a connection + Грешка при установяване на връзка + + + Connection error, please try again later + Грешка при свързване, моля опитайте отново по-късно + + + Connection timed out + Връзката прекъсната + + + Version check failed + Грешка при проверка на версията + + + An error occured while parsing: +version mark not found + Възникна грешка при анализ: +не е намерена версия + + + An error occured while parsing: +malformed version + Възникна грешка при анализ: +нереформирана версия + + + An error occured while comparing: +malformed upstream version + Възникна грешка при сравняването: +нереформирана версия нагоре по веригата + + + + CrissCross + + Victory + Победа + + + You beated me! + Ти ме би! + + + This time you lost! + Този път загуби! + + + Draw + Равенство + + + Nice match + Добър мач + + + + DialogBool + + Yes + Да + + + No + Не + + + + DialogIda + + Ignore + Игнориране + + + Discard + Изхвърляне + + + Abort + Прекъсване + + + + DialogMsg + + Ok + Добре + + + + DialogSec + + One of the lists has an invalid item + Един от списъците има невалидна позиция + + + An error occured while reading the configuration file + Грешка при четене на конфигурационния файл + + + An error occured while parsing configuration file's data + Грешка при анализ на конфигурационните данни на файла + + + Failed to create the configuration file's directory + Грешка при създаване на директорията на конфигурационния файл + + + Failed to create the configuration file + Грешка при създаване на конфигурационния файл + + + An error occured while writing the configuration file + Грешка при запис на конфигурационния файл + + + An error occured while preparing the configuration file's data + Грешка при изготвяне на конфигурационните данни + + + The path contains a symlink + Пътят съдържа симлинк + + + The file does not exist + Файлът не съществува + + + Failed to create the database backups' directory + Грешка при създаване на директорията за архивиране на базата данни + + + Failed to copy the database file + Грешка при копиране на файла с базата данни + + + Failed to update the backups + Грешка при обновяване на архива + + + Failed to create the directory + Грешка при създаване на директорията + + + Unrecognized entry + Непризнато вписване + + + Size of the file + Размер на файла + + + Warning size parameter + Параметър за размера на предупреждението + + + Failed to read gzipped file + Грешка при четене на gzipped файл + + + An error occured while parsing the format string + Появи се грешка при анализ на низа формат + + + Available memory + Налична памет + + + Size of the logs + Размер на трупите + + + An error occured while reading the gzipped file + Грешка при четене на gzipped файл + + + An error occured while reading the file + Грешка при четене на файла + + + Something failed while handling the file + Нещо се е провалило при обработката на файла + + + An error occured while working on the database + Грешка при работа в базата данни + + + Aborting + Прекъсване + + + Invalid locale + Неправилно местоположение + + + Unexpected locale format + Неочакван локален формат + + + If you haven't manually edited the configuration file, +please report this issue + Ако не сте редактирали ръчно конфигурационния файл, +Моля, докладвайте за това + + + The given locale is not an accepted language + Даденото място не е приет език + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Ако искате да имате това място в LogDoctor, +Моля, следвайте инструкциите на страницата в хранилището + + + Configuration file not found + Файлът не е намерен + + + Unable to retrieve the configuration file + Грешка при извличане на конфигурационния файл + + + Skipping + Пропускане + + + An error occured while handling the configuration file + Грешка при работа с конфигурационния файл + + + Failed to write the configuration file + Грешка при запис на конфигурационния файл + + + Current configuration not saved + Текущата конфигурация не е записана + + + File not readable + Файлът не може да бъде прочетен + + + The file is not readable + Файлът не може да бъде прочетен + + + File not writable + Файлът не се записва + + + The file is not writable + Файлът не е написан + + + Directory not writable + Директория не се записва + + + The directory is not writable + Директорията не се пише + + + Invalid path + Невалиден път + + + Failed applying configuration + Грешка при прилагане на конфигурацията + + + Invalid configuration lines + Невалидни конфигурационни линии + + + Has not been possible to apply some of the configurations + Не е възможно да се приложат някои от конфигурациите + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Ако решите да продължите, всички незаявени конфигурации ще бъдат загубени +Да продължа? + + + Failed to retrieve the help file + Грешка при извличане на файла за помощ + + + An error occured while getting the help file + Грешка при получаване на файла за помощ + + + Additional resources can be downloaded from the git repo + Допълнителни ресурси могат да бъдат изтеглени от Git репо + + + Unable to retrieve the file + Грешка при извличане на файла + + + Invalid string + Невалиден низ + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Този низ е невалиден и не може да бъде добавен в списъка + +Моля, поправете го и опитайте отново + + + QSql driver not found + QSql драйвер не е намерен + + + Failed to retrieve the driver needed to handle the database + Грешка при извличане на драйвера, необходим за обработка на базата данни + + + File not found + Файлът не е намерен + + + Failed to retrieve the database file + Грешка при извличане на файла с базата данни + + + Create a new database? + Създаване на нова база данни? + + + The database contains an unexpected table + Базата данни съдържа неочаквана таблица + + + Unexpected table + Неочаквана таблица + + + It seems that the database is missing a table + Изглежда, че в базата данни липсва маса + + + Table not found + Таблицата не е намерена + + + The database contains an unexpected column + Базата данни съдържа неочаквана колона + + + Unexpected column + Неочаквана колона + + + It seems that the table is missing a column + Изглежда, че на масата липсва колона + + + Column not found + Колоната не е намерена + + + A column has an unexpected data-type + Колоната има неочакван тип данни + + + Unexpected data-type + Неочакван тип данни + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Тази база данни ще бъде преименувана с проследяващо копие и ще бъде създадена нова. +Да продължа? + + + Database created + Създаване на база данни + + + Successfully created a new database + Успешно създаване на нова база данни + + + Not a file + Не е файл + + + The path was supposed to point to a file, but it doesn't + Пътят трябваше да сочи към файл, но не е + + + Please remove the conflict and retry + Моля, премахнете конфликта и опитайте отново + + + The database file is not readable + Файлът с базата данни не може да бъде прочетен + + + Please set the proper permissions and retry +If this error persists, please report this issue + Моля, задайте подходящите права и опитайте отново +Ако тази грешка продължава, моля, докладвайте този въпрос + + + The database file is not writable + Файлът с базата данни не е написан + + + Invalid database path + Невалиден път към базата данни + + + Failed creating database + Грешка при създаване на база данни + + + An error occured while creating the database + Грешка при създаване на базата данни + + + Failed opening database + Грешка при отваряне на базата данни + + + An error occured while opening the database + Грешка при отваряне на базата данни + + + Failed executing on database + Грешка при изпълнение на базата данни + + + An error occured while executing a statement on the database + Грешка при изпълнение на изявление в базата данни + + + Failed to backup database + Грешка при архивиране на базата данни + + + Please report this issue + Моля, докладвайте този въпрос + + + Invalid log format string + Невалиден низ формат на дневника + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Моля, проверете дали няма грешка, хвърлена от вашия WebServer +Ако го приемат, моля проверете наличието на печатна грешка тук. +Ако всичко е наред, моля, докладвайте за това + + + Log format error + Грешка във формат на дневника + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Форматът на дневника не е зададен или невалиден +Моля, добавете валиден в конфигурацията + + + Misconfigured log format + Name + + + No log field has been set in the current logs format, +making it useless to parse logs + Не е зададено логово поле в текущия формат на трупите, +Безполезно е да събираш трупи + + + Please set up a format which contains at least one field + Моля, настройте формат, който съдържа поне едно поле + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Липсва разделител между едно или повече полета, +което затруднява установяването на нетни граници, +и вероятно води до съхранение на неправилни данни + + + Please set up a format which contains separators between fields + Моля, настройте формат, който съдържа разделители между полетата + + + Missing field in log format + Липсващо поле в лог формат + + + An important field is missing from the provided format: + От предоставения формат липсва важно поле: + + + The quality of the statistics may be seriously compromized + Качеството на статистиката може да бъде сериозно компромизирано + + + Proceed anyway? + Да продължим? + + + 'Carriage Return' in log format + "Завръщане на брака" в лог формат + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Предоставеният формат съдържа "Завръщане на брака." +Това може да доведе до загуба на данни или сривове, ако не се използва с повишено внимание + + + An error occured while parsing logs + Грешка при анализ на трупите + + + Failed defining type + Грешка при определяне на типа + + + Failed to determine the log type + Грешка при определяне на типа дневник + + + File already used + Файлът вече е използван + + + The file has probably been used already + Файлът вероятно вече е използван + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Игнорирай предупреждението и го използвай, изхвърли го и продължи или прекрати целия процес? + + + Duplicate file + Дублиране на файл + + + The file appears twice in the list of selections + Файлът се появява два пъти в списъка със селекции + + + Failed updating hashes + Грешка при актуализиране на hashes + + + An error occured while inserting the parsed files hashes into the database + Възникна грешка при вмъкване на съхранените файлове в базата данни + + + File exceeds warning size + Файлът превишава размера на предупреждението + + + The file's size exceeds the warning size + Размерът на файла превишава размера на предупреждението + + + Not enough memory + Няма достатъчно памет + + + The total size of the selected files exceeds the available memory + Общият размер на избраните файлове надвишава наличната памет + + + Please free some resources, parse the files in different steps or split them into smaller units + Моля, освободете някои ресурси, анализирайте файловете на различни стъпки или ги разделете на по-малки единици + + + Failed reading + Неуспешно четене + + + File is empty + Файлът е празен + + + The file is blank + Файлът е празен + + + Failed to retrieve the selected file + Грешка при извличане на избрания файл + + + Discard it and continue, or Abort all and exit? + Изхвърлете го и продължете или спрете всичко и напуснете? + + + No file to parse + Няма файл за анализ + + + The list of files to parse is empty + Списъкът с файловете за анализ е празен + + + Directory not found + Директория не е намерена + + + The directory does not exists + Директорията не съществува + + + Directory not readable + Директория не може да се чете + + + The directory is not readable + Директорията не може да бъде прочетена + + + Please set the proper permissions before to start + Моля, задайте подходящите разрешения преди да започнете + + + Failed creating directory + Грешка при създаване на директория + + + The path does not exists + Пътят не съществува + + + Data conversion failed + Неуспешно преобразуване на данните + + + Failed to convert from '%1' to '%2' + Грешка при конвертиране от '%1' в '%2' + + + Failed to create statistics + Грешка при създаване на статистика + + + An error occured while processing + Възникна грешка при обработката + + + Cannot create statistics + Грешка при създаване на статистика + + + No data has been found that matches with the currently set parameters + Не са открити данни, които да съвпадат с настоящите зададени параметри + + + Not a folder + Не е папка + + + The path was supposed to point to a folder, but it doesn't + Пътят трябваше да сочи към папка, но не е + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Входът ще бъде преименуван с ".copy" и ще бъде създаден нов. +Да продължа? + + + An error occured + Възникна грешка + + + Failed renaming + Грешка при преименуване + + + An error occured while renaming + Грешка при преименуване + + + + GameDialog + + Ok + Добре + + + + MainWindow + + Parse logs from the Apache2 web server + Преглед на записите от уеб сървъра Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Анализ на трупи от уеб сървъра Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Преглед на трупи от уеб сървъра на Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Изберете / изберете всички файлове + + + All + Всички + + + Inspect a log file + Преглед на лог файл + + + Name + Име + + + Size + Размер + + + Refresh the list + Обновяване на списъка + + + Total size of the parsed data + Общ размер на събраните данни + + + Total number of parsed lines + Общ брой на обработените линии + + + Start parsing the selected files + Започнете да анализирате избраните файлове + + + START + Начало + + + Time elapsed since the start + Изминало време от началото + + + Average speed, in parsed data size per second + Средна скорост, в парсирани данни за секунда + + + Web Server + Уеб сървър + + + Select a Web Server + Избор на уеб сървър + + + Year + Година + + + Month + Месец + + + Day + Ден + + + Hour + Час + + + Draw the chart + Показване на диаграмата + + + Log line marked as Warning + Линия на дневника, маркирана като предупреждение + + + Date when the request arrived (YYYY-MM-DD) + Дата на получаване на искането (ГГГГ-ММ-ДД) + + + Time when the request arrived (hh:mm:ss) + Време, когато искането пристигна (hh:mm:ss) + + + Protocol of the request + Протокол от искането + + + Method of the request + Метод на искането + + + URI of the requested page + URI на поисканата страница + + + Query carried along with the URI + Запитване, проведено заедно с URI + + + Response code from the server + Код за отговор от сървъра + + + User-agent of the client which made the request + Потребител-агент на клиента, отправил искането + + + IP address of the Client which made the request + IP адрес на Клиента, отправил искането + + + Cookie used for the request + Бисквитка, използвана за искането + + + The URL which redirected the Client to the requested page + Адресът, който пренасочи Клиента към търсената страница + + + Size ib Bytes of the request, usually includes header and data + Размер иб байтове на искането, обикновено включва заглавна част и данни + + + Size in Bytes of the served content, usually includes header and data + Размер в байтове на обслужваното съдържание, обикновено включва заглавна част и данни + + + Time taken by the server to serve the content, in milliseconds + Времето, необходимо на сървъра, за да служи на съдържанието, в милисекунди + + + Only use lines in which the field is starting with this string + Използвайте само линии, в които полето започва с този низ + + + Protocol: + Протокол: + + + Method: + Метод: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Използвайте само линии, в които полето съвпада с това твърдение. +Използвайте '!', '=', '<' или >', за да декларирате какво да използвате + + + Response: + Отговор: + + + Query: + Въпрос: + + + URI: + URI: + + + Filters + Филтри + + + Count + Брой + + + Number of occurrences + Брой събития + + + Item + Позиция + + + Value of the field + Стойност на полето + + + From: + От: + + + To: + До: + + + Select a log field to view + Изберете логово поле за преглед + + + Field: + Поле: + + + Filter: + Филтър: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + С низове ще бъдат използвани само линиите, в които полето започва с този низ. +С номера, използвайте "!," "=," "<" или ">," за да декларирате какво да използвате + + + Protocol + Протокол + + + Method + Метод + + + URI + URI + + + User-agent + Потребителски агент + + + Most recurrent + Най-често + + + Most trafficked + Повечето трафикирани + + + Date ever + Среща някога + + + Day of the week + Ден от седмицата + + + Hour of the day + Час на деня + + + Time taken + Отнемане на време + + + Bytes sent + Байтове изпратени + + + Bytes received + Получени байтове + + + Mean/Max performances + Средно/максово представяне + + + Requests received + Получени искания + + + Total work + Обща работа + + + General + Общи положения + + + Window + Прозорец + + + Dialogs + Диалози + + + Charts + Графики + + + Appearance + Външен вид + + + Speed + Скорост + + + Relational + Относително + + + TextBrowser + Comment + + + Databases + База данни + + + Security + Сигурност + + + Logs + Дневници + + + Defaults + По подразбиране + + + Control + Контрол + + + Path + Път + + + Format + Формат + + + Warnlists + Предупреждения + + + Blacklists + Черни списъци + + + Remember the window's position and size + Запомнете позицията и размера на прозореца + + + Remember position and size + Запомни позицията и размера + + + Remember window's position and size + Запомнете позицията и размера на прозореца + + + Geometry + Геометрия + + + Theme to use for the window + Тема за използване за прозореца + + + Theme + Тема + + + Native + Местно + + + Light + Светлина + + + Dark + Тъмно + + + Auto + Авто + + + Icons + Икони + + + Normal quantity of dialog messages shown + Нормално количество показани диалогови съобщения + + + Normal + Нормално + + + Dialogs from the main processes + Диалози от основните процеси + + + Dialogs emitted when parsing logs + Диалози, излъчвани при анализ на трупи + + + Logs parser + Дневници parser + + + Dialogs emitted when viewing statistics + Диалози, излъчвани при разглеждане на статистиката + + + Statistics viewer + Преглед на статистиката + + + Define the quantity of dialog mesages shown + Определяне на количеството на показаните диалогови съобщения + + + Dialogs level + Ниво на диалозите + + + Reduced quantity of dialog messages shown + Намалено количество показани диалогови съобщения + + + Essential + Съществено + + + Augmented quantity of dialog messages shown + Надхвърлено количество показани диалогови съобщения + + + Explanatory + Указание + + + Theme to use for the Charts + Тема за използване на картите + + + Preview + Преглед + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Представлява стъпка във времевата ос за секунди. +Всички стойности, попадащи в един и същ интервал, ще бъдат слети и ще се използва средната стойност. + + + Time interval + Времеви интервал + + + The format to use for the labels of the time axis. + Формат за използване на етикетите на оста на времето. + + + Time format + Формат на времето + + + The size of the pie + Размерът на пая + + + Pie size + Размер на пай + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Максималният брой парчета, от които ще се състои паят. +Превишените парчета ще бъдат групирани в едно цялостно парче. + + + Maximum slices + Максимални парчета + + + Font to use for the Text Browser + Шрифт за използване за текстов браузър + + + Font + Шрифт + + + Double-spaced lines + Двупространствени линии + + + Use wide lines + Използване на широки линии + + + Define the spacing between lines + Определяне на разстоянието между линиите + + + Lines spacing + Разстояние между линиите + + + None + Няма + + + Color scheme to use for the Text Browser + Цветова схема за използване на текстов четец + + + Color scheme + Цветова схема + + + The appearance of the Text Browser with the current settings + Появата на текстов браузър с текущите настройки + + + Insert the base path only, file name excluded + Вмъкване само на основния път, изключено име на файла + + + The given path doen't exists, or doesn't point to a folder + Даден път не съществува или не сочи папка + + + Path for the database files + Път за файловете в базата данни + + + Paths + Пътища + + + Apply the current path + Прилагане на текущия път + + + Select the path through a dialog window + Избор на път през прозорец + + + Path where the logs data collection database is located + Път, където се намира базата данни за събиране на данни от трупи + + + Logs data + Данни за дневника + + + Path where the used files hashes database is located + Път, където се намира базата данни на използваните файлове + + + Used files + Използвани файлове + + + Backup options for the Logs Data database + Опции за архивиране на базата данни Logs Data + + + Backups + Подкрепления + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Ново резервно копие се прави при затваряне на LogDoctor след успешно редактиране на базата данни + + + Backup the Logs Data database and keep + Подсигуряване на базата данни на дневника + + + Whether it is allowed or denied to follow symlinks occuring in a path + Дали е позволено или отказано да се следват симвръзки, които се случват по пътя + + + Follow symlinks + Следвайте симвръзките + + + Default WebServer + WebServer по подразбиране + + + Usage control + Контрол на употребата + + + Hide already used files + Скриване на вече използваните файлове + + + Size warnings + Предупреждения за размер + + + Warn me when using files with a size exceeding: + Предупреди ме, когато използваш файлове с размер над: + + + Logs folder + Директория за дневника + + + Logs format string + Name + + + Format string + Форматиране на низ + + + Insert the format string you're using + Вмъкване на низа формат, който използвате + + + Apply the current string + Прилагане на текущия низ + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Генериране на линия за вземане на проби от записания в момента низ, за да се провери дали е форматиран правилно. +Всяко поле, което не се разглежда от LogDoctor ще се появи като 'DISCARDED' + + + Generate sample + Генериране на извадка + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Моля, проверете точността на тази линия. +Полета, маркирани като 'DISCARDED' са обработени правилно, но не се разглеждат от LogDoctor + + + Open an help window + Отваряне на прозорец за помощ + + + Help + Помощ + + + Select a log field + Избор на логово поле + + + Use warnlist for this field + Използване на предупредителен списък за това поле + + + Add the current line to the list + Добавяне на текущия ред към списъка + + + Remove the selected item from the list + Премахване на избрания елемент от списъка + + + Move the selected item down + Преместване на избрания елемент надолу + + + Use blacklist for this field + Използване на черния списък за това поле + + + Add line + Добавяне на линия + + + Remove selection + Премахване на избора + + + Language + Език + + + Utilities + Инструменти + + + Tools + Инструменти + + + Games + Игри + + + Perform a version-check + Извършване на проверка на версията + + + Show some info about LogDoctor + Показване на информация за LogDoctor + + + Open a block-note like window to write temporary text + Отваряне на бележка като прозорец за запис на временен текст + + + Play CrissCross + Играйте CrissCross + + + Play Snake + Играй Змия + + + Show the changelog + Показване на changelog + + + warnlist + предупредителен списък + + + blacklist + черен списък + + + copy + Копиране + + + copies + копия + + + Check updates + Проверка на актуализациите + + + Infos + Информация + + + BlockNote + Блокиране + + + CrissCross + CrissCross + + + Snake + Змия + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Изберете файл от списъка + + + to inspect its content + да проверява съдържанието му + + + Failed to read + Грешка при четене + + + + SnakeGame + + PLAY + Играй + + + Classic + Класика + + + Hunt + Лов + + + Battle + Битка + + + Game Over + Край на играта + + + Your adversary fell in the water! + Твоят противник падна във водата! + + + YOU WON! + Уон! + + + You fell in the water! + Падна във водата! + + + YOU LOST! + Ти загуби! + + + Your adversary ate itself! + Твоят противник се е изял сам! + + + You ate yourself! + Изяде се! + + + Your adversary ate you! + Противникът ти те изяде! + + + You ate your adversary! + Изяде противника си! + + + You ate each other! + Изяли сте се! + + + MATCH IS DRAW! + Матч е драскач! + + + + TR + + Unexpected WebServer + Неочакван уеб сървър + + + Logs Size Breakdown + Logs размер разбивка + + + Ignored + Игнориран + + + Parsed + Обработен + + + Blacklisted + Черен списък + + + Others + Други + + + from + от + + + to + до + + + Log Lines Marked as Warning + Линии на логове маркирани като предупреждение + + + Time Taken to Serve Requests + Отнема време, за да се изпълнят изискванията + + + Time of Day Count + Час на преброяването + + + Relational Count + Относителен брой + + + FALSE + Невярно + + + TRUE + ИСТИНА + + + Date + Дата + + + Year + Година + + + Month + Месец + + + Day + Ден + + + Time + Време + + + Hour + Час + + + Minute + Минутка + + + Second + Второ + + + Warning + Предупреждение + + + Protocol + Протокол + + + Method + Метод + + + URI + URI + + + Query + Запитване + + + Response code + Код на отговора + + + Time taken + Отнемане на време + + + Bytes sent + Байтове изпратени + + + Bytes received + Получени байтове + + + Referrer + Разписка + + + Cookie + Бисквитка + + + Client + Клиент + + + User-agent + Потребителски агент + + + January + Януари + + + February + Февруари + + + March + Март + + + April + Април + + + May + Май + + + June + Юни + + + July + Юли + + + August + Август + + + September + септември + + + October + Октомври + + + November + Ноември + + + December + декември + + + Sunday + Неделя + + + Monday + Понеделник + + + Tuesday + Вторник + + + Wednesday + Сряда + + + Thursday + Четвъртък + + + Friday + Петък + + + Saturday + Събота + + + diff --git a/logdoctor/translations/LogDoctor_bn_BN.ts b/logdoctor/translations/LogDoctor_bn_BN.ts new file mode 100644 index 0000000..461d689 --- /dev/null +++ b/logdoctor/translations/LogDoctor_bn_BN.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + সংস্করণ + + + Version 4 + সংস্করণ ৪ + + + Version 3 + ভার্সান ৩ + + + Version 2 + ভার্সান ২ + + + Version 1 + ভার্সান ১ + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + স্ক্রিপ্ট নির্মাণ করুন + + + Cross-platform compatibility: + ক্রস-প্লাটফর্ম পাইলট: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + পরিসংখ্যান: + + + Warnings + সতর্কবার্তা + + + Speed + গতি + + + Counts + সংখ্যা + + + Daytime + দিন + + + Relational + সম্বন্ধযুক্ত + + + Globals + গ্রোবাল + + + Translations: + অনুবাদ: + + + Italian + ইতালীয়Name + + + Spanish + স্প্যানিশ + + + French + ফরাসি + + + Tools: + সরঞ্জাম: + + + Block note + নোট বন্ধ করুন + + + Utilities: + বিবিধ সামগ্রী: + + + Infos viewer + তথ্য প্রদর্শক + + + Updates checker + আপডেট পরীক্ষণ + + + Themes: + থিম: + + + Dark + কালো + + + Light + সাদা + + + Improvements and fixes + উন্নতি এবং উন্নতি + + + New themes: + নতুন থিম: + + + Ash + আশতাবুলা + + + Candy + ক্যান্ডি + + + Forest + ফরেস্ট + + + Powder + পাউডার + + + Restyled GUI + পুনঃসেটের GUI + + + Restyled dialogs + পুনঃসেট সংক্রান্ত ডায়লগ + + + Doxygen documentation + Dxygen নথিপত্রের জন্য + + + Mini-Games: + Minue- ব্লক খেলা: + + + Criss-cross + রিস-পোর্ট + + + Snake + সাপ + + + Changed default paths + ডিফল্ট পাথ + + + New game modes for Snake + সাপের জন্য নতুন খেলা + + + Hunt + হান্ট + + + Battle + যুদ্ধ + + + New translations: + নতুন অনুবাদ: + + + Japanese + জাপানি + + + Portuguese + পর্তুগীজName + + + Code improvements + কোড উন্নতি + + + Performance improvements + উন্নতির উন্নতি + + + Added tests suite: + পরীক্ষা স্যুইট যোগ করা হয়েছে: + + + white box tests + সাদা বক্স পরীক্ষা + + + Customized charts themes + স্বনির্ধারিত চার্ট থিম + + + Fixes + গণনা করো + + + Tests improvements + পরীক্ষা সংক্রান্ত উন্নতি + + + Docker support + ডকার সহায়তা + + + Upgrade to C++20 + C++20 এ আপগ্রেড করুন + + + Upgrade to Qt6 + Qt6 থেকে উন্নীত করুন + + + Restyled themes + স্টাইলের থিম + + + Redesigned configs section + পুনরায় স্বাক্ষরিত কনফিগের বিভাগ + + + Stability improvements + স্থায়ী উন্নতি + + + Generating warnings dinamically + সাবধানবাণীমূলক + + + New tool: + নতুন টুল: + + + Changelog + লেবেল পরিবর্তন করো + + + Tweakable parameters for some of the charts: + কিছু চার্টের জন্য দুর্বল পরামিতি: + + + Improved project structure + উন্নত প্রজেক্ট কাঠামো + + + Modernized Cmake usage + আধুনিক CA-র ব্যবহার + + + + Crapinfo + + Version + সংস্করণ + + + Currently installed version of the software + বর্তমানে সফ্টওয়্যারের সংস্করণ ইনস্টল করা হয়েছে + + + Repository links + সংগ্রহস্থলের লিঙ্ক + + + Paths + পাথ + + + The path of the executable file + এক্সিকিউটেবল ফাইলের পাথ + + + Executable + এক্সেকিউটেবল + + + The path where the configuration file gets saved and searched in + কনফিগারেশন ফাইল সংরক্ষণের উদ্দেশ্যে চিহ্নিত পাথ ও অনুসন্ধানের পাথ + + + Configuration file + কনফিগারেশন ফাইল + + + The path where the application searches for extra resources + অ্যাপ্লিকেশন অনুসন্ধানযোগ্য কাজের পাথ + + + Application data + অ্যাপ্লিকেশনের তথ্য + + + + Crapnote + + Reduce the font size + ফন্টের মাপ হ্রাস করা হবে + + + Font size + ফন্টের মাপ + + + Increase the font size + ফন্টের মাপ বৃদ্ধি করুন + + + + Crappath + + Choose + নির্বাচন করুন + + + Cancel + বাতিল + + + + Crapup + + Checking for updates + আপডেটের উপস্থিতি পরীক্ষণ + + + New version available + নতুন সংস্করণ উপলব্ধ রয়েছে + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + নতুন সংস্করণ উপলব্ধ রয়েছে! +দয়া করে লগDoc-এর জি- আই- ডি রিপোজিটরিতে প্রবেশ করুন এবং কিভাবে আপডেট করা যায় সে বিষয়ে নির্দেশনা অনুসরণ করুন + + + No update found + আপডেট পাওয়া যায়নি + + + LogDoctor is up-to-date + LogDoc'এ লগ-আউট + + + :/ + / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + তুমি ভবিষ্যতের কোনো সংস্করণ চালাচ্ছে! +আপনার সংস্করণ এর বর্তমান ক্র্যাশ সংস্করণ এর বাইরে +আপনি কি মূল LogDoc'র চলছে? +অনুগ্রহ করে লগDoc'র রিপোজিটরের রিপোজিটরের রিপোজিটর করুন এবং এর একটি নতুন সংস্করণ পান + + + Failed to establish a connection + সংযোগ স্থাপন করতে ব্যর্থ + + + Connection error, please try again later + সংযোগ সংক্রান্ত ত্রুটি, অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন + + + Connection timed out + সংযোগের সময়সীমা উত্তীর্ণ হয়েছে + + + Version check failed + সংস্করণ বিফল + + + An error occured while parsing: +version mark not found + পার্স করার সময় একটি ত্রুটি দেখা দিয়েছে: +সংস্করণ পাওয়া যায়নি + + + An error occured while parsing: +malformed version + পার্স করার সময় একটি ত্রুটি দেখা দিয়েছে: +ত্রুটিপূর্ণ সংস্করণ + + + An error occured while comparing: +malformed upstream version + সুসংগত করার সময় একটি ত্রুটি দেখা দিয়েছে: +ত্রুটিপূর্ণ স্ট্রিম সংস্করণ + + + + CrissCross + + Victory + বিজয়ী + + + You beated me! + তুমি আমাকে ধোঁকা দিয়েছ! + + + This time you lost! + এবার তুমি হেরে গেছো! + + + Draw + অঙ্কন + + + Nice match + মিল পাওয়া গেছেComment + + + + DialogBool + + Yes + হ্যাঁ + + + No + না + + + + DialogIda + + Ignore + উপেক্ষা করা হবে + + + Discard + বাতিল + + + Abort + থামাও + + + + DialogMsg + + Ok + ঠিক আছে + + + + DialogSec + + One of the lists has an invalid item + একটি তালিকার মধ্যে অবৈধ সামগ্রীর তালিকা উপস্থিত রয়েছে + + + An error occured while reading the configuration file + কনফিগারেশন ফাইল পড়তে সমস্যা হয়েছে + + + An error occured while parsing configuration file's data + কনফিগারেশন ফাইলের তথ্য পার্স করতে সমস্যা হয়েছে + + + Failed to create the configuration file's directory + কনফিগারেশন ফাইল নির্মাণ করতে ব্যর্থ + + + Failed to create the configuration file + কনফিগারেশন ফাইল নির্মাণ করতে ব্যর্থ + + + An error occured while writing the configuration file + কনফিগারেশন ফাইলে লিখতে সমস্যা হয়েছে + + + An error occured while preparing the configuration file's data + কনফিগারেশন ফাইল প্রস্তুত করার সময় একটি ত্রুটি দেখা দিয়েছে + + + The path contains a symlink + পাথের মধ্যে একটি সিম-লিংক উপস্থিত রয়েছে + + + The file does not exist + ফাইল বর্তমানে উপস্থিত নেই + + + Failed to create the database backups' directory + ব্যাক-আপ ডিরেক্টরি নির্মাণ করতে ব্যর্থ + + + Failed to copy the database file + ডাটাবেস ফাইল কপি করতে ব্যর্থ + + + Failed to update the backups + ব্যাক-আপ আপডেট করতে ব্যর্থ + + + Failed to create the directory + ডিরেক্টরি নির্মাণ করতে ব্যর্থ + + + Unrecognized entry + অকার্যকর এনট্রি + + + Size of the file + ফাইলের মাপ + + + Warning size parameter + সতর্কবার্তার মাপ + + + Failed to read gzipped file + gzip ফাইল পড়তে ব্যর্থ + + + An error occured while parsing the format string + বিন্যাসের পংক্তি পার্স করতে সমস্যা + + + Available memory + উপলব্ধ মেমরি + + + Size of the logs + লগ প্রদর্শনের মাপ + + + An error occured while reading the gzipped file + gzip দ্বারা ফাইল পড়ার সময় একটি ত্রুটি দেখা দিয়েছে + + + An error occured while reading the file + ফাইল পড়তে সমস্যা + + + Something failed while handling the file + ফাইল পরিচালনা করতে ব্যর্থ + + + An error occured while working on the database + ডেটাবেসে কাজ করার সময় একটি ত্রুটি ঘটেছে + + + Aborting + বাতিল করা হচ্ছে + + + Invalid locale + অকার্যকর লোকেইল + + + Unexpected locale format + স্ট্রিমের অপ্রত্যাশিত বিন্যাস + + + If you haven't manually edited the configuration file, +please report this issue + যদি আপনি এই কনফিগারেশন ফাইল না করেন, +অনুগ্রহ করে এই বিষয় সম্পর্কে প্রতিবেদন করুন + + + The given locale is not an accepted language + প্রদত্ত লোকেইল কোনো গ্রহণ করা হয়নি + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + যদি আপনি এই লোকেইলের মাধ্যমে লগ-ইন করতে চান, +দয়া করে রিপোজিটরি পাতায় নির্দেশনা অনুসরণ করুন + + + Configuration file not found + কনফিগারেশন ফাইল পাওয়া যায়নি + + + Unable to retrieve the configuration file + কনফিগারেশন ফাইল পুনরুদ্ধার করতে ব্যর্থ + + + Skipping + বন্ধ করা হচ্ছে + + + An error occured while handling the configuration file + কনফিগারেশন ফাইল ব্যবস্থাপনার সময় একটি ত্রুটি ঘটেছে + + + Failed to write the configuration file + কনফিগারেশন ফাইল লিখতে ব্যর্থ + + + Current configuration not saved + বর্তমান কনফিগারেশন সংরক্ষণ করা হয়নি + + + File not readable + ফাইল পাঠযোগ্য নয় + + + The file is not readable + ফাইলটি পাঠযোগ্য নয় + + + File not writable + ফাইলটি অপরিবর্তনীয় + + + The file is not writable + ফাইলটি অপরিবর্তনীয় + + + Directory not writable + ডিরেক্টরিটি অপরিবর্তনীয় + + + The directory is not writable + ডিরেক্টরিটি অপরিবর্তনীয় + + + Invalid path + অবৈধ পাথ + + + Failed applying configuration + কনফিগারেশন প্রয়োগ করতে ব্যর্থ + + + Invalid configuration lines + অবৈধ কনফিগারেশন পংক্তি + + + Has not been possible to apply some of the configurations + কনফিগারেশনের কিছু বৈশিষ্ট্য প্রয়োগ করা সম্ভব হয়নি + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + এগিয়ে গেলে, সকল স্বনির্ধারিত কনফিগারেশন মুছে ফেলা হবে +এগিয়ে চলুন? + + + Failed to retrieve the help file + সাহায্যের ফাইল পুনরুদ্ধার করতে ব্যর্থ + + + An error occured while getting the help file + সহায়ক ফাইল প্রাপ্ত করতে সমস্যা + + + Additional resources can be downloaded from the git repo + জি- এইচ- টি- পি থেকে অতিরিক্ত রিসোর্স ডাউনলোড করা যাবে + + + Unable to retrieve the file + ফাইল উদ্ধার করতে ব্যর্থ + + + Invalid string + অকার্যকর স্ট্রিং + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + প্রদত্ত স্ট্রিংটি অবৈধ এবং তালিকা হতে পারছে না + +অনুগ্রহ করে এটি সংশোধন করে পুনরায় প্রচেষ্টা করুন + + + QSql driver not found + QSql ড্রাইভার পাওয়া যায়নি + + + Failed to retrieve the driver needed to handle the database + ডাটাবেস পরিচালনার জন্য ড্রাইভারের প্রয়োজনীয় তথ্য প্রাপ্ত করতে ব্যর্থ + + + File not found + ফাইল পাওয়া যায়নি + + + Failed to retrieve the database file + ডাটাবেস ফাইল পুনরুদ্ধার করতে ব্যর্থ + + + Create a new database? + একটি নতুন ডাটাবেস তৈরি করা হবে? + + + The database contains an unexpected table + ডাটাবেসের মধ্যে অপ্রত্যাশিত টেবিল উপস্থিত রয়েছে + + + Unexpected table + অপ্রত্যাশিত টেবিল + + + It seems that the database is missing a table + সম্ভবত ডাটাবেসের টেবিল অনুপস্থিত + + + Table not found + টেবিল পাওয়া যায়নি + + + The database contains an unexpected column + ডাটাবেসের মধ্যে অপ্রত্যাশিত কলাম উপস্থিত রয়েছে + + + Unexpected column + অপ্রত্যাশিত কলাম + + + It seems that the table is missing a column + টেবিলের কলামের শিরোনাম পরিবর্তন সম্ভবত বৈধ নয় + + + Column not found + কলাম পাওয়া যায়নি + + + A column has an unexpected data-type + একটি কলামের মধ্যে কোনো অপ্রত্যাশিত তথ্য উপস্থিত রয়েছে + + + Unexpected data-type + অপ্রত্যাশিত তথ্য + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + এই ডাটাবেসের মধ্যে উপস্থিত 'বাতিল' বিকল্পটি পুনরায় লেখা হবে। +এগিয়ে চলুন? + + + Database created + ডাটাবেস নির্মিত হয়েছে + + + Successfully created a new database + সাফল্যের সাথে নতুন ডাটাবেস নির্মাণ করা হয়েছে + + + Not a file + এটি ফাইল নয় + + + The path was supposed to point to a file, but it doesn't + পাথ একটি ফাইল নির্দেশ করতে হবে, কিন্তু তা নয় + + + Please remove the conflict and retry + অনুগ্রহ করে দ্বন্দ্ব বের করে পুনরায় প্রচেষ্টা করুন + + + The database file is not readable + ফাইলটি পাঠযোগ্য নয় + + + Please set the proper permissions and retry +If this error persists, please report this issue + অনুগ্রহ করে সঠিক অনুমতি নির্ধারণ করুন +যদি এতে সমস্যা হয়, অনুগ্রহ করে এই সমস্যার প্রতিবেদন দিন + + + The database file is not writable + ফাইলটি অপরিবর্তনীয় + + + Invalid database path + অবৈধ ডাটাবেস পাথ + + + Failed creating database + ডাটাবেস নির্মাণ করতে ব্যর্থ + + + An error occured while creating the database + ডাটাবেস নির্মাণকালে একটি ত্রুটি দেখা দিয়েছে + + + Failed opening database + ডাটাবেস খুলতে ব্যর্থ + + + An error occured while opening the database + ডাটাবেস খোলার সময় সমস্যা দেখা দিয়েছে + + + Failed executing on database + ডাটাবেসের মধ্যে সঞ্চালন করতে ব্যর্থ + + + An error occured while executing a statement on the database + ডেটাবেসে একটি বিবৃতি সঞ্চালনের সময় সমস্যা হয়েছে + + + Failed to backup database + ডাটাবেস নির্মাণ করতে ব্যর্থ + + + Please report this issue + অনুগ্রহ করে এই বিষয় সম্পর্কে প্রতিবেদন করুন + + + Invalid log format string + লগের বিন্যাস বৈধ নয় + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + অনুগ্রহ করে পরীক্ষা করুন আপনার ওয়েব সার্ভার দ্বারা কোনো ত্রুটি উৎপন্ন হয়নি +যদি এটা গ্রহন করা হয়, দয়া করে এখানে একটি ভিপোর উপস্থিতি পরীক্ষা করুন +যদি সবকিছু ঠিক থাকে, দয়া করে এই ব্যাপারটা রিপোর্ট করুন + + + Log format error + লগের সমস্যা + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + লগের বিন্যাস বৈধ নয় অথবা বৈধ নয় +কনফিগারেশনের মধ্যে একটি বৈধ কনফিগারেশন যোগ করুন + + + Misconfigured log format + লগ- ইন নাম পরিবর্তন করা হয়েছে + + + No log field has been set in the current logs format, +making it useless to parse logs + বর্তমান লগের বিন্যাসের মধ্যে কোনো লগ-ইন করা হয়নি +লগ-আউট করতে এটি অর্থহীন + + + Please set up a format which contains at least one field + অনুগ্রহ করে একটি বুলিয়ান বিন্যাস নির্ধারণ করুন + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + এক অথবা একাধিক ক্ষেত্রের মধ্যে বিভাজক অনুপস্থিত +জোর খাটানো কঠিন, +সঠিক তথ্য সংরক্ষণের উদ্দেশ্যে সম্ভবত ক্ষতিগ্রস্ত + + + Please set up a format which contains separators between fields + অনুগ্রহ করে প্রস্তুত করার ক্ষেত্রে প্রযোজ্য বিন্যাস নির্ধারণ করুন + + + Missing field in log format + লগের অনুপস্থিত + + + An important field is missing from the provided format: + প্রদত্ত বিন্যাস থেকে একটি গুরুত্বপূর্ণ ক্ষেত্র অনুপস্থিত: + + + The quality of the statistics may be seriously compromized + পরিসংখ্যানের গুণগত মান গুরুতরভাবে ক্ষতিকর হতে পারে + + + Proceed anyway? + এগিয়ে চলুন? + + + 'Carriage Return' in log format + 'rrayz' লগে প্রত্যাবর্তন করুন + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + প্রদত্ত বিন্যাসের মধ্যে 'Carreze' প্রত্যাবর্তন করা হয়েছে। +সতর্কতা ব্যবহার না করা হলে তথ্য ক্ষতিগ্রস্ত অথবা ক্ষতিগ্রস্ত হওয়ার সম্ভাবনা রয়েছে + + + An error occured while parsing logs + লগ-ইন করার সময় ত্রুটি দেখা দিয়েছে + + + Failed defining type + ধরন নির্মাণ করতে ব্যর্থ + + + Failed to determine the log type + লগ-ইন প্রক্রিয়া ব্যর্থ + + + File already used + ফাইল বর্তমানে ব্যবহৃত হচ্ছে + + + The file has probably been used already + এই ফাইলটি সম্ভবত ব্যবহৃত হয়েছে + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + সতর্কবার্তা উপেক্ষা করে এটি অগ্রাহ্য করা হবে ও ব্যবহার করুন, বর্জন করা হবে কি? + + + Duplicate file + ফাইলের প্রতিলিপি নির্মাণ করুন + + + The file appears twice in the list of selections + ফাইলের তালিকায় দুইবার ক্লিক করা হয়েছে + + + Failed updating hashes + আপডেট করতে ব্যর্থ + + + An error occured while inserting the parsed files hashes into the database + আর্কাইভে ফাইল সংযোজন করার সময় একটি ত্রুটি দেখা দিয়েছে + + + File exceeds warning size + ফাইল অনুযায়ী সর্বাধিক মাপ + + + The file's size exceeds the warning size + ফাইলের মাপ অনুযায়ী ধার্য সর্বোচ্চ মাপ + + + Not enough memory + মেমরি অবশিষ্ট নেই + + + The total size of the selected files exceeds the available memory + নির্বাচিত ফাইলগুলির মাপ অনুযায়ী প্রকৃত ফাইলের মাপ ধার্য করা হবে + + + Please free some resources, parse the files in different steps or split them into smaller units + অনুগ্রহ করে কিছু সম্পদ, কিছু ধাপ অনুসারে ফাইল পার্স করতে, অথবা ছোট ইউনিটে বিভক্ত করুন + + + Failed reading + পড়তে ব্যর্থ + + + File is empty + ফাইল ফাঁকা + + + The file is blank + ফাইলটি ফাঁকা + + + Failed to retrieve the selected file + নির্বাচিত ফাইল পুনরুদ্ধার করতে ব্যর্থ + + + Discard it and continue, or Abort all and exit? + ফেলে দিতে হবে, না বাতিল করে প্রস্থান করা হবে? + + + No file to parse + ফাইল পার্স করতে ব্যর্থ + + + The list of files to parse is empty + ফাঁকা ফাইলের তালিকা + + + Directory not found + ডিরেক্টরি পাওয়া যায়নি + + + The directory does not exists + ডিরেক্টরি বর্তমানে উপস্থিত নেই + + + Directory not readable + ডিরেক্টরি পাঠযোগ্য নয় + + + The directory is not readable + ডিরেক্টরি পাঠযোগ্য নয় + + + Please set the proper permissions before to start + আরম্ভ করার পূর্বে অনুগ্রহ করে সঠিক অনুমতি নির্ধারণ করুন + + + Failed creating directory + ডিরেক্টরি নির্মাণ করতে ব্যর্থ + + + The path does not exists + পাথ বর্তমানে উপস্থিত নেই + + + Data conversion failed + তথ্য রূপান্তর করতে ব্যর্থ + + + Failed to convert from '%1' to '%2' + '%1' থেকে '%2' রূপান্তর করা যায়নি + + + Failed to create statistics + পরিসংখ্যান প্রদর্শন করতে ব্যর্থ + + + An error occured while processing + প্রক্রিয়াকরণ কালে সমস্যা + + + Cannot create statistics + পরিসংখ্যান প্রদর্শন করা যাবে না + + + No data has been found that matches with the currently set parameters + চিহ্নিত পরামিতি সহ কোনো তথ্য পাওয়া যায়নি + + + Not a folder + ফোল্ডার নয় + + + The path was supposed to point to a folder, but it doesn't + পাথ একটি ফোল্ডার নির্দেশ করার কথা ছিল, কিন্তু তা নয় + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + এনট্রির নাম পরিবর্তিত হবে। নতুন 'কপি' ও 'নতুন একটি তৈরি করা হব। +এগিয়ে চলুন? + + + An error occured + একটি ত্রুটি দেখা দিয়েছে। + + + Failed renaming + নাম পরিবর্তন করতে ব্যর্থ + + + An error occured while renaming + একটি ত্রুটি দেখা দিয়েছে। + + + + GameDialog + + Ok + ঠিক আছে + + + + MainWindow + + Parse logs from the Apache2 web server + Pepic2 ওয়েব সার্ভার থেকে লগ বিচ্ছিন্ন করুন + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Nginx ওয়েব সার্ভার থেকে লগ-ইন করুন + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + MicrosoftIS ওয়েব থেকে লগ ইন করুন + + + IIS + IIS + + + Select/deselect all the files + সব ফাইল নির্বাচন করুন/নির্বাচিত করুন + + + All + সকল + + + Inspect a log file + একটি লগ ফাইল যাচাই করুন + + + Name + নাম + + + Size + মাপ + + + Refresh the list + তালিকা উদ্ধার করুন (_l) + + + Total size of the parsed data + তথ্যের সর্বমোট মাপ + + + Total number of parsed lines + সর্বমোট সংখ্যা + + + Start parsing the selected files + নির্বাচিত ফাইল আরম্ভ করুন + + + START + সম্পন্ন + + + Time elapsed since the start + আরম্ভের সময় + + + Average speed, in parsed data size per second + গড় গতি, প্রতি সেকেন্ডে পূর্ণসংখ্যা মান + + + Web Server + ওয়েব সার্ভার + + + Select a Web Server + একটি ওয়েব সার্ভার নির্বাচন করুন + + + Year + বছর + + + Month + মাস + + + Day + দিন + + + Hour + ঘন্টা + + + Draw the chart + রেখাচিত্র আঁকা হবে + + + Log line marked as Warning + সতর্কবার্তা রূপে চিহ্নিত পংক্তি চিহ্নিত হয়েছে + + + Date when the request arrived (YYYY-MM-DD) + অনুরোধের সময় যে তারিখ আসল হবে (Y-Y-MM-D) + + + Time when the request arrived (hh:mm:ss) + অনুরোধ আসার সময় (হ্যাঁ: s) + + + Protocol of the request + প্রোটোকলের প্রোটোকল + + + Method of the request + অনুরোধের পদ্ধতি + + + URI of the requested page + অনুরোধ করা পৃষ্ঠার URI + + + Query carried along with the URI + URI সহ অনুসন্ধান করা হয়েছে + + + Response code from the server + সার্ভার থেকে প্রাপ্ত প্রতিক্রিয়া + + + User-agent of the client which made the request + অনুরোধ করা ক্লায়েন্টের ব্যবহারকারীর-নাম + + + IP address of the Client which made the request + ক্লায়েন্টের IP ঠিকানা যা অনুরোধ করা হয়েছিল + + + Cookie used for the request + অনুরোধ করার কুকি + + + The URL which redirected the Client to the requested page + অনুরোধ করার উদ্দেশ্যে চিহ্নিত URL লেখার উদ্দেশ্যে চিহ্নিত URL + + + Size ib Bytes of the request, usually includes header and data + অনুরোধকৃত উইজেটের আকার, সাধারণত হেডার ও ডাটার মধ্যে অন্তর্ভুক্ত + + + Size in Bytes of the served content, usually includes header and data + পরিসেবার মধ্যে উপস্থিত সকল সামগ্রী, সাধারণত হেডার ও ডাটার মাপ + + + Time taken by the server to serve the content, in milliseconds + বিষয়বস্তু পরিচালনা করতে ব্যবহৃত সার্ভার + + + Only use lines in which the field is starting with this string + যে ক্ষেত্রে শুধুমাত্র এই পংক্তি দিয়ে আরম্ভ হয় + + + Protocol: + প্রোটোকল: + + + Method: + ইনপুটের পদ্ধতি: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + শুধুমাত্র সেই লাইনগুলি ব্যবহার করুন যেখানে ক্ষেত্রটি এই বিবৃতিটির সাথে মেলে। +'!', '=', '<' ব্যবহার করুন অথবা '>' কি ব্যবহার করতে হবে তা ঘোষণা করতে + + + Response: + সাড়া: + + + Query: + অনুসন্ধান: + + + URI: + URI: + + + Filters + ফিল্টার + + + Count + সংখ্যা + + + Number of occurrences + ঘটনাসমূহের সংখ্যা + + + Item + আইটেম + + + Value of the field + ক্ষেত্রের মান + + + From: + উৎস: + + + To: + প্রাপক: + + + Select a log field to view + প্রদর্শন করার উদ্দেশ্যে লগ ভিউ নির্বাচন করুন + + + Field: + ক্ষেত্র: + + + Filter: + ফিল্টার: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + স্ট্রিংয়ের সাথে, শুধুমাত্র সেই লাইনগুলি ব্যবহার করা হবে যেখানে এই স্ট্রিং দিয়ে ফিল্ডটি শুরু হচ্ছে। +সংখ্যার সাথে, '!', '=', '<' অথবা '>' কি ব্যবহার করতে হবে তা ঘোষণা করতে + + + Protocol + প্রোটোকল + + + Method + পদ্ধতি + + + URI + URI + + + User-agent + ব্যবহারকারী অ্যাকাউন্ট + + + Most recurrent + সর্বাধিক বিকল্প + + + Most trafficked + অধিকাংশ যানজট + + + Date ever + তারিখ + + + Day of the week + সপ্তাহের দিন + + + Hour of the day + দিনের বিষয় + + + Time taken + সময় গ্রহণ করা হয়েছে + + + Bytes sent + বাইট প্রেরিত হয়েছে + + + Bytes received + বাইট প্রাপ্ত হয়েছে + + + Mean/Max performances + গড় + + + Requests received + অনুরোধ প্রাপ্ত হয়েছে + + + Total work + মোট কাজ + + + General + সাধারণ + + + Window + উইন্ডো + + + Dialogs + ডায়ালগ + + + Charts + রেখা চিত্র + + + Appearance + চেহারা + + + Speed + গতি + + + Relational + সম্বন্ধযুক্ত + + + TextBrowser + টেক্সট ব্রাউজার + + + Databases + ডাটাবেস + + + Security + সুরক্ষা + + + Logs + লগ + + + Defaults + ডিফল্ট + + + Control + কনট্রোল + + + Path + পাথ + + + Format + বিন্যাস + + + Warnlists + সতর্ক তালিকা + + + Blacklists + কালো তালিকা + + + Remember the window's position and size + উইন্ডোর অবস্থান এবং মাপ পরিবর্তন করুন + + + Remember position and size + কার্সারের অবস্থান ও মাপ পরিবর্তন করুন + + + Remember window's position and size + উইন্ডোর অবস্থান এবং মাপ পরিবর্তন করুন + + + Geometry + জ্যামিতি + + + Theme to use for the window + উইন্ডোর জন্য যে থিম ব্যবহার করা হবে + + + Theme + থিম + + + Native + নেটিভ + + + Light + সাদা + + + Dark + কালো + + + Auto + স্বয়ংক্রিয় + + + Icons + আইকন + + + Normal quantity of dialog messages shown + সাধারণ + + + Normal + স্বাভাবিক + + + Dialogs from the main processes + প্রধান প্রসেসের ডায়লগ + + + Dialogs emitted when parsing logs + ডিবাগ লগ করা হলে ডায়লগ প্রদর্শন করা হবে + + + Logs parser + লগ পার্সার + + + Dialogs emitted when viewing statistics + পরিসংখ্যান প্রদর্শিত হলে ডায়লগ প্রদর্শন করা হবে + + + Statistics viewer + পরিসংখ্যান + + + Define the quantity of dialog mesages shown + আমার ভুলের মাত্রা নির্ধারণ করুন + + + Dialogs level + সহযোগীlevel + + + Reduced quantity of dialog messages shown + বার্তার ডায়লগের সংখ্যার পরিমাণ হ্রাস করা হচ্ছে + + + Essential + আবশ্যক + + + Augmented quantity of dialog messages shown + & পদাশ্রিত নির্দেশক + + + Explanatory + ব্যাখ্যা + + + Theme to use for the Charts + রেখাচিত্রের সাথে ব্যবহারযোগ্য থিম + + + Preview + প্রাকদর্শন + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + সে সময়ের অক্ষে এক ধাপ এগিয়ে এসেছে। +একই একই বিরতিতে সকল মান ধ্বংস করা হবে এবং তার মানে ব্যবহৃত হবে ।. + + + Time interval + বিরতি + + + The format to use for the labels of the time axis. + সময়ের অক্ষের লেবেল প্রদর্শনের জন্য ব্যবহৃত বিন্যাস।. + + + Time format + সময় বিন্যাস + + + The size of the pie + পাইর মাপ + + + Pie size + পাইর মাপ + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + পাইরের সর্বাধিক সংখ্যা যা হবে। +ধ্বংস হয়ে যাওয়া টুকরো এক টুকরো টুকরো হয়ে যাবে. + + + Maximum slices + সর্বাধিক অংশগুলি + + + Font to use for the Text Browser + টেক্সট ব্রাউজারের জন্য ব্যবহারযোগ্য ফন্ট + + + Font + ফন্ট + + + Double-spaced lines + দ্বৈত রেখা + + + Use wide lines + সম্পূর্ণ লাইন ব্যবহার করা হবে + + + Define the spacing between lines + তালিকার মধ্যে রেখার মধ্যবর্তী ব্যবধান + + + Lines spacing + লাইনের মধ্যে ব্যবধান + + + None + শূণ্য + + + Color scheme to use for the Text Browser + টেক্সট ব্রাউজারের জন্য ব্যবহারযোগ্য রঙের স্কিম + + + Color scheme + রংয়ের বিন্যাস + + + The appearance of the Text Browser with the current settings + বর্তমান বৈশিষ্ট্যের সাথে চিহ্নিত লেখা ব্রাউজারের প্রদর্শন + + + Insert the base path only, file name excluded + বেস পাথ শুধুমাত্র ফাইলের নাম অন্তর্ভুক্ত করবে + + + The given path doen't exists, or doesn't point to a folder + উল্লিখিত পাথ বর্তমানে উপস্থিত নেই অথবা এটি কোনো ফোল্ডার নয় + + + Path for the database files + ডাটাবেস ফাইলের পাথ + + + Paths + পাথ + + + Apply the current path + বর্তমান পাথ প্রয়োগ করুন + + + Select the path through a dialog window + ডায়লগের মধ্যে উপস্থিত পাথ নির্বাচন করুন + + + Path where the logs data collection database is located + তথ্য সংগ্রহ করার পাথ + + + Logs data + লগ তথ্য + + + Path where the used files hashes database is located + ফাইল সংরক্ষণের পাথ + + + Used files + ব্যবহৃত ফাইল + + + Backup options for the Logs Data database + লগ তথ্য ডাটাবেসের জন্য বিকল্প + + + Backups + ব্যাকআপ + + + A new backup is made when closing LogDoctor after having succesfully edited the database + সম্পাদনা করা ডাটাবেসের শেষে একটি নতুন ব্যাক-আপ তৈরি করা হয়েছে + + + Backup the Logs Data database and keep + কার্যবিবরণী তথ্য ডাটাবেস এবং অগ্রসর হোন + + + Whether it is allowed or denied to follow symlinks occuring in a path + সিম্বোলিক লিংকের প্রয়োগ করা হবে কি না + + + Follow symlinks + সিম্বোলিক-লিংক অনুসরণ করা হবে + + + Default WebServer + ডিফল্ট ওয়েব সার্ভার + + + Usage control + ব্যবহার প্রণালীর নিয়ন্ত্রণ + + + Hide already used files + ব্যবহৃত ফাইল আড়াল করা হবে + + + Size warnings + আকৃতি + + + Warn me when using files with a size exceeding: + একটি আকার ব্যবহার করে ফাইল মুছে ফেলো: + + + Logs folder + লগ ফোল্ডার + + + Logs format string + লগের স্ট্রিং + + + Format string + স্ট্রিং-য়ের বিন্যাস + + + Insert the format string you're using + পংক্তি সন্নিবেশ করুন + + + Apply the current string + বর্তমান পংক্তি প্রয়োগ করুন + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + বর্তমানে সংরক্ষিত স্ট্রিং থেকে একটি নমুনা লগ লাইন তৈরি করুন, এটি সঠিকভাবে ফর্ম্যাট হয়েছে কিনা তা পরীক্ষা করতে। +LogDoctor দ্বারা বিবেচনা করা হয় না এমন কোনো ক্ষেত্র 'DISCARDED' + + + Generate sample + নমুনা নির্মাণ করুন + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + এই লাইনের সঠিকতা পরীক্ষা করুন. +'DISCARDED' হিসাবে চিহ্নিত ক্ষেত্রগুলি সঠিকভাবে পার্স করা হয়েছে, কিন্তু LogDoctor দ্বারা বিবেচনা করা হয় না + + + Open an help window + সহায়িকা খুলুন + + + Help + সাহায্য + + + Select a log field + একটি লগ নির্বাচন করুন + + + Use warnlist for this field + এই ক্ষেত্রটির জন্য সতর্ক তালিকা + + + Add the current line to the list + তালিকায় বর্তমান লাইন যোগ করুন + + + Remove the selected item from the list + নির্বাচিত আইটেম তালিকা থেকে সরিয়ে ফেলুন + + + Move the selected item down + নির্বাচিত বিষয়টিকে টুলবারে নিয়ে যান + + + Use blacklist for this field + চিহ্নিত ক্ষেত্রের জন্য কালো তালিকা ব্যবহার করা হবে + + + Add line + পংক্তি যোগ করুন + + + Remove selection + নির্বাচিত অংশ মুছে ফেলুন + + + Language + ভাষা + + + Utilities + বিবিধ সামগ্রী + + + Tools + সরঞ্জাম + + + Games + খেলা + + + Perform a version-check + সংস্করণ বিশ্লেষণ করুন + + + Show some info about LogDoctor + লগ- আউটের তথ্য প্রদর্শন করা হবেName + + + Open a block-note like window to write temporary text + অস্থায়ী টেক্সট লেখার জন্য উইন্ডোর মধ্যে অ্যাপ্লিকেশন খুলুন + + + Play CrissCross + ক্রিসসস্ক্রলিং খেলুন + + + Play Snake + স্নেক খেলুন + + + Show the changelog + পরিবর্তনের লগ প্রদর্শন করা হবে + + + warnlist + বার্তা তালিকা + + + blacklist + কালো তালিকা + + + copy + কপি করুন + + + copies + প্রতিলিপি + + + Check updates + আপডেট পরীক্ষা করুন + + + Infos + তথ্য + + + BlockNote + ব্লকিং + + + CrissCross + ক্রিসসস্কোপ + + + Snake + সাপ + + + Changelog + লেবেল পরিবর্তন করো + + + + RichText + + Select a file from the list + তালিকা থেকে ফাইল নির্বাচন করুন + + + to inspect its content + বিষয়বস্তু পরীক্ষা করতে + + + Failed to read + পড়ার ব্যর্থ + + + + SnakeGame + + PLAY + প্লে + + + Classic + মার্গ সংগীত + + + Hunt + হান্ট + + + Battle + যুদ্ধ + + + Game Over + খেল খতম + + + Your adversary fell in the water! + তোমার প্রতিপক্ষ পানিতে পড়ে গেছে! + + + YOU WON! + তুমি! + + + You fell in the water! + তুমি পানিতে পড়ে গিয়েছিলে! + + + YOU LOST! + তুমি অনেক বড়! + + + Your adversary ate itself! + তোমার শত্রু নিজে নিজেই! + + + You ate yourself! + তুমি নিজেই নিজেকে খেয়ে নাও! + + + Your adversary ate you! + তোমার শত্রু! + + + You ate your adversary! + তুমি তোমার প্রতিদ্বন্দ্বীদের সাথে যোগ দিয়েছ! + + + You ate each other! + তোমরা একে অপরকে ভালোবাসো! + + + MATCH IS DRAW! + মনে হচ্ছে DRW! + + + + TR + + Unexpected WebServer + অপ্রত্যাশিত ওয়েব সার্ভার + + + Logs Size Breakdown + লগ-আউটের উজ্জ্বলতা + + + Ignored + উপেক্ষা করা হবে + + + Parsed + পেস্ট করুন + + + Blacklisted + কালো তালিকা + + + Others + অন্যান্য + + + from + থেকে + + + to + চিহ্নিত স্থানে চলুন + + + Log Lines Marked as Warning + সতর্কবার্তা রূপে চিহ্নিত পংক্তি লগ করা হবে + + + Time Taken to Serve Requests + সেবা করার জন্য সময় নেওয়া + + + Time of Day Count + দিনের গণনা + + + Relational Count + সম্বন্ধযুক্ত গণনা + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + তারিখ + + + Year + বছর + + + Month + মাস + + + Day + দিন + + + Time + সময় + + + Hour + ঘন্টা + + + Minute + মিনিট + + + Second + সেকন্ড + + + Warning + সতর্কবার্তা + + + Protocol + প্রোটোকল + + + Method + পদ্ধতি + + + URI + URI + + + Query + অনুসন্ধান + + + Response code + বহিরাগত কোড + + + Time taken + সময় গ্রহণ করা হয়েছে + + + Bytes sent + বাইট প্রেরিত হয়েছে + + + Bytes received + বাইট প্রাপ্ত হয়েছে + + + Referrer + উল্লেখকারী + + + Cookie + কুকি + + + Client + ক্লায়েন্ট + + + User-agent + ব্যবহারকারী অ্যাকাউন্ট + + + January + জানুয়ারী + + + February + ফেব্রুয়ারী + + + March + মার্চ + + + April + এপ্রিল + + + May + মে + + + June + জুন + + + July + জুলাই + + + August + আগস্ট + + + September + সেপ্টেম্বর + + + October + অক্টোবর + + + November + নভেম্বর + + + December + সদস্য + + + Sunday + রবিবার + + + Monday + সোমবার + + + Tuesday + মঙ্গলবার + + + Wednesday + বুধবার + + + Thursday + বৃহস্পতিবার + + + Friday + শুক্রবার + + + Saturday + শনিবার + + + diff --git a/logdoctor/translations/LogDoctor_ca_SP.ts b/logdoctor/translations/LogDoctor_ca_SP.ts new file mode 100644 index 0000000..757a309 --- /dev/null +++ b/logdoctor/translations/LogDoctor_ca_SP.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versió + + + Version 4 + Versió 4 + + + Version 3 + Versió 3 + + + Version 2 + Versió 2 + + + Version 1 + Versió 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Construeix scripts + + + Cross-platform compatibility: + Compatibilitat multiplataforma: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Estadístiques: + + + Warnings + Advertències + + + Speed + Velocitat + + + Counts + Compta + + + Daytime + Hora de dia + + + Relational + Relació + + + Globals + Globals + + + Translations: + Traduccions: + + + Italian + ItaliàName + + + Spanish + Espanyol + + + French + Francès + + + Tools: + Eines: + + + Block note + Nota de bloc + + + Utilities: + Utilitats: + + + Infos viewer + Visor d' informació + + + Updates checker + Actualitza el corrector + + + Themes: + Temes: + + + Dark + Fosc + + + Light + Llum + + + Improvements and fixes + Millores i correccions + + + New themes: + Temes nous: + + + Ash + Ash + + + Candy + CandyCity name (optional, probably does not need a translation) + + + Forest + Bosc + + + Powder + Powder + + + Restyled GUI + Interfície gràfica d'usuari restyled + + + Restyled dialogs + Diàlegs amb estil + + + Doxygen documentation + Documentació Doxygen + + + Mini-Games: + Mini-Games: + + + Criss-cross + Cris- crossCity name (optional, probably does not need a translation) + + + Snake + Serp + + + Changed default paths + S' han canviat les rutes per defecte + + + New game modes for Snake + Nou modes de joc per a la serp + + + Hunt + Hunt + + + Battle + Batalla + + + New translations: + Traduccions noves: + + + Japanese + JaponèsName + + + Portuguese + Portuguès + + + Code improvements + Millores de codi + + + Performance improvements + Millores de rendiment + + + Added tests suite: + S' ha afegit la suite de proves: + + + white box tests + Comprovacions de caixes blanques + + + Customized charts themes + Temes de diagrames personalitzats + + + Fixes + Arreglacions + + + Tests improvements + Millores de proves + + + Docker support + Implementació de punts + + + Upgrade to C++20 + Actualitza a C++20 + + + Upgrade to Qt6 + Actualitza a Qt6 + + + Restyled themes + Temes restyleitzats + + + Redesigned configs section + S' ha dissenyat la secció de configuració + + + Stability improvements + Millores d' usabilitat + + + Generating warnings dinamically + S' estan generant avisos dinamicament + + + New tool: + Eina nova: + + + Changelog + Registre de canvis + + + Tweakable parameters for some of the charts: + Paràmetres disponibles per a alguns dels diagrames: + + + Improved project structure + Estructura millorada del projecte + + + Modernized Cmake usage + Modernitzat Ús deake + + + + Crapinfo + + Version + Versió + + + Currently installed version of the software + La versió instal· lada actualment del programari + + + Repository links + Enllaços del repositori + + + Paths + Rutes + + + The path of the executable file + La ruta del fitxer executable + + + Executable + Executable + + + The path where the configuration file gets saved and searched in + El camí on es desa i cerca el fitxer de configuració + + + Configuration file + Fitxer de configuració + + + The path where the application searches for extra resources + El camí on l' aplicació cerca recursos extres + + + Application data + Dades d' aplicació + + + + Crapnote + + Reduce the font size + Redueix la mida del tipus de lletra + + + Font size + Mida del tipus de lletra + + + Increase the font size + Augmenta la mida del tipus de lletra + + + + Crappath + + Choose + Tria + + + Cancel + Cancel· la + + + + Crapup + + Checking for updates + S' estan comprovant les actualitzacionsThe role of the transaction, in present tense + + + New version available + Nova versió disponible + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Hi ha disponible una nova versió! +Si us plau, visiteu el repositori gid del LogDoctor i seguiu la instrucció sobre com actualitzar + + + No update found + No s' ha trobat cap actualització + + + LogDoctor is up-to-date + El registre està actualitzat + + + :/ + : / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Estàs executant una versió del futur! +La vostra versió està més enllà de la versió actual cap amunt del riu +Esteu executant el registre original? +Si us plau, visiteu el repositori del LogDoctor i obtindreu una nova versió d' aquesta + + + Failed to establish a connection + Ha fallat en establir una connexió + + + Connection error, please try again later + Error de connexió, si us plau, torneu- ho a provar més tard + + + Connection timed out + La connexió ha excedit el temps + + + Version check failed + Ha fallat la comprovació de versions + + + An error occured while parsing: +version mark not found + Hi ha hagut un error en analitzar: +No s' ha trobat el signe de versió + + + An error occured while parsing: +malformed version + Hi ha hagut un error en analitzar: +Versió incorrecte + + + An error occured while comparing: +malformed upstream version + Hi ha hagut un error en comparar: +Versió de la part superior alçada + + + + CrissCross + + Victory + Victòria + + + You beated me! + M'has enganyat! + + + This time you lost! + Aquest cop has perdut! + + + Draw + Dibuixa + + + Nice match + Coincidència bonica + + + + DialogBool + + Yes + + + + No + No + + + + DialogIda + + Ignore + Ignora + + + Discard + Descarta + + + Abort + Avorta + + + + DialogMsg + + Ok + + + + + DialogSec + + One of the lists has an invalid item + Una de les llistes té un element no vàlid + + + An error occured while reading the configuration file + Hi ha hagut un error en llegir el fitxer de configuració + + + An error occured while parsing configuration file's data + Hi ha hagut un error en analitzar les dades del fitxer de configuració + + + Failed to create the configuration file's directory + Ha fallat en crear el directori del fitxer de configuració + + + Failed to create the configuration file + No s' ha pogut crear el fitxer de configuració + + + An error occured while writing the configuration file + Hi ha hagut un error en escriure el fitxer de configuració + + + An error occured while preparing the configuration file's data + Hi ha hagut un error en preparar les dades del fitxer de configuració + + + The path contains a symlink + La ruta conté un enllaç simbòlic + + + The file does not exist + El fitxer no existeix + + + Failed to create the database backups' directory + Ha fallat en crear el directori de còpies de seguretat de la base de dades + + + Failed to copy the database file + No s' ha pogut copiar el fitxer de base de dades + + + Failed to update the backups + Ha fallat en actualitzar les còpies de seguretat + + + Failed to create the directory + Ha fallat en crear el directori + + + Unrecognized entry + Entrada no reconeguda + + + Size of the file + Mida del fitxer + + + Warning size parameter + Paràmetre de mida d' avís + + + Failed to read gzipped file + No s' ha pogut llegir el fitxer gzER + + + An error occured while parsing the format string + Hi ha hagut un error en analitzar la cadena de format + + + Available memory + Memòria disponible + + + Size of the logs + Mida dels registres + + + An error occured while reading the gzipped file + S' ha produït un error en llegir el fitxer gzER + + + An error occured while reading the file + Hi ha hagut un error en llegir el fitxer + + + Something failed while handling the file + Alguna cosa ha fallat en gestionar el fitxer + + + An error occured while working on the database + Hi ha hagut un error mentre treballava a la base de dades + + + Aborting + Avorta + + + Invalid locale + Idioma no vàlid + + + Unexpected locale format + Format local inesperat + + + If you haven't manually edited the configuration file, +please report this issue + Si no heu editat manualment el fitxer de configuració, +Si us plau, informeu d'aquest problema + + + The given locale is not an accepted language + El locale indicat no és un idioma acceptat + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Si voleu tenir aquesta localització al registre, +Si us plau, seguiu les instruccions de la pàgina repositori + + + Configuration file not found + No s' ha trobat el fitxer de configuració + + + Unable to retrieve the configuration file + No s' ha pogut recuperar el fitxer de configuració + + + Skipping + Saltant + + + An error occured while handling the configuration file + Hi ha hagut un error en gestionar el fitxer de configuració + + + Failed to write the configuration file + No s' ha pogut escriure el fitxer de configuració + + + Current configuration not saved + La configuració actual no s' ha desat + + + File not readable + No es pot llegir el fitxer + + + The file is not readable + El fitxer no es pot llegir + + + File not writable + No es pot escriure al fitxer + + + The file is not writable + El fitxer no es pot escriure + + + Directory not writable + No es pot escriure al directori + + + The directory is not writable + El directori no es pot escriure + + + Invalid path + Camí no vàlid + + + Failed applying configuration + Ha fallat en aplicar la configuració + + + Invalid configuration lines + Línies de configuració no vàlides + + + Has not been possible to apply some of the configurations + No s' ha pogut aplicar algunes de les configuracions + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Si escolliu procedir, es perdran totes les configuracions no vàlides +Continuo? + + + Failed to retrieve the help file + No s' ha pogut recuperar el fitxer d' ajuda + + + An error occured while getting the help file + Hi ha hagut un error en obtenir el fitxer d' ajuda + + + Additional resources can be downloaded from the git repo + Es poden descarregar recursos addicionals des de la repo + + + Unable to retrieve the file + No s' ha pogut recuperar el fitxer + + + Invalid string + Cadena no vàlida + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + La cadena indicada no és vàlida i no es pot afegir a la llista + +Si us plau corregiu- lo i torneu- ho a intentar + + + QSql driver not found + No s' ha trobat el controlador QSql + + + Failed to retrieve the driver needed to handle the database + No s' ha pogut recuperar el controlador necessari per gestionar la base de dades + + + File not found + No s' ha trobat el fitxer + + + Failed to retrieve the database file + No s' ha pogut recuperar el fitxer de la base de dades + + + Create a new database? + Creo una base de dades nova? + + + The database contains an unexpected table + La base de dades conté una taula inesperada + + + Unexpected table + Taula inesperada + + + It seems that the database is missing a table + Sembla que la base de dades està desapareguda una taula + + + Table not found + No s' ha trobat la taula + + + The database contains an unexpected column + La base de dades conté una columna inesperada + + + Unexpected column + Columna inesperada + + + It seems that the table is missing a column + Sembla que la taula ha desaparegut una columna + + + Column not found + No s' ha trobat la columna + + + A column has an unexpected data-type + Una columna té un tipus de dades inesperat + + + Unexpected data-type + Tipus de dades inesperat + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Aquesta base de dades es reanomenarà amb una pista '.còpia' i es crearà un de nou. +Continuo? + + + Database created + Base de dades creada + + + Successfully created a new database + S' ha creat amb èxit una nova base de dades + + + Not a file + No és un fitxer + + + The path was supposed to point to a file, but it doesn't + La ruta s'havia de apuntar a un fitxer, però no és + + + Please remove the conflict and retry + Si us plau, elimineu el conflicte i torneu- ho a intentar + + + The database file is not readable + El fitxer de base de dades no es pot llegir + + + Please set the proper permissions and retry +If this error persists, please report this issue + Si us plau, establiu els permisos adequats i torneu- ho a provar +Si aquest error persisteix, si us plau informeu d' aquest tema + + + The database file is not writable + El fitxer de base de dades no es pot escriure + + + Invalid database path + Camí de la base de dades no vàlid + + + Failed creating database + Ha fallat en crear la base de dades + + + An error occured while creating the database + Hi ha hagut un error en crear la base de dades + + + Failed opening database + Ha fallat en obrir la base de dades + + + An error occured while opening the database + Hi ha hagut un error en obrir la base de dades + + + Failed executing on database + Ha fallat en executar en la base de dades + + + An error occured while executing a statement on the database + Hi ha hagut un error en executar una declaració a la base de dades + + + Failed to backup database + Ha fallat en fer còpia de seguretat de la base de dades + + + Please report this issue + Si us plau, informeu d'aquest assumpte + + + Invalid log format string + Cadena de format de registre no vàlida + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Comproveu que no hi ha cap error llençat pel vostre servidor web +Si s' accepta, comproveu la presència d' un error aquí +Si tot va bé, si us plau, informeu d'aquest problema + + + Log format error + Error del format del registre + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + El format del registre no s' ha establert, o no és vàlid +Si us plau, afegiu una de vàlida a les configuracions + + + Misconfigured log format + Format erroni del registre + + + No log field has been set in the current logs format, +making it useless to parse logs + No s' ha establert cap camp de registre en el format de registre actual, +Fer que sigui inútil analitzar registres + + + Please set up a format which contains at least one field + Si us plau, configureu un format que conté almenys un camp + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Falta un separador entre un o més camps, +Fer que sigui difícil establir límits en xarxa, +i possiblement liderant per a emmagatzemar dades incorrectes + + + Please set up a format which contains separators between fields + Si us plau, establiu un format que conté separadors entre camps + + + Missing field in log format + Falta el camp en format de registre + + + An important field is missing from the provided format: + Falta un camp important del format proporcionat: + + + The quality of the statistics may be seriously compromized + La qualitat de les estadístiques es pot compilar seriosament + + + Proceed anyway? + Procedeixo igualment? + + + 'Carriage Return' in log format + " Retorn de carro" en format de registre + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + El format proporcionat conté el " Retorn de retorn de retorn ." +Això pot portar a les pèrdues de dades o fallades si no s' usa amb precaució + + + An error occured while parsing logs + Hi ha hagut un error en analitzar els registres + + + Failed defining type + Ha fallat en definir el tipus + + + Failed to determine the log type + No s' ha pogut determinar el tipus de registre + + + File already used + El fitxer ja s' ha usat + + + The file has probably been used already + El fitxer probablement ja s' ha usat + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignora l' avís i l' usa de tota manera, Descarta i continua, o interromp tot el procés? + + + Duplicate file + Duplica el fitxer + + + The file appears twice in the list of selections + El fitxer apareix dues vegades en la llista de seleccions + + + Failed updating hashes + Ha fallat l' actualització dels ha fallatName + + + An error occured while inserting the parsed files hashes into the database + Hi ha hagut un error en inserir els fitxers analitzats ha entrat a la base de dadesName + + + File exceeds warning size + El fitxer excedeix la mida de l' avís + + + The file's size exceeds the warning size + La mida del fitxer excedeix la mida de l' avís + + + Not enough memory + No hi ha prou memòria + + + The total size of the selected files exceeds the available memory + La mida total dels fitxers seleccionats excedeix la memòria disponible + + + Please free some resources, parse the files in different steps or split them into smaller units + Si us plau, deixeu lliure alguns recursos, analitzeu els fitxers en diferents passos o dividir- los en unitats menors + + + Failed reading + Ha fallat la lectura + + + File is empty + El fitxer és buit + + + The file is blank + El fitxer està en blanc + + + Failed to retrieve the selected file + Ha fallat en recuperar el fitxer seleccionat + + + Discard it and continue, or Abort all and exit? + Descartar-la i continuar, o cancel·lar-ho tot i sortir? + + + No file to parse + No hi ha cap fitxer a analitzar + + + The list of files to parse is empty + La llista de fitxers a analitzar és buida + + + Directory not found + No s' ha trobat el directori + + + The directory does not exists + El directori no existeix + + + Directory not readable + No es pot llegir el directori + + + The directory is not readable + El directori no es pot llegir + + + Please set the proper permissions before to start + Si us plau establiu els permisos adequats abans d' iniciar- los + + + Failed creating directory + Ha fallat en crear el directori + + + The path does not exists + El camí no existeix + + + Data conversion failed + Ha fallat la conversió de dades + + + Failed to convert from '%1' to '%2' + Ha fallat en convertir de '%1' a '%2' + + + Failed to create statistics + Ha fallat en crear estadístiques + + + An error occured while processing + S' ha produït un error en processar + + + Cannot create statistics + No s' han pogut crear estadístiques + + + No data has been found that matches with the currently set parameters + No s' ha trobat cap dada que coincideixi amb els paràmetres establerts actualment + + + Not a folder + Cap carpeta + + + The path was supposed to point to a folder, but it doesn't + Se suposa que la ruta estava destinada a una carpeta, però no és + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + L' entrada es reanomenarà amb una pista '.còpia' i es crearà un de nou. +Continuo? + + + An error occured + Hi ha hagut un error + + + Failed renaming + No s' ha pogut reanomenar + + + An error occured while renaming + S' ha produït un error en reanomenar + + + + GameDialog + + Ok + + + + + MainWindow + + Parse logs from the Apache2 web server + Analitza els registres des del servidor web Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Analitza els registres des del servidor web Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Analitza els registres des del servidor web Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Selecciona/deselect tots els fitxers + + + All + Tot + + + Inspect a log file + Inspecciona un fitxer de registre + + + Name + Nom + + + Size + Mida + + + Refresh the list + Refresca la llista + + + Total size of the parsed data + Mida total de les dades analitzades + + + Total number of parsed lines + Nombre total de línies analitzades + + + Start parsing the selected files + Comença a analitzar els fitxers seleccionats + + + START + Inici + + + Time elapsed since the start + Temps transcorregut des del començament + + + Average speed, in parsed data size per second + Velocitat mitjana, mida analitzada de dades per segon + + + Web Server + Servidor web + + + Select a Web Server + Escolliu un servidor web + + + Year + Any + + + Month + Mes + + + Day + Dia + + + Hour + Hora + + + Draw the chart + Dibuixa el diagrama + + + Log line marked as Warning + Línia de registre marcada com a avís + + + Date when the request arrived (YYYY-MM-DD) + Data quan va arribar la petició (YYYY- MM- DD) + + + Time when the request arrived (hh:mm:ss) + Temps en què es va arribar la petició (hh: mm:s) + + + Protocol of the request + Protocol de la petició + + + Method of the request + Mètode de petició + + + URI of the requested page + URI de la pàgina demanada + + + Query carried along with the URI + Consulta amb l' URI + + + Response code from the server + Codi de resposta del servidor + + + User-agent of the client which made the request + L' agent d' usuari del client que ha fet la petició + + + IP address of the Client which made the request + Adreça IP del client que ha fet la petició + + + Cookie used for the request + Galeta usada per a la petició + + + The URL which redirected the Client to the requested page + L' URL que ha redireccionat el client a la pàgina demanada + + + Size ib Bytes of the request, usually includes header and data + Mida dels bytes de la petició, normalment inclou capçalera i dades + + + Size in Bytes of the served content, usually includes header and data + Mida en bytes del contingut servit, normalment inclou capçalera i dades + + + Time taken by the server to serve the content, in milliseconds + Temps pres pel servidor per servir el contingut, en mil· lisegons + + + Only use lines in which the field is starting with this string + Usa només línies en les que el camp comença amb aquesta cadena + + + Protocol: + Protocol: + + + Method: + Mètode: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Només usa línies en les que el camp coincideix amb aquesta declaració. +Useu '!', '=', '<' o '>' per declarar què usar + + + Response: + Resposta: + + + Query: + Consulta: + + + URI: + URI: + + + Filters + Filtres + + + Count + Compte + + + Number of occurrences + Nombre d' ocurrències + + + Item + Element + + + Value of the field + Valor del camp + + + From: + Des de: + + + To: + A: + + + Select a log field to view + Seleccioneu un camp de registre a veure + + + Field: + Camp: + + + Filter: + Filtre: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Amb cadenes, només les línies en les que s' inicia el camp amb aquesta cadena s' usarà. +Amb números, useu '!', '=', '<' o '>' per declarar què usar + + + Protocol + Protocol + + + Method + Mètode + + + URI + URI + + + User-agent + Agent d' usuari + + + Most recurrent + Reactualment comú + + + Most trafficked + La majoria de tràfic + + + Date ever + Data de la història + + + Day of the week + Dia de la setmana + + + Hour of the day + Hora del dia + + + Time taken + Temps pres + + + Bytes sent + Bytes enviats + + + Bytes received + Bytes rebuts + + + Mean/Max performances + Presentacions per mitjana/Max + + + Requests received + S' han rebut les peticions + + + Total work + Treball total + + + General + General + + + Window + Finestra + + + Dialogs + Diàlegs + + + Charts + Diagrames + + + Appearance + Aparença + + + Speed + Velocitat + + + Relational + Relació + + + TextBrowser + TextBrowser + + + Databases + Bases de dades + + + Security + Seguretat + + + Logs + Registres + + + Defaults + Omissió + + + Control + Control + + + Path + Camí + + + Format + Format + + + Warnlists + Llistes d' avís + + + Blacklists + Llistes negres + + + Remember the window's position and size + Recorda la posició i mida de la finestra + + + Remember position and size + Recorda la posició i la mida + + + Remember window's position and size + Recorda la posició i mida de la finestra + + + Geometry + Geometria + + + Theme to use for the window + Tema a usar per a la finestra + + + Theme + Tema + + + Native + Nadiu + + + Light + Llum + + + Dark + Fosc + + + Auto + Auto + + + Icons + Icones + + + Normal quantity of dialog messages shown + quantitat normal de missatges mostrats + + + Normal + Normal + + + Dialogs from the main processes + Diàlegs des dels processos principals + + + Dialogs emitted when parsing logs + Els diàlegs emesos quan s' analitzaven els registres + + + Logs parser + Analitzador de registres + + + Dialogs emitted when viewing statistics + Diàlegs emèss en visualitzar estadístiques + + + Statistics viewer + Visualitzador d' estadístiques + + + Define the quantity of dialog mesages shown + Defineix la quantitat de meges de diàleg mostrats + + + Dialogs level + Nivell de diàlegs + + + Reduced quantity of dialog messages shown + quantitat reduïda dels missatges de diàleg mostrats + + + Essential + Essencial + + + Augmented quantity of dialog messages shown + quantitat agomentada de missatges de diàleg mostrats + + + Explanatory + Expiració + + + Theme to use for the Charts + Tema a usar pels diagrames + + + Preview + Vista prèvia + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Representa un pas en l'eix del temps, en segons. +Tots els valors que cauen dins del mateix interval seran fusionats i s' usarà el valor mitjà. + + + Time interval + Interval de temps + + + The format to use for the labels of the time axis. + El format a usar per les etiquetes de l' eix del temps. + + + Time format + Format d' hora + + + The size of the pie + La mida del pastís + + + Pie size + Mida de Sector + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + El nombre màxim de talls que el pastís serà compost. +Els talls d'exaltació s' agruparan en un tall complet. + + + Maximum slices + Nombre màxim de talls + + + Font to use for the Text Browser + Tipus de lletra a usar pel navegador de text + + + Font + Lletra + + + Double-spaced lines + Línies dobles espaiades + + + Use wide lines + Usa línies amples + + + Define the spacing between lines + Defineix l' espaiat entre línies + + + Lines spacing + Espaiat de les línies + + + None + Cap + + + Color scheme to use for the Text Browser + Esquema de color a usar pel navegador de text + + + Color scheme + Esquema de color + + + The appearance of the Text Browser with the current settings + L' aparença del navegador de text amb els paràmetres actuals + + + Insert the base path only, file name excluded + Insereix només la ruta base, el nom de fitxer exclòs + + + The given path doen't exists, or doesn't point to a folder + El camí proporcionat no existeix, o no apunta a una carpeta + + + Path for the database files + Camí als fitxers de la base de dades + + + Paths + Rutes + + + Apply the current path + Aplica la ruta actual + + + Select the path through a dialog window + Seleccioneu la ruta a través d' una finestra de diàleg + + + Path where the logs data collection database is located + Camí on està ubicada la base de dades de registres + + + Logs data + Registres de dades + + + Path where the used files hashes database is located + Camí on està ubicada la base de dades dels fitxers emprats + + + Used files + Fitxers usats + + + Backup options for the Logs Data database + Opcions de còpia de seguretat per a la base de dades dels registres + + + Backups + Còpia de seguretat + + + A new backup is made when closing LogDoctor after having succesfully edited the database + S' ha fet una nova còpia de seguretat en tancar el registreDoctor després d' haver editat habitualment la base de dades + + + Backup the Logs Data database and keep + Fes còpia de seguretat de la base de dades de registres i mantén + + + Whether it is allowed or denied to follow symlinks occuring in a path + Si està permès o denegat el seguiment dels enllaços simbòlics que ocorren en un camí + + + Follow symlinks + Segueix els enllaços simbòlics + + + Default WebServer + Servidor web predeterminatComment + + + Usage control + Control d' ús + + + Hide already used files + Oculta els fitxers ja usats + + + Size warnings + Avisos de mida + + + Warn me when using files with a size exceeding: + Avisa' m quan s' usen fitxers amb una mida superior: + + + Logs folder + Carpeta de registres + + + Logs format string + Format de cadena dels registres + + + Format string + Cadena de format + + + Insert the format string you're using + Insereix la cadena de format que useu + + + Apply the current string + Aplica la cadena actual + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Genera una línia de registre de mostra de la cadena desada actualment, per comprovar si es formata correctament. +Qualsevol camp no considerat pel registre apareixerà com a 'DISCARDED' + + + Generate sample + Genera una mostra + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Si us plau, comproveu la correcció d' aquesta línia. +Els camps marcats com a 'DISCARDED' s' han analitzat correctament, però no es considera pel registreDoctor + + + Open an help window + Obre una finestra d' ajuda + + + Help + Ajuda + + + Select a log field + Seleccioneu un camp de registre + + + Use warnlist for this field + Usa la llista d' avis per aquest camp + + + Add the current line to the list + Afegeix la línia actual a la llista + + + Remove the selected item from the list + Elimina l' element seleccionat de la llista + + + Move the selected item down + Baixa l' element seleccionat + + + Use blacklist for this field + Usa la llista negra per aquest camp + + + Add line + Afegeix línia + + + Remove selection + Elimina la selecció + + + Language + Idioma + + + Utilities + Utilitats + + + Tools + Eines + + + Games + Jocs + + + Perform a version-check + Realitza un comprovador de versions + + + Show some info about LogDoctor + Mostra alguna informació quant al LogDoctor + + + Open a block-note like window to write temporary text + Obre una nota de bloc com la finestra per escriure text temporal + + + Play CrissCross + Jugueu a la creuació Criss + + + Play Snake + Reprodueix serp + + + Show the changelog + Mostra el registre de canvis + + + warnlist + Llista d' avis + + + blacklist + Llista negra + + + copy + Còpia + + + copies + copies + + + Check updates + Comprova les actualitzacions + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + Creua Criss + + + Snake + Serp + + + Changelog + Registre de canvis + + + + RichText + + Select a file from the list + Seleccioneu un fitxer de la llista + + + to inspect its content + per inspeccionar el seu contingut + + + Failed to read + No s' ha pogut llegir + + + + SnakeGame + + PLAY + JUGAR + + + Classic + Clàssic + + + Hunt + Hunt + + + Battle + Batalla + + + Game Over + Fi de la partida + + + Your adversary fell in the water! + El teu adversari va caure a l'aigua! + + + YOU WON! + Ets tu! + + + You fell in the water! + Vas caure a l'aigua! + + + YOU LOST! + Has perdut! + + + Your adversary ate itself! + El seu adversari es va menjar ella mateixa! + + + You ate yourself! + T'has menjat tu mateix! + + + Your adversary ate you! + El teu adversari t'ha menjat! + + + You ate your adversary! + T'has menjat el teu adversari! + + + You ate each other! + Us heu menjat l'un a l'altre! + + + MATCH IS DRAW! + La investigació és DRAW! + + + + TR + + Unexpected WebServer + Servidor web inesperat + + + Logs Size Breakdown + Mida dels registres d' interrupció + + + Ignored + Ignorat + + + Parsed + Analitzat + + + Blacklisted + Llista negra + + + Others + Altres + + + from + des de + + + to + a + + + Log Lines Marked as Warning + Línies de registre marcades com a avís + + + Time Taken to Serve Requests + Temps d' ús de les peticions Serve + + + Time of Day Count + Hora del compte de dia + + + Relational Count + Compte relacional + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + Data + + + Year + Any + + + Month + Mes + + + Day + Dia + + + Time + Temps + + + Hour + Hora + + + Minute + Minut + + + Second + Segon + + + Warning + Avís + + + Protocol + Protocol + + + Method + Mètode + + + URI + URI + + + Query + Consulta + + + Response code + Codi de resposta + + + Time taken + Temps pres + + + Bytes sent + Bytes enviats + + + Bytes received + Bytes rebuts + + + Referrer + Referència + + + Cookie + Galeta + + + Client + Client + + + User-agent + Agent d' usuari + + + January + gener + + + February + febrer + + + March + Març + + + April + abril + + + May + maig + + + June + juny + + + July + juliol + + + August + agost + + + September + setembre + + + October + Octubre + + + November + novembre + + + December + desembre + + + Sunday + Diumenge + + + Monday + Dilluns + + + Tuesday + Dimarts + + + Wednesday + Dimecres + + + Thursday + Dijous + + + Friday + Divendres + + + Saturday + Dissabte + + + diff --git a/logdoctor/translations/LogDoctor_cs_CZ.ts b/logdoctor/translations/LogDoctor_cs_CZ.ts new file mode 100644 index 0000000..8b6eb51 --- /dev/null +++ b/logdoctor/translations/LogDoctor_cs_CZ.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Verze + + + Version 4 + Verze 4 + + + Version 3 + Verze 3 + + + Version 2 + Verze 2 + + + Version 1 + Verze 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Postavit skripty + + + Cross-platform compatibility: + Kompatibilita příčného tvaru: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistika: + + + Warnings + Varování + + + Speed + Rychlost + + + Counts + Počet + + + Daytime + Den + + + Relational + Související + + + Globals + Globální + + + Translations: + Překlady: + + + Italian + Italský + + + Spanish + Španělština + + + French + Francie + + + Tools: + Nástroje: + + + Block note + Bloková poznámka + + + Utilities: + Nástroje: + + + Infos viewer + Prohlížeč informací + + + Updates checker + Kontrola aktualizací + + + Themes: + Témata: + + + Dark + Tma + + + Light + Světlo + + + Improvements and fixes + Zlepšení a opravy + + + New themes: + Nová témata: + + + Ash + Popel + + + Candy + Cukr + + + Forest + Les + + + Powder + Prášek + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Upravená dialogová okna + + + Doxygen documentation + Dokumentace kyslíku + + + Mini-Games: + Mini-Hry: + + + Criss-cross + Criss-cross + + + Snake + had + + + Changed default paths + Změna výchozích cest + + + New game modes for Snake + Nové herní režimy pro hada + + + Hunt + Lov + + + Battle + Boj + + + New translations: + Nové překlady: + + + Japanese + Japonština + + + Portuguese + Portugalština + + + Code improvements + Zlepšování kódů + + + Performance improvements + Zlepšení výkonnosti + + + Added tests suite: + Přidáno testovací apartmá: + + + white box tests + Zkoušky bílé krabice + + + Customized charts themes + Přizpůsobená témata grafů + + + Fixes + Opravy + + + Tests improvements + Vylepšení zkoušek + + + Docker support + Podpora Dockera + + + Upgrade to C++20 + Aktualizace na C++20 + + + Upgrade to Qt6 + Upgrade na Qt6 + + + Restyled themes + Restylovaná témata + + + Redesigned configs section + Sekce redesignovaných konfigů + + + Stability improvements + Zlepšení stability + + + Generating warnings dinamically + Generování varování dinamicky + + + New tool: + Nový nástroj: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Vyměnitelné parametry pro některé grafy: + + + Improved project structure + Zlepšená struktura projektu + + + Modernized Cmake usage + Modernizované Použití Cmake + + + + Crapinfo + + Version + Verze + + + Currently installed version of the software + Aktuálně nainstalovaná verze softwaru + + + Repository links + Odkazy na úložiště + + + Paths + Cesty + + + The path of the executable file + Cesta k spustitelnému souboru + + + Executable + Spustitelné + + + The path where the configuration file gets saved and searched in + Cesta, ve které je konfigurační soubor uložen a vyhledán + + + Configuration file + Konfigurační soubor + + + The path where the application searches for extra resources + Cesta, kde aplikace hledá další zdroje + + + Application data + Údaje o aplikaci + + + + Crapnote + + Reduce the font size + Snížit velikost písma + + + Font size + Velikost písma + + + Increase the font size + Zvýšit velikost písma + + + + Crappath + + Choose + Vybrat + + + Cancel + Zrušit + + + + Crapup + + Checking for updates + Kontrola aktualizací + + + New version available + Nová dostupná verze + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Nová verze je k dispozici! +Navštivte repozitář git programu LogDoctor a postupujte podle pokynů, jak aktualizovat + + + No update found + Nebyly nalezeny žádné aktualizace + + + LogDoctor is up-to-date + LogDoktor je aktuální + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Spouštíš verzi z budoucnosti! +Vaše verze je mimo aktuální protilehlou verzi +Vedete originál LogDoctor? +Prosím navštivte úložiště LogDoctor a získejte jeho novou verzi + + + Failed to establish a connection + Nepodařilo se navázat spojení + + + Connection error, please try again later + Chyba připojení, zkuste to prosím později + + + Connection timed out + Čas připojení vypršel + + + Version check failed + Kontrola verze selhala + + + An error occured while parsing: +version mark not found + Při analýze došlo k chybě: +značka verze nenalezena + + + An error occured while parsing: +malformed version + Při analýze došlo k chybě: +Znetvořené znění + + + An error occured while comparing: +malformed upstream version + Při porovnávání došlo k chybě: +Znetvořené protilehlé verze + + + + CrissCross + + Victory + Vítězství + + + You beated me! + Porazil jsi mě! + + + This time you lost! + Tentokrát jsi prohrál! + + + Draw + Kreslit + + + Nice match + Pěkný zápas + + + + DialogBool + + Yes + Ano + + + No + Ne + + + + DialogIda + + Ignore + Ignorovat + + + Discard + Zahodit + + + Abort + Přerušit + + + + DialogMsg + + Ok + Dobře + + + + DialogSec + + One of the lists has an invalid item + Jeden ze seznamů má neplatnou položku + + + An error occured while reading the configuration file + Při čtení konfiguračního souboru došlo k chybě + + + An error occured while parsing configuration file's data + Při analýze dat konfiguračního souboru došlo k chybě + + + Failed to create the configuration file's directory + Selhalo vytvoření adresáře konfiguračního souboru + + + Failed to create the configuration file + Selhalo vytvoření konfiguračního souboru + + + An error occured while writing the configuration file + Při zápisu konfiguračního souboru došlo k chybě + + + An error occured while preparing the configuration file's data + Při přípravě konfiguračního souboru došlo k chybě + + + The path contains a symlink + Cesta obsahuje symlink + + + The file does not exist + Soubor neexistuje + + + Failed to create the database backups' directory + Selhalo vytvoření adresáře zálohování databáze + + + Failed to copy the database file + Nepodařilo se zkopírovat soubor databáze + + + Failed to update the backups + Nepodařilo se aktualizovat zálohy + + + Failed to create the directory + Selhalo vytvoření adresáře + + + Unrecognized entry + Nerozpoznaný vstup + + + Size of the file + Velikost souboru + + + Warning size parameter + Parametr velikosti varování + + + Failed to read gzipped file + Selhalo čtení gzipovaného souboru + + + An error occured while parsing the format string + Při analýze řetězce formátu došlo k chybě + + + Available memory + Dostupná paměť + + + Size of the logs + Velikost logů + + + An error occured while reading the gzipped file + Při čtení gzipového souboru došlo k chybě + + + An error occured while reading the file + Při čtení souboru došlo k chybě + + + Something failed while handling the file + Něco selhalo při manipulaci se souborem + + + An error occured while working on the database + Při práci na databázi došlo k chybě + + + Aborting + Přerušuji + + + Invalid locale + Neplatný locale + + + Unexpected locale format + Neočekávaný lokální formát + + + If you haven't manually edited the configuration file, +please report this issue + Pokud jste ručně neupravovali konfigurační soubor, +oznamte prosím toto téma + + + The given locale is not an accepted language + Uvedená lokalita není přijatelný jazyk + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Pokud byste chtěl mít tento locale v LogDoctor, +postupujte podle pokynů na stránce úložiště + + + Configuration file not found + Konfigurační soubor nenalezen + + + Unable to retrieve the configuration file + Nelze získat konfigurační soubor + + + Skipping + Přeskočit + + + An error occured while handling the configuration file + Při manipulaci s konfiguračním souborem došlo k chybě + + + Failed to write the configuration file + Nepodařilo se zapsat konfigurační soubor + + + Current configuration not saved + Současná konfigurace není uložena + + + File not readable + Soubor není čitelný + + + The file is not readable + Soubor není čitelný + + + File not writable + Soubor není zapisovatelný + + + The file is not writable + Soubor není zapisovatelný + + + Directory not writable + Adresář není zapisovatelný + + + The directory is not writable + Adresář není zapisovatelný + + + Invalid path + Neplatná cesta + + + Failed applying configuration + Konfigurace selhala + + + Invalid configuration lines + Neplatné konfigurační řádky + + + Has not been possible to apply some of the configurations + Nebylo možné použít některé konfigurace + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Pokud se rozhodnete pokračovat, všechny nepoužité konfigurace budou ztraceny +Pokračovat? + + + Failed to retrieve the help file + Selhalo získání souboru nápovědy + + + An error occured while getting the help file + Při získávání souboru nápovědy došlo k chybě + + + Additional resources can be downloaded from the git repo + Další zdroje lze stáhnout z git repo + + + Unable to retrieve the file + Nelze získat soubor + + + Invalid string + Neplatný řetězec + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Zadaný řetězec je neplatný a nelze jej přidat do seznamu + +Prosím, opravte to a zkuste to znovu + + + QSql driver not found + QSql ovladač nenalezen + + + Failed to retrieve the driver needed to handle the database + Selhalo získání řidiče potřebného k manipulaci s databází + + + File not found + Soubor nenalezen + + + Failed to retrieve the database file + Selhalo získání databázového souboru + + + Create a new database? + Vytvořit novou databázi? + + + The database contains an unexpected table + Databáze obsahuje nečekanou tabulku + + + Unexpected table + Neočekávaná tabulka + + + It seems that the database is missing a table + Zdá se, že databáze chybí tabulka + + + Table not found + Tabulka nenalezena + + + The database contains an unexpected column + Databáze obsahuje nečekaný sloupec + + + Unexpected column + Neočekávaný sloupec + + + It seems that the table is missing a column + Zdá se, že ta tabulka chybí sloupec + + + Column not found + Sloupec nenalezen + + + A column has an unexpected data-type + Sloupec má neočekávaný datový typ + + + Unexpected data-type + Neočekávaný datový typ + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Tato databáze bude přejmenována na ".copy" a bude vytvořena nová. +Pokračovat? + + + Database created + Vytvořená databáze + + + Successfully created a new database + Úspěšně vytvořena nová databáze + + + Not a file + Ne soubor + + + The path was supposed to point to a file, but it doesn't + Cesta měla ukazovat na soubor, ale neukazuje + + + Please remove the conflict and retry + Prosím odstraňte konflikt a pokuste se znovu + + + The database file is not readable + Databázový soubor není čitelný + + + Please set the proper permissions and retry +If this error persists, please report this issue + Prosím nastavte správné oprávnění a zkuste znovu +Pokud tato chyba přetrvává, nahlašte prosím tento problém + + + The database file is not writable + Databázový soubor není zapisovatelný + + + Invalid database path + Neplatná cesta databáze + + + Failed creating database + Selhalo vytvoření databáze + + + An error occured while creating the database + Při vytváření databáze došlo k chybě + + + Failed opening database + Selhalo otevření databáze + + + An error occured while opening the database + Při otevírání databáze došlo k chybě + + + Failed executing on database + Neuskutečnění v databázi + + + An error occured while executing a statement on the database + Při provádění prohlášení v databázi došlo k chybě + + + Failed to backup database + Nepodařilo se zálohovat databázi + + + Please report this issue + Oznamte prosím toto téma + + + Invalid log format string + Neplatný řetězec formátu záznamu + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Prosím zkontrolujte, zda váš WebServer nehodí žádnou chybu +Pokud to přijmete, zkontrolujte prosím přítomnost překlepu. +Pokud je vše v pořádku, nahlašte prosím tento problém + + + Log format error + Chyba ve formátu záznamu + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Formát záznamu nebyl nastaven nebo je neplatný +Prosím přidejte platný v konfiguracích + + + Misconfigured log format + Chybný formát záznamu + + + No log field has been set in the current logs format, +making it useless to parse logs + Žádné pole záznamu nebylo nastaveno v aktuálním formátu záznamů, +kvůli tomu, že je k ničemu analyzovat záznamy + + + Please set up a format which contains at least one field + Nastavte prosím formát, který obsahuje alespoň jedno pole + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + mezi jedním nebo více poli chybí separátor, +ztěžkne stanovení čistých hranic, +a případně vede k uložení nesprávných údajů + + + Please set up a format which contains separators between fields + Nastavte prosím formát obsahující oddělovače mezi poli + + + Missing field in log format + Chybějící pole ve formátu záznamu + + + An important field is missing from the provided format: + V daném formátu chybí důležité pole: + + + The quality of the statistics may be seriously compromized + Kvalita statistik může být vážně kompromitována + + + Proceed anyway? + Pokračuješ? + + + 'Carriage Return' in log format + 'Carriage Return' ve formátu záznamu + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Poskytnutý formát obsahuje 'Carriage Return'. +To může vést ke ztrátě údajů nebo zkratům, pokud není použito s opatrností + + + An error occured while parsing logs + Při analýze logů došlo k chybě + + + Failed defining type + Selhalo vymezení typu + + + Failed to determine the log type + Nepodařilo se určit typ záznamu + + + File already used + Již použitý soubor + + + The file has probably been used already + Soubor byl pravděpodobně již použit + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorovat varování a použít ho stejně, vyhodit a pokračovat, nebo zrušit celý proces? + + + Duplicate file + Duplikovat soubor + + + The file appears twice in the list of selections + Soubor se objeví dvakrát v seznamu výběru + + + Failed updating hashes + Nepodařená aktualizace hashes + + + An error occured while inserting the parsed files hashes into the database + Nastala chyba při vložení parsed souborů hashes do databáze + + + File exceeds warning size + Soubor přesahuje velikost varování + + + The file's size exceeds the warning size + Velikost souboru přesahuje velikost varování + + + Not enough memory + Nedostatek paměti + + + The total size of the selected files exceeds the available memory + Celková velikost vybraných souborů přesahuje dostupnou paměť + + + Please free some resources, parse the files in different steps or split them into smaller units + Uvolněte prosím některé zdroje, rozeberte soubory v různých krocích nebo je rozdělíte na menší jednotky + + + Failed reading + Selhalo čtení + + + File is empty + Soubor je prázdný + + + The file is blank + Soubor je prázdný + + + Failed to retrieve the selected file + Selhalo získání vybraného souboru + + + Discard it and continue, or Abort all and exit? + Zbavit se ho a pokračovat, nebo zrušit všechno a odejít? + + + No file to parse + Žádný soubor k analýze + + + The list of files to parse is empty + Seznam souborů k analýze je prázdný + + + Directory not found + Adresář nenalezen + + + The directory does not exists + Adresář neexistuje + + + Directory not readable + Adresář není čitelný + + + The directory is not readable + Adresář není čitelný + + + Please set the proper permissions before to start + Před spuštěním prosím nastavte správná povolení + + + Failed creating directory + Selhalo vytvoření adresáře + + + The path does not exists + Cesta neexistuje + + + Data conversion failed + Převod dat selhal + + + Failed to convert from '%1' to '%2' + Nepodařilo se převést z '%1' na '%2' + + + Failed to create statistics + Selhalo vytvoření statistik + + + An error occured while processing + Při zpracování došlo k chybě + + + Cannot create statistics + Nelze vytvořit statistiky + + + No data has been found that matches with the currently set parameters + Nebyly zjištěny žádné údaje, které by odpovídaly aktuálně nastaveným parametrům + + + Not a folder + Žádná složka + + + The path was supposed to point to a folder, but it doesn't + Cesta měla ukázat na složku, ale neukazuje + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Vstup bude přejmenován na stopu '.kopie' a bude vytvořen nový. +Pokračovat? + + + An error occured + Došlo k chybě + + + Failed renaming + Přejmenování selhalo + + + An error occured while renaming + Při přejmenování došlo k chybě + + + + GameDialog + + Ok + Dobře + + + + MainWindow + + Parse logs from the Apache2 web server + Parse logy z webového serveru Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Prohlédněte záznamy z webového serveru Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Prohlédněte záznamy z webového serveru Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Vybrat/vybrat všechny soubory + + + All + Všechny + + + Inspect a log file + Zkontrolujte soubor s logem + + + Name + Název + + + Size + Velikost + + + Refresh the list + Obnovit seznam + + + Total size of the parsed data + Celková velikost parsovaných dat + + + Total number of parsed lines + Celkový počet parsovaných řádků + + + Start parsing the selected files + Začněte analyzovat vybrané soubory + + + START + START + + + Time elapsed since the start + Doba uplynula od začátku + + + Average speed, in parsed data size per second + Průměrná rychlost, velikost parsovaných dat za sekundu + + + Web Server + Webový server + + + Select a Web Server + Vybrat webový server + + + Year + Rok + + + Month + Měsíc + + + Day + Den + + + Hour + Hodina + + + Draw the chart + Nakreslit graf + + + Log line marked as Warning + Řádka záznamu označená jako Varování + + + Date when the request arrived (YYYY-MM-DD) + Datum doručení žádosti (RRRR-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Čas doručení žádosti (hh:mm:ss) + + + Protocol of the request + Protokol o žádosti + + + Method of the request + Způsob žádosti + + + URI of the requested page + URI požadované stránky + + + Query carried along with the URI + Dotaz provedený spolu s URI + + + Response code from the server + Kód odezvy ze serveru + + + User-agent of the client which made the request + Uživatel-agent klienta, který podal žádost + + + IP address of the Client which made the request + IP adresa klienta, který podal žádost + + + Cookie used for the request + Cookie použitý pro žádost + + + The URL which redirected the Client to the requested page + URL, které přesměrovalo klienta na požadovanou stránku + + + Size ib Bytes of the request, usually includes header and data + Velikost ib Byty žádosti, obvykle zahrnuje hlavičku a data + + + Size in Bytes of the served content, usually includes header and data + Velikost podávaného obsahu v Bajtech obvykle zahrnuje hlavičku a data + + + Time taken by the server to serve the content, in milliseconds + Čas potřebný serverem k podání obsahu v milisekundách + + + Only use lines in which the field is starting with this string + Používejte pouze řádky, ve kterých pole začíná tímto řetězcem + + + Protocol: + Protokol: + + + Method: + Metoda: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Použijte pouze řádky, ve kterých pole odpovídá tomuto příkazu. +Použít '!', '=', '<' nebo '>' k prohlášení, co používat + + + Response: + Odpověď: + + + Query: + Dotaz: + + + URI: + URI: + + + Filters + Filtry + + + Count + Počet + + + Number of occurrences + Počet událostí + + + Item + Položka + + + Value of the field + Hodnota pole + + + From: + Od: + + + To: + Pro: + + + Select a log field to view + Vyberte pole záznamu pro zobrazení + + + Field: + Pole: + + + Filter: + Filtr: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + S řetězci budou použity pouze řádky, ve kterých pole začíná tímto řetězcem. +S čísly, použijte '!', '=',' <' nebo '>' k prohlášení, co použít + + + Protocol + Protokol + + + Method + Metoda + + + URI + URI + + + User-agent + Uživatelský agent + + + Most recurrent + Většina opakování + + + Most trafficked + Většina přepravy + + + Date ever + Datum vůbec + + + Day of the week + Den v týdnu + + + Hour of the day + Hodina dne + + + Time taken + Uplynulý čas + + + Bytes sent + Byty odeslány + + + Bytes received + Obdržené byty + + + Mean/Max performances + Průměr/max výkonů + + + Requests received + Přijaté žádosti + + + Total work + Celkem práce + + + General + Obecné + + + Window + Okno + + + Dialogs + Dialogy + + + Charts + Grafy + + + Appearance + Vzhled + + + Speed + Rychlost + + + Relational + Související + + + TextBrowser + Prohlížeč textu + + + Databases + Databáze + + + Security + Bezpečnost + + + Logs + Záznamy + + + Defaults + Výchozí + + + Control + Kontrola + + + Path + Cesta + + + Format + Formát + + + Warnlists + Warnlists + + + Blacklists + Černolisté + + + Remember the window's position and size + Pamatujte si pozici a velikost okna + + + Remember position and size + Pamatujte si pozici a velikost + + + Remember window's position and size + Zapamatujte si polohu a velikost okna + + + Geometry + Geometrie + + + Theme to use for the window + Motiv k použití pro okno + + + Theme + Motiv + + + Native + Indián + + + Light + Světlo + + + Dark + Tma + + + Auto + Automaticky + + + Icons + Ikony + + + Normal quantity of dialog messages shown + Normální množství zobrazených dialogových zpráv + + + Normal + Normální + + + Dialogs from the main processes + Dialogy z hlavních procesů + + + Dialogs emitted when parsing logs + Dialogy vydané při analýze logů + + + Logs parser + Parser na dřevo + + + Dialogs emitted when viewing statistics + Dialogy emitované při prohlížení statistik + + + Statistics viewer + Prohlížeč statistik + + + Define the quantity of dialog mesages shown + Definovat množství zobrazených zmatků dialogů + + + Dialogs level + Úroveň dialogů + + + Reduced quantity of dialog messages shown + Snížené množství zobrazených dialogových zpráv + + + Essential + Základní + + + Augmented quantity of dialog messages shown + Vybrané množství zobrazených dialogových zpráv + + + Explanatory + Vysvětlení + + + Theme to use for the Charts + Motiv pro grafy + + + Preview + Náhled + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Představuje krok v časové ose v sekundách. +Všechny hodnoty padající do stejného intervalu budou sloučeny a bude použita průměrná hodnota. + + + Time interval + Časový interval + + + The format to use for the labels of the time axis. + Formát pro označení časové osy. + + + Time format + Formát času + + + The size of the pie + Velikost koláče + + + Pie size + Velikost koláče + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Maximální počet plátků, ze kterých bude koláč složen. +Překročení plátků bude seskupeno do jednoho komplexního plátku. + + + Maximum slices + Maximální plátky + + + Font to use for the Text Browser + Písmo pro textový prohlížeč + + + Font + Písmo + + + Double-spaced lines + Dvojstranné čáry + + + Use wide lines + Použít široké čáry + + + Define the spacing between lines + Definovat vzdálenost mezi řádky + + + Lines spacing + Rozmezí linií + + + None + Žádné + + + Color scheme to use for the Text Browser + Barevné schéma pro textový prohlížeč + + + Color scheme + Barevné schéma + + + The appearance of the Text Browser with the current settings + Vzhled textového prohlížeče s aktuálním nastavením + + + Insert the base path only, file name excluded + Vložit pouze základní cestu, název souboru vyloučen + + + The given path doen't exists, or doesn't point to a folder + Zadaná cesta neexistuje nebo neukazuje na složku + + + Path for the database files + Cesta pro databázové soubory + + + Paths + Cesty + + + Apply the current path + Použít současnou cestu + + + Select the path through a dialog window + Vybrat cestu oknem dialogu + + + Path where the logs data collection database is located + Cesta, kde se nachází databáze pro sběr údajů + + + Logs data + Údaje záznamů + + + Path where the used files hashes database is located + Cesta, kde se nachází použitá databáze souborů hashes + + + Used files + Použité soubory + + + Backup options for the Logs Data database + Možnosti zálohování databáze Logs Data + + + Backups + Zálohování + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Nová záloha je provedena při uzavření LogDoctor poté, co úspěšně upravil databázi + + + Backup the Logs Data database and keep + Zálohování databáze záznamů a vedení + + + Whether it is allowed or denied to follow symlinks occuring in a path + Ať už je dovoleno nebo odepřeno sledovat symlinks, které se vyskytují v cestě + + + Follow symlinks + Následujte symlinky + + + Default WebServer + Výchozí WebServer + + + Usage control + Kontrola používání + + + Hide already used files + Skrýt již použité soubory + + + Size warnings + Varování velikosti + + + Warn me when using files with a size exceeding: + Varujte mě při použití souborů o velikosti převyšující: + + + Logs folder + Složka záznamů + + + Logs format string + String formátu záznamů + + + Format string + Formátovací řetězec + + + Insert the format string you're using + Vložte řetězec formátu, který používáte + + + Apply the current string + Použít aktuální řetězec + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generovat vzorek log řádek z aktuálně uložené řetězce, zkontrolovat, zda je správně formátován. +Každé pole, které není považováno LogDoctorem, se objeví jako 'DISCARDED' + + + Generate sample + Generovat vzorek + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Zkontrolujte prosím správnost tohoto řádku. +Pole označená jako 'DISCARDED' byla rozebrána správně, ale nejsou považována za LogDoctor + + + Open an help window + Otevřete okno nápovědy + + + Help + Pomoc + + + Select a log field + Vybrat pole záznamu + + + Use warnlist for this field + Použít seznam varování pro toto pole + + + Add the current line to the list + Přidat aktuální řádek do seznamu + + + Remove the selected item from the list + Odstranit vybranou položku ze seznamu + + + Move the selected item down + Přesunout vybranou položku dolů + + + Use blacklist for this field + Použít černý seznam pro toto pole + + + Add line + Přidat řádek + + + Remove selection + Odstranit výběr + + + Language + Jazyk + + + Utilities + Nástroje + + + Tools + Nástroje + + + Games + Hry + + + Perform a version-check + Proveďte kontrolu verze + + + Show some info about LogDoctor + Zobrazit nějaké informace o LogDoctor + + + Open a block-note like window to write temporary text + Otevřít blok-note jako okno pro zápis dočasného textu + + + Play CrissCross + Zahrajte CrissCross + + + Play Snake + Zahrajte Snake + + + Show the changelog + Zobrazit seznam změn + + + warnlist + Seznam varování + + + blacklist + černý seznam + + + copy + kopírovat + + + copies + kopie + + + Check updates + Kontrola aktualizací + + + Infos + Informace + + + BlockNote + Bloková poznámka + + + CrissCross + CrissCross + + + Snake + had + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Vybrat soubor ze seznamu + + + to inspect its content + kontrola obsahu + + + Failed to read + Selhalo čtení + + + + SnakeGame + + PLAY + HRU + + + Classic + Klasický + + + Hunt + Lov + + + Battle + Boj + + + Game Over + Konec hry + + + Your adversary fell in the water! + Tvůj protivník spadl do vody! + + + YOU WON! + Vyhrál jsi! + + + You fell in the water! + Spadl jsi do vody! + + + YOU LOST! + Prohrál jsi! + + + Your adversary ate itself! + Tvůj protivník se sám snědl! + + + You ate yourself! + Snědla ses! + + + Your adversary ate you! + Tvůj protivník tě sežral! + + + You ate your adversary! + Snědl jsi svého protivníka! + + + You ate each other! + Snědli jste se! + + + MATCH IS DRAW! + MATCH SE kreslí! + + + + TR + + Unexpected WebServer + Neočekávaný WebServer + + + Logs Size Breakdown + Rozpis velikosti záznamů + + + Ignored + Ignorováno + + + Parsed + Parsované + + + Blacklisted + Černý seznam + + + Others + Ostatní + + + from + od + + + to + + + + Log Lines Marked as Warning + Logické čáry označené jako varování + + + Time Taken to Serve Requests + Čas potřebný k podávání žádostí + + + Time of Day Count + Čas počtu dnů + + + Relational Count + Počet příbuzných + + + FALSE + FALSE + + + TRUE + PRAVDA + + + Date + Datum + + + Year + Rok + + + Month + Měsíc + + + Day + Den + + + Time + Čas + + + Hour + Hodina + + + Minute + Minuta + + + Second + Druhý + + + Warning + Varování + + + Protocol + Protokol + + + Method + Metoda + + + URI + URI + + + Query + Dotaz + + + Response code + Kód odpovědi + + + Time taken + Uplynulý čas + + + Bytes sent + Byty odeslány + + + Bytes received + Obdržené byty + + + Referrer + Předkladatel + + + Cookie + Cookie + + + Client + Klient + + + User-agent + Uživatelský agent + + + January + Leden + + + February + Únor + + + March + březen + + + April + Duben + + + May + Květen + + + June + červen + + + July + Červenec + + + August + Srpen + + + September + Září + + + October + Říjen + + + November + Listopad + + + December + prosinec + + + Sunday + Neděle + + + Monday + pondělí + + + Tuesday + Úterý + + + Wednesday + Středa + + + Thursday + Čtvrtek + + + Friday + Pátek + + + Saturday + Sobota + + + diff --git a/logdoctor/translations/LogDoctor_da_DA.ts b/logdoctor/translations/LogDoctor_da_DA.ts new file mode 100644 index 0000000..f7b2349 --- /dev/null +++ b/logdoctor/translations/LogDoctor_da_DA.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versioner + + + Version 4 + Version 4 + + + Version 3 + Version 3 + + + Version 2 + Version 2 + + + Version 1 + Version 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Byg scripts + + + Cross-platform compatibility: + Cross-platform kompatibilitet: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistik: + + + Warnings + Advarsel + + + Speed + Hastighedshastighed + + + Counts + Counts + + + Daytime + Dagstid + + + Relational + Forhold + + + Globals + Globals + + + Translations: + Oversættelser: + + + Italian + Italiensk Italiensk Italiensk + + + Spanish + Spansk spansk spansk spansk + + + French + Fransk fransk fransk + + + Tools: + Værktøj: + + + Block note + Bloker note + + + Utilities: + Hjælpeværktøjer: + + + Infos viewer + Infos viewer + + + Updates checker + Opdaterer checker + + + Themes: + Temaer: + + + Dark + Mørkegrå + + + Light + Lys lys + + + Improvements and fixes + Forbedring og rettelser + + + New themes: + Nye temaer: + + + Ash + Ash Ash Ash + + + Candy + Candy Candy Candy Candy + + + Forest + Skovskov + + + Powder + Pulver + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Ændrede dialoger + + + Doxygen documentation + Doxygen dokumentation + + + Mini-Games: + Minispil: + + + Criss-cross + Crisss-cross + + + Snake + Slange + + + Changed default paths + Ændrede standardstier + + + New game modes for Snake + Nye spiltilstande til Snake + + + Hunt + Hunt Hunt Hunt + + + Battle + Slaget ved Battle + + + New translations: + Nye oversættelser: + + + Japanese + Japansk japansk + + + Portuguese + Portugisisk portugisisk + + + Code improvements + Code forbedringer + + + Performance improvements + præstationsforbedringer + + + Added tests suite: + Tilføjet test suite: + + + white box tests + hvid boks test + + + Customized charts themes + Tilpassede diagrammer temaer + + + Fixes + Fixes + + + Tests improvements + Test af forbedringer + + + Docker support + Docker support + + + Upgrade to C++20 + Opgrader til C++20 + + + Upgrade to Qt6 + Opgrader til Qt6 + + + Restyled themes + Restilerede temaer + + + Redesigned configs section + Redesignet configs sektion + + + Stability improvements + Stabilitetsforbedringer + + + Generating warnings dinamically + Generende advarsler dinamisk + + + New tool: + Nyt værktøj: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Præcise parametre for nogle af diagrammerne: + + + Improved project structure + Forbedret projektstruktur + + + Modernized Cmake usage + Moderne moderniseret Cmake brug + + + + Crapinfo + + Version + Version Version Version + + + Currently installed version of the software + I øjeblikket installeret version af softwaren + + + Repository links + Repository links + + + Paths + Veje + + + The path of the executable file + Vejen til den eksekverbare fil + + + Executable + Udførelse + + + The path where the configuration file gets saved and searched in + Den sti, hvor konfigurationsfilen bliver gemt og søgt på + + + Configuration file + Konfiguration af fil + + + The path where the application searches for extra resources + Vejen, hvor applikationen søger efter ekstra ressourcer + + + Application data + Ansøgningsdata + + + + Crapnote + + Reduce the font size + Reducer skriftstørrelsen + + + Font size + Skriftstørrelse + + + Increase the font size + Forøg skriftstørrelsen + + + + Crappath + + Choose + Vælg Vælg Vælg Vælg + + + Cancel + Annuller Annuller Annuller Annuller Annuller + + + + Crapup + + Checking for updates + Kontrol af opdateringer + + + New version available + Ny version tilgængelig + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + En ny version er tilgængelig! +Besøg LogDoctor's git-lager og følg instruktionerne om, hvordan du opdaterer + + + No update found + Ingen opdatering fundet + + + LogDoctor is up-to-date + LogDoctor er opdateret + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Du kører en version fra fremtiden! +Din version er ud over den nuværende upstream-version +Kører du den originale LogDoctor? +Besøg vores arkiv og få en frisk version af det + + + Failed to establish a connection + Detaljeret at oprette en forbindelse + + + Connection error, please try again later + Tilslutningsfejl, prøv igen senere + + + Connection timed out + Tilslutningstidend ud + + + Version check failed + Version check mislykkedes + + + An error occured while parsing: +version mark not found + En fejl opstår, mens du parsing: +Versionsmærke findes ikke + + + An error occured while parsing: +malformed version + En fejl opstår, mens du parsing: +misdannet version + + + An error occured while comparing: +malformed upstream version + En fejl opstår, mens du sammenligner: +fejldannet opstrøm version + + + + CrissCross + + Victory + Sejr + + + You beated me! + Du begav mig! + + + This time you lost! + Denne gang du tabte! + + + Draw + Tegning + + + Nice match + Nice match + + + + DialogBool + + Yes + Ja + + + No + Ingen Ingen + + + + DialogIda + + Ignore + Ignorer + + + Discard + Diskard + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + En af listerne har et ugyldigt produkt + + + An error occured while reading the configuration file + En fejl opstod, mens du læser konfigurationsfilen + + + An error occured while parsing configuration file's data + En fejl, der opstår, mens du udfylder konfigurationsfilens data + + + Failed to create the configuration file's directory + Detaljeret for at oprette konfigurationsfilens mappe + + + Failed to create the configuration file + Detaljeret for at oprette konfigurationsfilen + + + An error occured while writing the configuration file + En fejl opstod, mens du skriver konfigurationsfilen + + + An error occured while preparing the configuration file's data + En fejl opstod, mens du forbereder konfigurationsfilens data + + + The path contains a symlink + Stien indeholder et symlink + + + The file does not exist + Filen findes ikke + + + Failed to create the database backups' directory + Detaljeret for at oprette database backups' mappe + + + Failed to copy the database file + Detaljeret at kopiere databasefilen + + + Failed to update the backups + Detaljeret at opdatere sikkerhedskopierne + + + Failed to create the directory + Detaljeret for at oprette mappen + + + Unrecognized entry + Ukendt indrejse + + + Size of the file + Størrelsen af filen + + + Warning size parameter + Advarselsstørrelse parameter + + + Failed to read gzipped file + Detaljeret at læse gzipped-fil + + + An error occured while parsing the format string + En fejl opstår, mens du parrer formatstrengen + + + Available memory + Tilgængelig hukommelse + + + Size of the logs + Størrelse af logfiler + + + An error occured while reading the gzipped file + En fejl opstod, mens du læser gzipped-filen + + + An error occured while reading the file + En fejl opstod, mens du læser filen + + + Something failed while handling the file + Noget mislykkedes, mens du håndterer filen + + + An error occured while working on the database + En fejl opstod, mens du arbejder på databasen + + + Aborting + Aboring + + + Invalid locale + Ugyldig lokale + + + Unexpected locale format + Uventet lokalformat + + + If you haven't manually edited the configuration file, +please report this issue + Hvis du ikke manuelt har redigeret konfigurationsfilen, +Venligst rapportere dette problem + + + The given locale is not an accepted language + Den givne lokal er ikke et accepteret sprog + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Hvis du gerne vil have denne lokale i LogDoctor, +Følg instruktionerne på lagersiden + + + Configuration file not found + Konfigurationsfilen ikke fundet + + + Unable to retrieve the configuration file + Kan ikke hente konfigurationsfilen + + + Skipping + Skipping + + + An error occured while handling the configuration file + En fejl opstod, mens du håndterer konfigurationsfilen + + + Failed to write the configuration file + Detaljeret at skrive konfigurationsfilen + + + Current configuration not saved + Nuværende konfiguration ikke gemt + + + File not readable + Fil ikke læses + + + The file is not readable + Filen kan ikke læses + + + File not writable + Fil ikke writable + + + The file is not writable + Filen er ikke tilgængelig + + + Directory not writable + Oversættelse af websiden + + + The directory is not writable + Skabelonen er ikke tilgængelig + + + Invalid path + Ugyldig vej + + + Failed applying configuration + Detaljeret anvendelse af konfiguration + + + Invalid configuration lines + Ugyldig konfigurationslinjer + + + Has not been possible to apply some of the configurations + Har ikke været muligt at anvende nogle af konfigurationerne + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Hvis du vælger at fortsætte, vil alle de uapplierede konfigurationer gå tabt +Fortsæt? + + + Failed to retrieve the help file + Detaljeret for at hente hjælpefilen + + + An error occured while getting the help file + En fejl opstod, mens du får hjælpefilen + + + Additional resources can be downloaded from the git repo + Yderligere ressourcer kan downloades fra git repo + + + Unable to retrieve the file + Kan ikke hente filen + + + Invalid string + Ugyldig streng + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Den givne streng er ugyldig og kan ikke føjes til listen + +Ret venligst den og retry + + + QSql driver not found + QSql driver ikke fundet + + + Failed to retrieve the driver needed to handle the database + Detaljeret at hente den driver, der er nødvendig for at håndtere databasen + + + File not found + Filen blev ikke fundet + + + Failed to retrieve the database file + Detaljeret at hente databasefilen + + + Create a new database? + Opret en ny database? + + + The database contains an unexpected table + Databasen indeholder et uventet bord + + + Unexpected table + Uventet bord + + + It seems that the database is missing a table + Det ser ud til, at databasen mangler en tabel + + + Table not found + Tabel ikke fundet + + + The database contains an unexpected column + Databasen indeholder en uventet kolonne + + + Unexpected column + Uventet kolonne + + + It seems that the table is missing a column + Det ser ud til, at tabellen mangler en kolonne + + + Column not found + Ikke fundet + + + A column has an unexpected data-type + En kolonne har en uventet datatype + + + Unexpected data-type + Uventet datatype + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Denne database vil blive omdøbt med en trailing '.copy' og en ny vil blive oprettet. +Fortsæt? + + + Database created + Database oprettet + + + Successfully created a new database + Skabt en ny database + + + Not a file + Ikke en fil + + + The path was supposed to point to a file, but it doesn't + Stien skulle pege på en fil, men det gør ikke + + + Please remove the conflict and retry + Fjern konflikten og retry + + + The database file is not readable + Databasefilen kan ikke læses + + + Please set the proper permissions and retry +If this error persists, please report this issue + Angiv venligst de relevante tilladelser og retry +Hvis denne fejl fortsætter, bedes du rapportere dette problem + + + The database file is not writable + Databasefilen er ikke tilgængelig + + + Invalid database path + Ugyldig databasesti + + + Failed creating database + Detaljeret oprettelse af database + + + An error occured while creating the database + En fejl opstod, mens du opretter databasen + + + Failed opening database + Detaljeret åbningsdatabase + + + An error occured while opening the database + En fejl opstod, mens du åbner databasen + + + Failed executing on database + Detaljeret udførelse på database + + + An error occured while executing a statement on the database + En fejl opstod, mens du udfører en erklæring på databasen + + + Failed to backup database + Detaljeret til backup database + + + Please report this issue + Rapporter dette problem + + + Invalid log format string + Ugyldig log format streng + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Tjek venligst, at der ikke bliver kastet fejl af din WebServer +Hvis det bliver accepteret, skal du kontrollere tilstedeværelsen af en typografi her +Hvis alt er fint, bedes du rapportere dette problem + + + Log format error + Log formatfejl + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + log format er ikke blevet indstillet, eller er ugyldig +Tilføj en gyldig i konfigurationerne + + + Misconfigured log format + Fejlkonfigureret log format + + + No log field has been set in the current logs format, +making it useless to parse logs + Ingen log felt er blevet indstillet i det aktuelle logformat, +gøre det ubrugeligt at parse logs + + + Please set up a format which contains at least one field + Opsæt et format, der indeholder mindst ét felt + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + En separator mangler mellem et eller flere felter, +gør det svært at etablere net bundete, +og muligvis fører til at gemme forkerte data + + + Please set up a format which contains separators between fields + Opsæt et format, der indeholder separatorer mellem felter + + + Missing field in log format + Manglende felt i log format + + + An important field is missing from the provided format: + Et vigtigt felt mangler fra det angivne format: + + + The quality of the statistics may be seriously compromized + Statistikets kvalitet kan være alvorligt compromized + + + Proceed anyway? + Er du alligevel? + + + 'Carriage Return' in log format + 'Carriage Return' i log format + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Det angivne format indeholder 'Carriage Return'. +Dette kan føre til tab af data eller nedbrud, hvis ikke anvendes med forsigtighed + + + An error occured while parsing logs + En fejl opstod, mens du parsingslog + + + Failed defining type + Detaljeret definerende type + + + Failed to determine the log type + Detaljeret for at afgøre logtypen + + + File already used + Fil, der allerede bruges + + + The file has probably been used already + Filen har sandsynligvis været brugt allerede + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorer advarsel og brug det alligevel, Discard det og fortsætte, eller Abort hele processen? + + + Duplicate file + Dubleret fil + + + The file appears twice in the list of selections + Filen vises to gange på listen over valg + + + Failed updating hashes + Detaljeret opdatering af hashes + + + An error occured while inserting the parsed files hashes into the database + En fejl opstod, mens du indsætter de parsed filer hashes i databasen + + + File exceeds warning size + Fil overskrider advarselsstørrelse + + + The file's size exceeds the warning size + Filens størrelse overstiger advarselsstørrelsen + + + Not enough memory + Ikke nok hukommelse + + + The total size of the selected files exceeds the available memory + Den samlede størrelse af de valgte filer overstiger den tilgængelige hukommelse + + + Please free some resources, parse the files in different steps or split them into smaller units + Gratis nogle ressourcer, parse filerne i forskellige trin eller opdele dem i mindre enheder + + + Failed reading + Detaljeret læsning + + + File is empty + Fil er tom + + + The file is blank + Filen er blank + + + Failed to retrieve the selected file + Detaljeret at hente den valgte fil + + + Discard it and continue, or Abort all and exit? + Diskard det og fortsætte, eller Abort alt og udgang? + + + No file to parse + Ingen fil til parse + + + The list of files to parse is empty + Listen af filer til parse er tomt + + + Directory not found + Kategori ikke fundet + + + The directory does not exists + Biblioteket findes ikke + + + Directory not readable + Oversættelse af websiden + + + The directory is not readable + Skabelonen kan ikke læses + + + Please set the proper permissions before to start + Angiv venligst de relevante tilladelser, før du starter + + + Failed creating directory + Detaljeret oprettelse af mappe + + + The path does not exists + Vejen findes ikke + + + Data conversion failed + Datakonvertering mislykkedes + + + Failed to convert from '%1' to '%2' + Detaljeret at konvertere fra "%1" til "%2" + + + Failed to create statistics + Detaljeret for at oprette statistik + + + An error occured while processing + En fejl opstår, mens du behandler + + + Cannot create statistics + Kan ikke oprette statistik + + + No data has been found that matches with the currently set parameters + Ingen data er fundet, der matcher de aktuelt indstillede parametre + + + Not a folder + Ikke en mappe + + + The path was supposed to point to a folder, but it doesn't + Stien skulle pege på en mappe, men det gør ikke + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Indgangen vil blive omdøbt med en trailing '.copy' og en ny vil blive skabt. +Fortsæt? + + + An error occured + En fejl opstår + + + Failed renaming + Detaljeret renaming + + + An error occured while renaming + En fejl opstod, mens du renamer + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parse logs fra Apache2 webserver + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse logs fra Nginx webserver + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parseloger fra Microsoft IIS webserver + + + IIS + IIS + + + Select/deselect all the files + Vælg/vælg alle filerne + + + All + Alle + + + Inspect a log file + Undersøg en logfil + + + Name + Navn Navn + + + Size + Størrelse Størrelse Størrelse Størrelse + + + Refresh the list + Opdater listen + + + Total size of the parsed data + Samlet størrelse af parsed data + + + Total number of parsed lines + Samlet antal parsed linjer + + + Start parsing the selected files + Start parsing af de valgte filer + + + START + Start START + + + Time elapsed since the start + Tiden udløb siden starten + + + Average speed, in parsed data size per second + Gennemsnitlig hastighed, i parsed data størrelse pr. sekund + + + Web Server + Web Server + + + Select a Web Server + Vælg en webserver + + + Year + Årsår + + + Month + Månedsmåneder + + + Day + Dagsdagsdagen + + + Hour + Time Hour Hour + + + Draw the chart + Tegn diagrammet + + + Log line marked as Warning + Log linje markeret som advarsel + + + Date when the request arrived (YYYY-MM-DD) + Dato, når anmodningen ankom (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Tid, når anmodningen ankom (hh:mm:ss) + + + Protocol of the request + Protokol af anmodningen + + + Method of the request + Metode af anmodningen + + + URI of the requested page + URI af den anmodede side + + + Query carried along with the URI + Forespørgsel udført sammen med URI + + + Response code from the server + Svarkode fra serveren + + + User-agent of the client which made the request + Brugeragent af den klient, der gjorde anmodning + + + IP address of the Client which made the request + IP-adressen på den klient, der har foretaget anmodning + + + Cookie used for the request + Cookie, der bruges til anmodning + + + The URL which redirected the Client to the requested page + Den webadresse, der omdirigerede Klienten til den ønskede side + + + Size ib Bytes of the request, usually includes header and data + Størrelse ib Bytes af anmodningen, normalt omfatter header og data + + + Size in Bytes of the served content, usually includes header and data + Størrelse i Bytes af det serveret indhold, normalt omfatter header og data + + + Time taken by the server to serve the content, in milliseconds + Tid taget af serveren til at tjene indholdet, i millisekunder + + + Only use lines in which the field is starting with this string + Brug kun linjer, hvor feltet starter med denne streng + + + Protocol: + protokol: + + + Method: + Metode: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Brug kun linjer, som feltet matcher denne erklæring. +Brug '!', '=', '<' eller '>' for at erklære, hvad du skal bruge + + + Response: + Svar: + + + Query: + Forespørgsel: + + + URI: + URI: + + + Filters + Filtre + + + Count + Nedtælling + + + Number of occurrences + Antal forekomster + + + Item + Varenummer + + + Value of the field + Værdi for feltet + + + From: + Fra: + + + To: + Til: + + + Select a log field to view + Vælg et logfelt for at se + + + Field: + Felt: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Med strenge, kun de linjer, som feltet starter med denne streng vil blive brugt. +Med tal, brug '!', '=', '<' eller '>' for at erklære, hvad der skal bruges + + + Protocol + protokolprotokollen + + + Method + Metode Metode Metode Metode + + + URI + URI + + + User-agent + Brugeragent + + + Most recurrent + Mest tilbagevendende + + + Most trafficked + Mest trafikerede + + + Date ever + Dato nogensinde + + + Day of the week + Dag i ugen + + + Hour of the day + Dagens time + + + Time taken + Tid taget + + + Bytes sent + Aftes sendt + + + Bytes received + Aftes modtaget + + + Mean/Max performances + Mean/Max forestillinger + + + Requests received + Anmodninger modtaget + + + Total work + Totalt arbejde + + + General + Generelle Generelle Generelle Generelle Generelle + + + Window + Vindue Vindue Vindue + + + Dialogs + Dialoger + + + Charts + Charts + + + Appearance + Udseende Udseende + + + Speed + Hastighedshastighed + + + Relational + Forhold + + + TextBrowser + TekstBrowser + + + Databases + Databaser + + + Security + Sikkerhed for sikkerhed + + + Logs + Log ind + + + Defaults + Standarder + + + Control + Kontrolstyring + + + Path + Vejvej + + + Format + Formateringsformat + + + Warnlists + Warnlists + + + Blacklists + Sortlister + + + Remember the window's position and size + Husk vinduets position og størrelse + + + Remember position and size + Husk position og størrelse + + + Remember window's position and size + Husk vinduesposition og størrelse + + + Geometry + Geometry + + + Theme to use for the window + Tema til brug for vinduet + + + Theme + Tematema + + + Native + Indfødte + + + Light + Lys lys + + + Dark + Mørkegrå + + + Auto + Auto Auto Auto + + + Icons + Ikoner + + + Normal quantity of dialog messages shown + Normal mængde af dialogmeddelelser vist + + + Normal + Normal + + + Dialogs from the main processes + Dialoger fra de vigtigste processer + + + Dialogs emitted when parsing logs + Dialoger, der udsendes, når der skal skrives + + + Logs parser + Loger parser + + + Dialogs emitted when viewing statistics + Dialoger, der udsendes ved visning af statistik + + + Statistics viewer + Statistikvisninger + + + Define the quantity of dialog mesages shown + Definer mængden af dialog mesages vist + + + Dialogs level + Dialoger niveau + + + Reduced quantity of dialog messages shown + Reduceret antal dialogmeddelelser vist + + + Essential + Væsentligt vigtigt + + + Augmented quantity of dialog messages shown + Augmented mængde af dialogmeddelelser vist + + + Explanatory + Eksplanerende + + + Theme to use for the Charts + Tema til brug for Charts + + + Preview + Forhåndsvisning + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Repræsenter et trin i tidsaksen på få sekunder. +Alle de værdier, der falder inde i det samme interval, vil blive flettet, og den gennemsnitlige værdi vil blive brugt. + + + Time interval + Tidsinterval + + + The format to use for the labels of the time axis. + Formatet til brug for etiketterne af tidsaksen. + + + Time format + Tidsformat + + + The size of the pie + Størrelsen af tærte + + + Pie size + Pie størrelse + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Det maksimale antal skiver, som tærten består af. +Udelagte skiver vil blive grupperet i en samlet skive. + + + Maximum slices + Maksimume skiver + + + Font to use for the Text Browser + Font at bruge til tekstbrowseren + + + Font + Skrifttyper + + + Double-spaced lines + Dobbelte linjer + + + Use wide lines + Brug brede linjer + + + Define the spacing between lines + Definer afstanden mellem linjer + + + Lines spacing + Linjeafstand + + + None + Ingen Ingen Ingen + + + Color scheme to use for the Text Browser + Farveskema til brug for Tekstbrowseren + + + Color scheme + Farvesammensætning + + + The appearance of the Text Browser with the current settings + Udseendet af Text Browser med de aktuelle indstillinger + + + Insert the base path only, file name excluded + Indsæt kun basisvejen, filnavn udelukket + + + The given path doen't exists, or doesn't point to a folder + Den givne sti eksisterer ikke, eller peger ikke på en mappe + + + Path for the database files + Sti til databasefiler + + + Paths + Veje + + + Apply the current path + Anvend den aktuelle vej + + + Select the path through a dialog window + Vælg stien gennem et dialogvindue + + + Path where the logs data collection database is located + Path hvor logdataopsamlingsdatabase er placeret + + + Logs data + Log ind data + + + Path where the used files hashes database is located + Path hvor de brugte filer hashes database er placeret + + + Used files + Brugte filer + + + Backup options for the Logs Data database + Backup muligheder for Logs Data database + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + En ny sikkerhedskopi foretages, når du lukker LogDoctor efter at have succesfuldt redigeret databasen + + + Backup the Logs Data database and keep + Sikkerhedskopiere logdatadatabasen og holde + + + Whether it is allowed or denied to follow symlinks occuring in a path + om det er tilladt eller nægtet at følge symlinks, der opstår på en vej + + + Follow symlinks + Følg symlinks + + + Default WebServer + Standard webserver + + + Usage control + Brugskontrol + + + Hide already used files + Skjul allerede brugte filer + + + Size warnings + Størrelse advarsler + + + Warn me when using files with a size exceeding: + Warn mig, når du bruger filer med en størrelse over: + + + Logs folder + Log ind mappe + + + Logs format string + Loger format streng + + + Format string + Formatér streng + + + Insert the format string you're using + Indsæt formatstrengen, du bruger + + + Apply the current string + Anvend den aktuelle streng + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generer en prøve log linje fra den aktuelt gemte streng, for at kontrollere, om det bliver formateret korrekt. +Alle felter, der ikke betragtes som 'DISCARDED' + + + Generate sample + Generer prøve + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Tjek venligst korrektheden af denne linje. +Felter markeret som 'DISCARDED' blev parsed korrekt, men betragtes ikke af LogDoctor + + + Open an help window + Åbn et hjælpevindue + + + Help + Hjælp Hjælp Hjælp + + + Select a log field + Vælg et logfelt + + + Use warnlist for this field + Brug advarselsliste til dette felt + + + Add the current line to the list + Tilføj den aktuelle linje til listen + + + Remove the selected item from the list + Fjern det valgte element fra listen + + + Move the selected item down + Flytte det valgte element nede + + + Use blacklist for this field + Brug blacklist til dette felt + + + Add line + Tilføj linje + + + Remove selection + Fjern markeringen + + + Language + Sprogsprog + + + Utilities + Hjælpeværktøjer + + + Tools + Værktøjsværktøjer + + + Games + Spil spil + + + Perform a version-check + Udfør en version-check + + + Show some info about LogDoctor + Vis nogle oplysninger om LogDoctor + + + Open a block-note like window to write temporary text + Åbn et blok-note som vindue for at skrive midlertidig tekst + + + Play CrissCross + Afspil CrisssCross + + + Play Snake + Afspil Snake + + + Show the changelog + Vis ændringslog + + + warnlist + advarselsliste + + + blacklist + blacklist + + + copy + kopi kopi + + + copies + kopier af kopier + + + Check updates + Opdater opdateringer + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + CrisssCross + + + Snake + Slange + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Vælg en fil fra listen + + + to inspect its content + at undersøge indholdet + + + Failed to read + Detaljeret at læse + + + + SnakeGame + + PLAY + Spille PLAY PLAY + + + Classic + Klassisk klassiker + + + Hunt + Hunt Hunt Hunt + + + Battle + Slaget ved Battle + + + Game Over + Spil Over + + + Your adversary fell in the water! + Din modstander faldt i vandet! + + + YOU WON! + DU WON! + + + You fell in the water! + Du faldt i vandet! + + + YOU LOST! + DU LOST! + + + Your adversary ate itself! + Din modstander selv! + + + You ate yourself! + Du spiste dig selv! + + + Your adversary ate you! + Din modstander til dig! + + + You ate your adversary! + Du spiste din modstander! + + + You ate each other! + Du spiste hinanden! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + Uventet webserver + + + Logs Size Breakdown + Loger Størrelse Breakdown + + + Ignored + Ignored + + + Parsed + Pared + + + Blacklisted + Sortliste + + + Others + Andre andre Andre Andre + + + from + fra fra fra + + + to + til at til + + + Log Lines Marked as Warning + Log Lines markeret som advarsel + + + Time Taken to Serve Requests + Tid Taken til at servere forespørgsler + + + Time of Day Count + Tidspunkt for dag Count + + + Relational Count + Forholdstælling + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + Dato Dato Dato + + + Year + Årsår + + + Month + Månedsmåneder + + + Day + Dagsdagsdagen + + + Time + Tidstid + + + Hour + Time Hour Hour + + + Minute + Billig rejse til Minute + + + Second + Andet + + + Warning + Advarsel om advarsel + + + Protocol + protokolprotokollen + + + Method + Metode Metode Metode Metode + + + URI + URI + + + Query + Forespørgsel + + + Response code + Svarkode + + + Time taken + Tid taget + + + Bytes sent + Aftes sendt + + + Bytes received + Aftes modtaget + + + Referrer + Henvisninger + + + Cookie + Cookie- og Cookie-cookie + + + Client + Klient klient + + + User-agent + Brugeragent + + + January + januar januar + + + February + februar februar + + + March + Marts marts + + + April + April + + + May + maj maj maj + + + June + juni juni + + + July + juli juli juli juli + + + August + august august + + + September + september + + + October + oktober + + + November + november november + + + December + december december + + + Sunday + Søndag søndag + + + Monday + Mandag Mandag + + + Tuesday + Tirsdag tirsdag + + + Wednesday + Onsdag onsdag + + + Thursday + Torsdag + + + Friday + Fredag fredag fredag + + + Saturday + Lørdag + + + diff --git a/logdoctor/translations/LogDoctor_de_GE.ts b/logdoctor/translations/LogDoctor_de_GE.ts new file mode 100644 index 0000000..df7043e --- /dev/null +++ b/logdoctor/translations/LogDoctor_de_GE.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versionen + + + Version 4 + Artikel 4 + + + Version 3 + Artikel 3 + + + Version 2 + Artikel 2 + + + Version 1 + Artikel 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Erstellen von Skripten + + + Cross-platform compatibility: + Cross-Plattform-Kompatibilität: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistik: + + + Warnings + Warnungen + + + Speed + Geschwindigkeit + + + Counts + Anzahl + + + Daytime + Tag + + + Relational + Verhältnis + + + Globals + Globale + + + Translations: + Übersetzungen: + + + Italian + Italienisch + + + Spanish + Spanisch + + + French + Französisch + + + Tools: + Werkzeuge: + + + Block note + Blocknote + + + Utilities: + Verwendungen: + + + Infos viewer + Infos zum Event + + + Updates checker + Update-Checker + + + Themes: + Themen: + + + Dark + Dunkel + + + Light + Licht + + + Improvements and fixes + Verbesserungen und Korrekturen + + + New themes: + Neue Themen: + + + Ash + Asche + + + Candy + Süßigkeiten + + + Forest + Wald + + + Powder + Pulver + + + Restyled GUI + Restylierte GUI + + + Restyled dialogs + Restylierte Dialoge + + + Doxygen documentation + Dokumentation von Doxygen + + + Mini-Games: + Minispiele: + + + Criss-cross + Criss-cross + + + Snake + Schlange + + + Changed default paths + Veränderte Standardpfade + + + New game modes for Snake + Neue Spielmodi für Schlange + + + Hunt + Jagd + + + Battle + Schlachten + + + New translations: + Neue Übersetzungen: + + + Japanese + Japan + + + Portuguese + Portugiesisch + + + Code improvements + Verbesserungen des Codes + + + Performance improvements + Leistungsverbesserungen + + + Added tests suite: + Hinzugefügt Tests Suite: + + + white box tests + weiße Box Tests + + + Customized charts themes + Kundenspezifische Charts Themen + + + Fixes + Behebungen + + + Tests improvements + Verbesserungen bei der Prüfung + + + Docker support + Docker Unterstützung + + + Upgrade to C++20 + Upgrade auf C++20 + + + Upgrade to Qt6 + Upgrade auf Qt6 + + + Restyled themes + Restylierte Themen + + + Redesigned configs section + Redesigned configs + + + Stability improvements + Verbesserung der Stabilität + + + Generating warnings dinamically + Warnungen dinamisch generieren + + + New tool: + Neues Werkzeug: + + + Changelog + Änderungen + + + Tweakable parameters for some of the charts: + Tweakable Parameter für einige der Diagramme: + + + Improved project structure + Verbesserung der Projektstruktur + + + Modernized Cmake usage + modernisiert Verwendung von Kuchen + + + + Crapinfo + + Version + Version + + + Currently installed version of the software + Derzeit installierte Version der Software + + + Repository links + Repository-Links + + + Paths + Pfade + + + The path of the executable file + Der Pfad der ausführbaren Datei + + + Executable + Ausführbar + + + The path where the configuration file gets saved and searched in + Der Pfad, in dem die Konfigurationsdatei gespeichert und eingesucht wird + + + Configuration file + Konfigurationsdatei + + + The path where the application searches for extra resources + Der Pfad, in dem die Anwendung nach zusätzlichen Ressourcen sucht + + + Application data + Anwendungsdaten + + + + Crapnote + + Reduce the font size + Reduzieren Sie die Schriftgröße + + + Font size + Schriftgröße + + + Increase the font size + Erhöhen Sie die Schriftgröße + + + + Crappath + + Choose + Wählen + + + Cancel + Abbrechen + + + + Crapup + + Checking for updates + Überprüfung nach Updates + + + New version available + Neue Version verfügbar + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Eine neue Version ist verfügbar! +Bitte besuchen Sie LogDoctor's git Repository und folgen Sie der Anleitung, wie Sie aktualisieren + + + No update found + Kein Update gefunden + + + LogDoctor is up-to-date + LogDoctor ist aktuell + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Du hast eine Version aus der Zukunft! +Ihre Version ist über die aktuelle Upstream-Version hinaus +Führen Sie den ursprünglichen LogDoctor? +Bitte besuchen Sie das LogDoctor-Repository und erhalten Sie eine neue Version davon + + + Failed to establish a connection + Versäumt, eine Verbindung herzustellen + + + Connection error, please try again later + Verbindungsfehler, bitte versuchen Sie es später + + + Connection timed out + Verbindung ausgezeitet + + + Version check failed + Versionskontrolle fehlgeschlagen + + + An error occured while parsing: +version mark not found + Ein Fehler trat beim Parsing auf: +nicht gefunden + + + An error occured while parsing: +malformed version + Ein Fehler trat beim Parsing auf: +Malformierte Version + + + An error occured while comparing: +malformed upstream version + Ein Fehler beim Vergleich: +formierte vorgelagerte Version + + + + CrissCross + + Victory + Sieg + + + You beated me! + Du hast mich betrogen! + + + This time you lost! + Diesmal hast du verloren! + + + Draw + Zeichnung + + + Nice match + Schönes Spiel + + + + DialogBool + + Yes + Ja + + + No + Nein + + + + DialogIda + + Ignore + Ignorieren + + + Discard + Discard + + + Abort + Abbruch + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Eine der Listen hat einen ungültigen Gegenstand + + + An error occured while reading the configuration file + Ein Fehler beim Lesen der Konfigurationsdatei + + + An error occured while parsing configuration file's data + Ein Fehler beim Parsing der Daten der Konfigurationsdatei + + + Failed to create the configuration file's directory + Fehler beim Erstellen des Verzeichnisses der Konfigurationsdatei + + + Failed to create the configuration file + Fehler beim Erstellen der Konfigurationsdatei + + + An error occured while writing the configuration file + Ein Fehler beim Schreiben der Konfigurationsdatei + + + An error occured while preparing the configuration file's data + Bei der Erstellung der Daten der Konfigurationsdatei trat ein Fehler auf + + + The path contains a symlink + Der Pfad enthält einen Symlink + + + The file does not exist + Die Datei existiert nicht + + + Failed to create the database backups' directory + Fehler beim Erstellen des Verzeichnisses der Datenbanksicherungen + + + Failed to copy the database file + Versäumt, die Datenbankdatei zu kopieren + + + Failed to update the backups + Fehler beim Update der Backups + + + Failed to create the directory + Fehler beim Erstellen des Verzeichnisses + + + Unrecognized entry + Nicht erkannter Eintrag + + + Size of the file + Größe der Datei + + + Warning size parameter + Warngrößenparameter + + + Failed to read gzipped file + Nicht zu lesen gzipped Datei + + + An error occured while parsing the format string + Ein Fehler beim Parsing des Formatstrings + + + Available memory + Verfügbarer Speicher + + + Size of the logs + Größe der Protokolle + + + An error occured while reading the gzipped file + Ein Fehler beim Lesen der gzipped Datei auftritt + + + An error occured while reading the file + Ein Fehler beim Lesen der Datei auftritt + + + Something failed while handling the file + Etwas scheiterte beim Umgang mit der Datei + + + An error occured while working on the database + Ein Fehler beim Arbeiten an der Datenbank + + + Aborting + Abbrechen + + + Invalid locale + Invalid locale + + + Unexpected locale format + Unerwartetes lokales Format + + + If you haven't manually edited the configuration file, +please report this issue + Wenn Sie die Konfigurationsdatei nicht manuell bearbeitet haben, +Bitte berichten Sie diese Frage + + + The given locale is not an accepted language + Der angegebene Ort ist keine akzeptierte Sprache + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Wenn Sie dieses Lokal in LogDoctor haben möchten, +Bitte folgen Sie den Anweisungen auf der Repository-Seite + + + Configuration file not found + Konfigurationsdatei nicht gefunden + + + Unable to retrieve the configuration file + Unfähig, die Konfigurationsdatei abzurufen + + + Skipping + Skifahren + + + An error occured while handling the configuration file + Ein Fehler beim Umgang mit der Konfigurationsdatei + + + Failed to write the configuration file + Fehler beim Schreiben der Konfigurationsdatei + + + Current configuration not saved + Aktuelle Konfiguration nicht gespeichert + + + File not readable + Datei nicht lesbar + + + The file is not readable + Die Datei ist nicht lesbar + + + File not writable + Datei nicht schreibbar + + + The file is not writable + Die Datei ist nicht schreibbar + + + Directory not writable + Verzeichnis nicht schreibbar + + + The directory is not writable + Das Verzeichnis ist nicht schreibbar + + + Invalid path + Invalider Pfad + + + Failed applying configuration + Nicht anwendbare Konfiguration + + + Invalid configuration lines + Invalide Konfigurationslinien + + + Has not been possible to apply some of the configurations + war nicht möglich, einige der Konfigurationen anzuwenden + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Wenn Sie sich entscheiden, fortzufahren, werden alle ungenutzten Konfigurationen verloren gehen +Weiter? + + + Failed to retrieve the help file + Fehler beim Abrufen der Hilfedatei + + + An error occured while getting the help file + Ein Fehler trat beim Erhalt der Hilfedatei auf + + + Additional resources can be downloaded from the git repo + Zusätzliche Ressourcen können vom git repo heruntergeladen werden + + + Unable to retrieve the file + Unfähig, die Datei abzurufen + + + Invalid string + Invalid string + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Der angegebene String ist ungültig und kann nicht der Liste hinzugefügt werden + +Bitte korrigieren Sie es und retry + + + QSql driver not found + QSql Treiber nicht gefunden + + + Failed to retrieve the driver needed to handle the database + Fehler beim Abrufen des Treibers, der für die Bearbeitung der Datenbank benötigt wird + + + File not found + Datei nicht gefunden + + + Failed to retrieve the database file + Fehler beim Abrufen der Datenbankdatei + + + Create a new database? + Eine neue Datenbank erstellen? + + + The database contains an unexpected table + Die Datenbank enthält eine unerwartete Tabelle + + + Unexpected table + Unerwartete Tabelle + + + It seems that the database is missing a table + Es scheint, dass die Datenbank eine Tabelle fehlt + + + Table not found + Tabelle nicht gefunden + + + The database contains an unexpected column + Die Datenbank enthält eine unerwartete Spalte + + + Unexpected column + Unerwartete Spalte + + + It seems that the table is missing a column + Es scheint, dass die Tabelle fehlt eine Spalte + + + Column not found + Spalte nicht gefunden + + + A column has an unexpected data-type + Eine Spalte hat einen unerwarteten Datentyp + + + Unexpected data-type + Unerwartete Datenart + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Diese Datenbank wird mit einer nachlaufenden '.copy' umbenannt und eine neue erstellt. +Weiter? + + + Database created + Datenbank erstellt + + + Successfully created a new database + Erfolgreich eine neue Datenbank erstellt + + + Not a file + Nicht eine Datei + + + The path was supposed to point to a file, but it doesn't + Der Pfad sollte auf eine Datei zeigen, aber es ist nicht + + + Please remove the conflict and retry + Bitte entfernen Sie den Konflikt und retry + + + The database file is not readable + Die Datenbankdatei ist nicht lesbar + + + Please set the proper permissions and retry +If this error persists, please report this issue + Bitte setzen Sie die richtigen Berechtigungen und Retry +Wenn dieser Fehler fortbesteht, melden Sie bitte dieses Problem + + + The database file is not writable + Die Datenbankdatei ist nicht schreibbar + + + Invalid database path + Invalider Datenbankpfad + + + Failed creating database + Nicht erstellte Datenbank + + + An error occured while creating the database + Ein Fehler beim Erstellen der Datenbank auftritt + + + Failed opening database + Datenbank nicht geöffnet + + + An error occured while opening the database + Ein Fehler beim Öffnen der Datenbank + + + Failed executing on database + Nicht ausgeführt auf Datenbank + + + An error occured while executing a statement on the database + Ein Fehler bei der Ausführung einer Erklärung auf der Datenbank + + + Failed to backup database + Nicht auf Backup-Datenbank + + + Please report this issue + Bitte melden Sie sich an + + + Invalid log format string + Invalid log format string + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Bitte überprüfen Sie, ob kein Fehler von Ihrem WebServer geworfen wird +Wenn es akzeptiert wird, überprüfen Sie bitte die Anwesenheit eines Typs hier +Wenn alles in Ordnung ist, melden Sie bitte dieses Problem + + + Log format error + Fehler im Format + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Das Log-Format wurde nicht gesetzt oder ist ungültig +Bitte ein gültiges in den Konfigurationen hinzufügen + + + Misconfigured log format + Falsches Protokollformat + + + No log field has been set in the current logs format, +making it useless to parse logs + Im aktuellen Log-Format wurde kein Protokollfeld gesetzt, +es nutzlos zu parse logs + + + Please set up a format which contains at least one field + Bitte ein Format einrichten, das mindestens ein Feld enthält + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Ein Separator fehlt zwischen einem oder mehreren Feldern, +es schwer machen, Netzbindungen zu etablieren, +und möglicherweise dazu führen, falsche Daten zu speichern + + + Please set up a format which contains separators between fields + Bitte ein Format einrichten, das Trennzeichen zwischen Feldern enthält + + + Missing field in log format + fehlendes Feld im Log-Format + + + An important field is missing from the provided format: + Ein wichtiges Feld fehlt aus dem bereitgestellten Format: + + + The quality of the statistics may be seriously compromized + Die Qualität der Statistiken kann ernsthaft beeinträchtigt werden + + + Proceed anyway? + Gehen Sie trotzdem? + + + 'Carriage Return' in log format + 'Carriage Return' im Log-Format + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Das bereitgestellte Format enthält die 'Carriage Return'. +Dies kann zu Datenverlusten oder Abstürzen führen, wenn nicht mit Vorsicht verwendet + + + An error occured while parsing logs + Ein Fehler beim Parsing-Logs auftritt + + + Failed defining type + Nicht definierter Typ + + + Failed to determine the log type + Fehler bei der Bestimmung des Protokolltyps + + + File already used + Datei bereits verwendet + + + The file has probably been used already + Die Datei wurde wahrscheinlich bereits verwendet + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorieren Sie die Warnung und verwenden Sie sie sowieso, Discard it and Continue, oder Abbrechen des gesamten Prozesses? + + + Duplicate file + Duplikate Datei + + + The file appears twice in the list of selections + Die Datei erscheint zweimal in der Auswahlliste + + + Failed updating hashes + Nicht aktualisierte Hashes + + + An error occured while inserting the parsed files hashes into the database + Ein Fehler beim Einfügen der parsierten Dateien hathes in die Datenbank auftritt + + + File exceeds warning size + Datei überschreitet Warngröße + + + The file's size exceeds the warning size + Die Größe der Datei übersteigt die Warngröße + + + Not enough memory + Nicht genug Speicher + + + The total size of the selected files exceeds the available memory + Die Gesamtgröße der ausgewählten Dateien überschreitet den verfügbaren Speicher + + + Please free some resources, parse the files in different steps or split them into smaller units + Bitte befreien Sie einige Ressourcen, parieren Sie die Dateien in verschiedenen Schritten oder teilen Sie sie in kleinere Einheiten + + + Failed reading + Nicht gelesen + + + File is empty + Datei ist leer + + + The file is blank + Die Datei ist leer + + + Failed to retrieve the selected file + Fehler beim Abrufen der ausgewählten Datei + + + Discard it and continue, or Abort all and exit? + Entscheiden und fortfahren oder alles abbrechen und verlassen? + + + No file to parse + Keine Datei zu parse + + + The list of files to parse is empty + Die Liste der Dateien zu parse ist leer + + + Directory not found + Seite nicht gefunden + + + The directory does not exists + Das Verzeichnis existiert nicht + + + Directory not readable + Verzeichnis nicht lesbar + + + The directory is not readable + Das Verzeichnis ist nicht lesbar + + + Please set the proper permissions before to start + Bitte setzen Sie die richtigen Berechtigungen, bevor Sie beginnen + + + Failed creating directory + Nicht erstelltes Verzeichnis + + + The path does not exists + Der Pfad existiert nicht + + + Data conversion failed + Datenkonvertierung fehlgeschlagen + + + Failed to convert from '%1' to '%2' + Nicht umgerechnet von '%1' in '%2' + + + Failed to create statistics + Nicht erstellte Statistiken + + + An error occured while processing + Ein Fehler bei der Verarbeitung + + + Cannot create statistics + Statistik nicht erstellen + + + No data has been found that matches with the currently set parameters + Es wurden keine Daten gefunden, die mit den aktuell eingestellten Parametern übereinstimmen + + + Not a folder + Nicht ein Ordner + + + The path was supposed to point to a folder, but it doesn't + Der Pfad sollte auf einen Ordner zeigen, aber er ist nicht + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Der Eintrag wird mit einer nachlaufenden '.copy' umbenannt und eine neue erstellt. +Weiter? + + + An error occured + Ein Fehler auftritt + + + Failed renaming + Nicht umbenannt + + + An error occured while renaming + Ein Fehler beim Umbenennen auftritt + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parse Protokolle vom Apache2-Webserver + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse Protokolle vom Nginx Webserver + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parse Protokolle vom Microsoft IIS Webserver + + + IIS + IIS + + + Select/deselect all the files + Wählen Sie alle Dateien aus + + + All + Alle + + + Inspect a log file + Inspizieren Sie eine Protokolldatei + + + Name + Name + + + Size + Größe + + + Refresh the list + Die Liste aktualisieren + + + Total size of the parsed data + Gesamtgröße der parsierten Daten + + + Total number of parsed lines + Gesamtzahl der parsierten Zeilen + + + Start parsing the selected files + Starten Sie die Parsierung der ausgewählten Dateien + + + START + HERSTELLUNG + + + Time elapsed since the start + Zeit abgelaufen seit dem Start + + + Average speed, in parsed data size per second + Durchschnittsgeschwindigkeit, in parsierter Datengröße pro Sekunde + + + Web Server + Webserver + + + Select a Web Server + Wählen Sie einen Webserver + + + Year + Jahr + + + Month + Monat + + + Day + Tag + + + Hour + Geruch + + + Draw the chart + Diagramm zeichnen + + + Log line marked as Warning + Logzeile als Warnung markiert + + + Date when the request arrived (YYYY-MM-DD) + Datum, an dem die Anfrage ankam (YYYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Zeit, wenn die Anfrage ankam (hh:mm:ss) + + + Protocol of the request + Protokoll des Antrags + + + Method of the request + Art des Antrags + + + URI of the requested page + URI der angeforderten Seite + + + Query carried along with the URI + Abfrage mit dem URI + + + Response code from the server + Antwortcode vom Server + + + User-agent of the client which made the request + Benutzeragent des Clients, der die Anfrage gemacht hat + + + IP address of the Client which made the request + IP-Adresse des Kunden, die die Anfrage gemacht + + + Cookie used for the request + Cookie für die Anfrage + + + The URL which redirected the Client to the requested page + Die URL, die den Client auf die gewünschte Seite umgeleitet hat + + + Size ib Bytes of the request, usually includes header and data + Größe ib Bytes der Anfrage, in der Regel enthält Header und Daten + + + Size in Bytes of the served content, usually includes header and data + Größe in Bytes des bedienten Inhalts, in der Regel enthält Header und Daten + + + Time taken by the server to serve the content, in milliseconds + Zeit vom Server genommen, um den Inhalt zu bedienen, in Millisekunden + + + Only use lines in which the field is starting with this string + Verwenden Sie nur Zeilen, in denen das Feld mit diesem String beginnt + + + Protocol: + Protokoll: + + + Method: + Methode: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Verwenden Sie nur Zeilen, in denen das Feld dieser Aussage entspricht. +Verwendung '!', '=', '<' oder '>' zur Angabe der Verwendung + + + Response: + Antwort: + + + Query: + Query: + + + URI: + URI: + + + Filters + Filter + + + Count + Anzahl + + + Number of occurrences + Anzahl der Ereignisse + + + Item + Waren + + + Value of the field + Wert des Feldes + + + From: + Von: + + + To: + Zu: + + + Select a log field to view + Wählen Sie ein Protokollfeld aus + + + Field: + Feld: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Bei Strings werden nur die Zeilen verwendet, in denen das Feld mit diesem String beginnt. +mit Zahlen '!', '=', '<' oder '>', um zu erklären, was man benutzt + + + Protocol + Protokoll + + + Method + Methode + + + URI + URI + + + User-agent + Benutzeragent + + + Most recurrent + Die meisten + + + Most trafficked + Die meisten Verkehrsteilnehmer + + + Date ever + Datum je + + + Day of the week + Tag der Woche + + + Hour of the day + Stunde des Tages + + + Time taken + Zeit genommen + + + Bytes sent + Bytes gesendet + + + Bytes received + empfangene Bytes + + + Mean/Max performances + Mittel/Max-Leistungen + + + Requests received + eingegangene Anträge + + + Total work + Gesamtarbeit + + + General + Allgemeines + + + Window + Window + + + Dialogs + Dialog + + + Charts + Diagramme + + + Appearance + Erscheinung + + + Speed + Geschwindigkeit + + + Relational + Verhältnis + + + TextBrowser + TextBrowser + + + Databases + Datenbanken + + + Security + Sicherheit + + + Logs + Logs + + + Defaults + Fehler + + + Control + Steuerung + + + Path + Pfad + + + Format + Format + + + Warnlists + Warnlisten + + + Blacklists + Schwarze Listen + + + Remember the window's position and size + Denken Sie an die Position und Größe des Fensters + + + Remember position and size + Denken Sie an Position und Größe + + + Remember window's position and size + Position und Größe des Fensters + + + Geometry + Geometrie + + + Theme to use for the window + Thema für das Fenster zu verwenden + + + Theme + Thema + + + Native + Native + + + Light + Licht + + + Dark + Dunkel + + + Auto + Auto + + + Icons + Ikonen + + + Normal quantity of dialog messages shown + Normale Anzahl der angezeigten Dialogmeldungen + + + Normal + Normal + + + Dialogs from the main processes + Dialoge aus den wichtigsten Prozessen + + + Dialogs emitted when parsing logs + Dialoge, die beim Abgleich von Protokollen ausgesandt werden + + + Logs parser + Logs parser + + + Dialogs emitted when viewing statistics + Dialoge beim Betrachten von Statistiken + + + Statistics viewer + Statistik Viewer + + + Define the quantity of dialog mesages shown + Definieren Sie die Anzahl der angezeigten Dialog-Mesagen + + + Dialogs level + Dialogebene + + + Reduced quantity of dialog messages shown + Reduzierte Anzahl der angezeigten Dialogmeldungen + + + Essential + Wesentlich + + + Augmented quantity of dialog messages shown + Erweiterte Anzahl der angezeigten Dialognachrichten + + + Explanatory + Erläuterung + + + Theme to use for the Charts + Thema für die Diagramme zu verwenden + + + Preview + Voransicht + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Stellt einen Schritt in der Zeitachse in Sekunden dar. +Alle Werte, die in das gleiche Intervall fallen, werden zusammengeführt und der Mittelwert wird verwendet. + + + Time interval + Zeitintervall + + + The format to use for the labels of the time axis. + Das Format für die Etiketten der Zeitachse. + + + Time format + Zeitformat + + + The size of the pie + Die Größe des Kuchens + + + Pie size + Stückgröße + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Die maximale Anzahl der Scheiben, aus denen der Kuchen zusammengesetzt wird. +Überschüssige Scheiben werden in eine umfassende Scheibe gruppiert. + + + Maximum slices + Maximale Scheiben + + + Font to use for the Text Browser + Schriftart für den Text Browser verwenden + + + Font + Schriftart + + + Double-spaced lines + Doppelgetrennte Linien + + + Use wide lines + Breitlinien verwenden + + + Define the spacing between lines + Definieren Sie den Abstand zwischen Linien + + + Lines spacing + Zeilenabstand + + + None + Keine + + + Color scheme to use for the Text Browser + Farbschema für den Text Browser verwenden + + + Color scheme + Farbschema + + + The appearance of the Text Browser with the current settings + Das Aussehen des Textbrowsers mit den aktuellen Einstellungen + + + Insert the base path only, file name excluded + Nur den Basispfad einfügen, Dateiname ausgeschlossen + + + The given path doen't exists, or doesn't point to a folder + Der angegebene Pfad existiert nicht oder zeigt nicht auf einen Ordner + + + Path for the database files + Pfad für die Datenbankdateien + + + Paths + Pfade + + + Apply the current path + Den aktuellen Pfad anwenden + + + Select the path through a dialog window + Wählen Sie den Pfad durch ein Dialogfenster + + + Path where the logs data collection database is located + Pfad, auf dem sich die Datenerfassungsdatenbank befindet + + + Logs data + Daten protokollieren + + + Path where the used files hashes database is located + Pfad, wo die verwendeten Dateien Hashes Datenbank befindet + + + Used files + Gebrauchte Dateien + + + Backup options for the Logs Data database + Sicherungsoptionen für die Datendatenbank Logs + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Ein neues Backup wird beim Schließen von LogDoctor nach sorgfältiger Bearbeitung der Datenbank erstellt + + + Backup the Logs Data database and keep + Backup der Logs Data Datenbank und halten + + + Whether it is allowed or denied to follow symlinks occuring in a path + Ob es erlaubt oder verweigert wird, Symlinks zu folgen, die in einem Pfad auftreten + + + Follow symlinks + Symlinks folgen + + + Default WebServer + Default WebServer + + + Usage control + Nutzungskontrolle + + + Hide already used files + bereits verwendete Dateien verbergen + + + Size warnings + Größenwarnungen + + + Warn me when using files with a size exceeding: + Warnen Sie mich, wenn Sie Dateien mit einer Größe von mehr als: + + + Logs folder + Logs Ordner + + + Logs format string + Logs format string + + + Format string + Format string + + + Insert the format string you're using + Legen Sie die Formatfolge ein, die Sie verwenden + + + Apply the current string + Bewerben Sie den aktuellen String + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generieren Sie eine Beispiel-Logzeile aus dem aktuell gespeicherten String, um zu überprüfen, ob es richtig formatiert wird. +Jedes Feld, das nicht von LogDoctor betrachtet wird, erscheint als 'DISCARDED' + + + Generate sample + Probe generieren + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Bitte überprüfen Sie die Richtigkeit dieser Zeile. +Felder, die als 'DISCARDED' gekennzeichnet sind, wurden korrekt parsiert, werden aber nicht von LogDoctor betrachtet + + + Open an help window + Hilfefenster öffnen + + + Help + Hilfe + + + Select a log field + Wählen Sie ein Protokollfeld + + + Use warnlist for this field + Warnlist für dieses Feld verwenden + + + Add the current line to the list + Fügen Sie die aktuelle Zeile in die Liste + + + Remove the selected item from the list + Entfernen Sie den ausgewählten Artikel aus der Liste + + + Move the selected item down + Verschieben Sie den ausgewählten Artikel nach unten + + + Use blacklist for this field + Blacklist für dieses Feld verwenden + + + Add line + Zeile hinzufügen + + + Remove selection + Auswahl entfernen + + + Language + Sprache + + + Utilities + Verwendung + + + Tools + Werkzeuge + + + Games + Spiele + + + Perform a version-check + Eine Versionsprüfung durchführen + + + Show some info about LogDoctor + Einige Infos über LogDoctor anzeigen + + + Open a block-note like window to write temporary text + Öffnen Sie eine Blocknote wie Fenster, um temporären Text zu schreiben + + + Play CrissCross + Spielen CrissCross + + + Play Snake + Spielen Snake + + + Show the changelog + Das Changelog anzeigen + + + warnlist + Die Welt der Welt + + + blacklist + Schwarze Liste + + + copy + Kopie + + + copies + Kopien + + + Check updates + Aktualisierungen prüfen + + + Infos + Infos Ã1⁄4ber uns + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Schlange + + + Changelog + Änderungen + + + + RichText + + Select a file from the list + Wählen Sie eine Datei aus der Liste + + + to inspect its content + um seinen Inhalt zu überprüfen + + + Failed to read + Nicht zu lesen + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klassik + + + Hunt + Jagd + + + Battle + Schlachten + + + Game Over + Spiel Over + + + Your adversary fell in the water! + Ihr Gegner fiel ins Wasser! + + + YOU WON! + Du WON! + + + You fell in the water! + Du bist ins Wasser gefallen! + + + YOU LOST! + Du hast Recht! + + + Your adversary ate itself! + Ihr Gegner aß sich! + + + You ate yourself! + Sie aßen sich! + + + Your adversary ate you! + Ihr Gegner aß Sie! + + + You ate your adversary! + Sie aßen Ihren Gegner! + + + You ate each other! + Sie aßen einander! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + Unerwartete WebServer + + + Logs Size Breakdown + Logs Größe Aufschlüsselung + + + Ignored + Ignoriert + + + Parsed + Parfüm + + + Blacklisted + Schwarze Liste + + + Others + Sonstige + + + from + von + + + to + bis + + + Log Lines Marked as Warning + Log Lines als Warnung markiert + + + Time Taken to Serve Requests + Zeit in Anspruch genommen + + + Time of Day Count + Zeit des Tages + + + Relational Count + Beziehungszähler + + + FALSE + FALDEN + + + TRUE + TR + + + Date + Datum + + + Year + Jahr + + + Month + Monat + + + Day + Tag + + + Time + Zeit + + + Hour + Geruch + + + Minute + Minuten + + + Second + Zwei + + + Warning + Warnung + + + Protocol + Protokoll + + + Method + Methode + + + URI + URI + + + Query + Abfrage + + + Response code + Antwortcode + + + Time taken + Zeit genommen + + + Bytes sent + Bytes gesendet + + + Bytes received + empfangene Bytes + + + Referrer + Referenten + + + Cookie + Cookies + + + Client + Kunde + + + User-agent + Benutzeragent + + + January + Januar + + + February + Februar + + + March + März + + + April + April + + + May + Mai + + + June + Juni + + + July + Juli + + + August + August + + + September + September + + + October + Oktober + + + November + November + + + December + Dezember + + + Sunday + Sonntag + + + Monday + Montag + + + Tuesday + Dienstag + + + Wednesday + Mittwoch + + + Thursday + Donnerstag + + + Friday + Freitag + + + Saturday + Samstag + + + diff --git a/logdoctor/translations/LogDoctor_el_GR.ts b/logdoctor/translations/LogDoctor_el_GR.ts new file mode 100644 index 0000000..da0d6c9 --- /dev/null +++ b/logdoctor/translations/LogDoctor_el_GR.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Εκδόσεις + + + Version 4 + Έκδοση 4 + + + Version 3 + Έκδοση 3 + + + Version 2 + Έκδοση 2 + + + Version 1 + Έκδοση 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Κατασκευή σεναρίων + + + Cross-platform compatibility: + Συμβατότητα διατομής: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Στατιστικά στοιχεία: + + + Warnings + Προειδοποιήσεις + + + Speed + Ταχύτητα + + + Counts + Μετρήσεις + + + Daytime + Ημέρα + + + Relational + Σχέση + + + Globals + Παγκόσμια + + + Translations: + Μεταφράσεις: + + + Italian + Ιταλικά + + + Spanish + Ισπανικά + + + French + Γαλλικά + + + Tools: + Εργαλεία: + + + Block note + Σημείωση μπλοκ + + + Utilities: + Βοηθητικά προγράμματα: + + + Infos viewer + Προβολέας πληροφοριών + + + Updates checker + Έλεγχος ενημερώσεων + + + Themes: + Θέματα: + + + Dark + Σκούρο + + + Light + Φως + + + Improvements and fixes + Βελτιώσεις και διορθώσεις + + + New themes: + Νέα θέματα: + + + Ash + Τέφρα + + + Candy + Γλυκά + + + Forest + Δάσος + + + Powder + Κόνις + + + Restyled GUI + Αναδιαμορφωμένο γραφικό περιβάλλον + + + Restyled dialogs + Αναδιαμορφωμένοι διάλογοι + + + Doxygen documentation + Τεκμηρίωση Doxygen + + + Mini-Games: + Μίνι παιχνίδια: + + + Criss-cross + Σταυρός + + + Snake + Φίδι + + + Changed default paths + Αλλαγή προεπιλεγμένων διαδρομών + + + New game modes for Snake + Νέες λειτουργίες παιχνιδιού για φίδι + + + Hunt + Κυνήγι + + + Battle + Μάχη + + + New translations: + Νέες μεταφράσεις: + + + Japanese + Ιαπωνικά + + + Portuguese + Πορτογαλικά + + + Code improvements + Βελτιώσεις κώδικα + + + Performance improvements + Βελτιώσεις επιδόσεων + + + Added tests suite: + Σουίτα προστιθέμενων δοκιμών: + + + white box tests + δοκιμές λευκού κουτιού + + + Customized charts themes + Θέματα προσαρμοσμένων διαγραμμάτων + + + Fixes + Διόρθωση + + + Tests improvements + Βελτιώσεις δοκιμών + + + Docker support + Υποστήριξη Docker + + + Upgrade to C++20 + Αναβάθμιση σε C++20 + + + Upgrade to Qt6 + Αναβάθμιση σε Qt6 + + + Restyled themes + Αναδιαμορφωμένα θέματα + + + Redesigned configs section + Τμήμα επανασχεδιασμένων ρυθμίσεων + + + Stability improvements + Βελτίωση της σταθερότητας + + + Generating warnings dinamically + Παραγωγή προειδοποιήσεων δυναμικά + + + New tool: + Νέο εργαλείο: + + + Changelog + Τροποποίηση log + + + Tweakable parameters for some of the charts: + Αδύνατες παράμετροι για ορισμένους χάρτες: + + + Improved project structure + Βελτιωμένη δομή του έργου + + + Modernized Cmake usage + Εκσυγχρονισμένος Χρήση Cmake + + + + Crapinfo + + Version + Έκδοση + + + Currently installed version of the software + Επί του παρόντος εγκατεστημένη έκδοση του λογισμικού + + + Repository links + Σύνδεσμοι αποθετηρίου + + + Paths + Διαδρομές + + + The path of the executable file + Η διαδρομή του εκτελέσιμου αρχείου + + + Executable + Εκτελέσιμο + + + The path where the configuration file gets saved and searched in + Η διαδρομή στην οποία αποθηκεύεται και ερευνάται το αρχείο ρυθμίσεων + + + Configuration file + Αρχείο ρύθμισης + + + The path where the application searches for extra resources + Η διαδρομή όπου η εφαρμογή αναζητά επιπλέον πόρους + + + Application data + Στοιχεία εφαρμογής + + + + Crapnote + + Reduce the font size + Μείωση του μεγέθους γραμματοσειράς + + + Font size + Μέγεθος γραμματοσειράς + + + Increase the font size + Αύξηση του μεγέθους γραμματοσειράς + + + + Crappath + + Choose + Επιλογή + + + Cancel + Ακύρωση + + + + Crapup + + Checking for updates + Έλεγχος για ενημερώσεις + + + New version available + Νέα διαθέσιμη έκδοση + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Μια νέα έκδοση είναι διαθέσιμη! +Παρακαλούμε επισκεφθείτε το git repository του LogDoctor και ακολουθήστε τις οδηγίες για το πώς να ενημερώσετε + + + No update found + Δε βρέθηκε ενημέρωση + + + LogDoctor is up-to-date + Το LogDoctor είναι ενημερωμένο + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Τρέχεις μια εκδοχή από το μέλλον! +Η έκδοσή σας είναι πέρα από την τρέχουσα έκδοση ανάντη +Τρέχεις το αρχικό LogDoctor; +Παρακαλώ επισκεφθείτε την αποθήκη του LogDoctor και να πάρετε μια νέα έκδοση του + + + Failed to establish a connection + Αποτυχία δημιουργίας σύνδεσης + + + Connection error, please try again later + Σφάλμα σύνδεσης, παρακαλώ προσπαθήστε ξανά αργότερα + + + Connection timed out + Χρονικό όριο σύνδεσης + + + Version check failed + Αποτυχία ελέγχου έκδοσης + + + An error occured while parsing: +version mark not found + Συνέβη ένα σφάλμα κατά την ανάλυση: +Το σήμα έκδοσης δε βρέθηκε + + + An error occured while parsing: +malformed version + Συνέβη ένα σφάλμα κατά την ανάλυση: +λανθασμένη έκδοση + + + An error occured while comparing: +malformed upstream version + Συνέβη ένα σφάλμα κατά τη σύγκριση: +κακοδιαμορφωμένη έκδοση ανάντη + + + + CrissCross + + Victory + Νίκη + + + You beated me! + Με κατατρόμαξες! + + + This time you lost! + Αυτή τη φορά έχασες! + + + Draw + Σχεδίαση + + + Nice match + Ωραίο ταίριασμα + + + + DialogBool + + Yes + Ναι + + + No + Όχι + + + + DialogIda + + Ignore + Παράβλεψη + + + Discard + Απόρριψη + + + Abort + Εγκατάλειψη + + + + DialogMsg + + Ok + Εντάξει + + + + DialogSec + + One of the lists has an invalid item + Μία από τις λίστες έχει μη έγκυρο αντικείμενο + + + An error occured while reading the configuration file + Συνέβη ένα σφάλμα κατά την ανάγνωση του αρχείου ρυθμίσεων + + + An error occured while parsing configuration file's data + Συνέβη ένα σφάλμα κατά την ανάλυση των δεδομένων του αρχείου ρυθμίσεων + + + Failed to create the configuration file's directory + Αποτυχία δημιουργίας του καταλόγου του αρχείου ρυθμίσεων + + + Failed to create the configuration file + Αποτυχία δημιουργίας του αρχείου ρυθμίσεων + + + An error occured while writing the configuration file + Συνέβη ένα σφάλμα κατά την εγγραφή του αρχείου ρυθμίσεων + + + An error occured while preparing the configuration file's data + Συνέβη ένα σφάλμα κατά την προετοιμασία των δεδομένων του αρχείου ρυθμίσεων + + + The path contains a symlink + Η διαδρομή περιέχει ένα συμβολικό σύνδεσμο + + + The file does not exist + Το αρχείο δεν υπάρχει + + + Failed to create the database backups' directory + Αποτυχία δημιουργίας του καταλόγου αντιγράφων ασφαλείας της βάσης δεδομένων + + + Failed to copy the database file + Αποτυχία αντιγραφής του αρχείου βάσης δεδομένων + + + Failed to update the backups + Αποτυχία ενημέρωσης των αντιγράφων ασφαλείας + + + Failed to create the directory + Αποτυχία δημιουργίας του καταλόγου + + + Unrecognized entry + Μη αναγνωρισμένη καταχώρηση + + + Size of the file + Μέγεθος του αρχείου + + + Warning size parameter + Παράμετρος μεγέθους προειδοποίησης + + + Failed to read gzipped file + Αποτυχία ανάγνωσης του αρχείου gzipped + + + An error occured while parsing the format string + Συνέβη ένα σφάλμα κατά την ανάλυση της συμβολοσειράς μορφής + + + Available memory + Διαθέσιμη μνήμη + + + Size of the logs + Μέγεθος των κορμών + + + An error occured while reading the gzipped file + Συνέβη ένα σφάλμα κατά την ανάγνωση του αρχείου gzipped + + + An error occured while reading the file + Συνέβη ένα σφάλμα κατά την ανάγνωση του αρχείου + + + Something failed while handling the file + Κάτι απέτυχε κατά το χειρισμό του αρχείου + + + An error occured while working on the database + Συνέβη ένα σφάλμα κατά την εργασία στη βάση δεδομένων + + + Aborting + Εγκατάλειψη + + + Invalid locale + Μη έγκυρη τοποθεσία + + + Unexpected locale format + Μη αναμενόμενη τοπική μορφή + + + If you haven't manually edited the configuration file, +please report this issue + Αν δεν έχετε επεξεργαστεί χειροκίνητα το αρχείο ρυθμίσεων, +Παρακαλώ αναφέρετε αυτό το θέμα + + + The given locale is not an accepted language + Η δοσμένη τοπική γλώσσα δεν είναι αποδεκτή + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Αν θέλετε να έχετε αυτό το μέρος στο LogDoctor, +παρακαλώ ακολουθήστε τις οδηγίες στη σελίδα αποθετηρίου + + + Configuration file not found + Το αρχείο ρύθμισης δε βρέθηκε + + + Unable to retrieve the configuration file + Αδυναμία ανάκτησης του αρχείου ρυθμίσεων + + + Skipping + Παράλειψη + + + An error occured while handling the configuration file + Συνέβη ένα σφάλμα κατά τον χειρισμό του αρχείου ρυθμίσεων + + + Failed to write the configuration file + Αποτυχία εγγραφής του αρχείου ρυθμίσεων + + + Current configuration not saved + Οι τρέχουσες ρυθμίσεις δεν έχουν αποθηκευτεί + + + File not readable + Το αρχείο δεν είναι αναγνώσιμο + + + The file is not readable + Το αρχείο δεν είναι αναγνώσιμο + + + File not writable + Το αρχείο δεν εγγράφεται + + + The file is not writable + Το αρχείο δεν είναι εγγράψιμο + + + Directory not writable + Ο κατάλογος δεν εγγράφεται + + + The directory is not writable + Ο κατάλογος δεν είναι εγγράψιμος + + + Invalid path + Μη έγκυρη διαδρομή + + + Failed applying configuration + Αποτυχία εφαρμογής ρυθμίσεων + + + Invalid configuration lines + Μη έγκυρες γραμμές ρύθμισης + + + Has not been possible to apply some of the configurations + Δεν ήταν δυνατή η εφαρμογή ορισμένων από τις ρυθμίσεις + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Αν επιλέξετε να προχωρήσετε, όλες οι μη εφαρμοσμένες ρυθμίσεις θα χαθούν +Να συνεχίσω; + + + Failed to retrieve the help file + Αποτυχία ανάκτησης του αρχείου βοήθειας + + + An error occured while getting the help file + Συνέβη ένα σφάλμα κατά τη λήψη του αρχείου βοήθειας + + + Additional resources can be downloaded from the git repo + Επιπλέον πόροι μπορούν να μεταφορτωθούν από το git repo + + + Unable to retrieve the file + Αδυναμία ανάκτησης του αρχείου + + + Invalid string + Μη έγκυρη συμβολοσειρά + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Η δοσμένη συμβολοσειρά είναι άκυρη και δεν μπορεί να προστεθεί στη λίστα + +Παρακαλώ διορθώστε το και ξαναπροσπαθήστε + + + QSql driver not found + Ο οδηγός QSql δε βρέθηκε + + + Failed to retrieve the driver needed to handle the database + Αποτυχία ανάκτησης του οδηγού που απαιτείται για τη διαχείριση της βάσης δεδομένων + + + File not found + Το αρχείο δε βρέθηκε + + + Failed to retrieve the database file + Αποτυχία ανάκτησης του αρχείου βάσης δεδομένων + + + Create a new database? + Δημιουργία νέας βάσης δεδομένων; + + + The database contains an unexpected table + Η βάση δεδομένων περιέχει έναν απροσδόκητο πίνακα + + + Unexpected table + Μη αναμενόμενος πίνακας + + + It seems that the database is missing a table + Φαίνεται ότι η βάση δεδομένων λείπει ένα τραπέζι + + + Table not found + Δε βρέθηκε πίνακας + + + The database contains an unexpected column + Η βάση δεδομένων περιέχει μια μη αναμενόμενη στήλη + + + Unexpected column + Μη αναμενόμενη στήλη + + + It seems that the table is missing a column + Φαίνεται ότι στον πίνακα λείπει μια στήλη + + + Column not found + Η στήλη δε βρέθηκε + + + A column has an unexpected data-type + Μια στήλη έχει έναν απρόσμενο τύπο δεδομένων + + + Unexpected data-type + Μη αναμενόμενος τύπος δεδομένων + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Αυτή η βάση δεδομένων θα μετονομαστεί με ένα \"αντιγραφή\" και ένα νέο θα δημιουργηθεί. +Να συνεχίσω; + + + Database created + Δημιουργία βάσης δεδομένων + + + Successfully created a new database + Με επιτυχία δημιουργήθηκε μια νέα βάση δεδομένων + + + Not a file + Δεν είναι αρχείο + + + The path was supposed to point to a file, but it doesn't + Το μονοπάτι έπρεπε να δείχνει ένα αρχείο, αλλά δεν δείχνει + + + Please remove the conflict and retry + Παρακαλώ αφαιρέστε τη σύγκρουση και ξαναδοκιμάστε + + + The database file is not readable + Το αρχείο βάσης δεδομένων δεν είναι αναγνώσιμο + + + Please set the proper permissions and retry +If this error persists, please report this issue + Παρακαλώ θέστε τις κατάλληλες άδειες και ξαναδοκιμάστε +Εάν αυτό το σφάλμα επιμένει, παρακαλούμε να αναφέρετε αυτό το θέμα + + + The database file is not writable + Το αρχείο βάσης δεδομένων δεν είναι εγγράψιμο + + + Invalid database path + Μη έγκυρη διαδρομή βάσης δεδομένων + + + Failed creating database + Αποτυχία δημιουργίας βάσης δεδομένων + + + An error occured while creating the database + Συνέβη ένα σφάλμα κατά τη δημιουργία της βάσης δεδομένων + + + Failed opening database + Αποτυχία ανοίγματος βάσης δεδομένων + + + An error occured while opening the database + Συνέβη ένα σφάλμα κατά το άνοιγμα της βάσης δεδομένων + + + Failed executing on database + Αποτυχία εκτέλεσης στη βάση δεδομένων + + + An error occured while executing a statement on the database + Συνέβη ένα σφάλμα κατά την εκτέλεση μιας δήλωσης στη βάση δεδομένων + + + Failed to backup database + Αποτυχία δημιουργίας αντιγράφων ασφαλείας + + + Please report this issue + Παρακαλώ αναφέρετε αυτό το θέμα + + + Invalid log format string + Μη έγκυρη συμβολοσειρά μορφής καταγραφής + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Παρακαλώ ελέγξτε ότι κανένα σφάλμα δεν ρίχνεται από το WebServer σας +Αν γίνει αποδεκτό, παρακαλώ ελέγξτε την παρουσία ενός τυποτύπου εδώ +Εάν όλα είναι εντάξει, παρακαλώ αναφέρετε αυτό το θέμα + + + Log format error + Σφάλμα μορφής καταγραφής + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Η μορφή καταγραφής δεν έχει οριστεί, ή είναι άκυρη +Παρακαλώ προσθέστε μια έγκυρη στις ρυθμίσεις + + + Misconfigured log format + Εσφαλμένη μορφή καταγραφής + + + No log field has been set in the current logs format, +making it useless to parse logs + Δεν έχει οριστεί πεδίο καταγραφής στην τρέχουσα μορφή καταγραφής, +Το κάνει άχρηστο να αναλύει τα αρχεία καταγραφής + + + Please set up a format which contains at least one field + Παρακαλώ ρυθμίστε μια μορφή που περιέχει τουλάχιστον ένα πεδίο + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Λείπει ένας διαχωριστής μεταξύ ενός ή περισσότερων πεδίων, +δυσκολεύοντας να καθιερώσουμε όρια, +και ενδεχομένως να οδηγήσει στην αποθήκευση λανθασμένων δεδομένων + + + Please set up a format which contains separators between fields + Παρακαλώ ρυθμίστε μια μορφή που περιέχει διαχωριστές μεταξύ των πεδίων + + + Missing field in log format + Λείπει πεδίο σε μορφή καταγραφής + + + An important field is missing from the provided format: + Λείπει ένα σημαντικό πεδίο από την παρεχόμενη μορφή: + + + The quality of the statistics may be seriously compromized + Η ποιότητα των στατιστικών μπορεί να διορθωθεί σοβαρά + + + Proceed anyway? + Να προχωρήσω; + + + 'Carriage Return' in log format + 'Carriage Return' σε μορφή αρχείου καταγραφής + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Η παρεχόμενη μορφή περιέχει το «Carriage Return». +Αυτό μπορεί να οδηγήσει σε απώλειες ή καταρρεύσεις δεδομένων εάν δεν χρησιμοποιηθεί με προσοχή + + + An error occured while parsing logs + Συνέβη ένα σφάλμα κατά την ανάλυση αρχείων καταγραφής + + + Failed defining type + Αποτυχία ορισμού τύπου + + + Failed to determine the log type + Αποτυχία προσδιορισμού του τύπου καταγραφής + + + File already used + Το αρχείο χρησιμοποιήθηκε ήδη + + + The file has probably been used already + Το αρχείο έχει ήδη χρησιμοποιηθεί + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Αγνοήστε την προειδοποίηση και χρησιμοποιήστε την ούτως ή άλλως, Απορρίψτε την και συνεχίστε, ή Εγκαταλείψτε όλη τη διαδικασία; + + + Duplicate file + Διπλότυπο αρχείου + + + The file appears twice in the list of selections + Το αρχείο εμφανίζεται δύο φορές στη λίστα των επιλογών + + + Failed updating hashes + Αποτυχία ενημέρωσης hashes + + + An error occured while inserting the parsed files hashes into the database + Συνέβη ένα σφάλμα κατά την εισαγωγή των αναλυμένων αρχείων hashes στη βάση δεδομένων + + + File exceeds warning size + Το αρχείο υπερβαίνει το μέγεθος προειδοποίησης + + + The file's size exceeds the warning size + Το μέγεθος του αρχείου υπερβαίνει το μέγεθος προειδοποίησης + + + Not enough memory + Μη επαρκής μνήμη + + + The total size of the selected files exceeds the available memory + Το συνολικό μέγεθος των επιλεγμένων αρχείων υπερβαίνει τη διαθέσιμη μνήμη + + + Please free some resources, parse the files in different steps or split them into smaller units + Παρακαλώ ελευθερώστε κάποιους πόρους, αναλύστε τα αρχεία σε διαφορετικά βήματα ή χωρίστε τα σε μικρότερες μονάδες + + + Failed reading + Αποτυχία ανάγνωσης + + + File is empty + Το αρχείο είναι κενό + + + The file is blank + Το αρχείο είναι κενό + + + Failed to retrieve the selected file + Αποτυχία ανάκτησης του επιλεγμένου αρχείου + + + Discard it and continue, or Abort all and exit? + Να το πετάξω και να συνεχίσω, ή να τα εγκαταλείψω όλα και να φύγω; + + + No file to parse + Δεν υπάρχει αρχείο για ανάλυση + + + The list of files to parse is empty + Η λίστα των αρχείων για ανάλυση είναι κενή + + + Directory not found + Ο κατάλογος δε βρέθηκε + + + The directory does not exists + Ο κατάλογος δεν υπάρχει + + + Directory not readable + Ο κατάλογος δεν είναι αναγνώσιμος + + + The directory is not readable + Ο κατάλογος δεν είναι αναγνώσιμος + + + Please set the proper permissions before to start + Παρακαλώ θέστε τις κατάλληλες άδειες πριν από την έναρξη + + + Failed creating directory + Αποτυχία δημιουργίας καταλόγου + + + The path does not exists + Η διαδρομή δεν υπάρχει + + + Data conversion failed + Αποτυχία μετατροπής δεδομένων + + + Failed to convert from '%1' to '%2' + Αποτυχία μετατροπής από '%1' σε '%2' + + + Failed to create statistics + Αποτυχία δημιουργίας στατιστικών + + + An error occured while processing + Συνέβη ένα σφάλμα κατά την επεξεργασία + + + Cannot create statistics + Αδυναμία δημιουργίας στατιστικών + + + No data has been found that matches with the currently set parameters + Δεν βρέθηκαν δεδομένα που να ταιριάζουν με τις τρέχουσες παραμέτρους + + + Not a folder + Δεν υπάρχει φάκελος + + + The path was supposed to point to a folder, but it doesn't + Το μονοπάτι έπρεπε να δείχνει ένα φάκελο, αλλά δεν δείχνει + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Η καταχώρηση θα μετονομαστεί με ένα tracking '.copy' και ένα νέο θα δημιουργηθεί. +Να συνεχίσω; + + + An error occured + Συνέβη ένα σφάλμα + + + Failed renaming + Αποτυχία μετονομασίας + + + An error occured while renaming + Συνέβη ένα σφάλμα κατά τη μετονομασία + + + + GameDialog + + Ok + Εντάξει + + + + MainWindow + + Parse logs from the Apache2 web server + Ανάλυση αρχείων καταγραφής από τον εξυπηρετητή ιστού Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Ανάλυση αρχείων καταγραφής από τον εξυπηρετητή ιστού Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Ανάλυση αρχείων καταγραφής από τον web server της Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Επιλογή/αποεπιλογή όλων των αρχείων + + + All + Όλα + + + Inspect a log file + Επιθεώρηση αρχείου καταγραφής + + + Name + Όνομα + + + Size + Μέγεθος + + + Refresh the list + Ανανέωση της λίστας + + + Total size of the parsed data + Συνολικό μέγεθος των αναλυόμενων δεδομένων + + + Total number of parsed lines + Συνολικός αριθμός αναλυόμενων γραμμών + + + Start parsing the selected files + Έναρξη ανάλυσης των επιλεγμένων αρχείων + + + START + ΕΝΑ STARTΞΗ + + + Time elapsed since the start + Χρόνος που πέρασε από την αρχή + + + Average speed, in parsed data size per second + Μέση ταχύτητα, σε μέγεθος αναλυόμενων δεδομένων ανά δευτερόλεπτο + + + Web Server + Εξυπηρετητής ιστού + + + Select a Web Server + Επιλέξτε έναν εξυπηρετητή ιστού + + + Year + Έτος + + + Month + Μήνας + + + Day + Ημέρα + + + Hour + Ώρα + + + Draw the chart + Σχεδίαση του χάρτη + + + Log line marked as Warning + Γραμμή καταγραφής σημειωμένη ως Προειδοποίηση + + + Date when the request arrived (YYYY-MM-DD) + Ημερομηνία παραλαβής του αιτήματος (ΕΕΕΕ-ΜΜ-ΗΗ) + + + Time when the request arrived (hh:mm:ss) + Ώρα που έφτασε το αίτημα (hh:mm:ss) + + + Protocol of the request + Πρωτόκολλο της αίτησης + + + Method of the request + Μέθοδος της αίτησης + + + URI of the requested page + URI της ζητούμενης σελίδας + + + Query carried along with the URI + Ερωτηματολόγιο μαζί με το URI + + + Response code from the server + Κωδικός απάντησης από τον εξυπηρετητή + + + User-agent of the client which made the request + Διαχειριστής του πελάτη που υπέβαλε το αίτημα + + + IP address of the Client which made the request + Διεύθυνση IP του Πελάτη που υπέβαλε το αίτημα + + + Cookie used for the request + Cookie που χρησιμοποιείται για την αίτηση + + + The URL which redirected the Client to the requested page + Το URL που ανακατευθύνει τον πελάτη στην ζητούμενη σελίδα + + + Size ib Bytes of the request, usually includes header and data + Μέγεθος ib Bytes του αιτήματος, συνήθως περιλαμβάνει κεφαλίδα και δεδομένα + + + Size in Bytes of the served content, usually includes header and data + Μέγεθος σε ψηφιολέξεις του σερβιρισμένου περιεχομένου, συνήθως περιλαμβάνει κεφαλίδα και δεδομένα + + + Time taken by the server to serve the content, in milliseconds + Χρόνος που χρειάζεται ο εξυπηρετητής για να εξυπηρετήσει το περιεχόμενο, σε χιλιοστά του δευτερολέπτου + + + Only use lines in which the field is starting with this string + Χρησιμοποιήστε μόνο γραμμές στις οποίες το πεδίο ξεκινά με αυτή τη συμβολοσειρά + + + Protocol: + Πρωτόκολλο: + + + Method: + Μέθοδος: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Χρησιμοποιήστε μόνο γραμμές στις οποίες το πεδίο ταιριάζει με αυτή τη δήλωση. +Χρησιμοποιήστε '!', '=', '<' ή '> για να δηλώσετε τι να χρησιμοποιήσετε + + + Response: + Απάντηση: + + + Query: + Ερώτηση: + + + URI: + ΟΥΡΙ: + + + Filters + Φίλτρα + + + Count + Μέτρα + + + Number of occurrences + Αριθμός περιστατικών + + + Item + Θέση + + + Value of the field + Αξία του πεδίου + + + From: + Από: + + + To: + Στο: + + + Select a log field to view + Επιλέξτε ένα πεδίο καταγραφής για προβολή + + + Field: + Πεδίο: + + + Filter: + Φίλτρο: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Με συμβολοσειρές, θα χρησιμοποιηθούν μόνο οι γραμμές στις οποίες αρχίζει το πεδίο με αυτή τη συμβολοσειρά. +Με αριθμούς, χρησιμοποιήστε '!', '=', '<' ή '> για να δηλώσετε τι να χρησιμοποιήσετε + + + Protocol + Πρωτόκολλο + + + Method + Μέθοδος + + + URI + ΟΥΡΙ + + + User-agent + Παράγοντας χρήστη + + + Most recurrent + Πιο επαναλαμβανόμενη + + + Most trafficked + Οι περισσότεροι διακινούνται + + + Date ever + Ημερομηνία ποτέ + + + Day of the week + Ημέρα της εβδομάδας + + + Hour of the day + Ώρα της ημέρας + + + Time taken + Λήξη χρόνου + + + Bytes sent + Αποστολή bytes + + + Bytes received + Λαμβάνονται bytes + + + Mean/Max performances + Μέση/μέγιστη απόδοση + + + Requests received + Παραληφθείσες αιτήσεις + + + Total work + Σύνολο εργασιών + + + General + Γενικά + + + Window + Παράθυρο + + + Dialogs + Διάλογοι + + + Charts + Διαγράμματα + + + Appearance + Εμφάνιση + + + Speed + Ταχύτητα + + + Relational + Σχέση + + + TextBrowser + Περιήγηση κειμένου + + + Databases + Βάσεις δεδομένων + + + Security + Ασφάλεια + + + Logs + Καταγραφές + + + Defaults + Προκαθορισμένα + + + Control + Έλεγχος + + + Path + Διαδρομή + + + Format + Μορφή + + + Warnlists + Προειδοποιήσεις + + + Blacklists + Μαύρες λίστες + + + Remember the window's position and size + Θυμηθείτε τη θέση και το μέγεθος του παραθύρου + + + Remember position and size + Θυμηθείτε τη θέση και το μέγεθος + + + Remember window's position and size + Θυμηθείτε τη θέση και το μέγεθος του παραθύρου + + + Geometry + Γεωμετρία + + + Theme to use for the window + Θέμα προς χρήση για το παράθυρο + + + Theme + Θέμα + + + Native + Ιθαγενής + + + Light + Φως + + + Dark + Σκούρο + + + Auto + Αυτόματο + + + Icons + Εικονίδια + + + Normal quantity of dialog messages shown + Κανονική ποσότητα των μηνυμάτων διαλόγου που εμφανίζονται + + + Normal + Κανονικό + + + Dialogs from the main processes + Διάλογοι από τις κύριες διεργασίες + + + Dialogs emitted when parsing logs + Διάλογοι που εκπέμπονται κατά την ανάλυση αρχείων καταγραφής + + + Logs parser + Αναλυτής καταγραφών + + + Dialogs emitted when viewing statistics + Διάλογοι που εκπέμπονται κατά την παρακολούθηση στατιστικών + + + Statistics viewer + Προβολέας στατιστικών + + + Define the quantity of dialog mesages shown + Ορισμός της ποσότητας των μηνυμάτων διαλόγου που εμφανίζονται + + + Dialogs level + Επίπεδο διαλόγων + + + Reduced quantity of dialog messages shown + Μειωμένη ποσότητα των μηνυμάτων διαλόγου που εμφανίζονται + + + Essential + Βασικό + + + Augmented quantity of dialog messages shown + Αυξημένη ποσότητα των μηνυμάτων διαλόγου που εμφανίζονται + + + Explanatory + Επεξήγηση + + + Theme to use for the Charts + Θέμα προς χρήση για τα γραφήματα + + + Preview + Προεπισκόπηση + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Αντιπροσωπεύει ένα βήμα στον άξονα του χρόνου, σε δευτερόλεπτα. +Όλες οι τιμές που εμπίπτουν στο ίδιο διάστημα θα συγχωνευθούν και η μέση τιμή θα χρησιμοποιηθεί. + + + Time interval + Χρονικό διάστημα + + + The format to use for the labels of the time axis. + Η μορφή που θα χρησιμοποιηθεί για τις ετικέτες του χρονοάξονα. + + + Time format + Μορφή ώρας + + + The size of the pie + Το μέγεθος της πίτας + + + Pie size + Μέγεθος πίτας + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Ο μέγιστος αριθμός φέτες από τις οποίες θα αποτελείται η πίτα. +Η υπέρβαση φέτες θα ομαδοποιηθεί σε μια ολοκληρωμένη φέτα. + + + Maximum slices + Μέγιστες φέτες + + + Font to use for the Text Browser + Γραμματοσειρά που θα χρησιμοποιηθεί για τον περιηγητή κειμένου + + + Font + Γραμματοσειρά + + + Double-spaced lines + Διαχωρισμένες γραμμές + + + Use wide lines + Χρήση πλατιών γραμμών + + + Define the spacing between lines + Ορισμός της απόστασης μεταξύ γραμμών + + + Lines spacing + Διαπόσταση γραμμών + + + None + Καμία + + + Color scheme to use for the Text Browser + Σχέδιο χρωμάτων που θα χρησιμοποιηθεί για τον περιηγητή κειμένου + + + Color scheme + Σχέδιο χρωμάτων + + + The appearance of the Text Browser with the current settings + Η εμφάνιση του περιηγητή κειμένου με τις τρέχουσες ρυθμίσεις + + + Insert the base path only, file name excluded + Εισαγωγή μόνο της βασικής διαδρομής, το όνομα αρχείου αποκλείεται + + + The given path doen't exists, or doesn't point to a folder + Η δοσμένη διαδρομή δεν υπάρχει, ή δεν δείχνει ένα φάκελο + + + Path for the database files + Διαδρομή για τα αρχεία βάσης δεδομένων + + + Paths + Διαδρομές + + + Apply the current path + Εφαρμογή της τρέχουσας διαδρομής + + + Select the path through a dialog window + Επιλέξτε τη διαδρομή μέσω ενός παραθύρου διαλόγου + + + Path where the logs data collection database is located + Διαδρομή όπου βρίσκεται η βάση δεδομένων συλλογής δεδομένων καταγραφής + + + Logs data + Δεδομένα καταγραφής + + + Path where the used files hashes database is located + Διαδρομή όπου βρίσκεται η βάση δεδομένων των χρησιμοποιημένων αρχείων hashes + + + Used files + Μεταχειρισμένα αρχεία + + + Backup options for the Logs Data database + Επιλογές αντιγράφων ασφαλείας για τη βάση δεδομένων καταγραφής + + + Backups + Αντιγράφων ασφαλείας + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Ένα νέο αντίγραφο ασφαλείας γίνεται κατά το κλείσιμο του LogDoctor μετά την επιτυχή επεξεργασία της βάσης δεδομένων + + + Backup the Logs Data database and keep + Δημιουργία αντιγράφου ασφαλείας της βάσης δεδομένων καταγραφής και διατήρηση + + + Whether it is allowed or denied to follow symlinks occuring in a path + Αν επιτρέπεται ή δεν επιτρέπεται να ακολουθείτε συμβολικούς δεσμούς που συμβαίνουν σε ένα μονοπάτι + + + Follow symlinks + Ακολούθηση συμβολικών δεσμών + + + Default WebServer + Προκαθορισμένος εξυπηρετητής ιστού + + + Usage control + Έλεγχος χρήσης + + + Hide already used files + Απόκρυψη ήδη χρησιμοποιημένων αρχείων + + + Size warnings + Προειδοποιήσεις μεγέθους + + + Warn me when using files with a size exceeding: + Προειδοποιήστε με όταν χρησιμοποιείτε αρχεία με μέγεθος που υπερβαίνει: + + + Logs folder + Φάκελος καταγραφής + + + Logs format string + συμβολοσειρά μορφής καταγραφής + + + Format string + Μορφή συμβολοσειράς + + + Insert the format string you're using + Εισαγωγή της συμβολοσειράς μορφής που χρησιμοποιείτε + + + Apply the current string + Εφαρμογή της τρέχουσας συμβολοσειράς + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Δημιουργήστε μια γραμμή καταγραφής δειγμάτων από την τρέχουσα αποθηκευμένη συμβολοσειρά, για να ελέγξετε αν διαμορφώνεται σωστά. +Κάθε πεδίο που δεν εξετάζεται από το LogDoctor θα εμφανίζεται ως 'DISCARDED' + + + Generate sample + Δημιουργία δείγματος + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Παρακαλώ ελέγξτε την ορθότητα αυτής της γραμμής. +Τα πεδία που σημειώνονται ως 'DISCARDED' αναλύθηκαν σωστά, αλλά δεν θεωρούνται από το LogDoctor + + + Open an help window + Άνοιγμα παραθύρου βοήθειας + + + Help + Βοήθεια + + + Select a log field + Επιλέξτε ένα πεδίο καταγραφής + + + Use warnlist for this field + Χρήση λίστας προειδοποίησης για αυτό το πεδίο + + + Add the current line to the list + Προσθήκη της τρέχουσας γραμμής στη λίστα + + + Remove the selected item from the list + Αφαίρεση του επιλεγμένου αντικειμένου από τη λίστα + + + Move the selected item down + Μετακίνηση του επιλεγμένου αντικειμένου κάτω + + + Use blacklist for this field + Χρήση μαύρης λίστας για αυτό το πεδίο + + + Add line + Προσθήκη γραμμής + + + Remove selection + Αφαίρεση επιλογής + + + Language + Γλώσσα + + + Utilities + Βοηθητικά προγράμματα + + + Tools + Εργαλεία + + + Games + Παιχνίδια + + + Perform a version-check + Εκτέλεση ελέγχου έκδοσης + + + Show some info about LogDoctor + Εμφάνιση πληροφοριών σχετικά με το LogDoctor + + + Open a block-note like window to write temporary text + Άνοιγμα μιας σημείωσης μπλοκ για εγγραφή προσωρινού κειμένου + + + Play CrissCross + Παίξε CrissCross + + + Play Snake + Αναπαραγωγή φιδιού + + + Show the changelog + Εμφάνιση του log αλλαγών + + + warnlist + Προειδοποιητικός κατάλογος + + + blacklist + μαύρη λίστα + + + copy + αντίγραφο + + + copies + αντίγραφα + + + Check updates + Έλεγχος ενημερώσεων + + + Infos + Πληροφορίες + + + BlockNote + Σημείωση πλοκής + + + CrissCross + Κρος + + + Snake + Φίδι + + + Changelog + Τροποποίηση log + + + + RichText + + Select a file from the list + Επιλέξτε ένα αρχείο από τη λίστα + + + to inspect its content + να επιθεωρήσει το περιεχόμενό του + + + Failed to read + Αποτυχία ανάγνωσης + + + + SnakeGame + + PLAY + ΠΑΙΧΝΙΔΙ + + + Classic + Κλασικό + + + Hunt + Κυνήγι + + + Battle + Μάχη + + + Game Over + Τέλος παιχνιδιού + + + Your adversary fell in the water! + Ο αντίπαλός σου έπεσε στο νερό! + + + YOU WON! + Κέρδισες! + + + You fell in the water! + Έπεσες στο νερό! + + + YOU LOST! + Έχασες! + + + Your adversary ate itself! + Ο αντίπαλός σου έφαγε μόνος του! + + + You ate yourself! + Έφαγες τον εαυτό σου! + + + Your adversary ate you! + Ο αντίπαλός σου σε έφαγε! + + + You ate your adversary! + Έφαγες τον αντίπαλο σου! + + + You ate each other! + Φάγατε ο ένας τον άλλον! + + + MATCH IS DRAW! + Ο Μatch είναι DRAW! + + + + TR + + Unexpected WebServer + Μη αναμενόμενος εξυπηρετητής ιστού + + + Logs Size Breakdown + Ανάλυση μεγέθους καταγραφών + + + Ignored + Παράβλεψη + + + Parsed + Ανατρεπόμενο + + + Blacklisted + Μαύρη λίστα + + + Others + Άλλα + + + from + από + + + to + σε + + + Log Lines Marked as Warning + Γραμμές καταγραφής σημειώνονται ως προειδοποίηση + + + Time Taken to Serve Requests + Απαιτούμενος χρόνος για να εξυπηρετήσετε τα αιτήματα + + + Time of Day Count + Ώρα της ημέρας καταμέτρηση + + + Relational Count + Αριθμός συσχέτισης + + + FALSE + ΨΕΥΔΑ + + + TRUE + ΑΛΗΘΕΙΑ + + + Date + Ημερομηνία + + + Year + Έτος + + + Month + Μήνας + + + Day + Ημέρα + + + Time + Χρόνος + + + Hour + Ώρα + + + Minute + Λεπτό + + + Second + Δεύτερη + + + Warning + Προειδοποίηση + + + Protocol + Πρωτόκολλο + + + Method + Μέθοδος + + + URI + ΟΥΡΙ + + + Query + Ερώτηση + + + Response code + Κωδικός απάντησης + + + Time taken + Λήξη χρόνου + + + Bytes sent + Αποστολή bytes + + + Bytes received + Λαμβάνονται bytes + + + Referrer + Αναφορά + + + Cookie + Μπισκότο + + + Client + Πελάτης + + + User-agent + Παράγοντας χρήστη + + + January + Ιανουάριος + + + February + Φεβρουάριος + + + March + Μάρτιος + + + April + Απρίλιος + + + May + Μάιος + + + June + Ιούνιος + + + July + Ιούλιος + + + August + Αύγουστος + + + September + Σεπτέμβριος + + + October + Οκτώβριος + + + November + Νοέμβριος + + + December + Δεκέμβριος + + + Sunday + Κυριακή + + + Monday + Δευτέρα + + + Tuesday + Τρίτη + + + Wednesday + Τετάρτη + + + Thursday + Πέμπτη + + + Friday + Παρασκευή + + + Saturday + Σάββατο + + + diff --git a/logdoctor/translations/LogDoctor_en_GB.ts b/logdoctor/translations/LogDoctor_en_GB.ts index 39f0065..eed4907 100644 --- a/logdoctor/translations/LogDoctor_en_GB.ts +++ b/logdoctor/translations/LogDoctor_en_GB.ts @@ -1055,6 +1055,30 @@ This may lead to data losses or crashes if not used with caution The provided format contains the 'Carriage Return'. This may lead to data losses or crashes if not used with caution + + Failed to create the configuration file + Failed to create the configuration file + + + The path contains a symlink + The path contains a symlink + + + The file does not exist + The file does not exist + + + Invalid path + Invalid path + + + Invalid database path + Invalid database path + + + The path does not exists + The path does not exists + GameDialog @@ -1631,22 +1655,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not conside Tools Tools - - Check updates - Check updates - Perform a version-check Perform a version-check - - Infos - Infos - - - BlockNote - BlockNote - Open a block-note like window to write temporary text Open a block-note like window to write temporary text @@ -1731,18 +1743,10 @@ With numbers, use '!', '=','<' or '>&ap Games Games - - CrissCross - CrissCross - Play CrissCross Play CrissCross - - Snake - Snake - Play Snake Play Snake @@ -1781,10 +1785,6 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'Show some info about LogDoctor Show some info about LogDoctor - - Changelog - Changelog - Show the changelog Show the changelog @@ -1803,121 +1803,73 @@ All the values falling inside the same interval will be merged and the mean valu Time interval - 1 - 1 - - - 2 - 2 - - - 3 - 3 - - - 4 - 4 - - - 5 - 5 - - - 10 - 10 - - - 15 - 15 - - - 20 - 20 - - - 30 - 30 - - - 60 - 60 - - - 120 - 120 - - - 180 - 180 + The format to use for the labels of the time axis. + The format to use for the labels of the time axis. - 240 - 240 + Time format + Time format - 300 - 300 + The size of the pie + The size of the pie - 600 - 600 + Pie size + Pie size - 900 - 900 + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + The maximum number of slices that the pie will be composed of. Exceeding slices will be grouped into one comprehensive slice. - 1200 - 1200 + Maximum slices + Maximum slices - 1800 - 1800 + Relational + Relational - 3600 - 3600 + Appearance + Appearance - The format to use for the labels of the time axis. - The format to use for the labels of the time axis. + Security + Security - Time format - Time format + Whether it is allowed or denied to follow symlinks occuring in a path + Whether it is allowed or denied to follow symlinks occuring in a path - hh:mm - hh:mm + Follow symlinks + Follow symlinks - hh - hh - - - The size of the pie - The size of the pie + Check updates + Check updates - Pie size - Pie size + Infos + Infos - The maximum number of slices that the pie will be composed of. -Exceeding slices will be grouped into one comprehensive slice. - The maximum number of slices that the pie will be composed of. Exceeding slices will be grouped into one comprehensive slice. + BlockNote + BlockNote - Maximum slices - Maximum slices + CrissCross + CrissCross - Relational - Relational + Snake + Snake - Appearance - Appearance + Changelog + Changelog diff --git a/logdoctor/translations/LogDoctor_eo_EO.ts b/logdoctor/translations/LogDoctor_eo_EO.ts new file mode 100644 index 0000000..7ea5d6d --- /dev/null +++ b/logdoctor/translations/LogDoctor_eo_EO.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versioj + + + Version 4 + Versio 4 + + + Version 3 + Versio 3 + + + Version 2 + Versio 2 + + + Version 1 + Versio 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Konstruu manuskriptojn + + + Cross-platform compatibility: + Cross-platforma kongrueco: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistiko: + + + Warnings + Avertoj + + + Speed + Rapida Rapideco + + + Counts + Kalkuloj + + + Daytime + Tagtempo + + + Relational + Rilato + + + Globals + Globals + + + Translations: + Tradukoj: + + + Italian + Itala itala + + + Spanish + Hispana hispano + + + French + Franca franca + + + Tools: + Iloj: + + + Block note + Bloko noto + + + Utilities: + Kategorioj: + + + Infos viewer + Infosa spektanto + + + Updates checker + Ĝisdatigoj kontrolis + + + Themes: + Temoj: + + + Dark + Mallumo + + + Light + Lumo de lumo + + + Improvements and fixes + Plibonigoj kaj riparoj + + + New themes: + Novaj temoj: + + + Ash + Ash + + + Candy + Candy Candy Candy + + + Forest + Arbaroj + + + Powder + Pulvo + + + Restyled GUI + Restivis GUI + + + Restyled dialogs + Restivis dialogojn + + + Doxygen documentation + Doxygen dokumentaro + + + Mini-Games: + Mini-Games: + + + Criss-cross + Criss-cross + + + Snake + Serpenta Serpento + + + Changed default paths + Ŝanĝitaj defaŭltaj vojoj + + + New game modes for Snake + Novaj ludreĝimoj por Snake + + + Hunt + Hunt + + + Battle + Batalo + + + New translations: + Novaj tradukoj: + + + Japanese + Japanaj japanoj + + + Portuguese + Portugala portugala + + + Code improvements + Kodo plibonigoj + + + Performance improvements + Efikecplibonigoj + + + Added tests suite: + Aldonita testserio: + + + white box tests + Blanka skatolo testas + + + Customized charts themes + Kutimaj furorlisto temoj + + + Fixes + Fiksoj + + + Tests improvements + Testas plibonigojn + + + Docker support + Docker subteno + + + Upgrade to C++20 + Antaŭite fare de C++20 + + + Upgrade to Qt6 + Pli ol Qt6 + + + Restyled themes + Retiligitaj temoj + + + Redesigned configs section + Redesigned configs sekcio + + + Stability improvements + Stabilaj plibonigoj + + + Generating warnings dinamically + Generi avertojn dinamike + + + New tool: + Nova ilo: + + + Changelog + Ŝanĝoj + + + Tweakable parameters for some of the charts: + Tweakable parametroj por kelkaj el la furorlisto: + + + Improved project structure + Plibonigita projektostrukturo + + + Modernized Cmake usage + modernigita C faras uzokutimon + + + + Crapinfo + + Version + Versio versio + + + Currently installed version of the software + Nun instalita versio de la programaro + + + Repository links + Deponejo ligiloj + + + Paths + Vojoj + + + The path of the executable file + La pado de la efektivigebla dosiero + + + Executable + Eksplusebla + + + The path where the configuration file gets saved and searched in + La pado kie la konfiguraciodosiero iĝas savita kaj serĉita en + + + Configuration file + Adapta dosiero + + + The path where the application searches for extra resources + La pado kie la aplikiĝo serĉas ekstrajn resursojn + + + Application data + Apliko datumoj + + + + Crapnote + + Reduce the font size + Redukti la tiparon + + + Font size + Fontgrandeco + + + Increase the font size + Plimultigu la tiparon + + + + Crappath + + Choose + Elektu elekti + + + Cancel + Cancel + + + + Crapup + + Checking for updates + Kontrolu por ĝisdatigoj + + + New version available + Nova versio havebla + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Nova versio estas disponebla! +Bonvole vizitu la zondeponejon de LogDoctor kaj sekvu la instrukcion pri kiel ĝisdatigi + + + No update found + Neniu ĝisdatigo trovita + + + LogDoctor is up-to-date + LogDoctor estas ĝisdata + + + :/ + : / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Vi havas version de la estonteco! +Via versio estas preter la nuna kontraŭflua versio +Ĉu vi havas la originalan dosieron? +Bonvole vizitu la deponejon de la LogDoctor kaj ricevu freŝan version de ĝi + + + Failed to establish a connection + Malsukcesas establi ligon + + + Connection error, please try again later + La eraro, bonvolu provi denove + + + Connection timed out + Situo + + + Version check failed + Versio-kontrolo malsukcesis + + + An error occured while parsing: +version mark not found + Eraro okazis dum analizado: +versio ne trovita + + + An error occured while parsing: +malformed version + Eraro okazis dum analizado: +misformita versio + + + An error occured while comparing: +malformed upstream version + Eraro okazis komparante: +misformita kontraŭflua versio + + + + CrissCross + + Victory + Venko + + + You beated me! + Vi min kreis! + + + This time you lost! + Ĉi-foje vi perdis! + + + Draw + Eventoj + + + Nice match + Nia matĉo + + + + DialogBool + + Yes + Jes, jes + + + No + Neniu + + + + DialogIda + + Ignore + Ignori + + + Discard + Disĵetas + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Unu el la listoj havas malvalidan objekton + + + An error occured while reading the configuration file + Eraro okazis legante la konfiguraciodosieron + + + An error occured while parsing configuration file's data + Eraro okazis dum analizado de konfiguraciodosiero datenoj + + + Failed to create the configuration file's directory + Malsukcesa krei la adresaron de la konfiguraciodosiero + + + Failed to create the configuration file + Malsukcesa krei la konfiguracio dosieron + + + An error occured while writing the configuration file + Eraro okazis skribante la konfiguraciodosieron + + + An error occured while preparing the configuration file's data + Eraro okazis preparante la datenojn de la konfiguraciodosiero + + + The path contains a symlink + La vojo enhavas simligon + + + The file does not exist + La dosiero ne ekzistas + + + Failed to create the database backups' directory + Malsukcesa krei la datumbazon reenkondukas la adresaron + + + Failed to copy the database file + Malsukcesa kopii la datumbazo dosieron + + + Failed to update the backups + Malsukcesas ĝisdatigi la rezervojn + + + Failed to create the directory + Malsukcesas krei la direktoron + + + Unrecognized entry + Neagnoskita eniro + + + Size of the file + Size de la dosiero + + + Warning size parameter + Averto grandeco parametro + + + Failed to read gzipped file + Malsukcesita legi gzipped dosieron + + + An error occured while parsing the format string + Eraro okazis dum analizado de la formatkordo + + + Available memory + Havebla memoro + + + Size of the logs + Size de la tagaloj + + + An error occured while reading the gzipped file + Eraro okazis legante la gzipped dosieron + + + An error occured while reading the file + Eraro okazis legante la dosieron + + + Something failed while handling the file + Io malsukcesis pritraktante la dosieron + + + An error occured while working on the database + Eraro okazis dum laborado pri la datumbazo + + + Aborting + Abordo + + + Invalid locale + Invalida lokulo + + + Unexpected locale format + Unexpected locale formato + + + If you haven't manually edited the configuration file, +please report this issue + Se vi ne mane redaktis la konfiguraciodosieron, +Bonvolu raporti ĉi tiun temon + + + The given locale is not an accepted language + La antaŭfiksita ejo ne estas akceptita lingvo + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Se vi ŝatus havi tiun ejon en LogDoctor, +Bonvolu sekvi la instrukcion sur la deponejo paĝo + + + Configuration file not found + Konfigura dosiero ne trovita + + + Unable to retrieve the configuration file + Nekapabla preni la konfiguracio dosieron + + + Skipping + Skipado + + + An error occured while handling the configuration file + Eraro okazis pritraktante la konfiguraciodosieron + + + Failed to write the configuration file + Malsukcesas skribi la konfiguracio dosieron + + + Current configuration not saved + Nuna konfiguracio ne savis + + + File not readable + Dosiero ne legebla + + + The file is not readable + La dosiero ne estas legebla + + + File not writable + Ne Dosiero + + + The file is not writable + La dosiero ne estas asigno + + + Directory not writable + Adresaro ne akorda + + + The directory is not writable + La adresaro ne estas asigno + + + Invalid path + Invalida vojo + + + Failed applying configuration + Malsukcesa aplika konfiguracio + + + Invalid configuration lines + Invalidaj konfiguraciolinioj + + + Has not been possible to apply some of the configurations + Ne eblas apliki iujn el la agordoj + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Se vi elektas daŭrigi, ĉiuj la neuzitaj konfiguracioj estos perditaj. +Daŭrigu? + + + Failed to retrieve the help file + Malsukcesas preni la helpdosieron + + + An error occured while getting the help file + Eraro okazis ricevante la helpdosieron + + + Additional resources can be downloaded from the git repo + Kromaj resursoj povas esti elŝutitaj de la git repo + + + Unable to retrieve the file + Nekapabla preni la dosieron + + + Invalid string + Invalida kordo + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + La antaŭfiksita kordo estas malvalida kaj ne povas esti aldonita al la listo + +Bonvolu korekti ĝin kaj reiro + + + QSql driver not found + QSql ŝoforo ne trovis + + + Failed to retrieve the driver needed to handle the database + Malsukcesa preni la ŝoforon bezonatan por pritrakti la datumbazon + + + File not found + Ne trovita + + + Failed to retrieve the database file + Malsukcesa por preni la datumbazo dosieron + + + Create a new database? + Ĉu krei novan datumbazon? + + + The database contains an unexpected table + La datumbazo enhavas neatenditan tablon + + + Unexpected table + Neatendita tablo + + + It seems that the database is missing a table + Ŝajnas ke la datumbazo mankas tablo + + + Table not found + Tablo ne trovita + + + The database contains an unexpected column + La datumbazo enhavas neatenditan kolonon + + + Unexpected column + Neatendita kolono + + + It seems that the table is missing a column + Ŝajnas ke la tablo mankas kolono + + + Column not found + Kolono ne trovita + + + A column has an unexpected data-type + Kolono havas neatenditan daten-specon + + + Unexpected data-type + Unexpected Data-speco + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Tiu datumbazo estos renomita kun migrovojo '.copy kaj nova oni estos kreita. +Daŭrigu? + + + Database created + Datumbazo kreita + + + Successfully created a new database + Sukcesa kreita nova datumbazo + + + Not a file + Ne dosiero + + + The path was supposed to point to a file, but it doesn't + La pado laŭsupoze montras al dosiero, sed ĝi ne estas + + + Please remove the conflict and retry + Bonvolu forigi la konflikton kaj reiron + + + The database file is not readable + La datumbazo dosiero ne estas legebla + + + Please set the proper permissions and retry +If this error persists, please report this issue + Bonvolu meti la ĝustajn permesojn kaj reiron +Se tiu eraro daŭras, bonvolu raporti tiun temon + + + The database file is not writable + La datumbazo dosiero ne estas asigno + + + Invalid database path + Invalida datumbazo pado + + + Failed creating database + Malsukcesa kreado de datumbazo + + + An error occured while creating the database + Eraro okazis kreante la datumbazon + + + Failed opening database + Malsukcesa komenca datumbazo + + + An error occured while opening the database + Eraro okazis malfermante la datumbazon + + + Failed executing on database + Malsukcesa efektivigo sur datumbazo + + + An error occured while executing a statement on the database + Eraro okazis ekzekutante deklaron sur la datumbazo + + + Failed to backup database + Malsukcesa al rezervo datumbazo + + + Please report this issue + Bonvolu raporti ĉi tiun temon + + + Invalid log format string + Invalida tagalo formata kordo + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Bonvolu kontroli ke neniu eraro estas ĵetita de via WebServer +Se ĝi estas akceptita, bonvolu kontroli la ĉeeston de tipo ĉi tie +Se ĉio estas bona, bonvolu raporti tiun temon + + + Log format error + Logo formata eraro + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + La registradformato ne estis metita, aŭ estas malvalida +Bonvolu aldoni validan unu en la agordoj + + + Misconfigured log format + Miskonfigurita loga formato + + + No log field has been set in the current logs format, +making it useless to parse logs + Neniu arbotrunko-kampo estis metita en la nuna tagalo formato, +Farante ĝin senutila por parse-registroj + + + Please set up a format which contains at least one field + Bonvolu instali formaton kiu enhavas almenaŭ unu kampon + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Selektisto mankas inter unu aŭ pluraj kampoj, +igante ĝin malmola establi netajn saltegojn, +Kaj eble kondukante al stoki malĝustajn datenojn + + + Please set up a format which contains separators between fields + Bonvole starigis formaton kiu enhavas apartigilojn inter kampoj + + + Missing field in log format + Mankanta kampo en loga formato + + + An important field is missing from the provided format: + Grava kampo mankas de la disponigita formato: + + + The quality of the statistics may be seriously compromized + La kvalito de la statistiko povas esti grave kompromisigita + + + Proceed anyway? + Ĉu vi pripensis? + + + 'Carriage Return' in log format + "Carriage Return" en loga formato + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + La disponigita formato enhavas la "Carriage Return". +Tio povas kaŭzi datenperdojn aŭ kraŝojn se ne uzite kun singardo + + + An error occured while parsing logs + Eraro okazis dum analizado de tagaloj + + + Failed defining type + Malsukcesa difina tipo + + + Failed to determine the log type + Malsukcesa por determini la logan tipon + + + File already used + Dosiero jam uzis + + + The file has probably been used already + La dosiero verŝajne jam estis uzata + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignoru la averton kaj uzu ĝin ĉiuokaze, Discard ĝi kaj daŭrigu, aŭ Abort la tutan procezon? + + + Duplicate file + Duplika dosiero + + + The file appears twice in the list of selections + La dosiero aperas dufoje en la listo de selektadoj + + + Failed updating hashes + Malsukcesa ĝisdatigo havas + + + An error occured while inserting the parsed files hashes into the database + Eraro okazis enigante la parigitajn dosierojn havas en la datumbazo + + + File exceeds warning size + Dosiero superas avertantan grandecon + + + The file's size exceeds the warning size + La grandeco de la dosiero superas la avertantan grandecon + + + Not enough memory + Ne sufiĉe da memoro + + + The total size of the selected files exceeds the available memory + La totala grandeco de la elektitaj dosieroj superas la haveblan memoron + + + Please free some resources, parse the files in different steps or split them into smaller units + Bonvolu liberigi kelkajn rimedojn, analizi la dosierojn en malsamaj paŝoj aŭ dividi ilin en pli malgrandajn unuojn + + + Failed reading + Malsukcesa legado + + + File is empty + Dosiero estas malplena + + + The file is blank + La dosiero estas malplena + + + Failed to retrieve the selected file + Malsukcesa por preni la elektitan dosieron + + + Discard it and continue, or Abort all and exit? + Disĵetu ĝin kaj daŭrigu, aŭ Abort ĉion kaj eliron? + + + No file to parse + Neniu dosiero por parse + + + The list of files to parse is empty + La listo de dosieroj al parse estas malplena + + + Directory not found + Adresaro ne trovita + + + The directory does not exists + La dosierujo ne ekzistas + + + Directory not readable + Adresaro ne legebla + + + The directory is not readable + La adresaro ne estas legebla + + + Please set the proper permissions before to start + Bonvolu meti la ĝustajn permesojn antaŭ komenci + + + Failed creating directory + Malsukcesa kreado de adresaro + + + The path does not exists + La vojo ne ekzistas + + + Data conversion failed + Datumoj konvertiĝo malsukcesis + + + Failed to convert from '%1' to '%2' + Malsukcesa transformi de%1 ĝis%2 + + + Failed to create statistics + Malsukcesas krei statistikon + + + An error occured while processing + Eraro okazis dum prilaborado + + + Cannot create statistics + Ne povas krei statistikon + + + No data has been found that matches with the currently set parameters + Neniuj datenoj estis trovitaj ke matĉoj kun la nuntempe metitaj parametroj + + + Not a folder + Ne faldas + + + The path was supposed to point to a folder, but it doesn't + La pado laŭsupoze montris al faldinto, sed ĝi ne estas + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + La eniro estos renomita kun migrovojo '.copy kaj nova estos kreita. +Daŭrigu? + + + An error occured + Eraro okazis + + + Failed renaming + Malsukcesa renamado + + + An error occured while renaming + Eraro okazis dum renomado + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parse logas de la Apache2-retservilo + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse logas de la Nginx retservilo + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parse logas de la Microsoft IIS-retservilo + + + IIS + IIS + + + Select/deselect all the files + Elekti ĉiujn dosierojn + + + All + Ĉiuj ĉiuj + + + Inspect a log file + Inspekti dosieron + + + Name + Nomo nomo + + + Size + Size + + + Refresh the list + Refresh la listo + + + Total size of the parsed data + Totala grandeco de la parigitaj datenoj + + + Total number of parsed lines + Totala nombro da parigitaj linioj + + + Start parsing the selected files + Komencu analizi la elektitajn dosierojn + + + START + START + + + Time elapsed since the start + Tempo pasis ekde la komenco + + + Average speed, in parsed data size per second + Meza rapideco, en analizita datengrandeco per sekundo + + + Web Server + Web Server + + + Select a Web Server + Elektu Web Server + + + Year + Jaro Jaro Jaro Jaro + + + Month + Monato + + + Day + Tago de Tago + + + Hour + Horo + + + Draw the chart + La diagramo + + + Log line marked as Warning + Loglinio markita kiel Warning + + + Date when the request arrived (YYYY-MM-DD) + Dato kiam la peto alvenis (YYY-MM-D) + + + Time when the request arrived (hh:mm:ss) + Tempo kiam la peto alvenis (h:mm:ss) + + + Protocol of the request + Protokolo de la peto + + + Method of the request + Metodo de la peto + + + URI of the requested page + URI de la petita paĝo + + + Query carried along with the URI + Query portis kune kun la URI + + + Response code from the server + Respondo kodo de la servilo + + + User-agent of the client which made the request + Uzanto-agento de la kliento kiu faris la peton + + + IP address of the Client which made the request + IP-adreso de la Kliento kiu faris la peton + + + Cookie used for the request + Cookie uzis por la peto + + + The URL which redirected the Client to the requested page + La URL kiu redirektis la Klienton al la petita paĝo + + + Size ib Bytes of the request, usually includes header and data + Size ib Bytes de la peto, kutime inkludas titolo- kaj datenojn + + + Size in Bytes of the served content, usually includes header and data + Size en Bytes de la servita enhavo, kutime inkludas pli kapon kaj datenojn + + + Time taken by the server to serve the content, in milliseconds + Tempo prenita fare de la servilo por servi la enhavon, en milisekundoj + + + Only use lines in which the field is starting with this string + Nur uzlinioj en kiuj la kampo komencas kun tiu kordo + + + Protocol: + Protokolo: + + + Method: + Metodo: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Nur uzlinioj en kiuj la kampo egalas tiun deklaron. +Uzu '!', '=', '<' aŭ '>' deklari kion uzi + + + Response: + Respondo: + + + Query: + Query: + + + URI: + URI: + + + Filters + Filtriloj + + + Count + kalkulo + + + Number of occurrences + Nombro de okazoj + + + Item + Ĝi estas + + + Value of the field + Valoro de la kampo + + + From: + De: + + + To: + Al: + + + Select a log field to view + Elekti logkampon por rigardi + + + Field: + Kampo: + + + Filter: + Filtrilo: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Kun kordoj, nur la linioj en kiuj la kampo komencas kun tiu kordo estos uzita. +Kun nombroj, uzas "!", "=", "<" aŭ ">" deklari kion uzi + + + Protocol + Protokolo de Protokolo + + + Method + Metodo + + + URI + URI + + + User-agent + Uzanto-agento + + + Most recurrent + Plej ripetiĝanta + + + Most trafficked + Plej trafikata + + + Date ever + Dato iam + + + Day of the week + Tago de la semajno + + + Hour of the day + Horo de la tago + + + Time taken + La tempo prenita + + + Bytes sent + Bytes sendis + + + Bytes received + Bytes ricevis + + + Mean/Max performances + Mean/Max-prezentoj + + + Requests received + Petoj ricevis + + + Total work + Totala laboro + + + General + Ĝenerala + + + Window + Fenestro + + + Dialogs + Dialogs + + + Charts + Diagramo + + + Appearance + Aplikiĝo + + + Speed + Rapida Rapideco + + + Relational + Rilato + + + TextBrowser + Tekstoj + + + Databases + Datumbazoj + + + Security + Sekureco + + + Logs + Registroj + + + Defaults + Defaŭloj + + + Control + Kontrolo + + + Path + Vojo + + + Format + Pormat + + + Warnlists + Militistoj + + + Blacklists + Blacklists + + + Remember the window's position and size + Memoru la pozicion kaj grandecon de la fenestro + + + Remember position and size + Memoru pozicion kaj grandecon + + + Remember window's position and size + Memoru la pozicion kaj grandecon de fenestro + + + Geometry + Geometrio + + + Theme to use for the window + Mi uzas la fenestron + + + Theme + La + + + Native + Indiĝeno + + + Light + Lumo + + + Dark + Mallumo + + + Auto + Aŭto + + + Icons + Ikono + + + Normal quantity of dialog messages shown + Normala kvanto de dialogo mesaĝoj montris + + + Normal + Normalo + + + Dialogs from the main processes + Dialogoj de la ĉefaj procezoj + + + Dialogs emitted when parsing logs + Dialogs elsendita kiam analizado de tagaloj + + + Logs parser + Registras parser + + + Dialogs emitted when viewing statistics + Dialogoj elsenditaj dum rigardado de statistiko + + + Statistics viewer + Statistiko spektanto + + + Define the quantity of dialog mesages shown + Difini la kvanton de dialogo kiun misaĝoj montris + + + Dialogs level + Dialoga nivelo + + + Reduced quantity of dialog messages shown + Reduktita kvanto de dialogo mesaĝoj montris + + + Essential + Esencaj esencaj + + + Augmented quantity of dialog messages shown + Pliigita kvanto de dialogmesaĝoj montris + + + Explanatory + Explanatory + + + Theme to use for the Charts + La jenaj paĝoj ligas al la kartoj + + + Preview + Antaŭvido + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Reprezentas paŝon en la tempoakso, en sekundoj. +Ĉiuj valoroj falantaj ene de la sama intervalo estos kunfanditaj kaj la averaĝa valoro estos uzita. + + + Time interval + Tempo intervalo + + + The format to use for the labels of the time axis. + La formato por uzi por la etikedoj de la tempoakso. + + + Time format + Tempo formato + + + The size of the pie + La grandeco de la torto + + + Pie size + Pie grandeco + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + La maksimuma nombro da tranĉaĵoj kiujn la torto estos kunmetita de. +Troaj tranĉaĵoj estos grupigitaj en unu ampleksan tranĉaĵon. + + + Maximum slices + Maksimumaj tranĉaĵoj + + + Font to use for the Text Browser + Fonto por uzi por la Teksto Browser + + + Font + Fonto + + + Double-spaced lines + Duobla-spacitaj linioj + + + Use wide lines + Uzu larĝajn liniojn + + + Define the spacing between lines + Difini la interspacigon inter linioj + + + Lines spacing + Linioj interspacigo + + + None + Neniu + + + Color scheme to use for the Text Browser + Koloro-skemo uzi por la Teksto Browser + + + Color scheme + Koloro-skemo + + + The appearance of the Text Browser with the current settings + La aspekto de la Teksto Browser kun la nunaj valoroj + + + Insert the base path only, file name excluded + Teni la bazpadon nur, dosiernomo ekskludis + + + The given path doen't exists, or doesn't point to a folder + La antaŭfiksita pado ne ekzistas, aŭ ne montras al faldinto + + + Path for the database files + Vojo por la datumbazo dosierojn + + + Paths + Vojoj + + + Apply the current path + La nuna vojo + + + Select the path through a dialog window + Elekti la padon tra dialogfenestro + + + Path where the logs data collection database is located + Pado kie la tagalo datenkolektaddatumbazo situas + + + Logs data + Registras datumojn + + + Path where the used files hashes database is located + Pado kie la uzitaj dosieroj havas datumbazon situas + + + Used files + Uzitaj dosieroj + + + Backup options for the Logs Data database + Malantaŭaj opcioj por la Logs Datadatumbazo + + + Backups + Malantaŭiĝoj + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Nova rezervo estas farita kiam ferma LogDoctor post esti jurpersekutinta la datumbazon + + + Backup the Logs Data database and keep + Backup the Logs Data datumbazo kaj konservas + + + Whether it is allowed or denied to follow symlinks occuring in a path + Ĉu estas permesite aŭ neis sekvi siligojn okazantajn en pado + + + Follow symlinks + Sekvu simligojn + + + Default WebServer + Defaŭlta WebServer + + + Usage control + Utila kontrolo + + + Hide already used files + Kaŝo jam uzis dosierojn + + + Size warnings + Faru avertojn + + + Warn me when using files with a size exceeding: + Lasu min uzi dosierojn kun grandeco superanta: + + + Logs folder + Registro de faldo + + + Logs format string + Registras formatan ŝnuron + + + Format string + Forma kordo + + + Insert the format string you're using + Insertu la formatan ŝnuron vi uzas + + + Apply the current string + Apliki la nunan ŝnuron + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generate provaĵa tagallinio de la nuntempe savita kordo, kontroli se ĝi iĝas formatita ĝuste. +Ĉiu kampo ne pripensita fare de LogDoctor aperos kiel 'DISCARDED' + + + Generate sample + Generita provaĵo + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Bonvolu kontroli la korektecon de ĉi tiu linio. +Kampoj markitaj kiel 'DISCARDED' ricevis analizitan ĝuste, sed ne estas pripensitaj fare de LogDoctor + + + Open an help window + Malfermu helpfenestron + + + Help + Helpo helpo + + + Select a log field + Elekti logkampon + + + Use warnlist for this field + Uzu militliston por tiu kampo + + + Add the current line to the list + Aldonu la nunan linion al la listo + + + Remove the selected item from the list + Forigu la elektitan objekton de la listo + + + Move the selected item down + Movi la elektitan objekton malsupren + + + Use blacklist for this field + Uzu nigran liston por ĉi tiu kampo + + + Add line + Aldoni linio + + + Remove selection + Forigu selektadon + + + Language + Lingvo + + + Utilities + Utilities + + + Tools + Iloj + + + Games + Ludoj Ludoj + + + Perform a version-check + Faru version-van + + + Show some info about LogDoctor + Montri kelkajn informojn pri LogDoctor + + + Open a block-note like window to write temporary text + Malfermu bloko-noton kiel fenestro por skribi provizora teksto + + + Play CrissCross + Play CrissCross + + + Play Snake + Situo de Snake + + + Show the changelog + Montri la ŝanĝon + + + warnlist + militlisto + + + blacklist + nigra listo + + + copy + Kopikopio + + + copies + kopioj + + + Check updates + Kontrolu ĝisdatigojn + + + Infos + Infos + + + BlockNote + Blokoj + + + CrissCross + CrissCross + + + Snake + Serpenta Serpento + + + Changelog + Ŝanĝoj + + + + RichText + + Select a file from the list + Elekti dosieron de la listo + + + to inspect its content + Inspekti ĝian enhavon + + + Failed to read + Malsukcesis legi + + + + SnakeGame + + PLAY + Situo + + + Classic + Klasika Klasikaĵo + + + Hunt + Hunt + + + Battle + Batalo + + + Game Over + La ludo + + + Your adversary fell in the water! + Via kontraŭulo falis en la akvo! + + + YOU WON! + Vi estas! + + + You fell in the water! + Vi falis en la akvon! + + + YOU LOST! + Vi estas! + + + Your adversary ate itself! + Via kontraŭulo manĝis sin mem! + + + You ate yourself! + Vi manĝis vin mem! + + + Your adversary ate you! + Via kontraŭulo manĝis vin! + + + You ate your adversary! + Vi manĝis vian kontraŭulon! + + + You ate each other! + Vi manĝis unu la alian! + + + MATCH IS DRAW! + MATI estas DRAW! + + + + TR + + Unexpected WebServer + Unexpected WebServer + + + Logs Size Breakdown + Registras Size Breakdown + + + Ignored + Ignorita + + + Parsed + Parita + + + Blacklisted + Blacklist + + + Others + Aliaj aliaj + + + from + de + + + to + por + + + Log Lines Marked as Warning + Taglinioj Markis kiel Warning + + + Time Taken to Serve Requests + Tempo Prenita al Serviloj + + + Time of Day Count + Tempo de Tago Count + + + Relational Count + Interrilata kalkulo + + + FALSE + FALSEOJ + + + TRUE + Taŭra + + + Date + Dato de dato + + + Year + Jaro Jaro Jaro Jaro + + + Month + Monato + + + Day + Tago de Tago + + + Time + La tempo + + + Hour + Horo + + + Minute + Protokolo + + + Second + Dua sekundo + + + Warning + Averto + + + Protocol + Protokolo de Protokolo + + + Method + Metodo + + + URI + URI + + + Query + Query + + + Response code + Respondo kodo + + + Time taken + La tempo prenita + + + Bytes sent + Bytes sendis + + + Bytes received + Bytes ricevis + + + Referrer + Referrer + + + Cookie + Cookie + + + Client + Kliento + + + User-agent + Uzanto-agento + + + January + Januaro Januaro Januaro Januaro + + + February + Februaro Februaro Februaro Februaro + + + March + Marto Marto Marto + + + April + April April aprilo + + + May + Majo Majo Majo Majo + + + June + Junio Junio Junio + + + July + Julio Julio + + + August + Aŭgusto Aŭgusto Aŭgusto + + + September + Septembro Septembro Septembro Septembro + + + October + Oktobro Oktobro Oktobro Oktobro + + + November + Novembro Novembro Novembro Novembro + + + December + Decembro Decembro Decembro + + + Sunday + Dimanĉo + + + Monday + lundo lunde + + + Tuesday + Marŝi marde + + + Wednesday + merkredo merkredo merkredo + + + Thursday + ĵaŭdon + + + Friday + vendrede + + + Saturday + Sabato sabate + + + diff --git a/logdoctor/translations/LogDoctor_es_ES.ts b/logdoctor/translations/LogDoctor_es_SP.ts similarity index 97% rename from logdoctor/translations/LogDoctor_es_ES.ts rename to logdoctor/translations/LogDoctor_es_SP.ts index e6bbe0a..6d99f81 100644 --- a/logdoctor/translations/LogDoctor_es_ES.ts +++ b/logdoctor/translations/LogDoctor_es_SP.ts @@ -1058,6 +1058,30 @@ This may lead to data losses or crashes if not used with caution El formato proporcionado contiene el 'Carriage Return'. Esto puede provocar pérdidas de datos o fallos si no se utiliza con precaución + + Failed to create the configuration file + Failed para crear el archivo de configuración + + + The path contains a symlink + El camino contiene un enlace + + + The file does not exist + El archivo no existe + + + Invalid path + Camino inválido + + + Invalid database path + Vía de base de datos inválida + + + The path does not exists + El camino no existe + GameDialog @@ -1550,18 +1574,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'Genere una línea de registro de muestra a partir de la cadena guardada actualmente, para verificar si se formatea correctamente. Cualquier campo no considerado por LogDoctor aparecerá como 'DISCARDED' - - CrissCross - CrissCross - Play CrissCross Jugar a CrissCross - - Snake - Snake - Play Snake Jugar a Snake @@ -1728,22 +1744,10 @@ Los campos marcados como 'DISCARDED' se analizaron correctamente, pero Games Juegos - - Check updates - Revisa actualizaciones - Perform a version-check Realizar una verificación de versión - - Infos - Información - - - BlockNote - Bloc de Notas - Open a block-note like window to write temporary text Abra una ventana similar a una nota de bloque para escribir texto temporal @@ -1784,10 +1788,6 @@ Los campos marcados como 'DISCARDED' se analizaron correctamente, pero Show some info about LogDoctor Mostrar información sobre LogDoctor - - Changelog - Registro de cambios - Show the changelog Mostrar el registro de cambios @@ -1806,82 +1806,6 @@ Todos los valores que se encuentren dentro del mismo intervalo se fusionarán y Time interval Intervalo de tiempo - - 1 - 1 - - - 2 - 2 - - - 3 - 3 - - - 4 - 4 - - - 5 - 5 - - - 10 - 10 - - - 15 - 15 - - - 20 - 20 - - - 30 - 30 - - - 60 - 60 - - - 120 - 120 - - - 180 - 180 - - - 240 - 240 - - - 300 - 300 - - - 600 - 600 - - - 900 - 900 - - - 1200 - 1200 - - - 1800 - 1800 - - - 3600 - 3600 - The format to use for the labels of the time axis. El formato a utilizar para las etiquetas del eje de tiempo. @@ -1890,14 +1814,6 @@ Todos los valores que se encuentren dentro del mismo intervalo se fusionarán y Time format Formato del tiempo - - hh:mm - hh:mm - - - hh - hh - The size of the pie El tamaño del gráfico circular @@ -1924,6 +1840,42 @@ Los sectores excedentes se agruparán en un sector comprensivo. Appearance Apariencia + + Security + Seguridad + + + Whether it is allowed or denied to follow symlinks occuring in a path + Si se permite o se niega a seguir los simpatizantes que ocurren en un camino + + + Follow symlinks + Seguir los simpatizantes + + + Check updates + Actualizaciones de cheques + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Snake + + + Changelog + Registro de cambios + RichText diff --git a/logdoctor/translations/LogDoctor_et_ES.ts b/logdoctor/translations/LogDoctor_et_ES.ts new file mode 100644 index 0000000..d0f931e --- /dev/null +++ b/logdoctor/translations/LogDoctor_et_ES.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versioonid + + + Version 4 + Versioon 4 + + + Version 3 + Versioon 3 + + + Version 2 + Versioon 2 + + + Version 1 + Versioon 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Skriptide loomine + + + Cross-platform compatibility: + Platvormiülene ühilduvus: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistika: + + + Warnings + Hoiatused + + + Speed + Kiirus + + + Counts + Loeb + + + Daytime + Päevane + + + Relational + Relatsiooniline + + + Globals + Globals + + + Translations: + Tõlked: + + + Italian + itaallane + + + Spanish + hispaania + + + French + Prantsuse + + + Tools: + Tööriistad: + + + Block note + Bloki märkus + + + Utilities: + Kommunaalteenused: + + + Infos viewer + Info näitaja + + + Updates checker + Uuendab kontrollijat + + + Themes: + Teemad: + + + Dark + Dark + + + Light + Valgus + + + Improvements and fixes + Parandused ja parandused + + + New themes: + Uued teemad: + + + Ash + Ash + + + Candy + Candy + + + Forest + Metsa + + + Powder + Pulber + + + Restyled GUI + Ümberstiilis GUI + + + Restyled dialogs + Uuendatud dialoogid + + + Doxygen documentation + Hapniku dokumendid + + + Mini-Games: + Minimängud: + + + Criss-cross + Criss Cross + + + Snake + Madu + + + Changed default paths + Muudetud vaikimisi asukohad + + + New game modes for Snake + Mao uued mängurežiimid + + + Hunt + Hunt + + + Battle + Lahing + + + New translations: + Uued tõlked: + + + Japanese + Jaapani + + + Portuguese + Portugali + + + Code improvements + Koodiparandused + + + Performance improvements + Tulemuslikkuse parandamine + + + Added tests suite: + Lisatud testide komplekt: + + + white box tests + valge kasti testid + + + Customized charts themes + Kohandatud diagrammide teemad + + + Fixes + Fixes + + + Tests improvements + Katsete täiustamine + + + Docker support + Dockeri toetus + + + Upgrade to C++20 + Uuendamine C++20-le + + + Upgrade to Qt6 + Uuendamine Qt6-le + + + Restyled themes + Teemade ümberkujundamine + + + Redesigned configs section + Ümberkujundatud seadistuste sektsioon + + + Stability improvements + Stabiilsuse parandamine + + + Generating warnings dinamically + Hoiatuste genereerimine dinamaalselt + + + New tool: + Uus tööriist: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Mõne diagrammi kohandatavad parameetrid: + + + Improved project structure + Projekti parem struktuur + + + Modernized Cmake usage + Moderniseeritud Cmaci kasutamine + + + + Crapinfo + + Version + Versioon + + + Currently installed version of the software + Praegu installitud tarkvara versioon + + + Repository links + Andmehoidla lingid + + + Paths + Rajad + + + The path of the executable file + Käivitatava faili asukoht + + + Executable + hukatav + + + The path where the configuration file gets saved and searched in + Tee, kus seadistustefail salvestatakse ja otsitakse + + + Configuration file + Seadistustefail + + + The path where the application searches for extra resources + Tee, kus rakendus otsib lisaressursse + + + Application data + Rakenduse andmed + + + + Crapnote + + Reduce the font size + Vähenda fondi suurust + + + Font size + Fondi suurus + + + Increase the font size + Suurenda fondi suurust + + + + Crappath + + Choose + Vali + + + Cancel + Tühistage + + + + Crapup + + Checking for updates + Uuenduste kontrollimine + + + New version available + Uus versioon saadaval + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Saadaval on uus versioon! +Palun külastage LogDoctori git-hoidlat ja järgige juhiseid selle kohta, kuidas värskendada + + + No update found + Värskendust ei leitud + + + LogDoctor is up-to-date + LogDoctor on ajakohane + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Sul on tuleviku versioon! +Sinu versioon on väljaspool praegust ülesvoolu versiooni +Kas kasutate originaalset LogDoctorit? +Palun külastage LogDoctori hoidlat ja hankige selle värske versioon + + + Failed to establish a connection + Ühenduse loomine nurjus + + + Connection error, please try again later + Ühenduse viga, palun proovige hiljem uuesti + + + Connection timed out + Ühendus aegus + + + Version check failed + Versiooni kontroll nurjus + + + An error occured while parsing: +version mark not found + Parsimisel tekkis viga: +versioonimärki ei leitud + + + An error occured while parsing: +malformed version + Parsimisel tekkis viga: +vigane versioon + + + An error occured while comparing: +malformed upstream version + Tekkis viga, kui võrreldi: +vigane ülesvoolu versioon + + + + CrissCross + + Victory + Võidu + + + You beated me! + Sa peksid mind! + + + This time you lost! + Seekord sa kaotasid! + + + Draw + Tõmba + + + Nice match + Kena mäng + + + + DialogBool + + Yes + Jah + + + No + Ei + + + + DialogIda + + Ignore + Ignoreeri + + + Discard + Visake ära + + + Abort + Katkestage + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Ühel nimekirjast on vigane element + + + An error occured while reading the configuration file + Seadistustefaili lugemisel tekkis viga + + + An error occured while parsing configuration file's data + Seadistustefaili andmete parsimisel tekkis viga + + + Failed to create the configuration file's directory + Seadistustefaili kataloogi loomine nurjus + + + Failed to create the configuration file + Seadistustefaili loomine nurjus + + + An error occured while writing the configuration file + Seadistustefaili kirjutamisel tekkis viga + + + An error occured while preparing the configuration file's data + Seadistustefaili andmete ettevalmistamisel tekkis viga + + + The path contains a symlink + Tee sisaldab nimelinki + + + The file does not exist + Faili ei ole olemas + + + Failed to create the database backups' directory + Andmebaasi varukoopiate kataloogi loomine nurjus + + + Failed to copy the database file + Andmebaasifaili kopeerimine nurjus + + + Failed to update the backups + Varukoopiate uuendamine nurjus + + + Failed to create the directory + Kataloogi loomine nurjus + + + Unrecognized entry + Tunnustamata kirje + + + Size of the file + Faili suurus + + + Warning size parameter + Hoiatussuuruse parameeter + + + Failed to read gzipped file + Gzipped- faili lugemine nurjus + + + An error occured while parsing the format string + Vormingustringi parsimisel tekkis viga + + + Available memory + Saadaolev mälu + + + Size of the logs + Palgi suurus + + + An error occured while reading the gzipped file + Gzipped- faili lugemisel tekkis viga + + + An error occured while reading the file + Faili lugemisel tekkis viga + + + Something failed while handling the file + Faili käsitlemisel läks midagi valesti + + + An error occured while working on the database + Andmebaasiga töötamisel tekkis viga + + + Aborting + Katkestan + + + Invalid locale + Vigane lokaat + + + Unexpected locale format + Ootamatu lokaadivorming + + + If you haven't manually edited the configuration file, +please report this issue + Kui te pole konfiguratsioonifaili käsitsi redigeerinud, +Palun teatage sellest probleemist + + + The given locale is not an accepted language + Antud lokaat ei ole aktsepteeritud keel + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Kui soovite seda lokaati LogDoctoris, +Palun järgige hoidla lehel toodud juhiseid + + + Configuration file not found + Seadistamisfaili ei leitud + + + Unable to retrieve the configuration file + Seadistustefaili hankimine nurjus + + + Skipping + Skipping + + + An error occured while handling the configuration file + Seadistustefaili käsitlemisel tekkis viga + + + Failed to write the configuration file + Seadistustefaili kirjutamine nurjus + + + Current configuration not saved + Aktiivne seadistus salvestatakse + + + File not readable + Fail ei ole loetav + + + The file is not readable + Fail ei ole loetav + + + File not writable + Fail ei ole kirjutatav + + + The file is not writable + Fail ei ole kirjutatav + + + Directory not writable + Kataloog ei ole kirjutatav + + + The directory is not writable + Kataloog ei ole kirjutatav + + + Invalid path + Vigane tee + + + Failed applying configuration + Seadistuse rakendamine nurjus + + + Invalid configuration lines + Vigased seadistusread + + + Has not been possible to apply some of the configurations + Mõnede konfiguratsioonide rakendamine pole olnud võimalik + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Kui otsustate jätkata, kaovad kõik rakendamata konfiguratsioonid. +Jätkake? + + + Failed to retrieve the help file + Abifaili hankimine nurjus + + + An error occured while getting the help file + Abifaili hankimisel tekkis viga + + + Additional resources can be downloaded from the git repo + Täiendavaid ressursse saab alla laadida git repo + + + Unable to retrieve the file + Faili hankimine nurjus + + + Invalid string + Vigane string + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Määratud string on vigane ja seda ei saa nimekirja lisada + +Palun paranda see ja proovi uuesti + + + QSql driver not found + QSql- i draiverit ei leitud + + + Failed to retrieve the driver needed to handle the database + Andmebaasi haldamiseks vajaliku draiveri hankimine nurjus + + + File not found + Faili ei leitud + + + Failed to retrieve the database file + Andmebaasifaili hankimine nurjus + + + Create a new database? + Kas luua uus andmebaas? + + + The database contains an unexpected table + Andmebaas sisaldab ootamatut tabelit + + + Unexpected table + Ootamatu tabel + + + It seems that the database is missing a table + Tundub, et andmebaasist puudub tabel + + + Table not found + Tabelit ei leitud + + + The database contains an unexpected column + Andmebaas sisaldab ootamatut veergu + + + Unexpected column + Ootamatu veerg + + + It seems that the table is missing a column + Tundub, et tabelis puudub veerg + + + Column not found + Veeru ei leitud + + + A column has an unexpected data-type + Veerul on ootamatu andmetüüp + + + Unexpected data-type + Ootamatu andmetüüp + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + See andmebaas nimetatakse ümber jäljega ".copy" ja luuakse uus. +Jätkake? + + + Database created + Loodud andmebaas + + + Successfully created a new database + Edukalt loodud uus andmebaas + + + Not a file + Mitte fail + + + The path was supposed to point to a file, but it doesn't + Tee pidi viitama failile, aga see ei + + + Please remove the conflict and retry + Palun eemaldage konflikt ja proovige uuesti + + + The database file is not readable + Andmebaasifail ei ole loetav + + + Please set the proper permissions and retry +If this error persists, please report this issue + Palun määra õiged õigused ja proovi uuesti +Kui see viga püsib, teatage sellest probleemist + + + The database file is not writable + Andmebaasifail ei ole kirjutatav + + + Invalid database path + Vigane andmebaasi asukoht + + + Failed creating database + Andmebaasi loomine nurjus + + + An error occured while creating the database + Andmebaasi loomisel tekkis viga + + + Failed opening database + Andmebaasi avamine nurjus + + + An error occured while opening the database + Andmebaasi avamisel tekkis viga + + + Failed executing on database + Täitmine andmebaasis nurjus + + + An error occured while executing a statement on the database + Andmebaasis avalduse täitmisel tekkis viga + + + Failed to backup database + Varundamisandmebaas nurjus + + + Please report this issue + Palun teatage sellest probleemist + + + Invalid log format string + Vigane logivormingu string + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Palun kontrollige, et teie veebiserver ei tekitaks vigu. +Kui see vastu võetakse, siis palun kontrollige kirjaviga siin +Kui kõik on korras, palun andke sellest teada + + + Log format error + Logivormingu viga + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Logivormingut ei ole määratud või see on vigane +Palun lisa sobiv konfiguratsiooni + + + Misconfigured log format + Valesti seadistatud logivorming + + + No log field has been set in the current logs format, +making it useless to parse logs + Aktiivses logivormingus ei ole logiväli määratud, +logide parsimine on kasutu + + + Please set up a format which contains at least one field + Palun vali vorming, mis sisaldab vähemalt ühte välja + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + ühe või mitme välja vahel puudub eraldaja; +võrgupiiride kehtestamise raskendamine, +ja võib põhjustada ebaõigete andmete salvestamise + + + Please set up a format which contains separators between fields + Palun määra vorming, mis sisaldab väljade vahel eraldajaid + + + Missing field in log format + Puuduv väli logivormingus + + + An important field is missing from the provided format: + Esitatud vormingust puudub oluline väli: + + + The quality of the statistics may be seriously compromized + Statistika kvaliteeti võib tõsiselt ohustada + + + Proceed anyway? + Jätkame ikkagi? + + + 'Carriage Return' in log format + "Veo tagastamine" logivormingus + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Antud formaat sisaldab 'veo tagastamist'. +See võib põhjustada andmete kadu või krahhi, kui seda ei kasutata ettevaatlikult + + + An error occured while parsing logs + Logide parsimisel tekkis viga + + + Failed defining type + Ebaõnnestunud defineerimise tüüp + + + Failed to determine the log type + Logitüübi määramine nurjus + + + File already used + Juba kasutatud fail + + + The file has probably been used already + Faili on ilmselt juba kasutatud + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignoreeri hoiatust ja kasuta seda ikkagi, viska see ära ja jätka või katkesta kogu protsess? + + + Duplicate file + Topeltfail + + + The file appears twice in the list of selections + Fail ilmub valikunimekirjas kaks korda + + + Failed updating hashes + Riisi uuendamine nurjus + + + An error occured while inserting the parsed files hashes into the database + Parsitud failide räsi sisestamisel andmebaasi tekkis viga + + + File exceeds warning size + Fail ületab hoiatuse suuruse + + + The file's size exceeds the warning size + Faili suurus ületab hoiatuse suuruse + + + Not enough memory + Ei piisa mälust + + + The total size of the selected files exceeds the available memory + Valitud failide kogusuurus ületab saadaoleva mälu + + + Please free some resources, parse the files in different steps or split them into smaller units + Palun vabastage mõned ressursid, sõeluge failid erinevates etappides või jagage need väiksemateks üksusteks + + + Failed reading + Lugemine nurjus + + + File is empty + Fail on tühi + + + The file is blank + Fail on tühi + + + Failed to retrieve the selected file + Valitud faili hankimine nurjus + + + Discard it and continue, or Abort all and exit? + Visake see ära ja jätkake või katkestage kõik ja lahkuge? + + + No file to parse + Puudub parsimine + + + The list of files to parse is empty + Parsitavate failide nimekiri on tühi + + + Directory not found + Kataloogi ei leitud + + + The directory does not exists + Kataloogi pole olemas + + + Directory not readable + Kataloog ei ole loetav + + + The directory is not readable + Kataloog ei ole loetav + + + Please set the proper permissions before to start + Palun määrake õiged õigused enne alustamist + + + Failed creating directory + Kataloogi loomine nurjus + + + The path does not exists + Rada ei ole olemas + + + Data conversion failed + Andmete teisendamine nurjus + + + Failed to convert from '%1' to '%2' + '%1' teisendamine '%2' nurjus + + + Failed to create statistics + Statistika loomine nurjus + + + An error occured while processing + Töötlemisel tekkis viga + + + Cannot create statistics + Statistika loomine nurjus + + + No data has been found that matches with the currently set parameters + Puuduvad andmed, mis vastaksid praegu kehtestatud parameetritele + + + Not a folder + Mitte kaust + + + The path was supposed to point to a folder, but it doesn't + Tee pidi viitama kaustale, aga see ei + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Kirje nimetatakse ümber jäljega ".copy" ja luuakse uus. +Jätkake? + + + An error occured + Tekkis viga + + + Failed renaming + Ümbernimetamine nurjus + + + An error occured while renaming + Ümbernimetamisel tekkis viga + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parsi logid Apache2 veebiserverist + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parsi logid Nginxi veebiserverist + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parsi logid Microsoft IIS veebiserverist + + + IIS + IIS + + + Select/deselect all the files + Kõigi failide valimine/ valimine + + + All + Kõik + + + Inspect a log file + Logifaili kontrollimine + + + Name + Nimi + + + Size + Suurus + + + Refresh the list + Värskenda nimekirja + + + Total size of the parsed data + Parsitud andmete kogumaht + + + Total number of parsed lines + Parsitud liinide koguarv + + + Start parsing the selected files + Alusta valitud failide parsimist + + + START + START + + + Time elapsed since the start + Algusest möödunud aeg + + + Average speed, in parsed data size per second + Keskmine kiirus, parsitud andmete suurus sekundis + + + Web Server + veebiserver + + + Select a Web Server + Vali veebiserver + + + Year + Aasta + + + Month + Kuu + + + Day + Päev + + + Hour + Tund + + + Draw the chart + Joonista diagramm + + + Log line marked as Warning + Logirida on tähistatud hoiatusena + + + Date when the request arrived (YYYY-MM-DD) + Taotluse saabumise kuupäev (AAAA-KK-PP) + + + Time when the request arrived (hh:mm:ss) + Taotluse saabumise aeg (hh:mm:ss) + + + Protocol of the request + Taotluse protokoll + + + Method of the request + Taotluse esitamise viis + + + URI of the requested page + soovitud lehekülje URI + + + Query carried along with the URI + URIga koos esitatud päring + + + Response code from the server + Serveri vastuse kood + + + User-agent of the client which made the request + Taotluse esitanud kliendi kasutajaagent + + + IP address of the Client which made the request + Taotluse esitanud kliendi IP-aadress + + + Cookie used for the request + Taotluses kasutatav küpsis + + + The URL which redirected the Client to the requested page + URL, mis suunas kliendi soovitud lehele + + + Size ib Bytes of the request, usually includes header and data + Taotluse suurus ib baidid, tavaliselt sisaldab päist ja andmeid + + + Size in Bytes of the served content, usually includes header and data + Teenitud sisu suurus baitides, tavaliselt sisaldab päist ja andmeid + + + Time taken by the server to serve the content, in milliseconds + Ajavahemik, mis serveril kulub sisu teenindamiseks millisekundites + + + Only use lines in which the field is starting with this string + Kasutatakse ainult ridu, kus väli algab selle stringiga + + + Protocol: + Protokoll: + + + Method: + Meetod: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Kasutatakse ainult ridu, kus väli vastab sellele väitele. +Kasuta "!", "=", "<" või ">", et deklareerida, mida kasutada + + + Response: + Vastus: + + + Query: + Päring: + + + URI: + URI: + + + Filters + Filtrid + + + Count + krahv + + + Number of occurrences + Juhtumite arv + + + Item + Punkt + + + Value of the field + Välja väärtus + + + From: + Alates: + + + To: + Et: + + + Select a log field to view + Vaadetava logivälja valimine + + + Field: + Väli: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Stringide puhul kasutatakse ainult ridu, milles väli selle stringiga algab. +Numbritega kasuta '!', '=', '<' või '>', et deklareerida, mida kasutada + + + Protocol + Protokoll + + + Method + Meetod + + + URI + URI + + + User-agent + Kasutajaagent + + + Most recurrent + Kõige sagedasem + + + Most trafficked + Enim kaubitseti + + + Date ever + Kohting + + + Day of the week + Nädalapäev + + + Hour of the day + Päevatund + + + Time taken + Aeg + + + Bytes sent + Saadetud baidid + + + Bytes received + Saadud baitid + + + Mean/Max performances + Keskmised/maksimumnäitajad + + + Requests received + Saadud taotlused + + + Total work + Kogu töö + + + General + Kindral + + + Window + Aken + + + Dialogs + Dialoogid + + + Charts + Diagrammid + + + Appearance + Välimus + + + Speed + Kiirus + + + Relational + Relatsiooniline + + + TextBrowser + Tekstilehitaja + + + Databases + Andmebaasid + + + Security + Turvalisus + + + Logs + Logid + + + Defaults + Vaikimisi + + + Control + Kontroll + + + Path + Path + + + Format + Formaat + + + Warnlists + Sõjaväelased + + + Blacklists + Must nimekiri + + + Remember the window's position and size + Jäta meelde akna asend ja suurus + + + Remember position and size + Asendi ja suuruse meelde jätmine + + + Remember window's position and size + Jäta meelde akna asukoht ja suurus + + + Geometry + Geomeetria + + + Theme to use for the window + Aknas kasutatav teema + + + Theme + Teema + + + Native + Native + + + Light + Valgus + + + Dark + Dark + + + Auto + Auto + + + Icons + Ikoonid + + + Normal quantity of dialog messages shown + Näidatavate dialoogisõnumite tavaline arv + + + Normal + Normaalne + + + Dialogs from the main processes + Peamiste protsesside dialoogid + + + Dialogs emitted when parsing logs + Logide parsimisel tekkivad dialoogid + + + Logs parser + Logiparser + + + Dialogs emitted when viewing statistics + Statistika vaatamisel tekkivad dialoogid + + + Statistics viewer + Statistika näitaja + + + Define the quantity of dialog mesages shown + Näitatavate dialoogisõnumite hulga määramine + + + Dialogs level + Dialoogide tase + + + Reduced quantity of dialog messages shown + Dialoogisõnumite arvu vähenemine + + + Essential + Olulised + + + Augmented quantity of dialog messages shown + Näidatavate dialoogisõnumite suurendatud kogus + + + Explanatory + Selgitav + + + Theme to use for the Charts + Diagrammide teema + + + Preview + Eelvaade + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Näitab sammu ajateljel sekundites. +Kõik samasse vahemikku jäävad väärtused liidetakse ja kasutatakse keskmist väärtust. + + + Time interval + Ajavahemik + + + The format to use for the labels of the time axis. + Ajatelje pealdistel kasutatav vorming. + + + Time format + Ajavorming + + + The size of the pie + Piruka suurus + + + Pie size + Koogi suurus + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Maksimaalne viilude arv, millest pirukas koosneb. +Ületavad viilud rühmitatakse üheks terviklikuks viiluks. + + + Maximum slices + Maksimaalsed lõigud + + + Font to use for the Text Browser + Teksti sirvijas kasutatav font + + + Font + Font + + + Double-spaced lines + Kahekohalised jooned + + + Use wide lines + Laiade ridade kasutamine + + + Define the spacing between lines + Ridade vahekauguse määramine + + + Lines spacing + Liinivahed + + + None + Mitte ükski + + + Color scheme to use for the Text Browser + Tekstilehitseja värviskeem + + + Color scheme + Värviskeem + + + The appearance of the Text Browser with the current settings + Tekstilehitseja välimus aktiivsete seadistustega + + + Insert the base path only, file name excluded + Lisa ainult baas asukoht, faili nimi välja arvatud + + + The given path doen't exists, or doesn't point to a folder + Määratud asukohta ei ole olemas või see ei osuta kataloogile + + + Path for the database files + Andmebaasifailide asukoht + + + Paths + Rajad + + + Apply the current path + Rakenda aktiivne asukoht + + + Select the path through a dialog window + Vali asukoht dialoogiakna kaudu + + + Path where the logs data collection database is located + Logiandmete kogumise andmebaasi asukoht + + + Logs data + Logiandmed + + + Path where the used files hashes database is located + Kasutatud failide räsiandmebaasi asukoht + + + Used files + Kasutatud failid + + + Backup options for the Logs Data database + Logiandmete andmebaasi varundamisvalikud + + + Backups + Varukoopiad + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Uus varukoopia tehakse LogDoctori sulgemisel pärast andmebaasi edukat redigeerimist + + + Backup the Logs Data database and keep + Varustage logiandmete andmebaas ja hoidke + + + Whether it is allowed or denied to follow symlinks occuring in a path + Kas on lubatud või keelatud järgida rajal esinevaid sümlinke + + + Follow symlinks + Sümbolite järgimine + + + Default WebServer + Vaikimisi veebiserver + + + Usage control + Kasutamise kontroll + + + Hide already used files + Peida juba kasutatud failid + + + Size warnings + Suuruse hoiatused + + + Warn me when using files with a size exceeding: + Hoiatage mind, kui kasutate faile, mille suurus ületab: + + + Logs folder + Logi kataloog + + + Logs format string + Logivormingu string + + + Format string + Vormindusstring + + + Insert the format string you're using + Sisesta kasutatav vormingustring + + + Apply the current string + Rakenda aktiivne string + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Loob parajasti salvestatud stringist proovilogirea, et kontrollida, kas see vormindatakse õigesti. +Kõik väljad, mida LogDoctor ei arvesta, kuvatakse kui 'DISCARDED' + + + Generate sample + Genereeri proov + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Palun kontrollige selle rea õigsust. +Väljad, mis on märgitud kui 'DISCARDED', on parsitud õigesti, kuid LogDoctor neid ei arvesta + + + Open an help window + Ava abiaken + + + Help + Aita + + + Select a log field + Logivälja valimine + + + Use warnlist for this field + Selle välja hoiatusnimekirja kasutamine + + + Add the current line to the list + Lisa aktiivne rida nimekirja + + + Remove the selected item from the list + Eemalda valitud element nimekirjast + + + Move the selected item down + Liiguta valitud element allapoole + + + Use blacklist for this field + Musta nimekirja kasutamine sellel väljal + + + Add line + Lisa rida + + + Remove selection + Eemalda valik + + + Language + Keel + + + Utilities + Kommunaalteenused + + + Tools + Tööriistad + + + Games + Mängud + + + Perform a version-check + Versioonikontroll + + + Show some info about LogDoctor + Näita veidi infot LogDoctori kohta + + + Open a block-note like window to write temporary text + Avab ajutise teksti kirjutamiseks plokk- märkuse nagu aken + + + Play CrissCross + Esita CrissCross + + + Play Snake + Mängi madu + + + Show the changelog + Muudatustelogi näitamine + + + warnlist + hoiataja + + + blacklist + musta nimekirja + + + copy + kopeerida + + + copies + koopiad + + + Check updates + Uuenduste kontrollimine + + + Infos + Infod + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Madu + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Faili valimine nimekirjast + + + to inspect its content + selle sisu kontrollimiseks + + + Failed to read + Lugemine nurjus + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klassika + + + Hunt + Hunt + + + Battle + Lahing + + + Game Over + Mäng läbi + + + Your adversary fell in the water! + Su vastane kukkus vette! + + + YOU WON! + Sa võidad! + + + You fell in the water! + Sa kukkusid vette! + + + YOU LOST! + Sa kaotasid! + + + Your adversary ate itself! + Sinu vastane sõi ennast ära! + + + You ate yourself! + Sa sõid ennast ära! + + + Your adversary ate you! + Su vastane sõi su ära! + + + You ate your adversary! + Sa sõid oma vastase ära! + + + You ate each other! + Te sõite üksteist! + + + MATCH IS DRAW! + Matš on joonistus! + + + + TR + + Unexpected WebServer + Ootamatu veebiserver + + + Logs Size Breakdown + Logi suuruse jaotus + + + Ignored + Ignoreeritud + + + Parsed + Parsitud + + + Blacklisted + Mustas nimekirjas + + + Others + Teised + + + from + pärit + + + to + kuni + + + Log Lines Marked as Warning + Hoiatuseks märgitud logiread + + + Time Taken to Serve Requests + Päringute teenindamiseks kulunud aeg + + + Time of Day Count + Päeva kellaaegade loend + + + Relational Count + Suhteline arv + + + FALSE + Vale + + + TRUE + TÕELINE + + + Date + Kuupäev + + + Year + Aasta + + + Month + Kuu + + + Day + Päev + + + Time + Aeg + + + Hour + Tund + + + Minute + Minut + + + Second + Teine + + + Warning + Hoiatus + + + Protocol + Protokoll + + + Method + Meetod + + + URI + URI + + + Query + Päring + + + Response code + Vastuskood + + + Time taken + Aeg + + + Bytes sent + Saadetud baidid + + + Bytes received + Saadud baitid + + + Referrer + suunaja + + + Cookie + Cookie + + + Client + Klient + + + User-agent + Kasutajaagent + + + January + jaanuar + + + February + veebruar + + + March + märts + + + April + Aprill + + + May + May + + + June + Juuni + + + July + juuli + + + August + August + + + September + september + + + October + Oktoober + + + November + november + + + December + detsember + + + Sunday + Pühapäev + + + Monday + Esmaspäev + + + Tuesday + Teisipäev + + + Wednesday + Kolmapäev + + + Thursday + neljapäeval + + + Friday + Reede + + + Saturday + Laupäev + + + diff --git a/logdoctor/translations/LogDoctor_fa_PE.ts b/logdoctor/translations/LogDoctor_fa_PE.ts new file mode 100644 index 0000000..678b963 --- /dev/null +++ b/logdoctor/translations/LogDoctor_fa_PE.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + نسخه ها + + + Version 4 + نسخه 4 + + + Version 3 + نسخه 3 + + + Version 2 + نسخه 2 + + + Version 1 + نسخه 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + ساخت اسکریپت + + + Cross-platform compatibility: + سازگاری Cross-platform: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + آمار: + + + Warnings + هشدار + + + Speed + سرعت سرعت سرعت + + + Counts + شمارش + + + Daytime + روز قیامت + + + Relational + رابطه + + + Globals + Globals + + + Translations: + ترجمه: + + + Italian + ایتالیایی ایتالیایی ایتالیایی + + + Spanish + اسپانیایی اسپانیایی اسپانیایی اسپانیایی + + + French + فرانسوی فرانسوی فرانسوی + + + Tools: + ابزار: + + + Block note + Block Note + + + Utilities: + خدمات درمانی: + + + Infos viewer + Infos Viewer + + + Updates checker + Updates Checker + + + Themes: + موضوعات: + + + Dark + تاریکی تاریک + + + Light + نور نور + + + Improvements and fixes + بهبود و اصلاح + + + New themes: + موضوعات جدید: + + + Ash + Ash + + + Candy + Candy + + + Forest + جنگل جنگل جنگل + + + Powder + پودر پودر پودر + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Restyled Conversations + + + Doxygen documentation + مستندات Doxygen + + + Mini-Games: + مینی گیمز: + + + Criss-cross + بحران ها + + + Snake + مار مار مار + + + Changed default paths + تغییر مسیر های پیش فرض + + + New game modes for Snake + بازی های جدید برای مار + + + Hunt + هانت + + + Battle + نبرد + + + New translations: + ترجمه های جدید: + + + Japanese + ژاپنی ژاپنی ژاپنی + + + Portuguese + پرتغالی پرتغالی + + + Code improvements + بهبود کد + + + Performance improvements + بهبود عملکرد + + + Added tests suite: + مجموعه تست های اضافه شده: + + + white box tests + تست جعبه سفید + + + Customized charts themes + قالب های سفارشی + + + Fixes + اصلاح + + + Tests improvements + بهبود تست ها + + + Docker support + پشتیبانی Docker + + + Upgrade to C++20 + ارتقاء به C++20 + + + Upgrade to Qt6 + ارتقاء Qt6 + + + Restyled themes + Restyled Themes + + + Redesigned configs section + Redesign configs Section + + + Stability improvements + بهبود ثبات + + + Generating warnings dinamically + تولید هشدارات + + + New tool: + ابزار جدید: + + + Changelog + تغییر + + + Tweakable parameters for some of the charts: + پارامترهای ضعیف برای برخی از نمودارها: + + + Improved project structure + بهبود ساختار پروژه + + + Modernized Cmake usage + مدرن استفاده از C + + + + Crapinfo + + Version + نسخه Version + + + Currently installed version of the software + در حال حاضر نسخه نصب شده از نرم افزار + + + Repository links + لینک های Repository + + + Paths + مسیرها + + + The path of the executable file + مسیر فایل اجرایی + + + Executable + دانلود بازی Executable + + + The path where the configuration file gets saved and searched in + مسیری که فایل پیکربندی ذخیره و جستجو می شود + + + Configuration file + فایل Configuration file + + + The path where the application searches for extra resources + مسیری که درخواست برای منابع اضافی جستجو می کند + + + Application data + اطلاعات کاربردی + + + + Crapnote + + Reduce the font size + کاهش اندازه فونت + + + Font size + اندازه فونت + + + Increase the font size + افزایش اندازه فونت + + + + Crappath + + Choose + انتخاب انتخاب انتخاب + + + Cancel + لغو لغو + + + + Crapup + + Checking for updates + بررسی به روز رسانی + + + New version available + نسخه جدید در دسترس + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + نسخه جدید در دسترس است! +لطفا از مخزن git LogDoctor بازدید کنید و دستورالعمل ها را در مورد چگونگی به روز رسانی دنبال کنید + + + No update found + هیچ به روز رسانی پیدا نشد + + + LogDoctor is up-to-date + LogDoctor به روز + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + شما یک نسخه از آینده را اجرا می کنید! +نسخه شما فراتر از نسخه بالادستی فعلی است. +آیا شما مدیر اصلی را اداره می کنید؟ +لطفا از مخزن LogDoctor بازدید کنید و نسخه جدیدی از آن را دریافت کنید + + + Failed to establish a connection + شکست برای ایجاد یک اتصال + + + Connection error, please try again later + خطای اتصال، لطفا دوباره امتحان کنید + + + Connection timed out + زمان اتصال + + + Version check failed + بررسی نسخه شکست خورده + + + An error occured while parsing: +version mark not found + خطایی رخ می دهد در حالی که تجزیه و تحلیل: +برچسب های برچسب ها not found + + + An error occured while parsing: +malformed version + خطایی رخ می دهد در حالی که تجزیه و تحلیل: +نسخه ناقص + + + An error occured while comparing: +malformed upstream version + یک خطا در هنگام مقایسه رخ می دهد: +نسخه بالا + + + + CrissCross + + Victory + پیروزی پیروزی پیروزی + + + You beated me! + تو مرا بخشیدی! + + + This time you lost! + این بار که گم کردید! + + + Draw + Draw Draw + + + Nice match + بازی خوب + + + + DialogBool + + Yes + بله بله بله + + + No + هیچ + + + + DialogIda + + Ignore + غفلت + + + Discard + Discard + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + یکی از لیست ها دارای یک آیتم نامعتبر است + + + An error occured while reading the configuration file + خطا هنگام خواندن فایل پیکربندی رخ می دهد + + + An error occured while parsing configuration file's data + یک خطا در هنگام تجزیه اطلاعات فایل پیکربندی رخ می دهد + + + Failed to create the configuration file's directory + شکست برای ایجاد دایرکتوری فایل پیکربندی + + + Failed to create the configuration file + شکست برای ایجاد فایل پیکربندی + + + An error occured while writing the configuration file + خطا هنگام نوشتن فایل پیکربندی رخ می دهد + + + An error occured while preparing the configuration file's data + یک خطا در هنگام آماده سازی داده های فایل پیکربندی رخ می دهد + + + The path contains a symlink + مسیر شامل یک symlink است + + + The file does not exist + فایل وجود ندارد + + + Failed to create the database backups' directory + شکست برای ایجاد دایرکتوری پشتیبان گیری پایگاه داده + + + Failed to copy the database file + شکست در کپی کردن فایل پایگاه داده + + + Failed to update the backups + شکست برای به روز رسانی پشتیبان + + + Failed to create the directory + شکست برای ایجاد دایرکتوری + + + Unrecognized entry + ورود ناشناخته + + + Size of the file + اندازه فایل + + + Warning size parameter + اندازه هشدار دهنده + + + Failed to read gzipped file + شکست در خواندن فایل gz + + + An error occured while parsing the format string + خطایی رخ می دهد در حالی که تجزیه رشته قالب + + + Available memory + حافظه موجود + + + Size of the logs + اندازه ی ورودی ها + + + An error occured while reading the gzipped file + یک خطا در هنگام خواندن فایل gzd رخ می دهد + + + An error occured while reading the file + یک خطا در هنگام خواندن فایل رخ می دهد + + + Something failed while handling the file + چیزی شکست خورده در هنگام اجرای فایل + + + An error occured while working on the database + یک خطا در هنگام کار بر روی پایگاه داده رخ می دهد + + + Aborting + Aborting + + + Invalid locale + محلی Invalid + + + Unexpected locale format + فرمت غیر منتظره Locale + + + If you haven't manually edited the configuration file, +please report this issue + اگر فایل پیکربندی را به صورت دستی ویرایش نکرده اید، +لطفا این موضوع را گزارش کنید + + + The given locale is not an accepted language + محلی داده شده یک زبان پذیرفته شده نیست + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + اگر دوست دارید این محلی را در Logtor داشته باشید، +لطفا دستورالعمل را در صفحه مخزن دنبال کنید + + + Configuration file not found + فایل پیکربندی پیدا نشد + + + Unable to retrieve the configuration file + امکان بازیابی فایل پیکربندی + + + Skipping + پرش + + + An error occured while handling the configuration file + خطا در هنگام انجام فایل پیکربندی رخ می دهد + + + Failed to write the configuration file + شکست برای نوشتن فایل پیکربندی + + + Current configuration not saved + تنظیمات فعلی ذخیره نشده + + + File not readable + فایل قابل خواندن نیست + + + The file is not readable + فایل قابل خواندن نیست + + + File not writable + بایگانی برچسب ها Not Inritable + + + The file is not writable + فایل قابل توجه نیست + + + Directory not writable + بایگانی برچسب ها Not Inritable + + + The directory is not writable + دایرکتوری قابل توجه نیست + + + Invalid path + مسیر Invalid + + + Failed applying configuration + عدم استفاده از پیکربندی + + + Invalid configuration lines + خطوط پیکربندی Invalid + + + Has not been possible to apply some of the configurations + امکان ندارد برخی از تنظیمات را اعمال کنید + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + اگر تصمیم به ادامه داشته باشید، تمام تنظیمات بی نظیر از دست خواهند رفت. +ادامه دهید؟ + + + Failed to retrieve the help file + شکست برای بازیابی فایل کمک + + + An error occured while getting the help file + یک خطا در هنگام دریافت فایل کمک رخ می دهد + + + Additional resources can be downloaded from the git repo + منابع اضافی را می توان از git repo + + + Unable to retrieve the file + امکان بازیابی فایل + + + Invalid string + رشته Invalid + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + رشته داده شده بی اعتبار است و نمی تواند به لیست اضافه شود + +لطفا آن را تصحیح کنید و دوباره امتحان کنید + + + QSql driver not found + راننده QSql پیدا نشد + + + Failed to retrieve the driver needed to handle the database + شکست برای بازیابی راننده مورد نیاز برای رسیدگی به پایگاه داده + + + File not found + File not found + + + Failed to retrieve the database file + شکست برای بازیابی فایل پایگاه داده + + + Create a new database? + یک پایگاه داده جدید بسازید؟ + + + The database contains an unexpected table + پایگاه داده شامل یک میز غیر منتظره است + + + Unexpected table + میز غیر منتظره + + + It seems that the database is missing a table + به نظر می رسد که پایگاه داده یک میز را گم کرده است + + + Table not found + جدول پیدا نشد + + + The database contains an unexpected column + پایگاه داده شامل یک ستون غیر منتظره است + + + Unexpected column + ستون های غیر منتظره + + + It seems that the table is missing a column + به نظر می رسد که میز یک ستون را از دست داده است + + + Column not found + ستون یافت نشد + + + A column has an unexpected data-type + یک ستون دارای یک نوع داده غیرمنتظره است + + + Unexpected data-type + نوع داده های غیر منتظره + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + این پایگاه داده با یک نسخه ". copy" تغییر خواهد کرد و یک پایگاه جدید ایجاد خواهد شد. +ادامه دهید؟ + + + Database created + پایگاه داده ایجاد شده + + + Successfully created a new database + موفق به ایجاد یک پایگاه داده جدید + + + Not a file + نه فایل + + + The path was supposed to point to a file, but it doesn't + این مسیر قرار بود به یک فایل اشاره کند، اما آن را نمی کند + + + Please remove the conflict and retry + لطفا تعارض را حذف کنید و دوباره تلاش کنید + + + The database file is not readable + فایل پایگاه داده قابل خواندن نیست + + + Please set the proper permissions and retry +If this error persists, please report this issue + اجازه های مناسب را تنظیم کنید و دوباره امتحان کنید +اگر این خطا ادامه داشته باشد، لطفا این موضوع را گزارش کنید + + + The database file is not writable + فایل پایگاه داده قابل توجه نیست + + + Invalid database path + مسیر پایگاه داده Invalid + + + Failed creating database + ایجاد پایگاه داده شکست خورده + + + An error occured while creating the database + یک خطا در هنگام ایجاد پایگاه داده رخ می دهد + + + Failed opening database + پایگاه داده باز شکست خورده + + + An error occured while opening the database + یک خطا در هنگام باز کردن پایگاه داده رخ می دهد + + + Failed executing on database + شکست در اجرای پایگاه داده + + + An error occured while executing a statement on the database + یک خطا در هنگام اجرای یک بیانیه در پایگاه داده رخ می دهد + + + Failed to backup database + شکست در پایگاه داده پشتیبان + + + Please report this issue + لطفا این موضوع را گزارش کنید + + + Invalid log format string + Invalid log Format + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + لطفا بررسی کنید که هیچ خطایی توسط WebServer شما پرتاب نمی شود +اگر پذیرفته شود، لطفا حضور یک تایپی را در اینجا بررسی کنید. +اگر همه چیز خوب است، لطفا این موضوع را گزارش کنید + + + Log format error + خطای فرمت Log + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + فرمت log تنظیم نشده یا بی اعتبار است +لطفا یک معتبر در تنظیمات اضافه کنید + + + Misconfigured log format + دانلود فیلم Badconfiged log Format + + + No log field has been set in the current logs format, +making it useless to parse logs + هیچ میدان ورودی در فرمت فعلی logs تنظیم نشده است. +بی فایده کردن آن برای پارو کردن + + + Please set up a format which contains at least one field + لطفا یک فرمت ایجاد کنید که شامل حداقل یک فیلد است + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + یک جداکننده بین یک یا چند رشته گم شده است. +ایجاد محدودیت های خالص، +و احتمالا منجر به ذخیره اطلاعات نادرست + + + Please set up a format which contains separators between fields + لطفا یک فرمت ایجاد کنید که شامل جداکننده های بین زمینه ها است + + + Missing field in log format + فیلد گمشده در قالب log + + + An important field is missing from the provided format: + یک زمینه مهم از فرمت ارائه شده گم شده است: + + + The quality of the statistics may be seriously compromized + کیفیت آمار ممکن است به طور جدی درک شود + + + Proceed anyway? + در هر صورت؟ + + + 'Carriage Return' in log format + "بازگشت اتومبیل" در فرمت log + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + فرمت ارائه شده شامل “بازگشت کار” است. +این ممکن است منجر به زیان داده یا تصادف شود اگر با احتیاط استفاده نشود + + + An error occured while parsing logs + خطایی رخ می دهد در حالی که لاگین + + + Failed defining type + عدم تعریف نوع + + + Failed to determine the log type + شکست برای تعیین نوع log + + + File already used + فایل هایی که قبلا استفاده شده اند + + + The file has probably been used already + این فایل احتمالا قبلا استفاده شده است + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + هشدار را نادیده بگیرید و به هر حال از آن استفاده کنید، آن را رها کنید و ادامه دهید یا کل فرآیند را متوقف کنید؟ + + + Duplicate file + فایل تکراری + + + The file appears twice in the list of selections + این فایل دو بار در لیست انتخاب ها ظاهر می شود + + + Failed updating hashes + شکست در به روز رسانی هش + + + An error occured while inserting the parsed files hashes into the database + یک خطا در هنگام قرار دادن هش فایل های تجزیه شده در پایگاه داده رخ می دهد + + + File exceeds warning size + فایل بیش از اندازه هشدار دهنده + + + The file's size exceeds the warning size + اندازه فایل بیش از اندازه هشدار + + + Not enough memory + حافظه کافی نیست + + + The total size of the selected files exceeds the available memory + اندازه کل فایل های انتخاب شده بیش از حافظه موجود است + + + Please free some resources, parse the files in different steps or split them into smaller units + لطفا برخی از منابع را آزاد کنید، فایل ها را در مراحل مختلف تجزیه کنید یا آنها را به واحدهای کوچکتر تقسیم کنید + + + Failed reading + شکست خواندن + + + File is empty + فایل خالی است + + + The file is blank + فایل خالی است + + + Failed to retrieve the selected file + شکست برای بازیابی فایل انتخاب شده + + + Discard it and continue, or Abort all and exit? + این کار را انجام دهید و ادامه دهید یا همه چیز را رها کنید و خارج شوید؟ + + + No file to parse + هیچ فایلی برای Parse + + + The list of files to parse is empty + فهرست فایل ها برای Parse خالی است + + + Directory not found + دایرکتوری یافت نشد + + + The directory does not exists + دایرکتوری وجود ندارد + + + Directory not readable + دایرکتوری قابل خواندن نیست + + + The directory is not readable + دایرکتوری قابل خواندن نیست + + + Please set the proper permissions before to start + اجازه های مناسب را قبل از شروع تنظیم کنید + + + Failed creating directory + شکست در ایجاد دایرکتوری + + + The path does not exists + مسیر وجود ندارد + + + Data conversion failed + تبدیل داده ها شکست خورد + + + Failed to convert from '%1' to '%2' + شکست در تبدیل از "%1" به "%2" + + + Failed to create statistics + شکست برای ایجاد آمار + + + An error occured while processing + خطا در هنگام پردازش رخ می دهد + + + Cannot create statistics + نمی تواند آمار ایجاد کند + + + No data has been found that matches with the currently set parameters + هیچ داده ای پیدا نشده است که مطابقت با پارامترهای تنظیم شده در حال حاضر + + + Not a folder + نه یک پوشه + + + The path was supposed to point to a folder, but it doesn't + مسیر قرار بود به یک پوشه اشاره کند، اما آن را نمی کند + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + این ورودی با یک نسخه ". copy" تغییر خواهد کرد و یک نسخه جدید ایجاد خواهد شد. +ادامه دهید؟ + + + An error occured + خطایی رخ می دهد + + + Failed renaming + نام انگلیسی: Failureed Renaming + + + An error occured while renaming + یک خطا در هنگام تغییر نام رخ می دهد + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parse logs از سرور وب Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse logs از سرور وب Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parse logs از Microsoft IIS web server + + + IIS + IIS + + + Select/deselect all the files + انتخاب / انتخاب تمام فایل ها + + + All + همه چیز + + + Inspect a log file + بررسی فایل log + + + Name + نام + + + Size + اندازه + + + Refresh the list + بازسازی لیست + + + Total size of the parsed data + مجموع حجم داده های تجزیه شده + + + Total number of parsed lines + تعداد کل خطوط شکسته + + + Start parsing the selected files + شروع به تجزیه فایل های انتخاب شده + + + START + START + + + Time elapsed since the start + زمان از آغاز + + + Average speed, in parsed data size per second + سرعت متوسط، در اندازه داده های تجزیه شده در ثانیه + + + Web Server + Web Server + + + Select a Web Server + یک Web Server را انتخاب کنید + + + Year + سال + + + Month + ماه ماه + + + Day + روز روز + + + Hour + ساعت قیامت + + + Draw the chart + نمودار را بکشید + + + Log line marked as Warning + خط اعلان به عنوان هشدار + + + Date when the request arrived (YYYY-MM-DD) + تاریخ زمانی که درخواست رسید (YY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + زمانی که درخواست رسید (h:mm:s) + + + Protocol of the request + پروتکل درخواست + + + Method of the request + روش درخواست + + + URI of the requested page + URI صفحه درخواست شده + + + Query carried along with the URI + همراه با URI + + + Response code from the server + کد پاسخ از سرور + + + User-agent of the client which made the request + User-agent از مشتری که درخواست را انجام داد + + + IP address of the Client which made the request + آدرس IP مشتری که درخواست را انجام داد + + + Cookie used for the request + کوکی های مورد استفاده برای درخواست + + + The URL which redirected the Client to the requested page + URL که مشتری را به صفحه درخواست شده هدایت می کند + + + Size ib Bytes of the request, usually includes header and data + اندازه ib بایت از درخواست، معمولا شامل هدر و داده ها + + + Size in Bytes of the served content, usually includes header and data + اندازه در بایت محتوای خدمت شده، معمولا شامل هدر و داده ها است + + + Time taken by the server to serve the content, in milliseconds + زمان گرفته شده توسط سرور برای خدمت به محتوا، در میلی ثانیه + + + Only use lines in which the field is starting with this string + فقط از خطوط استفاده کنید که در آن زمینه با این رشته شروع می شود + + + Protocol: + پروتکل: + + + Method: + روش: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + فقط از خطوطی استفاده کنید که در آن زمینه با این عبارت مطابقت دارد. +استفاده از "!"، "="، "<" یا ">" برای اعلام آنچه که باید استفاده کنید + + + Response: + پاسخ: + + + Query: + Query: + + + URI: + URI: + + + Filters + فیلتر فیلتر + + + Count + شمارش شمارش شمارش + + + Number of occurrences + تعداد رخدادها + + + Item + ماده + + + Value of the field + ارزش میدان + + + From: + از: + + + To: + برای: + + + Select a log field to view + یک فیلد log را انتخاب کنید تا ببینید + + + Field: + فیلد: + + + Filter: + فیلتر: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + با رشته ها، تنها خطوطی که در آن زمینه با این رشته شروع می شود استفاده می شود. +اعداد، استفاده از "!"، "="، "<" یا ">" برای اعلام آنچه که باید استفاده کنید + + + Protocol + پروتکل Protocol + + + Method + Method Method Method + + + URI + URI + + + User-agent + User-agent + + + Most recurrent + بیشترین تکرار + + + Most trafficked + بیشترین قاچاق + + + Date ever + تاریخ هرگز + + + Day of the week + روز هفته + + + Hour of the day + روز قیامت + + + Time taken + زمان گرفته شده + + + Bytes sent + سوگند + + + Bytes received + Bytes دریافت + + + Mean/Max performances + بازی های Mean/Max + + + Requests received + درخواست های دریافت شده + + + Total work + مجموع کار + + + General + ژنرال عمومی + + + Window + پنجره پنجره + + + Dialogs + Dialogs + + + Charts + نمودارها + + + Appearance + ظاهر ظاهری + + + Speed + سرعت سرعت سرعت + + + Relational + رابطه + + + TextBrowser + TextBrowser + + + Databases + پایگاه داده ها + + + Security + امنیت امنیتی + + + Logs + Logs + + + Defaults + شکست ها + + + Control + کنترل کنترل + + + Path + مسیر راه + + + Format + فرمت Format + + + Warnlists + Warnlists + + + Blacklists + Blacklists + + + Remember the window's position and size + به یاد داشته باشید موقعیت و اندازه پنجره + + + Remember position and size + به یاد داشته باشید موقعیت و اندازه + + + Remember window's position and size + به یاد داشته باشید موقعیت و اندازه پنجره + + + Geometry + جغرافیای + + + Theme to use for the window + تم برای استفاده برای پنجره + + + Theme + Theme Theme + + + Native + بومی بومی + + + Light + نور نور + + + Dark + تاریکی تاریک + + + Auto + Auto + + + Icons + Icons + + + Normal quantity of dialog messages shown + مقدار نرمال پیام های محاوره ای نشان داده شده + + + Normal + عادی + + + Dialogs from the main processes + Dialog از فرآیندهای اصلی + + + Dialogs emitted when parsing logs + Dialogs منتشر شده در هنگام ثبت نام + + + Logs parser + بایگانی برچسب ها: Logs + + + Dialogs emitted when viewing statistics + Dialogs منتشر شده در هنگام مشاهده آمار + + + Statistics viewer + بازدید کنندگان + + + Define the quantity of dialog mesages shown + تعریف مقدار یادداشت های گفتگو نشان داده شده + + + Dialogs level + سطح Dialogs + + + Reduced quantity of dialog messages shown + کاهش تعداد پیام های گفتگو نشان داده شده + + + Essential + ضروری + + + Augmented quantity of dialog messages shown + افزایش تعداد پیام های گفتگو نشان داد + + + Explanatory + داوطلب + + + Theme to use for the Charts + قالب برای استفاده برای نمودارها + + + Preview + Preview Preview + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + نشان دادن یک قدم در محور زمان، در ثانیه. +تمام ارزش های سقوط در همان فاصله ادغام خواهد شد و ارزش معنی استفاده خواهد شد. + + + Time interval + فاصله زمانی + + + The format to use for the labels of the time axis. + قالب برای استفاده برای برچسب های محور زمان. + + + Time format + فرمت زمان + + + The size of the pie + اندازه پای + + + Pie size + اندازه کفش + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + حداکثر تعداد برش هایی که پا از آن تشکیل شده است. +تقسیم بندی ها به یک برش جامع تقسیم می شوند. + + + Maximum slices + حداکثر برش + + + Font to use for the Text Browser + فونت برای استفاده از Text Browser + + + Font + فونت + + + Double-spaced lines + خطوط دو طرفه + + + Use wide lines + استفاده از خطوط گسترده + + + Define the spacing between lines + تعریف فاصله بین خطوط + + + Lines spacing + خطوط فاصله + + + None + هیچ + + + Color scheme to use for the Text Browser + طرح رنگ برای استفاده برای Text Browser + + + Color scheme + طرح رنگی + + + The appearance of the Text Browser with the current settings + ظهور مرورگر متن با تنظیمات فعلی + + + Insert the base path only, file name excluded + فقط مسیر پایه را وارد کنید، نام فایل حذف شده + + + The given path doen't exists, or doesn't point to a folder + مسیر داده شده وجود ندارد یا به یک پوشه اشاره نمی کند + + + Path for the database files + مسیر برای فایل های پایگاه داده + + + Paths + مسیرها + + + Apply the current path + استفاده از مسیر فعلی + + + Select the path through a dialog window + مسیر را از طریق یک پنجره محاوره ای انتخاب کنید + + + Path where the logs data collection database is located + مسیر جایی که پایگاه داده جمع آوری داده ها واقع شده است + + + Logs data + ورود داده ها + + + Path where the used files hashes database is located + مسیر جایی که پایگاه داده هش فایل های استفاده شده واقع شده است + + + Used files + فایل های استفاده شده + + + Backup options for the Logs Data database + گزینه های پشتیبان برای پایگاه داده داده داده Logs + + + Backups + پشتیبان گیری + + + A new backup is made when closing LogDoctor after having succesfully edited the database + یک نسخه پشتیبان جدید در هنگام بستن LogDoctor پس از ویرایش سرسختانه پایگاه داده ساخته شده است + + + Backup the Logs Data database and keep + پشتیبان گیری از پایگاه داده داده داده Logs و نگه داشتن + + + Whether it is allowed or denied to follow symlinks occuring in a path + این که آیا مجاز است یا رد شده است برای دنبال کردن symlinks در یک مسیر رخ می دهد + + + Follow symlinks + دنبال symlinks + + + Default WebServer + WebServer + + + Usage control + کنترل استفاده + + + Hide already used files + Hide در حال حاضر از فایل ها استفاده می کند + + + Size warnings + هشدار + + + Warn me when using files with a size exceeding: + من را در هنگام استفاده از فایل با اندازه بیش از حد: + + + Logs folder + پوشه Logs + + + Logs format string + Logs Format String + + + Format string + فرمت String + + + Insert the format string you're using + Insert the Format String که استفاده می کنید + + + Apply the current string + استفاده از رشته فعلی + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + یک خط ثبت نمونه را از رشته ذخیره شده در حال حاضر، برای بررسی اینکه آیا آن را به درستی فرمت شده است. +هر زمینه ای که توسط LogDoctor در نظر گرفته نمی شود به عنوان 'DISCARDED' ظاهر می شود + + + Generate sample + نمونه ژن + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + لطفا صحت این خط را بررسی کنید. +فیلد های مشخص شده به عنوان 'DISCARDED' به درستی تجزیه شده اند، اما توسط LogDoctor در نظر گرفته نمی شوند + + + Open an help window + باز کردن پنجره کمک + + + Help + کمک به کمک + + + Select a log field + انتخاب یک فیلد log + + + Use warnlist for this field + استفاده از هشدار برای این زمینه + + + Add the current line to the list + اضافه کردن خط فعلی به لیست + + + Remove the selected item from the list + حذف آیتم انتخاب شده از لیست + + + Move the selected item down + حرکت آیتم انتخاب شده پایین + + + Use blacklist for this field + استفاده از لیست سیاه برای این زمینه + + + Add line + اضافه کردن خط + + + Remove selection + حذف انتخاب + + + Language + زبان زبان زبان + + + Utilities + خدمات + + + Tools + ابزار + + + Games + بازی Games + + + Perform a version-check + انجام یک نسخه چک + + + Show some info about LogDoctor + برخی از اطلاعات در مورد دکتر Logtor + + + Open a block-note like window to write temporary text + باز کردن یک صفحه مانند پنجره برای نوشتن متن موقت + + + Play CrissCross + بازی CrissCross + + + Play Snake + بازی Snake + + + Show the changelog + نشان دادن تغییر + + + warnlist + هشدار + + + blacklist + لیست سیاه + + + copy + کپی کپی کپی + + + copies + نسخه های کپی + + + Check updates + بررسی به روز رسانی + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + بحران ها + + + Snake + مار مار مار + + + Changelog + تغییر + + + + RichText + + Select a file from the list + یک فایل را از لیست انتخاب کنید + + + to inspect its content + بررسی محتوای آن + + + Failed to read + شکست خواندن + + + + SnakeGame + + PLAY + بازی + + + Classic + کلاسیک کلاسیک کلاسیک + + + Hunt + هانت + + + Battle + نبرد + + + Game Over + بازی Over + + + Your adversary fell in the water! + دشمن شما در آب سقوط کرد! + + + YOU WON! + تو می آیی! + + + You fell in the water! + تو در آب افتادی! + + + YOU LOST! + شما از همه راضی هستید! + + + Your adversary ate itself! + دشمن شما خودش را خورد! + + + You ate yourself! + خودت را خورده ای! + + + Your adversary ate you! + دشمنت تو را خورد! + + + You ate your adversary! + شما دشمن خود را خورده اید! + + + You ate each other! + همدیگر را می خورید! + + + MATCH IS DRAW! + نگاهی به داعش! + + + + TR + + Unexpected WebServer + غیر منتظره WebServer + + + Logs Size Breakdown + دانلود زیرنویس فارسی فیلم The Time Breakdown + + + Ignored + نادیده گرفته شده + + + Parsed + پارس + + + Blacklisted + Blacklist + + + Others + دیگران + + + from + از + + + to + برای + + + Log Lines Marked as Warning + خطوط اعلان شده به عنوان هشدار + + + Time Taken to Serve Requests + زمان برای خدمت به درخواست ها + + + Time of Day Count + زمان شمارش روز + + + Relational Count + شمارش رابطه + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + تاریخ تاریخ + + + Year + سال + + + Month + ماه ماه + + + Day + روز روز + + + Time + زمان زمان + + + Hour + ساعت قیامت + + + Minute + دقیقه + + + Second + دوم دوم + + + Warning + هشدار هشدار + + + Protocol + پروتکل Protocol + + + Method + Method Method Method + + + URI + URI + + + Query + Query + + + Response code + کد پاسخ + + + Time taken + زمان گرفته شده + + + Bytes sent + سوگند + + + Bytes received + Bytes دریافت + + + Referrer + ارجاع دهنده + + + Cookie + کوکی ها + + + Client + مشتری + + + User-agent + User-agent + + + January + ژانویه ژانویه ژانویه + + + February + فوریه فوریه + + + March + مارس مارس + + + April + آوریل + + + May + ممکن است + + + June + ژوئن + + + July + جولای + + + August + آگوست + + + September + سپتامبر سپتامبر + + + October + اکتبر اکتبر + + + November + نوامبر نوامبر + + + December + دسامبر دسامبر دسامبر + + + Sunday + یکشنبه یکشنبه یکشنبه + + + Monday + دوشنبه دوشنبه + + + Tuesday + سه شنبه + + + Wednesday + چهارشنبه چهارشنبه + + + Thursday + پنجشنبه پنجشنبه + + + Friday + جمعه جمعه جمعه + + + Saturday + شنبه شنبه + + + diff --git a/logdoctor/translations/LogDoctor_fi_FI.ts b/logdoctor/translations/LogDoctor_fi_FI.ts new file mode 100644 index 0000000..03e1d94 --- /dev/null +++ b/logdoctor/translations/LogDoctor_fi_FI.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versioita + + + Version 4 + Versio 4 + + + Version 3 + Versio 3 + + + Version 2 + Versio 2 + + + Version 1 + Versio 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Rakenna käsikirjoituksia + + + Cross-platform compatibility: + Laivaston yhteensopivuus: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Tilastot: + + + Warnings + Varoitus + + + Speed + Nopeus + + + Counts + kreivitär + + + Daytime + Päivä + + + Relational + Suhde + + + Globals + Globals + + + Translations: + Käännökset: + + + Italian + Italian italia Italia + + + Spanish + Espanja espanja espanjaksi + + + French + ranskaksi ranskaksi + + + Tools: + Työkalut: + + + Block note + Block muistiinpanot + + + Utilities: + Hyödyt: + + + Infos viewer + Info katsoja + + + Updates checker + Päivitä tarkistus + + + Themes: + Aiheet: + + + Dark + Dark + + + Light + Valon valo + + + Improvements and fixes + Parannuksia ja korjauksia + + + New themes: + Uusia teemoja: + + + Ash + Ash + + + Candy + Karkki + + + Forest + Metsä metsä + + + Powder + Jauhetta + + + Restyled GUI + Restyle GUI + + + Restyled dialogs + Tallennettuja dialogeja + + + Doxygen documentation + Doxygen dokumentointi + + + Mini-Games: + Mini-pelit: + + + Criss-cross + Ristiriita + + + Snake + Käärme + + + Changed default paths + Muuttunut oletuspolku + + + New game modes for Snake + Uusia pelimuotoja käärmeelle + + + Hunt + Metsästys + + + Battle + Taistelu + + + New translations: + Uudet käännökset: + + + Japanese + Japanilaiset japanilaiset + + + Portuguese + Portugalilainen + + + Code improvements + Koodin parannukset + + + Performance improvements + Suorituskyvyn parannukset + + + Added tests suite: + Lisättyä testiä: + + + white box tests + Valkoiset laatikot + + + Customized charts themes + Mukautetut kaavion teemat + + + Fixes + Korjaaminen + + + Tests improvements + Testaa parannuksia + + + Docker support + Dockerin tuki + + + Upgrade to C++20 + Päivitys C++20 + + + Upgrade to Qt6 + Qt6 päivitys + + + Restyled themes + Tallennettuja teemoja + + + Redesigned configs section + Uudistetut konfigurtit + + + Stability improvements + Vakausparannukset + + + Generating warnings dinamically + Varoitukset dinamisesti + + + New tool: + Uusi työkalu: + + + Changelog + Muutos + + + Tweakable parameters for some of the charts: + Pieniä parametreja joillekin kaavioista: + + + Improved project structure + Parannettu projektirakenne + + + Modernized Cmake usage + Modernisoitunut Cmake käyttö + + + + Crapinfo + + Version + Versio + + + Currently installed version of the software + Ohjelmiston asennettu versio + + + Repository links + Repositiivinen linkki + + + Paths + Tiet + + + The path of the executable file + Toteutettavan tiedoston polku + + + Executable + Tekoäly + + + The path where the configuration file gets saved and searched in + Tie, jossa määritystiedosto tallennetaan ja haetaan + + + Configuration file + Määritelmätiedosto + + + The path where the application searches for extra resources + Tie, jossa sovellus etsii lisäresursseja + + + Application data + Sovellustiedot + + + + Crapnote + + Reduce the font size + Vähennä fontin kokoa + + + Font size + Font size + + + Increase the font size + Lisää fontin kokoa + + + + Crappath + + Choose + Valitse + + + Cancel + Peruutukset + + + + Crapup + + Checking for updates + Tarkista päivitykset + + + New version available + Uusi versio saatavilla + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Uusi versio on saatavilla! +Käy LogDoctorin git-tietokoneessa ja seuraa ohjeita päivittämisestä + + + No update found + Ei päivitystä löytynyt + + + LogDoctor is up-to-date + LogDoctor on ajan tasalla + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Käytössäsi on versio tulevaisuudesta! +Versio on yli tämänhetkinen versio +Käytätkö alkuperäistä logoa? +Käy LogDoctorin arkistossa ja hanki uusi versio siitä + + + Failed to establish a connection + Epäonnistunut muodostamaan yhteyden + + + Connection error, please try again later + Yhteysvirhe, yritä uudelleen myöhemmin + + + Connection timed out + Yhteys ajoitettu + + + Version check failed + Versiotarkastus epäonnistui + + + An error occured while parsing: +version mark not found + Erehdys tapahtui parrasingissa: +versiota ei löytynyt + + + An error occured while parsing: +malformed version + Erehdys tapahtui parrasingissa: +Epämuodostunut versio + + + An error occured while comparing: +malformed upstream version + Vertailussa tapahtui virhe: +Epämuodostunut ylävirran versio + + + + CrissCross + + Victory + Voitto + + + You beated me! + Sinä löit minut! + + + This time you lost! + Tällä kertaa hävisit! + + + Draw + Draama + + + Nice match + Hyvä ottelu + + + + DialogBool + + Yes + Kyllä Kyllä Kyllä Kyllä + + + No + Ei Ei Ei Ei Ei Ei Ei Ei Ei Ei + + + + DialogIda + + Ignore + Huonosti + + + Discard + Discard + + + Abort + Abortti + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Yhdellä listalla on mitätön kohta + + + An error occured while reading the configuration file + Virhe tapahtui, kun luin määritystiedoston + + + An error occured while parsing configuration file's data + Virhe tapahtui, kun määritystiedoston tiedot + + + Failed to create the configuration file's directory + Epäonnistunut luomaan määritystiedoston hakemistoa + + + Failed to create the configuration file + Epäonnistunut luomaan konfiguraatiotiedostoa + + + An error occured while writing the configuration file + Virhe tapahtui, kun kirjoitin kokoonpanotiedoston + + + An error occured while preparing the configuration file's data + Erehdys tapahtui, kun määritystiedoston tiedot valmisteltiin + + + The path contains a symlink + Tie sisältää symlinkin + + + The file does not exist + Tiedostoa ei ole olemassa + + + Failed to create the database backups' directory + Tietokannan varmuuskopioiden hakemiston luominen epäonnistui + + + Failed to copy the database file + Tietokantatiedoston kopiointi epäonnistui + + + Failed to update the backups + Epäonnistunut päivittämään varmuuskopioita + + + Failed to create the directory + Epäonnistunut luomaan hakemistoa + + + Unrecognized entry + Tunnistamaton sisäänpääsy + + + Size of the file + Tiedoston koko + + + Warning size parameter + Varoitusparametri + + + Failed to read gzipped file + Epäonnistunut lukemaan gzipped-tiedostoa + + + An error occured while parsing the format string + Erehdys tapahtui, kun muodon merkkijono + + + Available memory + Saatavilla oleva muisti + + + Size of the logs + Lokien koko + + + An error occured while reading the gzipped file + Erehdys tapahtui, kun luet Gzipped-tiedostoa + + + An error occured while reading the file + Virhe tapahtui, kun luin tiedoston + + + Something failed while handling the file + Jokin epäonnistui tiedoston käsittelyssä + + + An error occured while working on the database + Tietokantaan liittyvä virhe on tehty + + + Aborting + Abortti + + + Invalid locale + Invalid paikalliset + + + Unexpected locale format + Odottamaton paikallinen muoto + + + If you haven't manually edited the configuration file, +please report this issue + Jos et ole manuaalisesti muokannut kokoonpanotiedostoa, +Ilmoita tästä aiheesta + + + The given locale is not an accepted language + Koti ei ole hyväksytty kieli + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Jos haluat tehdä tämän paikan LogDoctorissa, +Ole hyvä ja noudata rekisterin ohjeita + + + Configuration file not found + Konfigurointitiedostoa ei löytynyt + + + Unable to retrieve the configuration file + Et voi hakea määritystiedostoa + + + Skipping + Skipping + + + An error occured while handling the configuration file + Virhe tapahtui konfiguraatiotiedoston käsittelyssä + + + Failed to write the configuration file + Epäonnistunut kirjoittamaan konfiguraatiotiedostoa + + + Current configuration not saved + Nykyinen kokoonpano ei ole pelastettu + + + File not readable + Tiedosto ei ole luettavissa + + + The file is not readable + Tiedosto ei ole luettavissa + + + File not writable + Tiedosto ei kirjoita + + + The file is not writable + Tiedosto ei ole kirjoitettu + + + Directory not writable + Ohjaus ei kirjoita + + + The directory is not writable + Hakemisto ei ole kirjoitettu + + + Invalid path + Väkivaltainen tie + + + Failed applying configuration + Epäonnistunut kokoonpano + + + Invalid configuration lines + Väkivaltaiset kokoonpanolinjat + + + Has not been possible to apply some of the configurations + ei ole ollut mahdollista käyttää joitakin kokoonpanoja + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Jos päätät jatkaa, kaikki soveltamattomat kokoonpanot menetetään. +Jatka? + + + Failed to retrieve the help file + Epäonnistunut hakemaan apua + + + An error occured while getting the help file + Virhe tapahtui, kun sait aputiedoston + + + Additional resources can be downloaded from the git repo + Lisäresursseja voi ladata Git Reposta + + + Unable to retrieve the file + Et voi hakea tiedostoa + + + Invalid string + Invalid string + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Joukko on mitätön eikä sitä voi lisätä luetteloon. + +Oikaise ja kierrätä + + + QSql driver not found + QSQL-kuljettajaa ei löytynyt + + + Failed to retrieve the driver needed to handle the database + Epäonnistunut hakemaan tietokannan käsittelyyn tarvittavaa kuljettajaa + + + File not found + Tiedostoa ei löytynyt + + + Failed to retrieve the database file + Tietokantatiedoston hakeminen epäonnistui + + + Create a new database? + Luo uusi tietokanta? + + + The database contains an unexpected table + Tietokanta sisältää odottamattoman taulukon + + + Unexpected table + Odottamaton pöytä + + + It seems that the database is missing a table + Tietokanta puuttuu pöydästä + + + Table not found + Pöytä ei löytynyt + + + The database contains an unexpected column + Tietokanta sisältää odottamattoman sarakkeen + + + Unexpected column + Odottamaton kolumni + + + It seems that the table is missing a column + Näyttää siltä, että pöytä puuttuu sarakkeesta + + + Column not found + Kolumni ei löytynyt + + + A column has an unexpected data-type + Sarakkeella on odottamaton tietotyyppi + + + Unexpected data-type + Odottamaton tietotyyppi + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Tämä tietokanta nimetään uudelleen trailing ".copy" ja uusi luodaan. +Jatka? + + + Database created + Tietokanta luotu + + + Successfully created a new database + Onnistunut uusi tietokanta + + + Not a file + Ei tiedostoa + + + The path was supposed to point to a file, but it doesn't + Tien oli tarkoitus osoittaa tiedostoon, mutta se ei + + + Please remove the conflict and retry + Poista konflikti ja poista + + + The database file is not readable + Tietokantatiedostoa ei ole luettavissa + + + Please set the proper permissions and retry +If this error persists, please report this issue + Ole hyvä ja aseta oikeat luvat ja luvat +Jos tämä virhe jatkuu, ilmoita asiasta + + + The database file is not writable + Tietokantatiedosto ei ole kirjoitettu + + + Invalid database path + Invalid tietokanta + + + Failed creating database + Tietokannan luominen epäonnistui + + + An error occured while creating the database + Tietokannan luomisessa tapahtui virhe + + + Failed opening database + Epäonnistunut tietokanta + + + An error occured while opening the database + Tietokannan avaamisessa tapahtui virhe + + + Failed executing on database + Tietokannan epäonnistuminen + + + An error occured while executing a statement on the database + Virhe tapahtui, kun tietokantaan tehtiin ilmoitus + + + Failed to backup database + Epäonnistunut varmuuskopiointitietokantaan + + + Please report this issue + Ilmoita tästä aiheesta + + + Invalid log format string + Invalid log format string + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Tarkista, että verkkopalvelimesi ei heittele virheitä. +Jos se hyväksytään, tarkista typon läsnäolo täältä. +Jos kaikki on hyvin, ilmoita tästä + + + Log format error + Log formaattivirhe + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Lokimuotoa ei ole määritetty tai se on mitätön. +Ole hyvä ja lisää pätevä yksi konfiguraatioihin + + + Misconfigured log format + Väärin määritetty log-formaatti + + + No log field has been set in the current logs format, +making it useless to parse logs + Nykyisessä lokimuodossa ei ole asetettu lokikenttää, +Tehdä siitä hyödytöntä parse lokit + + + Please set up a format which contains at least one field + Ole hyvä ja määritä lomake, jossa on vähintään yksi kenttä + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Yhdestä tai useammasta kentästä puuttuu ero, +vaikeuttaa verkon rajojen luomista, +mahdollisesti johtaa väärien tietojen tallentamiseen + + + Please set up a format which contains separators between fields + Ole hyvä ja luo lomake, joka sisältää kenttien välistä erotinta + + + Missing field in log format + Kadonnut kenttä lokimuodossa + + + An important field is missing from the provided format: + Tärkeä kenttä puuttuu suunnitellusta muotoilusta: + + + The quality of the statistics may be seriously compromized + Tilastojen laatu voi vaarantaa + + + Proceed anyway? + Prosessi joka tapauksessa? + + + 'Carriage Return' in log format + Palautus log-muodossa + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Mainitussa muodossa on 'Carriage Return'. +Tämä voi johtaa tietojen menetyksiin tai kaatumisiin, jos niitä ei käytetä varoen + + + An error occured while parsing logs + Erehdys tapahtui, kun lokit + + + Failed defining type + Epäonnistunut määrittelytyyppi + + + Failed to determine the log type + Epäonnistunut määrittämään lokityypin + + + File already used + Käytetty tiedosto + + + The file has probably been used already + Tiedostoa on todennäköisesti jo käytetty + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Huomaa varoitus ja käytä sitä joka tapauksessa, poista se ja jatka tai abort koko prosessin? + + + Duplicate file + Kaksinkertainen tiedosto + + + The file appears twice in the list of selections + Tiedosto näkyy kahdesti valintojen luettelossa + + + Failed updating hashes + Epäonnistuneet päivitykset + + + An error occured while inserting the parsed files hashes into the database + Virhe tapahtui, kun laajennettu tiedosto hajosi tietokantaan + + + File exceeds warning size + Tiedosto ylittää varoituskoon + + + The file's size exceeds the warning size + tiedoston koko ylittää varoituskoon + + + Not enough memory + Ei tarpeeksi muistia + + + The total size of the selected files exceeds the available memory + Valittujen tiedostojen koko ylittää käytettävissä olevan muistin + + + Please free some resources, parse the files in different steps or split them into smaller units + Vapauta joitakin resursseja, jaa tiedostot eri vaiheissa tai jaa ne pienempiin yksiköihin + + + Failed reading + epäonnistunut lukeminen + + + File is empty + Tiedosto on tyhjä + + + The file is blank + Tiedosto on tyhjä + + + Failed to retrieve the selected file + Epäonnistunut hakemaan valittua tiedostoa + + + Discard it and continue, or Abort all and exit? + Poista se ja jatka tai abortoi kaikki? + + + No file to parse + Ei tiedostoja parse + + + The list of files to parse is empty + Lista tiedostoista on tyhjä + + + Directory not found + Ohjausta ei löytynyt + + + The directory does not exists + Hakemistoa ei ole olemassa + + + Directory not readable + Ohjaus ei ole luettavissa + + + The directory is not readable + Hakemisto ei ole luettavissa + + + Please set the proper permissions before to start + Aseta oikeat luvat ennen kuin aloitat + + + Failed creating directory + Epäonnistunut hakemisto + + + The path does not exists + Tie ei ole olemassa + + + Data conversion failed + Datan muuntaminen epäonnistui + + + Failed to convert from '%1' to '%2' + Epäonnistunut "%1" -%2 + + + Failed to create statistics + Epäonnistunut luomaan tilastoja + + + An error occured while processing + Virhe tapahtui käsittelyn aikana + + + Cannot create statistics + Tilastoja ei voi luoda + + + No data has been found that matches with the currently set parameters + Mitään tietoja ei ole löydetty, jotka vastaavat tällä hetkellä asetettuja parametreja + + + Not a folder + Ei kansiota + + + The path was supposed to point to a folder, but it doesn't + Tien piti osoittaa kansioon, mutta se ei + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Sisäänpääsy nimetään uudelleen trailing ".copy" ja uusi luodaan. +Jatka? + + + An error occured + Virhe tapahtui + + + Failed renaming + Epäonnistunut nimeäminen + + + An error occured while renaming + Virhe tapahtui uudelleenmäärittelyssä + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Osallistu Apache2-verkkopalvelimeen + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Osallistu lokiin Nginx-verkkopalvelimesta + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Microsoft IIS -palvelimen sivut + + + IIS + IIS + + + Select/deselect all the files + Valitse/valitse kaikki tiedostot + + + All + Kaikki Kaikki Kaikki Kaikki + + + Inspect a log file + Tarkista lokitiedosto + + + Name + Nimen nimi + + + Size + Koko + + + Refresh the list + Päivitä lista + + + Total size of the parsed data + Parsed datan kokonaiskoko + + + Total number of parsed lines + Kokonaismäärä pehmeitä linjoja + + + Start parsing the selected files + Aloita valitsemasi tiedostot + + + START + Start + + + Time elapsed since the start + Aika kului alusta alkaen + + + Average speed, in parsed data size per second + Keskimääräinen nopeus, pirstoitujen tietojen koko sekunnissa + + + Web Server + Web-palvelin + + + Select a Web Server + Valitse verkkopalvelin + + + Year + Vuosi + + + Month + Kuukausi + + + Day + Päivä päivä + + + Hour + Tunti + + + Draw the chart + Piirrä kartta + + + Log line marked as Warning + Linja on merkitty varoituksena + + + Date when the request arrived (YYYY-MM-DD) + Päivämäärä, jolloin pyyntö tuli (YYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Aika, jolloin pyyntö tuli (h:mm:ss) + + + Protocol of the request + Pyynnön pöytäkirja + + + Method of the request + Pyynnön menetelmä + + + URI of the requested page + Pyydetyn sivun URI + + + Query carried along with the URI + URI URI mukana + + + Response code from the server + Vastauskoodi palvelimelta + + + User-agent of the client which made the request + Asiakkaan edustaja, joka pyysi + + + IP address of the Client which made the request + Asiakkaan IP-osoite, joka pyysi + + + Cookie used for the request + pyyntöön käytetty eväste + + + The URL which redirected the Client to the requested page + URL, joka ohjasi asiakkaan uudelleen pyydetylle sivulle + + + Size ib Bytes of the request, usually includes header and data + Pyynnön koon ib-sivut, yleensä otsikko ja tiedot + + + Size in Bytes of the served content, usually includes header and data + Size in Bytes of the served content, sisältää yleensä otsikot ja tiedot + + + Time taken by the server to serve the content, in milliseconds + Palvelimen käyttämä aika palvella sisältöä millisekunneissa + + + Only use lines in which the field is starting with this string + Käytä vain linjoja, joissa kenttä alkaa tästä + + + Protocol: + Pöytäkirja: + + + Method: + Menetelmä: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Käytä vain linkkejä, joissa kenttä vastaa tätä lausuntoa. +Käytä ’!’, ’=’, ’<’ tai ’>’ ilmoittaaksesi mitä käyttää + + + Response: + Vastaus: + + + Query: + Query: + + + URI: + URI: + + + Filters + Filters + + + Count + Count Count + + + Number of occurrences + Tapahtumien määrä + + + Item + kohteen + + + Value of the field + Alan arvo + + + From: + Lähde: + + + To: + To: + + + Select a log field to view + Valitse lokikenttä, jotta näet + + + Field: + Kenttä: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Jousien avulla käytetään vain linjoja, joissa kenttä alkaa tällä merkkijonolla. +Lukujen avulla käytä ’!’, ’=’, ’<’ tai ’>’ ilmoittamaan, mitä käyttää + + + Protocol + Pöytäkirja + + + Method + Menetelmä + + + URI + URI + + + User-agent + Käyttäjäagentti + + + Most recurrent + Eniten toistuvia + + + Most trafficked + Suurin osa ihmiskaupasta + + + Date ever + Päivämäärä koskaan + + + Day of the week + Viikon päivä + + + Hour of the day + Päivän tunti + + + Time taken + Aika kului + + + Bytes sent + Lähetettyjä sivuja + + + Bytes received + Saadut sivut + + + Mean/Max performances + Merkittävät / Max + + + Requests received + Saadut pyynnöt + + + Total work + Kokonaistyö + + + General + yleinen + + + Window + Ikkuna + + + Dialogs + Dialogit + + + Charts + Karttoja + + + Appearance + Ulkonäkö + + + Speed + Nopeus + + + Relational + Suhde + + + TextBrowser + Tekstien selaaminen + + + Databases + Tietokanta + + + Security + Turvallisuusturvallisuus + + + Logs + Lokit + + + Defaults + Defaults + + + Control + valvonta valvonta + + + Path + Tie + + + Format + Formaatti + + + Warnlists + Varoitus + + + Blacklists + Mustat listat + + + Remember the window's position and size + Muista ikkunan sijainti ja koko + + + Remember position and size + Muista sijainti ja koko + + + Remember window's position and size + Muista ikkunan sijainti ja koko + + + Geometry + Geometriaa + + + Theme to use for the window + Ikkunan käyttäminen + + + Theme + Teema + + + Native + Native + + + Light + Valon valo + + + Dark + Dark + + + Auto + Auto Auto Auto Auto Auto Auto Auto Auto Auto + + + Icons + Ikonit + + + Normal quantity of dialog messages shown + Normaali määrä dialogisia viestejä + + + Normal + Normaalisti + + + Dialogs from the main processes + Keskustelut tärkeimmistä prosesseista + + + Dialogs emitted when parsing logs + Dialogit, jotka on otettu päällystettäessä + + + Logs parser + Papukaija + + + Dialogs emitted when viewing statistics + Tilastoja tarkastellessa esitetyt dialogit + + + Statistics viewer + Tilastokeskuksen katsoja + + + Define the quantity of dialog mesages shown + Määrittele dialogin viestien määrä + + + Dialogs level + Dialogien taso + + + Reduced quantity of dialog messages shown + Vähentynyt määrä dialogisia viestejä + + + Essential + Eteerinen + + + Augmented quantity of dialog messages shown + Lisätty määrä dialogisia viestejä + + + Explanatory + Selitys + + + Theme to use for the Charts + Aiheena on käyttää kaavioita + + + Preview + Preview + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Edustaa askelta akselissa sekunneissa. +Kaikki saman väliajan arvot yhdistetään ja keskiarvoa käytetään. + + + Time interval + Aikaväli + + + The format to use for the labels of the time axis. + Akselin etiketteihin käytettävä muoto. + + + Time format + Aikamuoto + + + The size of the pie + Pienen kokoinen + + + Pie size + Pienen kokoinen + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Enimmäismäärä viipaloita, joista piirakka muodostuu. +Ylimääräiset viipaleet ryhmitellään yhteen kattavaan viipaleen. + + + Maximum slices + Maksimi viipaleet + + + Font to use for the Text Browser + Majoitusta Text Selain + + + Font + Font + + + Double-spaced lines + Kaksinkertaiset linjat + + + Use wide lines + Käytä laajaa linjaa + + + Define the spacing between lines + Määrittele rivien välinen spacing + + + Lines spacing + Linjat spacing + + + None + Ei kukaan + + + Color scheme to use for the Text Browser + Värijärjestelmä tekstiselainta varten + + + Color scheme + Värijärjestelmä + + + The appearance of the Text Browser with the current settings + Teksti selaimen ulkonäkö nykyisillä asetuksilla + + + Insert the base path only, file name excluded + Lisätään vain peruspolku, tiedoston nimi poissuljettuna + + + The given path doen't exists, or doesn't point to a folder + Tietty polku ei ole olemassa tai ei viittaa kansioon + + + Path for the database files + Tie tietokantatiedostoihin + + + Paths + Tiet + + + Apply the current path + Käytä nykyistä tietä + + + Select the path through a dialog window + Valitse reitti dialogin ikkunan läpi + + + Path where the logs data collection database is located + Tie, jossa lokitietojen keräystietokanta sijaitsee + + + Logs data + Logs tiedot + + + Path where the used files hashes database is located + Tie, jossa käytetyt tiedostot hajottavat tietokannan + + + Used files + Käytetyt tiedostot + + + Backup options for the Logs Data database + Varmuuskopiointivaihtoehdot Logs Data -tietokantaan + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Uusi varmuuskopio tehdään LogDoctorin sulkemisen jälkeen, kun tietokanta on onnistuneesti editoitu + + + Backup the Logs Data database and keep + Varmuuskopioi Logs Data -tietokanta ja säilytä + + + Whether it is allowed or denied to follow symlinks occuring in a path + Onko se sallittua tai kiellettyä seurata symlinkkejä, jotka tapahtuvat polulla + + + Follow symlinks + Seuraa symlinkkejä + + + Default WebServer + Oletus WebServer + + + Usage control + Käyttövalvonta + + + Hide already used files + Piilota jo käytettyjä tiedostoja + + + Size warnings + Koko Varoitukset + + + Warn me when using files with a size exceeding: + Varoita, kun käytät tiedostoja, joiden koko on suurempi: + + + Logs folder + Logs Folder + + + Logs format string + Logs format string Näytä lisää + + + Format string + Format string + + + Insert the format string you're using + Aseta lomake, jota käytät + + + Apply the current string + Levitä nykyistä merkkijonoa + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Luo näytteen lokilinja nykyisestä tallennetusta jono, tarkistaa, onko se muotoiltu oikein. +Kaikki kentät, joita LogDoctor ei katso, näyttävät 'DISCARDED' + + + Generate sample + Generation Näytteet + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Tarkista tämän linkin oikeellisuus. +'DISCARDED' merkityt kentät päällystettiin oikein, mutta LogDoctor ei katso niitä + + + Open an help window + Avaa ikkuna avuksi + + + Help + Apua auttamaan + + + Select a log field + Valitse lokikenttä + + + Use warnlist for this field + Varoitusta tälle kentälle + + + Add the current line to the list + Lisää nykyinen linja luetteloon + + + Remove the selected item from the list + Poista valittu kohde luettelosta + + + Move the selected item down + Siirrä valittu kohde alas + + + Use blacklist for this field + Käytä musta lista tällä alalla + + + Add line + Lisälinja + + + Remove selection + Poista valinta + + + Language + Kieli + + + Utilities + Hyödyllisiä + + + Tools + Työkalut + + + Games + Pelejä + + + Perform a version-check + Suorita versio-check + + + Show some info about LogDoctor + Lisätietoja LogDoctorista + + + Open a block-note like window to write temporary text + Avaa lohko-ääni, kuten ikkuna kirjoittaa väliaikaista tekstiä + + + Play CrissCross + Pelaa Criscross + + + Play Snake + Pelaa käärmettä + + + Show the changelog + Näytä muutos + + + warnlist + Varoitus + + + blacklist + Blacklist + + + copy + kopioita + + + copies + Kopioita + + + Check updates + Tarkista päivitykset + + + Infos + Info + + + BlockNote + Blokki + + + CrissCross + Kriisi + + + Snake + Käärme + + + Changelog + Muutos + + + + RichText + + Select a file from the list + Valitse tiedosto luettelosta + + + to inspect its content + tarkastaa sen sisällön + + + Failed to read + Epäonnistunut lukemaan + + + + SnakeGame + + PLAY + Lataa + + + Classic + Klassinen + + + Hunt + Metsästys + + + Battle + Taistelu + + + Game Over + Peli yli + + + Your adversary fell in the water! + Vihollinen putosi veteen! + + + YOU WON! + Sinä voit! + + + You fell in the water! + Sinä putosit veteen! + + + YOU LOST! + Sinä menetit! + + + Your adversary ate itself! + Vastustaja söi itsensä! + + + You ate yourself! + Söit itsesi! + + + Your adversary ate you! + Vihollinen söi sinut! + + + You ate your adversary! + Söit vastustajasi! + + + You ate each other! + Söitte toisianne! + + + MATCH IS DRAW! + MATCH on ihanaa! + + + + TR + + Unexpected WebServer + Odottamaton WebServer + + + Logs Size Breakdown + Kokoa Breakdown + + + Ignored + Unohdettu + + + Parsed + Vanhemmat + + + Blacklisted + Musta lista + + + Others + Muut + + + from + From + + + to + että + + + Log Lines Marked as Warning + Log Lines varoitus + + + Time Taken to Serve Requests + Aika kuluu pyyntöjen täyttämiseen + + + Time of Day Count + Päivän kreivi + + + Relational Count + suhteellinen kreivi + + + FALSE + Väärä + + + TRUE + True + + + Date + Päivämäärä + + + Year + Vuosi + + + Month + Kuukausi + + + Day + Päivä päivä + + + Time + Aika-aika + + + Hour + Tunti + + + Minute + Minuutti + + + Second + Toinen toinen + + + Warning + Varoitus + + + Protocol + Pöytäkirja + + + Method + Menetelmä + + + URI + URI + + + Query + Query + + + Response code + Vastauskoodi + + + Time taken + Aika kului + + + Bytes sent + Lähetettyjä sivuja + + + Bytes received + Saadut sivut + + + Referrer + Referrejä + + + Cookie + Cookie + + + Client + Asiakas + + + User-agent + Käyttäjäagentti + + + January + tammikuu tammikuu + + + February + helmikuu helmikuu helmikuu helmikuu + + + March + Maaliskuu + + + April + huhtikuu huhtikuu huhtikuu + + + May + May May + + + June + kesäkuuta + + + July + heinäkuu heinäkuu heinäkuu + + + August + Elokuu elokuu + + + September + Syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syys syyskuu syyskuu syys syyskuu syyskuu syyskuu syyskuu syyskuu syyskuu syys syyskuu syys syyskuu syyskuu syyskuu syyskuu syyskuu syys syys syyskuu syyskuu syyskuu syys syys syyskuu syys syys syyskuu syys syys syys syys syys syys syys syys syy syy syy syy syy syy syy syy syy syys syy syy syy syys syys syys syy syy syy syy syy syy syy syys syy syy syy syy syy syy syys syys syys syys syy syys syy syy syy syy syys syys syys syys syy syy syy syy syy syy syy syy syys syy syy syy syy syys syy syy syy syy syy syy syys syy syy syy syy syy syy syys syy syy syy syy syy syy syy syy syy syy syy syy syy + + + October + lokakuu lokakuu lokakuu + + + November + Marraskuu marraskuu marraskuu + + + December + joulukuuta + + + Sunday + sunnuntai sunnuntai sunnuntai + + + Monday + maanantaina maanantaina + + + Tuesday + Tiistaina tiistaina tiistaina + + + Wednesday + Keskiviikko keskiviikkona + + + Thursday + Torstaina torstai + + + Friday + Perjantaina perjantaina perjantaina + + + Saturday + Lauantaina lauantaina + + + diff --git a/logdoctor/translations/LogDoctor_fr_FR.ts b/logdoctor/translations/LogDoctor_fr_FR.ts index 78f4e2b..ec316f2 100644 --- a/logdoctor/translations/LogDoctor_fr_FR.ts +++ b/logdoctor/translations/LogDoctor_fr_FR.ts @@ -1058,6 +1058,30 @@ This may lead to data losses or crashes if not used with caution Le format fourni contient le 'Carriage Return'. Cela peut entraîner des pertes de données ou des plantages s'il n'est pas utilisé avec prudence + + Failed to create the configuration file + Impossible de créer le fichier de configuration + + + The path contains a symlink + Le chemin contient un lien symbolique + + + The file does not exist + Le fichier n&apos;existe pas + + + Invalid path + Voie non valide + + + Invalid database path + Chemin de base de données non valide + + + The path does not exists + Le chemin n&apos;existe pas + GameDialog @@ -1550,18 +1574,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'Générez un exemple de ligne de journal à partir de la chaîne actuellement enregistrée, pour vérifier si elle est correctement formatée. Tout champ non pris en compte par LogDoctor apparaîtra comme 'DISCARDED' - - CrissCross - CrissCross - Play CrissCross Jouer au CrissCross - - Snake - Snake - Play Snake Jouer au Snake @@ -1728,22 +1744,10 @@ Les champs marqués comme 'DISCARDED' ont été analysés correctement Games Jeux - - Check updates - Vérifier les mises à jour - Perform a version-check Effectuer une vérification de version - - Infos - Infos - - - BlockNote - Bloc Notes - Open a block-note like window to write temporary text Ouvrir une fenêtre de type bloc-note pour écrire un texte temporaire @@ -1784,10 +1788,6 @@ Les champs marqués comme 'DISCARDED' ont été analysés correctement Show some info about LogDoctor Afficher quelques informations sur LogDoctor - - Changelog - Journal des modifications - Show the changelog Afficher le journal des modifications @@ -1806,82 +1806,6 @@ Toutes les valeurs comprises dans le même intervalle seront fusionnées et la v Time interval Intervalle de temps - - 1 - 1 - - - 2 - 2 - - - 3 - 3 - - - 4 - 4 - - - 5 - 5 - - - 10 - 10 - - - 15 - 15 - - - 20 - 20 - - - 30 - 30 - - - 60 - 60 - - - 120 - 120 - - - 180 - 180 - - - 240 - 240 - - - 300 - 300 - - - 600 - 600 - - - 900 - 900 - - - 1200 - 1200 - - - 1800 - 1800 - - - 3600 - 3600 - The format to use for the labels of the time axis. Le format à utiliser pour les étiquettes de l'axe du temps. @@ -1890,14 +1814,6 @@ Toutes les valeurs comprises dans le même intervalle seront fusionnées et la v Time format Format de l'heure - - hh:mm - hh:mm - - - hh - hh - The size of the pie La taille du diagramme circulaire @@ -1924,6 +1840,42 @@ Les tranches excédentaires seront regroupées en une seule tranche compréhensi Appearance Apparence + + Security + Sécurité + + + Whether it is allowed or denied to follow symlinks occuring in a path + Qu&apos;il soit permis ou refusé de suivre des liens symboliques se produisant dans un chemin + + + Follow symlinks + Suivez les liens symboliques + + + Check updates + Vérifier les mises à jour + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Snake + + + Changelog + Journal des modifications + RichText diff --git a/logdoctor/translations/LogDoctor_ga_IR.ts b/logdoctor/translations/LogDoctor_ga_IR.ts new file mode 100644 index 0000000..29f57fa --- /dev/null +++ b/logdoctor/translations/LogDoctor_ga_IR.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Leaganacha + + + Version 4 + Leagan 4 + + + Version 3 + Leagan 3 + + + Version 2 + Leagan 2 + + + Version 1 + Leagan 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Tógáil scripteanna + + + Cross-platform compatibility: + Comhoiriúnacht tras-ardán: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Staitisticí: + + + Warnings + Amharc ar gach eolas + + + Speed + Luas agus Luas + + + Counts + Contaetha + + + Daytime + Lá an Lae + + + Relational + Gaol + + + Globals + Domhanda na + + + Translations: + Aistriúcháin: + + + Italian + Italian + + + Spanish + Spanish + + + French + French + + + Tools: + Uirlisí: + + + Block note + Tabhair faoi deara + + + Utilities: + Fóntais: + + + Infos viewer + Eolas faoin lucht féachana + + + Updates checker + Déan Teagmháil Linn + + + Themes: + Téamaí: + + + Dark + Dark + + + Light + Solas na Gréine + + + Improvements and fixes + Feabhsúcháin agus daingneáin + + + New themes: + Téamaí nua: + + + Ash + Ash + + + Candy + riachtanais uisce: measartha + + + Forest + Foraoise + + + Powder + Púdar triomaithe a reoite + + + Restyled GUI + GUI restyled + + + Restyled dialogs + dialóga athstiúrtha + + + Doxygen documentation + Doiciméid Doxygen + + + Mini-Games: + Mini-Games: + + + Criss-cross + Léirmheasanna-tras + + + Snake + Snake + + + Changed default paths + Bealaí réamhshocraithe a athrú + + + New game modes for Snake + Modhanna cluiche nua do Snake + + + Hunt + Hunt Hunt + + + Battle + Cathanna agus Cathanna + + + New translations: + aistriúcháin nua: + + + Japanese + Japanese + + + Portuguese + Portuguese + + + Code improvements + Feabhsúcháin ar Chód Cleachtais + + + Performance improvements + Feabhsuithe ar fheidhmíocht + + + Added tests suite: + Sraith tástálacha breise: + + + white box tests + tástálacha bosca bán + + + Customized charts themes + Téamaí cairteacha saincheaptha + + + Fixes + Fixes + + + Tests improvements + Feabhsuithe tástála + + + Docker support + Tacaíocht do Docker + + + Upgrade to C++20 + Uasghrádú go C++20 + + + Upgrade to Qt6 + Uasghrádú go Qt6 + + + Restyled themes + Téamaí restyled + + + Redesigned configs section + Cuid choigiltis athdheartha + + + Stability improvements + Feabhsuithe ar Chobhsaíocht + + + Generating warnings dinamically + rabhaidh a ghiniúint go dinamically + + + New tool: + Uirlis nua: + + + Changelog + Déan Teagmháil Linn + + + Tweakable parameters for some of the charts: + paraiméadair Tweakable do roinnt de na cairteacha: + + + Improved project structure + Struchtúr tionscadail feabhsaithe + + + Modernized Cmake usage + Nua-Aimseartha Úsáid a dhéanamh + + + + Crapinfo + + Version + Leagan Gaeilge + + + Currently installed version of the software + Leagan reatha suiteáilte de na bogearraí + + + Repository links + Naisc an tSuímh + + + Paths + Amharc ar gach eolas + + + The path of the executable file + An cosán ar an comhad inrite + + + Executable + inrite + + + The path where the configuration file gets saved and searched in + An cosán ina bhfaigheann an comhad cumraíocht shábháil agus a chuardach i + + + Configuration file + Comhad Cumraíochta + + + The path where the application searches for extra resources + An cosán ina gcuardaíonn an t-iarratas ar acmhainní breise + + + Application data + Sonraí an Iarratais + + + + Crapnote + + Reduce the font size + Laghdú ar an méid cló + + + Font size + Méid tiúchan + + + Increase the font size + Méadú ar mhéid an chló + + + + Crappath + + Choose + Roghnaigh + + + Cancel + Cealaigh + + + + Crapup + + Checking for updates + Seiceáil le haghaidh nuashonruithe + + + New version available + Leagan nua ar fáil + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Tá leagan nua ar fáil! +Tabhair cuairt ar stór git LogDoctor agus lean an teagasc faoi conas a thabhairt cothrom le dáta + + + No update found + Níl aon nuashonrú le fáil + + + LogDoctor is up-to-date + Tá LogDoctor cothrom le dáta + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Tá tú ag rith leagan as an todhchaí! +Tá do leagan níos faide ná an leagan sruth reatha +An bhfuil tú ag rith an LogDoctor bunaidh? +Tabhair cuairt ar an LogDoctor stór agus leagan úr de + + + Failed to establish a connection + Failed a bhunú nasc + + + Connection error, please try again later + Earráid Ceangal, déan iarracht arís ina dhiaidh sin + + + Connection timed out + Ceangal ama amach + + + Version check failed + Seiceáil Leagan theip + + + An error occured while parsing: +version mark not found + Tharla earráid agus parsáil: +leagan marc nach bhfuarthas + + + An error occured while parsing: +malformed version + Tharla earráid agus parsáil: +leagan malformed + + + An error occured while comparing: +malformed upstream version + Tharla earráid agus comparáid á dhéanamh: +leagan sruthú malformed + + + + CrissCross + + Victory + bláthanna cumhra: cumhráin + + + You beated me! + Tá tú beated dom! + + + This time you lost! + An uair seo chaill tú! + + + Draw + Amharc ar gach eolas + + + Nice match + Cluiche Nice + + + + DialogBool + + Yes + Tá sé + + + No + Níl an Tweet seo ar fáil + + + + DialogIda + + Ignore + taiseachas aeir: fliuch + + + Discard + Díroghnaigh gach rud + + + Abort + Abort + + + + DialogMsg + + Ok + Uisce agus Séarachas + + + + DialogSec + + One of the lists has an invalid item + Tá mír neamhbhailí ag ceann de na liostaí + + + An error occured while reading the configuration file + Tá earráid a tharlaíonn agus ag léamh an comhad chumraíocht + + + An error occured while parsing configuration file's data + Tá earráid a tharlaíonn agus parsing comhad chumraíocht sonraí + + + Failed to create the configuration file's directory + Failed a chruthú eolaire an comhad chumraíocht + + + Failed to create the configuration file + Failed a chruthú ar an comhad cumraíochta + + + An error occured while writing the configuration file + Tá earráid a tharlaíonn agus scríobh an comhad chumraíocht + + + An error occured while preparing the configuration file's data + Tarlaíonn earráid agus sonraí an chomhad cumraíochta á n-ullmhú + + + The path contains a symlink + Tá an cosán symlink + + + The file does not exist + Níl an comhad ann + + + Failed to create the database backups' directory + Failed a chruthú ar an bunachar sonraí cúltacaí' eolaire + + + Failed to copy the database file + Failed a chóipeáil an comhad bunachar sonraí + + + Failed to update the backups + Failed a thabhairt cothrom le dáta na cúltacaí + + + Failed to create the directory + Failed a chruthú ar an eolaire + + + Unrecognized entry + iontráil gan aithint + + + Size of the file + Méid an chomhaid + + + Warning size parameter + paraiméadar méid Cogadh + + + Failed to read gzipped file + Failed a léamh comhad gzipped + + + An error occured while parsing the format string + Tarlaíonn earráid agus parsing an teaghrán formáid + + + Available memory + cuimhne ar fáil + + + Size of the logs + Méid na logs + + + An error occured while reading the gzipped file + Tarlaíonn earráid agus an comhad gzipped á léamh + + + An error occured while reading the file + Tarlaíonn earráid agus an comhad á léamh + + + Something failed while handling the file + Theip ar rud éigin agus láimhseáil an comhad + + + An error occured while working on the database + Tarlaíonn earráid agus é ag obair ar an mbunachar sonraí + + + Aborting + Aborting + + + Invalid locale + Invalidity locale + + + Unexpected locale format + Formáid locale gan choinne + + + If you haven't manually edited the configuration file, +please report this issue + Más rud é nach bhfuil tú in eagar de láimh an comhad cumraíochta, +Tabhair tuairisc ar an gceist seo + + + The given locale is not an accepted language + Níl an locale ar leith teanga inghlactha + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Más mian leat go mbeadh an locale i LogDoctor, +le do thoil lean an teagasc ar an leathanach stór + + + Configuration file not found + Ní bhfuarthas an comhad Cumraíochta + + + Unable to retrieve the configuration file + Ní féidir a fháil ar an comhad cumraíochta + + + Skipping + Scipeáil chuig ábhar + + + An error occured while handling the configuration file + Tarlaíonn earráid agus láimhseáil an comhad chumraíocht + + + Failed to write the configuration file + Failed a scríobh an comhad chumraíocht + + + Current configuration not saved + cumraíocht reatha nach shábháil + + + File not readable + Comhad nach bhfuil inléite + + + The file is not readable + Níl an comhad inléite + + + File not writable + Comhad nach bhfuil inscríofa + + + The file is not writable + Níl an comhad inscríofa + + + Directory not writable + Eolaire nach inscríofa + + + The directory is not writable + Níl an eolaire inscríofa + + + Invalid path + cosán luachmhar + + + Failed applying configuration + Failed chumraíocht i bhfeidhm + + + Invalid configuration lines + Línte chumraíocht luachmhar + + + Has not been possible to apply some of the configurations + Níorbh fhéidir roinnt de na foirmíochtaí a chur i bhfeidhm + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Má roghnaíonn tú dul ar aghaidh, caillfear gach ceann de na cumraíochtaí neamhfheidhmeacha +Leanúint ar aghaidh? + + + Failed to retrieve the help file + Failed a fháil ar an comhad cabhrach + + + An error occured while getting the help file + Tarlaíonn earráid agus an comhad cabhrach á fháil + + + Additional resources can be downloaded from the git repo + Is féidir acmhainní breise a íoslódáil ón git repo + + + Unable to retrieve the file + Ní féidir a fháil ar an comhad + + + Invalid string + teaghrán luachmhar + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Tá an teaghrán tugtha neamhbhailí agus ní féidir é a chur leis an liosta + +Le do thoil é a cheartú agus atriail + + + QSql driver not found + Ní bhfuarthas tiománaí QSql + + + Failed to retrieve the driver needed to handle the database + Failed a fháil ar an tiománaí ag teastáil chun déileáil leis an mbunachar sonraí + + + File not found + Comhaid le fáil + + + Failed to retrieve the database file + Failed a fháil ar an comhad bunachar sonraí + + + Create a new database? + Cruthaigh bunachar sonraí nua? + + + The database contains an unexpected table + Tá an bunachar sonraí tábla gan choinne + + + Unexpected table + Tábla gan choinne + + + It seems that the database is missing a table + Dealraíonn sé go bhfuil an bunachar sonraí ar iarraidh tábla + + + Table not found + Tábla le fáil + + + The database contains an unexpected column + Tá an bunachar sonraí colún gan choinne + + + Unexpected column + colún gan choinne + + + It seems that the table is missing a column + Dealraíonn sé go bhfuil an tábla ar iarraidh colún + + + Column not found + Colún le fáil + + + A column has an unexpected data-type + Tá colún de chineál sonraí gan choinne + + + Unexpected data-type + Cineál sonraí gan choinne + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Déanfar an bunachar sonraí seo a athainmniú le rian '.cóip' agus cruthófar ceann nua. +Leanúint ar aghaidh? + + + Database created + Bunachar Sonraí cruthaithe + + + Successfully created a new database + chruthaigh rathúil bunachar sonraí nua + + + Not a file + Gan comhad + + + The path was supposed to point to a file, but it doesn't + Bhí ceaptha an cosán a chur in iúl do chomhad, ach ní chuireann sé + + + Please remove the conflict and retry + Cuir deireadh leis an gcoinbhleacht agus an t-attriall + + + The database file is not readable + Níl an comhad bunachar sonraí inléite + + + Please set the proper permissions and retry +If this error persists, please report this issue + Le do thoil a leagtar na ceadanna cuí agus retry +Má leanann an earráid seo, tabhair tuairisc ar an gceist seo + + + The database file is not writable + Níl an comhad bunachar sonraí inscríofa + + + Invalid database path + cosán bunachar sonraí luachmhar + + + Failed creating database + bunachar sonraí a chruthú Failed + + + An error occured while creating the database + Tá earráid a tharlaíonn agus a chruthú ar an mbunachar sonraí + + + Failed opening database + Bunachar sonraí oscailte Failed + + + An error occured while opening the database + Tharla earráid agus an bunachar sonraí á oscailt + + + Failed executing on database + Failed forghníomhaitheach ar bhunachar sonraí + + + An error occured while executing a statement on the database + Tarlaíonn earráid agus ráiteas á fhorghníomhú ar an mbunachar sonraí + + + Failed to backup database + Failed chun bunachar sonraí cúltaca + + + Please report this issue + Tabhair tuairisc ar an gceist seo + + + Invalid log format string + teaghrán formáid log + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Seiceáil le do thoil go bhfuil aon earráid thrown ag do WebServer +Má fhaigheann sé glacadh leis, le do thoil seiceáil an láithreacht de tío anseo +Má tá gach rud fíneáil, tabhair tuairisc ar an gceist seo + + + Log format error + Earráid formáid log + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Níl an fhormáid logála socraithe, nó tá sé neamhbhailí +Cuir ceann bailí sna foirmíochtaí + + + Misconfigured log format + formáid log Misconfigured + + + No log field has been set in the current logs format, +making it useless to parse logs + Níl aon réimse logáil leagtha i bhformáid logs reatha, +a dhéanamh useless sé logs parse + + + Please set up a format which contains at least one field + Le do thoil a chur ar bun formáid ina bhfuil ar a laghad réimse amháin + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Tá deighilteoir ar iarraidh idir réimse amháin nó níos mó, +ag déanamh sé deacair a bhunú glan bounds, +agus b'fhéidir as a stóráil sonraí mícheart + + + Please set up a format which contains separators between fields + Cuir ar bun formáid ina bhfuil deighilteoirí idir réimsí + + + Missing field in log format + Réimse Missing i bhformáid logáil + + + An important field is missing from the provided format: + Tá réimse tábhachtach ar iarraidh ón bhformáid a sholáthraítear: + + + The quality of the statistics may be seriously compromized + D'fhéadfadh cáilíocht na staitisticí a chur le chéile go mór + + + Proceed anyway? + Ar aon nós? + + + 'Carriage Return' in log format + 'Tuairisceán Caráiste' i bhformáid logála + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Tá an 'Tuairisceán Caráiste' san fhormáid a sholáthraítear. +D'fhéadfadh caillteanais nó tuairteanna sonraí a bheith mar thoradh air seo mura n-úsáidtear rabhadh + + + An error occured while parsing logs + Tarlaíonn earráid agus logs parsing + + + Failed defining type + Cineál sainithe Failed + + + Failed to determine the log type + Failed a chinneadh an cineál logáil + + + File already used + Comhad a úsáidtear cheana féin + + + The file has probably been used already + Tá an comhad a úsáid dócha cheana féin + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignore an rabhadh agus é a úsáid ar aon nós, Discard sé agus leanúint ar aghaidh, nó Abort an próiseas ar fad? + + + Duplicate file + Dúblach comhad + + + The file appears twice in the list of selections + Is cosúil go bhfuil an comhad faoi dhó sa liosta roghanna + + + Failed updating hashes + Failed thabhairt cothrom le dáta hashes + + + An error occured while inserting the parsed files hashes into the database + Tá earráid a tharlaíonn agus a chur isteach na comhaid parsed hashes isteach sa bhunachar sonraí + + + File exceeds warning size + Níos mó comhad méid rabhaidh + + + The file's size exceeds the warning size + Is mó méid an chomhaid an méid rabhaidh + + + Not enough memory + Níl go leor cuimhne + + + The total size of the selected files exceeds the available memory + An méid iomlán de na comhaid roghnaithe níos mó ná an chuimhne ar fáil + + + Please free some resources, parse the files in different steps or split them into smaller units + Tabhair saor in aisce roinnt acmhainní, parse na comhaid i céimeanna éagsúla nó iad a roinnt in aonaid níos lú + + + Failed reading + Léitheoireacht Failed + + + File is empty + Tá an comhad folamh + + + The file is blank + Is é an comhad bán + + + Failed to retrieve the selected file + Failed a fháil ar an comhad roghnaithe + + + Discard it and continue, or Abort all and exit? + Cóipeáil nasc leis an tweet Leabaigh an Tweet? + + + No file to parse + Uimh comhad a parse + + + The list of files to parse is empty + Is é an liosta de na comhaid a parse folamh + + + Directory not found + Eolaire nach bhfuarthas + + + The directory does not exists + Níl an t-eolaire ann + + + Directory not readable + Eolaire nach bhfuil inléite + + + The directory is not readable + Níl an t-eolaire inléite + + + Please set the proper permissions before to start + Le do thoil a leagtar na ceadanna cuí roimh a thosú + + + Failed creating directory + Failed a chruthú eolaire + + + The path does not exists + Níl an cosán ann + + + Data conversion failed + Theip ar chomhshó sonraí + + + Failed to convert from '%1' to '%2' + Failed a thiontú ó '%1' go '%2' + + + Failed to create statistics + Failed staitisticí a chruthú + + + An error occured while processing + Tharla earráid agus próiseáil + + + Cannot create statistics + Ní féidir staitisticí a chruthú + + + No data has been found that matches with the currently set parameters + Níl aon sonraí a fuarthas amach go oireann leis na paraiméadair atá leagtha faoi láthair + + + Not a folder + Ní fillteán + + + The path was supposed to point to a folder, but it doesn't + Bhí ceaptha an cosán a chur in iúl le fillteán, ach ní chuireann sé + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Déanfar an iontráil a athainmniú le rian '.cóip' agus cruthófar ceann nua. +Leanúint ar aghaidh? + + + An error occured + Tá earráid a tharlaíonn + + + Failed renaming + Failed athainmniú + + + An error occured while renaming + Tarlaíonn earráid agus athainmniú + + + + GameDialog + + Ok + Uisce agus Séarachas + + + + MainWindow + + Parse logs from the Apache2 web server + Logaí Parse ó fhreastalaí gréasáin Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Logaí Parse ó fhreastalaí gréasáin Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Logaí Parse ó fhreastalaí gréasáin Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Roghnaigh/roghnaigh gach comhad + + + All + Gach duine + + + Inspect a log file + Iniúchadh comhad logála + + + Name + Ainm an ainm + + + Size + Méid an Méid + + + Refresh the list + Athraigh an liosta + + + Total size of the parsed data + Méid iomlán na sonraí parsed + + + Total number of parsed lines + Líon iomlán na línte parsed + + + Start parsing the selected files + Tosaigh parsáil na comhaid roghnaithe + + + START + Amharc ar gach eolas + + + Time elapsed since the start + Am caite ó thús + + + Average speed, in parsed data size per second + Meánluas, i méid sonraí parsed in aghaidh an dara + + + Web Server + Freastalaí Gréasáin + + + Select a Web Server + Roghnaigh Freastalaí Gréasáin + + + Year + Bliain agus Bliain + + + Month + Míosa agus Mí + + + Day + Lá an Lae + + + Hour + Uair an chloig + + + Draw the chart + Tarraing an chairt + + + Log line marked as Warning + Logáil líne marcáilte mar Warning + + + Date when the request arrived (YYYY-MM-DD) + Dáta nuair a tháinig an iarraidh (YYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Am nuair a tháinig an t-iarratas (hh: mm:s) + + + Protocol of the request + Prótacal na hiarrata + + + Method of the request + Modh na hiarrata + + + URI of the requested page + URI an leathanach iarrtha + + + Query carried along with the URI + Ceist a rinneadh chomh maith leis an URI + + + Response code from the server + Cód freagartha ón bhfreastalaí + + + User-agent of the client which made the request + Úsáideoir-gníomhaire an chliaint a rinne an t-iarratas + + + IP address of the Client which made the request + Seoladh IP an Chliant a rinne an t-iarratas + + + Cookie used for the request + Cookie a úsáidtear le haghaidh an iarratais + + + The URL which redirected the Client to the requested page + An URL a atreorú an Cliant chuig an leathanach a iarradh + + + Size ib Bytes of the request, usually includes header and data + Méid ib Totes na hiarrata, Áirítear de ghnáth header agus sonraí + + + Size in Bytes of the served content, usually includes header and data + Méid i Totes an t-ábhar a sheirbheáil, Áirítear de ghnáth header agus sonraí + + + Time taken by the server to serve the content, in milliseconds + Am a thóg an freastalaí chun freastal ar an ábhar, i milliseconds + + + Only use lines in which the field is starting with this string + Níl ach línte a úsáid ina bhfuil an réimse ag tosú leis an teaghrán + + + Protocol: + Prótacal: + + + Method: + Modh: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Ní úsáidtear ach línte ina bhfuil an réimse comhoiriúnach leis an ráiteas seo. +Bain úsáid as '!', '=', '<' nó '>' a dhearbhú cad atá le húsáid + + + Response: + Response: + + + Query: + Ceist: + + + URI: + URI: + + + Filters + soilse loingseoireachta E + + + Count + Contae an Chontae + + + Number of occurrences + An líon teagmhas + + + Item + Mír Mír + + + Value of the field + Luach an réimse + + + From: + Ó: + + + To: + Chun: + + + Select a log field to view + Roghnaigh réimse logáil chun féachaint ar + + + Field: + Réimse: + + + Filter: + Scagaire: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Le teaghráin, ní úsáidfear ach na línte ina bhfuil an réimse ag tosú leis an teaghrán seo. +Le huimhreacha, bain úsáid as '!', '=', '<' nó '>' a dhearbhú cad atá le húsáid + + + Protocol + Prótacal an Phrótacail + + + Method + Modh Tástála + + + URI + Uisce agus Séarachas + + + User-agent + Úsáideoir-agent + + + Most recurrent + tréimhse saoil: ilbhliantúil + + + Most trafficked + An chuid is mó tráchta + + + Date ever + Dáta Tuairimí Ré + + + Day of the week + Lá na seachtaine + + + Hour of the day + Uair an lae + + + Time taken + Am tógtha + + + Bytes sent + Bytes sheoladh + + + Bytes received + Totes faighte + + + Mean/Max performances + Feidhmíochta Mean / Macs + + + Requests received + Iarratais a fuarthas + + + Total work + Iomlán na hoibre + + + General + Ginearálta + + + Window + Fuinneog + + + Dialogs + Naisc ábhartha eile + + + Charts + Cairteacha + + + Appearance + Dealramh + + + Speed + Luas agus Luas + + + Relational + Gaol + + + TextBrowser + Téacs Brabhsálaí + + + Databases + irl - Library Service + + + Security + Slándáil agus Slándáil + + + Logs + taiseachas aeir: fliuch + + + Defaults + Réamhshocrú + + + Control + Rialú ar Rialú + + + Path + Toir agus Crainn + + + Format + Amharc ar gach eolas + + + Warnlists + Seirbhís do Chustaiméirí + + + Blacklists + Seirbhís do Chustaiméirí + + + Remember the window's position and size + Cuimhnigh seasamh agus méid na fuinneoige + + + Remember position and size + Cuimhnigh seasamh agus méid + + + Remember window's position and size + Cuimhnigh seasamh na fuinneoige agus méid + + + Geometry + Tíreolaíocht + + + Theme to use for the window + Téama a úsáid le haghaidh na fuinneoige + + + Theme + Téama Téama + + + Native + Dúchasach Dúchasach + + + Light + Solas na Gréine + + + Dark + Dark + + + Auto + Auto Auto Auto Auto Auto + + + Icons + taiseachas aeir: fliuch + + + Normal quantity of dialog messages shown + cainníocht Gnáth na teachtaireachtaí dialóige a thaispeántar + + + Normal + De ghnáth, + + + Dialogs from the main processes + Diailigh ó na príomhphróisis + + + Dialogs emitted when parsing logs + Dialogs astaítear nuair logs parsing + + + Logs parser + Seirbhís do Chustaiméirí + + + Dialogs emitted when viewing statistics + Dialogs astaítear nuair a breathnú ar staitisticí + + + Statistics viewer + Amharc ar Staitisticí + + + Define the quantity of dialog mesages shown + Sainmhínigh an chainníocht mesages dialóg a thaispeántar + + + Dialogs level + Leibhéal na logs + + + Reduced quantity of dialog messages shown + Cainníocht laghdaithe teachtaireachtaí dialóige a thaispeántar + + + Essential + Riachtanach + + + Augmented quantity of dialog messages shown + Cainníocht de teachtaireachtaí dialóige a thaispeántar + + + Explanatory + Plean Gníomhaíochta don Oideachas + + + Theme to use for the Charts + Téama a úsáid le haghaidh na Charts + + + Preview + Réamhamhairc + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Déanann céim sa ais ama, i soicindí. +Beidh na luachanna a thagann taobh istigh den eatramh céanna a chumasc agus beidh an luach meán a úsáid. + + + Time interval + eatramh ama + + + The format to use for the labels of the time axis. + An fhormáid a úsáid le haghaidh lipéid na haise ama. + + + Time format + Formáid ama + + + The size of the pie + An méid de na pie + + + Pie size + Méid Píosa + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + An líon uasta de slices go mbeidh an pie a bheith comhdhéanta de. +Beidh slices thar a bheith grúpáilte i slice cuimsitheach amháin. + + + Maximum slices + Seirbhís do Chustaiméirí + + + Font to use for the Text Browser + Font a úsáid le haghaidh an Brabhsálaí Téacs + + + Font + Uisce agus Séarachas + + + Double-spaced lines + Línte dúbailte-spás + + + Use wide lines + Úsáid línte leathana + + + Define the spacing between lines + Sainmhínigh an spásáil idir línte + + + Lines spacing + Línte spásáil + + + None + Gan a bheith ráite + + + Color scheme to use for the Text Browser + Scéim dath a úsáid le haghaidh an Brabhsálaí Téacs + + + Color scheme + Scéim dathanna + + + The appearance of the Text Browser with the current settings + An chuma ar an Brabhsálaí Téacs leis na suímh reatha + + + Insert the base path only, file name excluded + Cuir isteach an cosán bonn amháin, ainm comhaid eisiata + + + The given path doen't exists, or doesn't point to a folder + Níl an cosán a thugtar ann, nó nach pointe le fillteán + + + Path for the database files + Conair do na comhaid bunachar sonraí + + + Paths + Amharc ar gach eolas + + + Apply the current path + Cuir an cosán reatha i bhfeidhm + + + Select the path through a dialog window + Roghnaigh an cosán trí fhuinneog dialóg + + + Path where the logs data collection database is located + Conair ina bhfuil an bunachar sonraí bailithe sonraí logaí suite + + + Logs data + Logs sonraí + + + Path where the used files hashes database is located + Conair ina bhfuil na comhaid a úsáidtear hashes bunachar sonraí suite + + + Used files + Comhaid Úsáidte + + + Backup options for the Logs Data database + Roghanna Cúltaca le haghaidh an bunachar sonraí Logaí + + + Backups + Amharc ar gach eolas + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Tá cúltaca nua a rinneadh nuair a dhúnadh LogDoctor tar éis curtha in eagar go succesfully an bunachar sonraí + + + Backup the Logs Data database and keep + Cúltaca an bunachar sonraí Logaí Sonraí agus a choinneáil + + + Whether it is allowed or denied to follow symlinks occuring in a path + Cibé an gceadaítear nó má dhiúltaítear siompóistí a leanúint i cosán + + + Follow symlinks + Lean symlinks + + + Default WebServer + Déan Teagmháil Linn + + + Usage control + Rialú úsáide + + + Hide already used files + Folaigh comhaid a úsáidtear cheana féin + + + Size warnings + rabhaidh Méid + + + Warn me when using files with a size exceeding: + Rabhadh dom nuair a úsáid comhaid le méid níos mó ná: + + + Logs folder + Logs fillteán + + + Logs format string + Logs teaghrán formáid + + + Format string + teaghrán formáid + + + Insert the format string you're using + Cuir isteach an teaghrán formáid tú ag baint úsáide as + + + Apply the current string + Cuir an teaghrán reatha + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Gin líne logáil sampla ón teaghrán a shábháil faoi láthair, a sheiceáil má fhaigheann sé formáidithe i gceart. +Beidh aon réimse nach bhfuil a mheas ag LogDoctor le feiceáil mar 'DISCARDED' + + + Generate sample + Sampla de chineál + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Seiceáil cruinneas na líne seo. +Réimsí marcáilte mar 'DISCARDED' fuair parsed i gceart, ach nach bhfuil a mheas ag LogDoctor + + + Open an help window + Oscail fuinneog cabhrach + + + Help + Cabhair + + + Select a log field + Roghnaigh réimse logála + + + Use warnlist for this field + Úsáid Warlist don réimse seo + + + Add the current line to the list + Cuir an líne reatha leis an liosta + + + Remove the selected item from the list + Bain an mhír roghnaithe ón liosta + + + Move the selected item down + Bog an mhír roghnaithe síos + + + Use blacklist for this field + Úsáid blacklist don réimse seo + + + Add line + Cuir líne + + + Remove selection + Bain roghnú + + + Language + Teanga na Gaeilge + + + Utilities + Uisce agus Séarachas + + + Tools + Uirlisí + + + Games + Cluichí ar líne + + + Perform a version-check + A dhéanamh leagan-seiceáil + + + Show some info about LogDoctor + Taispeáin roinnt eolais faoi LogDoctor + + + Open a block-note like window to write temporary text + Oscail bloc-nóta cosúil le fuinneog a scríobh téacs sealadach + + + Play CrissCross + Seinn CrissCross + + + Play Snake + Seinn Snake + + + Show the changelog + Taispeáin an Changelog + + + warnlist + free service + + + blacklist + blacklist + + + copy + cóip + + + copies + cóipeanna + + + Check updates + Amharc ar gach eolas + + + Infos + irl - Library Service + + + BlockNote + cliceáil grianghraf a mhéadú + + + CrissCross + riachtanais uisce: measartha + + + Snake + Snake + + + Changelog + Déan Teagmháil Linn + + + + RichText + + Select a file from the list + Roghnaigh comhad ón liosta + + + to inspect its content + chun iniúchadh a dhéanamh ar a ábhar + + + Failed to read + Failed a léamh + + + + SnakeGame + + PLAY + PLAY + + + Classic + Classico + + + Hunt + Hunt + + + Battle + Cathanna agus Cathanna + + + Game Over + Cluiche Thar Lear + + + Your adversary fell in the water! + Do adversary thit san uisce! + + + YOU WON! + TÚ AON! + + + You fell in the water! + Thit tú san uisce! + + + YOU LOST! + YOU LOST! + + + Your adversary ate itself! + Do adversary ith féin! + + + You ate yourself! + Ith tú féin! + + + Your adversary ate you! + Do adversary ith tú! + + + You ate your adversary! + Ith tú do adversary! + + + You ate each other! + Ith tú a chéile! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + Gan choinne WebServer + + + Logs Size Breakdown + Logs Miondealú Méid + + + Ignored + riachtanais uisce: measartha + + + Parsed + Toir agus Crainn + + + Blacklisted + Dubhliostaithe + + + Others + Daoine eile + + + from + ó + + + to + go dtí + + + Log Lines Marked as Warning + Línte Logáil Marcáilte mar Rabhadh + + + Time Taken to Serve Requests + Am Tógtha chun Iarratais Freastal + + + Time of Day Count + Am an Líon Lá + + + Relational Count + Comhaireamh Gaolmhar + + + FALSE + FÓGRA + + + TRUE + TUILLEADH + + + Date + Dáta Tuairimí Ré + + + Year + Bliain agus Bliain + + + Month + Míosa agus Mí + + + Day + Lá an Lae + + + Time + Am agus am + + + Hour + Uair an chloig + + + Minute + minicíocht uisce: flúirseach + + + Second + Dara dul síos + + + Warning + Ag dul i ngleic + + + Protocol + Prótacal an Phrótacail + + + Method + Modh Tástála + + + URI + Uisce agus Séarachas + + + Query + An tSraith Shinsearach + + + Response code + cód freagartha + + + Time taken + Am tógtha + + + Bytes sent + Bytes sheoladh + + + Bytes received + Totes faighte + + + Referrer + Amharc ar gach eolas + + + Cookie + Féachaint ar Fholúntais + + + Client + cineál gas: in airde + + + User-agent + Úsáideoir-agent + + + January + irl - Library Service + + + February + Amharc ar gach eolas + + + March + Márta 2015 + + + April + Aibreán 2018 + + + May + Bealtaine + + + June + Meitheamh 2015 + + + July + irl - Library Service + + + August + Amharc ar gach seirbhís + + + September + Meán Fómhair 2015 + + + October + Deireadh Fómhair 2015 + + + November + Samhain 2015 + + + December + Nollaig na Nollag + + + Sunday + Domhnach Dé Domhnaigh + + + Monday + Dé Luain + + + Tuesday + Dé hAoine + + + Wednesday + Dé Céadaoin + + + Thursday + Déardaoin + + + Friday + Dé hAoine + + + Saturday + Dé Sathairn + + + diff --git a/logdoctor/translations/LogDoctor_he_HE.ts b/logdoctor/translations/LogDoctor_he_HE.ts new file mode 100644 index 0000000..5dccebd --- /dev/null +++ b/logdoctor/translations/LogDoctor_he_HE.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + גרסאות + + + Version 4 + גירסה 4 + + + Version 3 + גירסה 3 + + + Version 2 + גרסה 2 + + + Version 1 + גרסה 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + לבנות תסריטים + + + Cross-platform compatibility: + תאימות חוצה כוכבית: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + סטטיסטיקה: + + + Warnings + אזהרה + + + Speed + מהירות מהירות + + + Counts + Counts + + + Daytime + יום יום + + + Relational + המונחים + + + Globals + Globals + + + Translations: + תרגום: + + + Italian + איטלקי איטלקי איטלקי + + + Spanish + ספרדית + + + French + צרפתית צרפתית + + + Tools: + כלים: + + + Block note + תגית: Block Note + + + Utilities: + המונחים: + + + Infos viewer + מידע על הצופה + + + Updates checker + עדכון Checker + + + Themes: + נושא: + + + Dark + כהה כהה + + + Light + אור אור + + + Improvements and fixes + שיפורים ותיקון + + + New themes: + נושאים חדשים: + + + Ash + אש אש + + + Candy + ממתקים + + + Forest + יער יער + + + Powder + אבקת אבקה + + + Restyled GUI + Restyle GUI + + + Restyled dialogs + דיאלוגים Restyled + + + Doxygen documentation + תיעוד Doxygen + + + Mini-Games: + מיני משחקים: + + + Criss-cross + קריס-קרוס + + + Snake + נחש נחש נחש + + + Changed default paths + מסלולי ברירת מחדל + + + New game modes for Snake + מצבי משחק חדשים עבור נחש + + + Hunt + ציד + + + Battle + קרב Battle Battle + + + New translations: + תרגומים חדשים: + + + Japanese + יפן יפנית + + + Portuguese + פורטוגזית + + + Code improvements + שיפור קוד + + + Performance improvements + שיפור ביצועים + + + Added tests suite: + חבילת בדיקות: + + + white box tests + בדיקות קופסה לבנות + + + Customized charts themes + נושאים מוסמכים + + + Fixes + תיקונים + + + Tests improvements + שיפור + + + Docker support + תמיכה Docker + + + Upgrade to C++20 + עקבו אחרי C++20 + + + Upgrade to Qt6 + עקבו אחרי Qt6 + + + Restyled themes + Restyle ערכות + + + Redesigned configs section + Redesigns + + + Stability improvements + שיפור + + + Generating warnings dinamically + יצירת אזהרות באופן ספונטני + + + New tool: + כלי חדש: + + + Changelog + שינוי + + + Tweakable parameters for some of the charts: + פרמטרים אפשריים עבור חלק מהגרפים: + + + Improved project structure + מבנה פרוייקט משופר + + + Modernized Cmake usage + מודרניזציה יצירת שימוש + + + + Crapinfo + + Version + גרסה + + + Currently installed version of the software + גירסה מותקנת של התוכנה + + + Repository links + קישור + + + Paths + נתיבים + + + The path of the executable file + הדרך של הקובץ המתואם + + + Executable + הוצאה להורג + + + The path where the configuration file gets saved and searched in + הדרך שבה קובץ התצורה נשמר ומחפש + + + Configuration file + קובץ Configuration + + + The path where the application searches for extra resources + הדרך שבה היישום מחפש משאבים נוספים + + + Application data + יישום נתונים + + + + Crapnote + + Reduce the font size + להקטין את גודל הגופן + + + Font size + גודל פונט + + + Increase the font size + להגדיל את גודל הגופן + + + + Crappath + + Choose + בוחרים + + + Cancel + ביטול + + + + Crapup + + Checking for updates + בדיקת עדכונים + + + New version available + גרסה חדשה זמינה + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + גרסה חדשה זמינה! +אנא בקרו ב-Gte Doctor's Git Repository ועקוב אחר ההוראה כיצד לעדכן + + + No update found + שום עדכון לא מצא + + + LogDoctor is up-to-date + LogDoctor הוא מעודכן + + + :/ + : / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + אתה מפעיל גרסה מהעתיד! +הגרסה שלך היא מעבר לגרסה הנוכחית במעלה הזרם +האם אתה מנהל את הדוקטור המקורי? +אנא בקר ב- LogDoctor's repository ולקבל גרסה חדשה של זה + + + Failed to establish a connection + לא מצליח ליצור קשר + + + Connection error, please try again later + טעות חיבור, אנא נסה שוב + + + Connection timed out + זמן החיבור בחוץ + + + Version check failed + בדיקת גרסאות נכשלה + + + An error occured while parsing: +version mark not found + טעות מתרחשת בזמן ההשתתפות: +סמן לא נמצא + + + An error occured while parsing: +malformed version + טעות מתרחשת בזמן ההשתתפות: +גרסה מותנית + + + An error occured while comparing: +malformed upstream version + טעות מתרחשת תוך השוואת: +המונחים: malformedstream version + + + + CrissCross + + Victory + ניצחון הניצחון + + + You beated me! + אתה מבזבז אותי! + + + This time you lost! + הפעם איבדתם! + + + Draw + צייר + + + Nice match + משחק נחמד + + + + DialogBool + + Yes + כן כן כן + + + No + לא לא + + + + DialogIda + + Ignore + להתעלם + + + Discard + Discard + + + Abort + Abort + + + + DialogMsg + + Ok + בסדר + + + + DialogSec + + One of the lists has an invalid item + לאחד הרשימות יש פריט לא חוקי + + + An error occured while reading the configuration file + שגיאה מתרחשת בעת קריאת קובץ התצורה + + + An error occured while parsing configuration file's data + שגיאה מתרחשת בעת קביעת הנתונים של קובץ התצורה + + + Failed to create the configuration file's directory + נכשל ליצור את מנהל התצורה + + + Failed to create the configuration file + נכשל ליצור את קובץ התצורה + + + An error occured while writing the configuration file + שגיאה מתרחשת בעת כתיבת קובץ התצורה + + + An error occured while preparing the configuration file's data + שגיאה מתרחשת בעת הכנת הנתונים של קובץ התצורה + + + The path contains a symlink + הדרך מכילה קישור + + + The file does not exist + הקובץ אינו קיים + + + Failed to create the database backups' directory + נכשל ליצור את מנהל הגיבוי של מסד הנתונים + + + Failed to copy the database file + נכשל להעתיק את קובץ מסד הנתונים + + + Failed to update the backups + נכשל לעדכן את הגיבוי + + + Failed to create the directory + נכשל ליצור את הבמאי + + + Unrecognized entry + כניסה בלתי רשמית + + + Size of the file + גודל הקובץ + + + Warning size parameter + פרמטר + + + Failed to read gzipped file + נכשל לקרוא קובץ gzipped + + + An error occured while parsing the format string + טעות מתרחשת תוך מינוף הפורמט + + + Available memory + זיכרון זמין + + + Size of the logs + גודל יומני + + + An error occured while reading the gzipped file + טעות מתרחשת בעת קריאת קובץ ה- gzipped + + + An error occured while reading the file + טעות מתרחשת בעת קריאת הקובץ + + + Something failed while handling the file + משהו נכשל בעת הטיפול בקובץ + + + An error occured while working on the database + טעות מתרחשת תוך כדי עבודה על מסד הנתונים + + + Aborting + Aborting + + + Invalid locale + מקומי לא חוקי + + + Unexpected locale format + פורמט מקומי בלתי צפוי + + + If you haven't manually edited the configuration file, +please report this issue + אם לא ביצעתם ידנית את קובץ התצורה, +נא לדווח על הבעיה + + + The given locale is not an accepted language + השפה המדוברת אינה שפה מקובלת + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + אם אתה רוצה להיות מקומי זה ב LogDoctor, +נא לעקוב אחר ההוראות בדף ה-Repository + + + Configuration file not found + קובץ קירור לא נמצא + + + Unable to retrieve the configuration file + לא ניתן לשחזר את קובץ התצורה + + + Skipping + לדלג + + + An error occured while handling the configuration file + שגיאה מתרחשת בעת טיפול בקובץ התצורה + + + Failed to write the configuration file + נכשל לכתוב את קובץ התצורה + + + Current configuration not saved + התצורה הנוכחית לא נשמרת + + + File not readable + תגית: Readable + + + The file is not readable + הקובץ אינו קריא + + + File not writable + תגית: writable + + + The file is not writable + הקובץ אינו עצבני + + + Directory not writable + מדריך לא עצבני + + + The directory is not writable + הבמאי אינו עצבני + + + Invalid path + נתיב לא חוקי + + + Failed applying configuration + נכשל יישום תצורה + + + Invalid configuration lines + המונחים invalid + + + Has not been possible to apply some of the configurations + לא ניתן היה ליישם חלק מההגדרות + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + אם תבחר להמשיך, כל התצורה הלא שימושית תאבד +ממשיכים? + + + Failed to retrieve the help file + לא הצליח לשחזר את קובץ העזרה + + + An error occured while getting the help file + טעות מתרחשת בעת קבלת קובץ העזרה + + + Additional resources can be downloaded from the git repo + משאבים נוספים ניתן להוריד מן ה-git repo + + + Unable to retrieve the file + לא ניתן לשחזר את הקובץ + + + Invalid string + מחרוזת Invalid + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + המחרוזת נתונה לא חוקית ולא ניתן להוסיף לרשימה + +נא לתקן את זה מחדש + + + QSql driver not found + נהג QSql לא נמצא + + + Failed to retrieve the driver needed to handle the database + לא הצליח להחזיר את הנהג הדרוש כדי להתמודד עם מסד הנתונים + + + File not found + קובץ לא נמצא + + + Failed to retrieve the database file + לא הצליח לשחזר את קובץ מסד הנתונים + + + Create a new database? + ליצור מסד נתונים חדש? + + + The database contains an unexpected table + מסד הנתונים מכיל שולחן בלתי צפוי + + + Unexpected table + שולחן בלתי צפוי + + + It seems that the database is missing a table + נראה כי מסד הנתונים חסר שולחן + + + Table not found + שולחן לא נמצא + + + The database contains an unexpected column + מסד הנתונים מכיל עמודה בלתי צפויה + + + Unexpected column + עמודה Unexpected + + + It seems that the table is missing a column + נראה שהשולחן חסר עמודה + + + Column not found + לא נמצאו + + + A column has an unexpected data-type + בעמודה יש סוג נתונים בלתי צפוי + + + Unexpected data-type + Unexpected Data-type + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + מסד נתונים זה ישים לב עם "העתק" וחדש ייברא. +ממשיכים? + + + Database created + מסד הנתונים שנוצר + + + Successfully created a new database + בהצלחה יצר מסד נתונים חדש + + + Not a file + לא קובץ + + + The path was supposed to point to a file, but it doesn't + הדרך הייתה אמורה להצביע על קובץ, אבל היא לא + + + Please remove the conflict and retry + נא להסיר את הסכסוך ולנסוע מחדש + + + The database file is not readable + קובץ מסד הנתונים אינו קריא + + + Please set the proper permissions and retry +If this error persists, please report this issue + אנא קבעו את הרשאות הנכונות ונסו מחדש +אם השגיאה הזו תימשך, נא לדווח על הבעיה + + + The database file is not writable + קובץ מסד הנתונים אינו הרגיז + + + Invalid database path + מסלול מסד הנתונים Invalid + + + Failed creating database + נכשל ביצירת מסד נתונים + + + An error occured while creating the database + טעות מתרחשת בעת יצירת מסד הנתונים + + + Failed opening database + מסד נתונים פתוח נכשל + + + An error occured while opening the database + טעות מתרחשת בעת פתיחת מסד הנתונים + + + Failed executing on database + נכשל בביצוע מסד נתונים + + + An error occured while executing a statement on the database + טעות מתרחשת בעת ביצוע הצהרה על מסד הנתונים + + + Failed to backup database + נכשל בגיבוי מסד נתונים + + + Please report this issue + נא לדווח על הבעיה + + + Invalid log format string + פורמט Invalid log + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + אנא בדוק כי אין טעות נזרקת על ידי WebServer +אם זה יתקבל, אנא בדוק את נוכחותו של הקלדה כאן +אם הכל בסדר, נא לדווח על הבעיה + + + Log format error + פורמט שגיאה + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + פורמט הגלם לא נקבע, או אינו חוקי. +נא להוסיף אחד חוקי בתצורה + + + Misconfigured log format + פורמט + + + No log field has been set in the current logs format, +making it useless to parse logs + אין שדה יומן נקבע במתכונת הלוגים הנוכחית, +עושה את זה חסר ערך עבור כתוביות + + + Please set up a format which contains at least one field + אנא קבעו פורמט המכיל לפחות שדה אחד + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + מפריד חסר בין שדות אחד או יותר. +להקשות על הקמת גבולות נטו, +ואולי מובילים לאחסון נתונים לא נכונים + + + Please set up a format which contains separators between fields + נא להגדיר פורמט המכיל מפרידים בין שדות + + + Missing field in log format + שדה חסר בפורמט + + + An important field is missing from the provided format: + שדה חשוב חסר מהתבנית הניתנת: + + + The quality of the statistics may be seriously compromized + איכות הנתונים הסטטיסטיים עשויה להיות מתואמת + + + Proceed anyway? + הוכח בכל מקרה? + + + 'Carriage Return' in log format + "Recarage Return" בפורמט + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + פורמט ה-'Carriage Return'. +זה עלול להוביל לאובדן נתונים או לתאונות אם לא בשימוש בזהירות + + + An error occured while parsing logs + טעות מתרחשת תוך הפרת יומני + + + Failed defining type + נכשל להגדיר סוג + + + Failed to determine the log type + נכשל כדי לקבוע את סוג יומן + + + File already used + קובץ כבר בשימוש + + + The file has probably been used already + כנראה שהקובץ כבר בשימוש + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + להתעלם מהאזהרה ולהשתמש בה בכל מקרה, לבטל אותה ולהמשיך, או לשלב את התהליך כולו? + + + Duplicate file + קובץ Duplicate + + + The file appears twice in the list of selections + הקובץ מופיע פעמיים ברשימת הבחירות + + + Failed updating hashes + עדכון hashes + + + An error occured while inserting the parsed files hashes into the database + שגיאה מתרחשת בעת הוספת הקבצים המוסמכים לתוך מסד הנתונים + + + File exceeds warning size + תגית: Warning size + + + The file's size exceeds the warning size + גודל הקובץ עולה על גודל האזהרה + + + Not enough memory + לא מספיק זיכרון + + + The total size of the selected files exceeds the available memory + הגודל הכולל של הקבצים שנבחרו עולה על הזיכרון הזמין + + + Please free some resources, parse the files in different steps or split them into smaller units + אנא שחררו כמה משאבים, חלקו את הקבצים בצעדים שונים או פיצו אותם ליחידות קטנות יותר + + + Failed reading + נכשל לקרוא + + + File is empty + File is Empty + + + The file is blank + הקובץ ריק + + + Failed to retrieve the selected file + לא הצליח לשחזר את הקובץ שנבחר + + + Discard it and continue, or Abort all and exit? + הרחיקו אותו והמשיכו, או עזבו הכל? + + + No file to parse + אין קובץ to parse + + + The list of files to parse is empty + רשימת הקבצים ל- parse היא ריקה + + + Directory not found + מדריך לא נמצא + + + The directory does not exists + המנהל לא קיים + + + Directory not readable + Directory לא קריא + + + The directory is not readable + הבמאי אינו קריא + + + Please set the proper permissions before to start + אנא קבעו את הרשאות הנכונות לפני שתתחילו + + + Failed creating directory + נכשל ביצירת במאי + + + The path does not exists + הדרך לא קיימת + + + Data conversion failed + המרת נתונים נכשלה + + + Failed to convert from '%1' to '%2' + לא הצליח להמיר את "%1" ל"%2" + + + Failed to create statistics + נכשל ליצור סטטיסטיקות + + + An error occured while processing + טעות מתרחשת בעת עיבוד + + + Cannot create statistics + לא יכול ליצור סטטיסטיקות + + + No data has been found that matches with the currently set parameters + לא נמצאו נתונים שמתאימים לפרמטרים הנוכחיים + + + Not a folder + לא תיקיה + + + The path was supposed to point to a folder, but it doesn't + הדרך הייתה אמורה להצביע על תיקיה, אבל היא לא + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + הכניסה תשים לב עם "העתק" וניתן ליצור חדש. +ממשיכים? + + + An error occured + טעות מתרחשת + + + Failed renaming + נכשל renaming + + + An error occured while renaming + טעות מתרחשת בזמן renaming + + + + GameDialog + + Ok + בסדר + + + + MainWindow + + Parse logs from the Apache2 web server + תגיות קשורות Apache2 web server + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + המונחים: Nginx web server + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + אתר האינטרנט של Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + בחר/מחק את כל הקבצים + + + All + הכל + + + Inspect a log file + Inspect a log file + + + Name + שם השם + + + Size + גודל + + + Refresh the list + מרעננים את הרשימה + + + Total size of the parsed data + הגודל הכולל של הנתונים המפונקים + + + Total number of parsed lines + מספר שלם של שורות + + + Start parsing the selected files + התחל לחלק את הקבצים שנבחרו + + + START + START + + + Time elapsed since the start + הזמן חלף מאז תחילת + + + Average speed, in parsed data size per second + מהירות ממוצעת, בגודל נתונים כפול לשנייה + + + Web Server + Web Server + + + Select a Web Server + בחר Web Server + + + Year + שנה + + + Month + חודש החודש + + + Day + יום יום יום + + + Hour + שעת שעה + + + Draw the chart + צייר את התרשים + + + Log line marked as Warning + המונחים: Warning + + + Date when the request arrived (YYYY-MM-DD) + התאריך שבו הגיעה הבקשה (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + עת הגיעה הבקשה (h:mm:s) + + + Protocol of the request + פרוטוקול הבקשה + + + Method of the request + שיטת הבקשה + + + URI of the requested page + URI של הדף המבוקש + + + Query carried along with the URI + קווירי נשאה יחד עם URI + + + Response code from the server + קוד תגובה מהשרת + + + User-agent of the client which made the request + User-agent of the Customer אשר עשה את הבקשה + + + IP address of the Client which made the request + כתובת IP של הלקוח אשר עשה את הבקשה + + + Cookie used for the request + עוגיות המשמשות את הבקשה + + + The URL which redirected the Client to the requested page + כתובת האתר שינתה את הלקוח לדף המבוקש + + + Size ib Bytes of the request, usually includes header and data + גודל ib Bytes של הבקשה, בדרך כלל כולל ראש ונתונים + + + Size in Bytes of the served content, usually includes header and data + גודל ב Bytes של התוכן מוגש, בדרך כלל כולל Header ונתונים + + + Time taken by the server to serve the content, in milliseconds + הזמן נלקח על ידי השרת כדי לשרת את התוכן, ב מילימטרים + + + Only use lines in which the field is starting with this string + רק להשתמש בקווים שבהם השדה מתחיל עם המחרוזת + + + Protocol: + פרוטוקול: + + + Method: + שיטה: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + רק להשתמש בקווים שבהם התחום תואם את ההצהרה. +השתמשו ב '!;', '=', '<' או '>' כדי להכריז מה להשתמש + + + Response: + תגובה: + + + Query: + המונחים: + + + URI: + URI: + + + Filters + מסננים + + + Count + הרוזן הרוזן + + + Number of occurrences + מספר אירועים + + + Item + Item + + + Value of the field + ערך השדה + + + From: + מ: + + + To: + תגית: + + + Select a log field to view + בחר שדה יומן כדי להציג + + + Field: + שדה: + + + Filter: + מסנן: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + עם מיתרים, רק השורות שבהן השדה מתחיל עם מיתר זה ישמש. +עם מספרים, השתמש '!', '=', '<' או '>' כדי להכריז מה להשתמש + + + Protocol + פרוטוקול + + + Method + שיטות + + + URI + URI + + + User-agent + User-agent + + + Most recurrent + רוב חוזר + + + Most trafficked + בעיקר + + + Date ever + תאריך אי פעם + + + Day of the week + יום השבוע + + + Hour of the day + שעת היום + + + Time taken + הזמן נלקח + + + Bytes sent + Bytes + + + Bytes received + Bytes שהתקבלו + + + Mean/Max performances + הופעות ב-MAX + + + Requests received + בקשות שהתקבלו + + + Total work + עבודה שלמה + + + General + גנרל כללי + + + Window + חלון החלון + + + Dialogs + דילוגים + + + Charts + Charts + + + Appearance + הופעה + + + Speed + מהירות מהירות + + + Relational + המונחים + + + TextBrowser + טקסטBrowser + + + Databases + מסד נתונים + + + Security + אבטחה + + + Logs + תגית: Logs + + + Defaults + אשמה + + + Control + בקרה + + + Path + נתיב + + + Format + פורמט + + + Warnlists + Warnlists + + + Blacklists + Blacklists + + + Remember the window's position and size + זוכרים את המיקום והגודל של החלון + + + Remember position and size + לזכור מיקום וגודל + + + Remember window's position and size + זוכרים את המיקום והגודל של החלון + + + Geometry + גאומטריה + + + Theme to use for the window + נושא לשימוש בחלון + + + Theme + נושא + + + Native + Native Native + + + Light + אור אור + + + Dark + כהה כהה + + + Auto + רכב אוטומטי + + + Icons + איקונים + + + Normal quantity of dialog messages shown + כמות נורמלית של הודעות דיאלוג + + + Normal + נורמלי + + + Dialogs from the main processes + אבחון מהתהליכים העיקריים + + + Dialogs emitted when parsing logs + דילוגים הנפלטים כאשר כתוביות + + + Logs parser + תגית: parser + + + Dialogs emitted when viewing statistics + דילוגים פולטים בעת צפייה בסטטיסטיקות + + + Statistics viewer + סטטיסטיקות + + + Define the quantity of dialog mesages shown + Define את כמות הודעות הדו-שיח המוצגות + + + Dialogs level + רמת אבחון + + + Reduced quantity of dialog messages shown + כמות מופחתת של הודעות דיאלוג + + + Essential + חיוני + + + Augmented quantity of dialog messages shown + כמות מופרזת של הודעות דיאלוג + + + Explanatory + תכנון + + + Theme to use for the Charts + נושא לשימוש עבור הטבלה + + + Preview + ביקורת + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + מייצג שלב בציר הזמן, בתוך שניות. +כל הערכים הנופלים בתוך אותו מרווח יתמזגו והערך הממוצע ישמש. + + + Time interval + זמן מרווח + + + The format to use for the labels of the time axis. + פורמט לשימוש בתוויות של ציר הזמן. + + + Time format + פורמט זמן + + + The size of the pie + גודל העוגה + + + Pie size + גודל פאי + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + המספר המקסימלי של פרוסות כי העוגה תהיה מורכבת. +פרוסות exceeding יסווגו לתוך פרוסה מקיפה אחת. + + + Maximum slices + פרוסות מקסימליות + + + Font to use for the Text Browser + פונט לשימוש בדפדפן הטקסט + + + Font + פונטפונט + + + Double-spaced lines + קווים כפולים + + + Use wide lines + שימוש בקווים רחבים + + + Define the spacing between lines + Define the ספאcing Between שורות + + + Lines spacing + המונחים + + + None + אף אחד לא + + + Color scheme to use for the Text Browser + תוכנית צבע לשימוש בדפדפן הטקסט + + + Color scheme + ערכת הצבעים + + + The appearance of the Text Browser with the current settings + המראה של דפדפן הטקסט עם ההגדרות הנוכחיות + + + Insert the base path only, file name excluded + הכנס את נתיב הבסיס בלבד, שם הקובץ נכלל + + + The given path doen't exists, or doesn't point to a folder + הדרך הנוכחית לא קיימת, או לא מצביעה על תיקיה + + + Path for the database files + הדרך לקבצי מסד הנתונים + + + Paths + נתיבים + + + Apply the current path + החל את הנתיב הנוכחי + + + Select the path through a dialog window + בחר את הנתיב דרך חלון דיאלוג + + + Path where the logs data collection database is located + נתיב שבו מסד הנתונים של איסוף הנתונים ממוקם + + + Logs data + עריכת נתונים + + + Path where the used files hashes database is located + נתיב שבו מסד הנתונים של קבצים משומשים ממוקם + + + Used files + קבצים משומשים + + + Backup options for the Logs Data database + אפשרויות גיבוי למסד הנתונים Logs Data + + + Backups + גיבויים + + + A new backup is made when closing LogDoctor after having succesfully edited the database + גיבוי חדש נעשה כאשר סוגר את LogDoctor לאחר שערך את מסד הנתונים + + + Backup the Logs Data database and keep + גיבוי מסד הנתונים של Logs Data ולשמור + + + Whether it is allowed or denied to follow symlinks occuring in a path + בין אם זה מותר או הכחיש לעקוב אחר קישורים מתרחשים בדרך + + + Follow symlinks + עקבו אחרי symlinks + + + Default WebServer + Default WebServer + + + Usage control + שימוש בשליטה + + + Hide already used files + קבצים כבר משתמשים + + + Size warnings + התראות + + + Warn me when using files with a size exceeding: + שחררו אותי כאשר משתמשים בקבצים בגודל העולה: + + + Logs folder + תיקיית Logs + + + Logs format string + פורמט מחרוזת + + + Format string + פורמט + + + Insert the format string you're using + הכנס את מחרוזת הפורמט שאתה משתמש + + + Apply the current string + החל את המחרוזת הנוכחית + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + ליצור קו יומן מדגם מן המחרוזת שנשמרה כיום, כדי לבדוק אם הוא מתואם נכון. +כל תחום שאינו נחשב ל- LogDoctor יופיע כ'DISCARDED' + + + Generate sample + המונחים + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + אנא בדוק את הנכונות של קו זה. +שדות המסומנים כמו 'DISCARDED' פשטו נכון, אך אינם נחשבים על ידי LogDoctor + + + Open an help window + פתח חלון עזרה + + + Help + עזרה + + + Select a log field + בחר שדה יומן + + + Use warnlist for this field + השתמש באזהרה בשדה זה + + + Add the current line to the list + הוסף את השורה הנוכחית לרשימה + + + Remove the selected item from the list + להסיר את הפריט שנבחר מהרשימה + + + Move the selected item down + הזיזו את הפריט שנבחר מטה + + + Use blacklist for this field + השתמש ברשימה השחורה של התחום הזה + + + Add line + הוסף + + + Remove selection + להסיר את הבחירה + + + Language + שפה + + + Utilities + המונחים + + + Tools + כלים + + + Games + משחקי משחקים + + + Perform a version-check + ביצוע גירסה-check + + + Show some info about LogDoctor + מידע על LogDoctor + + + Open a block-note like window to write temporary text + פתח את הפתק כמו החלון כדי לכתוב טקסט זמני + + + Play CrissCross + משחקי קריסוס + + + Play Snake + משחק הנחש + + + Show the changelog + הצג את השינוי + + + warnlist + אזהרה + + + blacklist + שחור + + + copy + עותק + + + copies + עותקים + + + Check updates + בדוק עדכונים + + + Infos + מידע + + + BlockNote + לחסוםnote + + + CrissCross + קריסוס + + + Snake + נחש נחש נחש + + + Changelog + שינוי + + + + RichText + + Select a file from the list + בחר קובץ מהרשימה + + + to inspect its content + כדי לבדוק את התוכן שלו + + + Failed to read + נכשל לקרוא + + + + SnakeGame + + PLAY + PLAY + + + Classic + קלאסיקה קלאסית + + + Hunt + ציד + + + Battle + קרב Battle Battle + + + Game Over + המשחק Over + + + Your adversary fell in the water! + ההתנתקות שלך נפלה במים! + + + YOU WON! + אתה! + + + You fell in the water! + נפלת למים! + + + YOU LOST! + אתה אבוד! + + + Your adversary ate itself! + ההתנתקות אכלה את עצמה! + + + You ate yourself! + אכלת את עצמך! + + + Your adversary ate you! + ההתנתקות אכלה אותך! + + + You ate your adversary! + אכלת את ה adversary שלך! + + + You ate each other! + אכלתם אחד את השני! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + WebServer + + + Logs Size Breakdown + המונחים: size Breakdown + + + Ignored + התעלמו + + + Parsed + פרס + + + Blacklisted + שחור + + + Others + אחרים + + + from + מתוך + + + to + to to + + + Log Lines Marked as Warning + המונחים: Warning + + + Time Taken to Serve Requests + הגיע הזמן להגיש בקשות + + + Time of Day Count + זמן הרוזן + + + Relational Count + הספירה לאחור + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + תאריך תאריך תאריך תאריך + + + Year + שנה + + + Month + חודש החודש + + + Day + יום יום יום + + + Time + הזמן + + + Hour + שעת שעה + + + Minute + דקה + + + Second + השני + + + Warning + אזהרה + + + Protocol + פרוטוקול + + + Method + שיטות + + + URI + URI + + + Query + Query + + + Response code + קוד תגובה + + + Time taken + הזמן נלקח + + + Bytes sent + Bytes + + + Bytes received + Bytes שהתקבלו + + + Referrer + Referrer + + + Cookie + Cookie + + + Client + לקוח + + + User-agent + User-agent + + + January + ינואר ינואר + + + February + פברואר פברואר + + + March + מרץ + + + April + אפריל אפריל + + + May + במאי מאי + + + June + יוני יוני יוני יוני יוני + + + July + יולי יולי + + + August + אוגוסט אוגוסט אוגוסט + + + September + ספטמבר ספטמבר + + + October + אוקטובר אוקטובר + + + November + נובמבר נובמבר + + + December + דצמבר דצמבר + + + Sunday + יום ראשון + + + Monday + יום שני + + + Tuesday + יום שלישי + + + Wednesday + יום רביעי + + + Thursday + יום חמישי + + + Friday + יום שישי + + + Saturday + יום שבת + + + diff --git a/logdoctor/translations/LogDoctor_hi_IN.ts b/logdoctor/translations/LogDoctor_hi_IN.ts new file mode 100644 index 0000000..349fb21 --- /dev/null +++ b/logdoctor/translations/LogDoctor_hi_IN.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + संस्करण + + + Version 4 + संस्करण 4 + + + Version 3 + संस्करण 3 + + + Version 2 + संस्करण 2 + + + Version 1 + संस्करण 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + स्क्रिप्ट का निर्माण + + + Cross-platform compatibility: + क्रॉस-प्लेटफॉर्म संगतता: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + सांख्यिकी: + + + Warnings + चेतावनी + + + Speed + गति + + + Counts + गिनती + + + Daytime + दिन + + + Relational + रिलेशन + + + Globals + ग्लोबल + + + Translations: + अनुवाद: + + + Italian + इतालवी + + + Spanish + स्पेनिश + + + French + फ्रेंच + + + Tools: + उपकरण: + + + Block note + ब्लॉक नोट + + + Utilities: + उपयोगिता: + + + Infos viewer + जानकारी दर्शक + + + Updates checker + अपडेट्स चेकर + + + Themes: + विषय: + + + Dark + अंधेरा + + + Light + प्रकाश + + + Improvements and fixes + सुधार और निर्धारण + + + New themes: + नई थीम: + + + Ash + ऐश + + + Candy + कैंडी + + + Forest + वन + + + Powder + पाउडर + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Restyled संवाद + + + Doxygen documentation + डॉक्सीजन प्रलेखन + + + Mini-Games: + मिनी गेम: + + + Criss-cross + क्रिस-क्रॉस + + + Snake + साँप + + + Changed default paths + डिफ़ॉल्ट पथ बदल गया + + + New game modes for Snake + सांप के लिए नए खेल मोड + + + Hunt + हंट + + + Battle + युद्ध + + + New translations: + नया अनुवाद: + + + Japanese + जापानी + + + Portuguese + पुर्तगाली + + + Code improvements + कोड सुधार + + + Performance improvements + निष्पादन सुधार + + + Added tests suite: + जोड़ा गया परीक्षण सूट: + + + white box tests + सफेद बॉक्स परीक्षण + + + Customized charts themes + स्वनिर्धारित चार्ट विषयों + + + Fixes + फिक्स + + + Tests improvements + परीक्षण सुधार + + + Docker support + डॉकर समर्थन + + + Upgrade to C++20 + C++20 में अपग्रेड + + + Upgrade to Qt6 + Qt6 में अपग्रेड करें + + + Restyled themes + Restyled विषयों + + + Redesigned configs section + Redesigned विन्यास अनुभाग + + + Stability improvements + स्थिरता सुधार + + + Generating warnings dinamically + गतिशील रूप से चेतावनी उत्पन्न करना + + + New tool: + नया उपकरण: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + कुछ चार्टों के लिए Tweakable पैरामीटर: + + + Improved project structure + परियोजना संरचना में सुधार + + + Modernized Cmake usage + आधुनिकीकरण Cmake उपयोग + + + + Crapinfo + + Version + संस्करण + + + Currently installed version of the software + वर्तमान में सॉफ्टवेयर का स्थापित संस्करण + + + Repository links + रिपोजिटरी लिंक + + + Paths + पथ + + + The path of the executable file + निष्पादन योग्य फ़ाइल का पथ + + + Executable + निष्पादन + + + The path where the configuration file gets saved and searched in + जहां कॉन्फ़िगरेशन फ़ाइल सहेजी जाती है और खोजी जाती है + + + Configuration file + कॉन्फ़िगरेशन फ़ाइल + + + The path where the application searches for extra resources + जहां आवेदन अतिरिक्त संसाधनों की खोज करता है + + + Application data + अनुप्रयोग डेटा + + + + Crapnote + + Reduce the font size + फ़ॉन्ट आकार को कम करें + + + Font size + फ़ॉन्ट आकार + + + Increase the font size + फ़ॉन्ट आकार बढ़ाएं + + + + Crappath + + Choose + चुनें + + + Cancel + रद्द करना + + + + Crapup + + Checking for updates + अद्यतन की जाँच + + + New version available + नया संस्करण उपलब्ध + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + एक नया संस्करण उपलब्ध है! +कृपया LogDoctor के गिट भंडार पर जाएं और कैसे अद्यतन करने के लिए निर्देश का पालन करें + + + No update found + कोई अपडेट नहीं मिला + + + LogDoctor is up-to-date + LogDoctor अप-टू-डेट है + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + आप भविष्य से एक संस्करण चला रहे हैं! +आपका संस्करण वर्तमान अपस्ट्रीम संस्करण से परे है +क्या आप मूल LogDoctor चला रहे हैं? +कृपया LogDoctor के भंडार पर जाएं और इसका नया संस्करण प्राप्त करें + + + Failed to establish a connection + एक कनेक्शन स्थापित करने में विफल + + + Connection error, please try again later + कनेक्शन त्रुटि, बाद में फिर से प्रयास करें + + + Connection timed out + सम्पर्क करने का समय + + + Version check failed + संस्करण की जाँच विफल + + + An error occured while parsing: +version mark not found + पार्सिंग के दौरान एक त्रुटि होती है: +संस्करण चिह्न नहीं मिला + + + An error occured while parsing: +malformed version + पार्सिंग के दौरान एक त्रुटि होती है: +विकृत संस्करण + + + An error occured while comparing: +malformed upstream version + तुलना करते समय त्रुटि होती है: +विकृत अपस्ट्रीम संस्करण + + + + CrissCross + + Victory + विजय + + + You beated me! + तुम मुझे beated! + + + This time you lost! + इस बार आप हार गए! + + + Draw + ड्रा + + + Nice match + अच्छा मैच + + + + DialogBool + + Yes + हाँ + + + No + नहीं + + + + DialogIda + + Ignore + इग्नोर + + + Discard + डिस्कर्ड + + + Abort + Abort + + + + DialogMsg + + Ok + ठीक + + + + DialogSec + + One of the lists has an invalid item + सूची में से एक में अमान्य वस्तु है + + + An error occured while reading the configuration file + कॉन्फ़िगरेशन फ़ाइल पढ़ने के दौरान त्रुटि होती है + + + An error occured while parsing configuration file's data + कॉन्फ़िगरेशन फ़ाइल के डेटा को पार करते समय एक त्रुटि होती है + + + Failed to create the configuration file's directory + कॉन्फ़िगरेशन फ़ाइल की निर्देशिका बनाने में विफल + + + Failed to create the configuration file + विन्यास फ़ाइल बनाने में विफल + + + An error occured while writing the configuration file + कॉन्फ़िगरेशन फ़ाइल लिखते समय त्रुटि होती है + + + An error occured while preparing the configuration file's data + कॉन्फ़िगरेशन फ़ाइल के डेटा को तैयार करते समय त्रुटि होती है + + + The path contains a symlink + पथ में एक समलिंक होता है + + + The file does not exist + फ़ाइल मौजूद नहीं है + + + Failed to create the database backups' directory + डेटाबेस बैकअप निर्देशिका बनाने में विफल + + + Failed to copy the database file + डेटाबेस फ़ाइल कॉपी करने में विफल + + + Failed to update the backups + बैकअप अद्यतन करने में विफल + + + Failed to create the directory + निर्देशिका बनाने में विफल + + + Unrecognized entry + अप्रत्याशित प्रविष्टि + + + Size of the file + फाइल का आकार + + + Warning size parameter + चेतावनी का आकार पैरामीटर + + + Failed to read gzipped file + Gzipped फ़ाइल पढ़ने में विफल + + + An error occured while parsing the format string + प्रारूप स्ट्रिंग को पार करते समय एक त्रुटि होती है + + + Available memory + उपलब्ध स्मृति + + + Size of the logs + लॉग का आकार + + + An error occured while reading the gzipped file + Gzipped फ़ाइल पढ़ने के दौरान एक त्रुटि हुई + + + An error occured while reading the file + फ़ाइल पढ़ने के दौरान त्रुटि होती है + + + Something failed while handling the file + फ़ाइल को संभालने के दौरान कुछ विफल रहा + + + An error occured while working on the database + डेटाबेस पर काम करते समय त्रुटि होती है + + + Aborting + गर्भपात + + + Invalid locale + अमान्य स्थानीय + + + Unexpected locale format + अनपेक्षित स्थानीय प्रारूप + + + If you haven't manually edited the configuration file, +please report this issue + यदि आपने मैन्युअल रूप से कॉन्फ़िगरेशन फ़ाइल को संपादित नहीं किया है, तो, +कृपया इस मुद्दे की रिपोर्ट करें + + + The given locale is not an accepted language + दी गई स्थानीय भाषा नहीं है + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + यदि आप LogDoctor में इस स्थान पर होना चाहते हैं, तो, +कृपया repository पृष्ठ पर निर्देश का पालन करें + + + Configuration file not found + कॉन्फ़िगरेशन फ़ाइल नहीं मिली + + + Unable to retrieve the configuration file + कॉन्फ़िगरेशन फ़ाइल को पुनर्प्राप्त करने में असमर्थ + + + Skipping + स्किप + + + An error occured while handling the configuration file + कॉन्फ़िगरेशन फ़ाइल को संभालने के दौरान त्रुटि होती है + + + Failed to write the configuration file + कॉन्फ़िगरेशन फ़ाइल लिखने में विफल + + + Current configuration not saved + वर्तमान विन्यास नहीं बचाया + + + File not readable + फ़ाइल पठनीय + + + The file is not readable + फ़ाइल पठनीय नहीं है + + + File not writable + फ़ाइल लिखने योग्य नहीं है + + + The file is not writable + फ़ाइल लिखने योग्य नहीं है + + + Directory not writable + निर्देशिका लिखने योग्य नहीं + + + The directory is not writable + निर्देशिका लिखने योग्य नहीं है + + + Invalid path + अवैध पथ + + + Failed applying configuration + आवेदन विन्यास विफल + + + Invalid configuration lines + अमान्य विन्यास लाइनों + + + Has not been possible to apply some of the configurations + कुछ विन्यास लागू करने के लिए संभव नहीं है + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + यदि आप आगे बढ़ने के लिए चुनते हैं, तो सभी अप्रयुक्त विन्यास खो जाएंगे +जारी रखें? + + + Failed to retrieve the help file + मदद फ़ाइल पुनर्प्राप्त करने में विफल + + + An error occured while getting the help file + मदद फ़ाइल प्राप्त करते समय त्रुटि होती है + + + Additional resources can be downloaded from the git repo + अतिरिक्त संसाधनों को गिट रेपो से डाउनलोड किया जा सकता है + + + Unable to retrieve the file + फ़ाइल पुनर्प्राप्त करने में असमर्थ + + + Invalid string + अमान्य स्ट्रिंग + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + दी गई स्ट्रिंग अवैध है और सूची में जोड़ा नहीं जा सकता है + +कृपया इसे सही करें और पुनः प्रयास करें + + + QSql driver not found + क्यूस्कल ड्राइवर नहीं मिला + + + Failed to retrieve the driver needed to handle the database + डेटाबेस को संभालने के लिए आवश्यक ड्राइवर को पुनर्प्राप्त करने में विफल रहा + + + File not found + फ़ाइल नहीं मिला + + + Failed to retrieve the database file + डेटाबेस फ़ाइल पुनर्प्राप्त करने में विफल + + + Create a new database? + एक नया डेटाबेस बनाएं? + + + The database contains an unexpected table + डेटाबेस में एक अप्रत्याशित तालिका होती है + + + Unexpected table + अनपेक्षित तालिका + + + It seems that the database is missing a table + ऐसा लगता है कि डेटाबेस एक तालिका लापता है + + + Table not found + नहीं मिला + + + The database contains an unexpected column + डेटाबेस में एक अप्रत्याशित स्तंभ होता है + + + Unexpected column + Unexpected स्तंभ + + + It seems that the table is missing a column + ऐसा लगता है कि तालिका एक स्तंभ लापता है + + + Column not found + कॉलम नहीं मिला + + + A column has an unexpected data-type + एक स्तंभ में अप्रत्याशित डेटा-प्रकार होता है + + + Unexpected data-type + अनपेक्षित डेटा-प्रकार + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + इस डेटाबेस को '.copy' नाम दिया जाएगा और एक नया बनाया जाएगा। +जारी रखें? + + + Database created + डेटाबेस बनाया गया + + + Successfully created a new database + सफलतापूर्वक एक नया डेटाबेस बनाया + + + Not a file + फ़ाइल नहीं + + + The path was supposed to point to a file, but it doesn't + पथ को एक फ़ाइल पर इंगित करना चाहिए था, लेकिन यह नहीं है + + + Please remove the conflict and retry + कृपया संघर्ष और पुनः प्रयास को हटा दें + + + The database file is not readable + डेटाबेस फ़ाइल पठनीय नहीं है + + + Please set the proper permissions and retry +If this error persists, please report this issue + कृपया उचित अनुमतियां निर्धारित करें और पुनः प्राप्त करें +यदि यह त्रुटि बनी रहती है, तो कृपया इस मुद्दे को रिपोर्ट करें + + + The database file is not writable + डेटाबेस फ़ाइल लिखने योग्य नहीं है + + + Invalid database path + अमान्य डेटाबेस पथ + + + Failed creating database + डेटाबेस बनाने में विफल + + + An error occured while creating the database + डेटाबेस बनाते समय एक त्रुटि होती है + + + Failed opening database + विफल खोलने डेटाबेस + + + An error occured while opening the database + डेटाबेस खोलने के दौरान त्रुटि होती है + + + Failed executing on database + डेटाबेस पर निष्पादन विफल + + + An error occured while executing a statement on the database + डेटाबेस पर एक बयान निष्पादित करते समय एक त्रुटि होती है + + + Failed to backup database + बैकअप डेटाबेस में विफल + + + Please report this issue + कृपया इस मुद्दे को रिपोर्ट करें + + + Invalid log format string + Invalid लॉग प्रारूप स्ट्रिंग + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + कृपया जांच लें कि आपके वेबसर्वर द्वारा कोई त्रुटि नहीं फेंकी जाती है +यदि यह स्वीकार किया जाता है, तो कृपया यहां एक टाइपो की उपस्थिति की जांच करें +यदि सब कुछ ठीक है, तो कृपया इस मुद्दे को रिपोर्ट करें + + + Log format error + लॉग प्रारूप त्रुटि + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + लॉग प्रारूप सेट नहीं किया गया है, या अवैध है +कृपया कॉन्फ़िगरेशन में एक मान्य जोड़ें + + + Misconfigured log format + Misconfigured लॉग प्रारूप + + + No log field has been set in the current logs format, +making it useless to parse logs + वर्तमान लॉग प्रारूप में कोई लॉग फ़ील्ड सेट नहीं किया गया है, +लॉग को पार्स करने के लिए इसे बेकार बनाना + + + Please set up a format which contains at least one field + कृपया एक प्रारूप स्थापित करें जिसमें कम से कम एक फ़ील्ड शामिल है + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + एक विभाजक एक या अधिक क्षेत्रों के बीच लापता है, +इसे शुद्ध सीमा स्थापित करना मुश्किल है, +और संभवतः गलत डेटा स्टोर करने के लिए अग्रणी + + + Please set up a format which contains separators between fields + कृपया एक प्रारूप स्थापित करें जिसमें फ़ील्ड के बीच विभाजक शामिल हैं + + + Missing field in log format + लॉग प्रारूप में लापता क्षेत्र + + + An important field is missing from the provided format: + एक महत्वपूर्ण क्षेत्र प्रदान किए गए प्रारूप से गायब है: + + + The quality of the statistics may be seriously compromized + सांख्यिकी की गुणवत्ता को गंभीरता से समझौता किया जा सकता है + + + Proceed anyway? + वैसे भी आगे बढ़ें? + + + 'Carriage Return' in log format + लॉग प्रारूप में 'कैरिज रिटर्न' + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + प्रदान किए गए प्रारूप में 'कैरिज रिटर्न' शामिल है। +यह डेटा हानि या दुर्घटनाग्रस्त हो सकता है यदि सावधानी के साथ उपयोग नहीं किया जाता है + + + An error occured while parsing logs + लॉग को पार करते समय त्रुटि होती है + + + Failed defining type + विफल परिभाषित प्रकार + + + Failed to determine the log type + लॉग प्रकार निर्धारित करने में विफल + + + File already used + पहले से ही इस्तेमाल किया + + + The file has probably been used already + शायद पहले से ही इस्तेमाल किया गया है + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + चेतावनी को अनदेखा करें और इसे वैसे भी उपयोग करें, इसे पढ़ें और जारी रखें, या पूरी प्रक्रिया को रद्द करें? + + + Duplicate file + डुप्लिकेट फ़ाइल + + + The file appears twice in the list of selections + फ़ाइल चयन की सूची में दो बार दिखाई देती है + + + Failed updating hashes + असफल अद्यतन हैश + + + An error occured while inserting the parsed files hashes into the database + एक त्रुटि तब होती है जब पार्स्ड फ़ाइलों को डेटाबेस में डाल दिया जाता है + + + File exceeds warning size + फ़ाइल चेतावनी आकार से अधिक है + + + The file's size exceeds the warning size + फ़ाइल का आकार चेतावनी के आकार से अधिक है + + + Not enough memory + पर्याप्त स्मृति नहीं + + + The total size of the selected files exceeds the available memory + चयनित फ़ाइलों का कुल आकार उपलब्ध स्मृति से अधिक है + + + Please free some resources, parse the files in different steps or split them into smaller units + कृपया कुछ संसाधनों को मुक्त करें, फ़ाइलों को विभिन्न चरणों में पार करें या उन्हें छोटी इकाइयों में विभाजित करें। + + + Failed reading + विफल पढ़ने + + + File is empty + फ़ाइल खाली है + + + The file is blank + फ़ाइल रिक्त है + + + Failed to retrieve the selected file + चयनित फ़ाइल पुनर्प्राप्त करने में विफल + + + Discard it and continue, or Abort all and exit? + इसे पढ़ें और जारी रखें, या सभी को छोड़ दें? + + + No file to parse + कोई फाइल नहीं + + + The list of files to parse is empty + पार्स के लिए फ़ाइलों की सूची खाली है + + + Directory not found + निर्देशिका नहीं मिला + + + The directory does not exists + निर्देशिका मौजूद नहीं है + + + Directory not readable + पढ़ने योग्य नहीं + + + The directory is not readable + निर्देशिका पढ़ने योग्य नहीं है + + + Please set the proper permissions before to start + शुरू करने से पहले कृपया उचित अनुमतियां निर्धारित करें + + + Failed creating directory + विफल बनाने निर्देशिका + + + The path does not exists + मार्ग मौजूद नहीं है + + + Data conversion failed + डेटा रूपांतरण विफल + + + Failed to convert from '%1' to '%2' + '%1' से '%2' में बदलने में विफल + + + Failed to create statistics + सांख्यिकी बनाने में विफल + + + An error occured while processing + प्रसंस्करण के दौरान एक त्रुटि होती है + + + Cannot create statistics + आंकड़े नहीं बना सकते + + + No data has been found that matches with the currently set parameters + कोई डेटा नहीं मिला है कि वर्तमान में निर्धारित मापदंडों के साथ मैच + + + Not a folder + कोई फ़ोल्डर नहीं + + + The path was supposed to point to a folder, but it doesn't + पथ को एक फ़ोल्डर पर इंगित करना चाहिए, लेकिन यह नहीं है + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + प्रवेश का नाम '.copy' रखा जाएगा और एक नया बनाया जाएगा। +जारी रखें? + + + An error occured + एक त्रुटि हुई + + + Failed renaming + विफल नाम + + + An error occured while renaming + नाम बदलने के दौरान त्रुटि होती है + + + + GameDialog + + Ok + ठीक + + + + MainWindow + + Parse logs from the Apache2 web server + Apache2 वेब सर्वर से पार्स लॉग + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Nginx वेब सर्वर से पार्स लॉग + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Microsoft IIS वेब सर्वर से पार्स लॉग + + + IIS + IIS + + + Select/deselect all the files + सभी फ़ाइलों का चयन / चयन करें + + + All + सब + + + Inspect a log file + लॉग फ़ाइल का निरीक्षण करें + + + Name + नाम + + + Size + आकार + + + Refresh the list + सूची ताज़ा करें + + + Total size of the parsed data + पार्स डेटा का कुल आकार + + + Total number of parsed lines + पार्स्ड लाइनों की कुल संख्या + + + Start parsing the selected files + चयनित फ़ाइलों को पार करना शुरू करें + + + START + स्टार्ट + + + Time elapsed since the start + शुरू होने के बाद से समय समाप्त हो गया + + + Average speed, in parsed data size per second + औसत गति, प्रति सेकंड पार्स्ड डेटा आकार में + + + Web Server + वेब सर्वर + + + Select a Web Server + वेब सर्वर चुनें + + + Year + वर्ष + + + Month + महीना + + + Day + दिवस + + + Hour + घंटे + + + Draw the chart + चार्ट खींचें + + + Log line marked as Warning + लॉग लाइन चेतावनी के रूप में चिह्नित + + + Date when the request arrived (YYYY-MM-DD) + तारीख जब अनुरोध आया (YYYYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + जब अनुरोध आया (hh:mm:s) + + + Protocol of the request + अनुरोध का प्रोटोकॉल + + + Method of the request + अनुरोध की विधि + + + URI of the requested page + अनुरोधित पृष्ठ का URI + + + Query carried along with the URI + क्वेरी यूआरआई के साथ मिलकर + + + Response code from the server + सर्वर से प्रतिक्रिया कोड + + + User-agent of the client which made the request + ग्राहक के उपयोगकर्ता-एजेंट ने अनुरोध किया + + + IP address of the Client which made the request + ग्राहक का आईपी एड्रेस जिसने अनुरोध किया + + + Cookie used for the request + कुकी अनुरोध के लिए इस्तेमाल किया + + + The URL which redirected the Client to the requested page + URL जो ग्राहक को अनुरोधित पेज पर रीडायरेक्ट करता है + + + Size ib Bytes of the request, usually includes header and data + अनुरोध के आकार आईबी बाइट्स में आमतौर पर हेडर और डेटा शामिल होता है + + + Size in Bytes of the served content, usually includes header and data + सामग्री के बाइट्स में आकार, आमतौर पर हेडर और डेटा शामिल होता है + + + Time taken by the server to serve the content, in milliseconds + सर्वर द्वारा सामग्री की सेवा के लिए लिया जाने वाला समय, मिलीसेकेंड में + + + Only use lines in which the field is starting with this string + केवल उन पंक्तियों का उपयोग करते हैं जिनमें क्षेत्र इस स्ट्रिंग से शुरू होता है + + + Protocol: + प्रोटोकॉल: + + + Method: + विधि: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + केवल उन पंक्तियों का उपयोग करते हैं जिनमें क्षेत्र इस बयान से मेल खाता है। +'!', '=', '<' या '>' का उपयोग करने के लिए क्या घोषणा करने के लिए + + + Response: + प्रतिक्रिया: + + + Query: + क्वेरी: + + + URI: + यूआरआई: + + + Filters + फिल्टर + + + Count + गणना + + + Number of occurrences + घटनाओं की संख्या + + + Item + आइटम + + + Value of the field + क्षेत्र का मूल्य + + + From: + से: + + + To: + To: + + + Select a log field to view + देखने के लिए लॉग फ़ील्ड चुनें + + + Field: + फील्ड: + + + Filter: + फ़िल्टर: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + स्ट्रिंग्स के साथ, केवल उन पंक्तियों में जहां क्षेत्र इस स्ट्रिंग के साथ शुरू होता है, का उपयोग किया जाएगा। +संख्याओं के साथ, '!', '=', '<' या '>' का उपयोग करने के लिए क्या घोषणा करना है + + + Protocol + प्रोटोकॉल + + + Method + विधि + + + URI + यूआरआई + + + User-agent + उपयोगकर्ता एजेंट + + + Most recurrent + वर्तमान + + + Most trafficked + अधिकांश यातायात + + + Date ever + कभी + + + Day of the week + सप्ताह का दिन + + + Hour of the day + दिन का समय + + + Time taken + समय लिया + + + Bytes sent + Bytes भेजा + + + Bytes received + Bytes प्राप्त + + + Mean/Max performances + मीन/अधिकतम प्रदर्शन + + + Requests received + प्राप्त अनुरोध + + + Total work + कुल कार्य + + + General + जनरल + + + Window + विंडो + + + Dialogs + संवाद + + + Charts + चार्ट + + + Appearance + दिखावट + + + Speed + गति + + + Relational + रिलेशन + + + TextBrowser + TextBrower + + + Databases + डेटाबेस + + + Security + सुरक्षा + + + Logs + लॉग + + + Defaults + डिफ़ॉल्ट + + + Control + नियंत्रण + + + Path + पथ + + + Format + प्रारूप + + + Warnlists + वार्नलिस्ट + + + Blacklists + ब्लैकलिस्ट + + + Remember the window's position and size + खिड़की की स्थिति और आकार याद रखें + + + Remember position and size + स्थिति और आकार याद रखें + + + Remember window's position and size + खिड़की की स्थिति और आकार याद रखें + + + Geometry + ज्यामिति + + + Theme to use for the window + थीम विंडो के लिए उपयोग करने के लिए + + + Theme + विषय + + + Native + मूल + + + Light + प्रकाश + + + Dark + अंधेरा + + + Auto + ऑटो + + + Icons + प्रतीक + + + Normal quantity of dialog messages shown + दिखाया गया संवाद संदेशों की सामान्य मात्रा + + + Normal + सामान्य + + + Dialogs from the main processes + मुख्य प्रक्रियाओं से संवाद + + + Dialogs emitted when parsing logs + जब लॉग पार्सिंग + + + Logs parser + लॉग पार्सर + + + Dialogs emitted when viewing statistics + आंकड़ों को देखते समय डायलॉग उत्सर्जित होता है + + + Statistics viewer + सांख्यिकी दर्शक + + + Define the quantity of dialog mesages shown + दिखाया गया संवाद mesage की मात्रा को परिभाषित करें + + + Dialogs level + डायलॉग स्तर + + + Reduced quantity of dialog messages shown + दिखाया गया संवाद संदेशों की मात्रा कम + + + Essential + आवश्यक + + + Augmented quantity of dialog messages shown + दिखाए गए संवाद संदेशों की बढ़ी हुई मात्रा + + + Explanatory + व्याख्यात्मक + + + Theme to use for the Charts + चार्ट के लिए उपयोग करने के लिए थीम + + + Preview + पूर्वावलोकन + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + सेकंड में, समय अक्ष में एक कदम का प्रतिनिधित्व करता है। +एक ही अंतराल के अंदर आने वाले सभी मूल्यों को विलय किया जाएगा और इसका मतलब मान इस्तेमाल किया जाएगा। + + + Time interval + समय अंतराल + + + The format to use for the labels of the time axis. + प्रारूप समय अक्ष के लेबल के लिए उपयोग करने के लिए। + + + Time format + समय स्वरूप + + + The size of the pie + पाई का आकार + + + Pie size + पाई का आकार + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + टुकड़ा है कि पाई से बना होगा की अधिकतम संख्या। +Exceeding स्लाइस को एक व्यापक स्लाइस में वर्गीकृत किया जाएगा। + + + Maximum slices + अधिकतम स्लाइस + + + Font to use for the Text Browser + फ़ॉन्ट टेक्स्ट ब्राउज़र के लिए उपयोग करने के लिए + + + Font + फ़ॉन्ट + + + Double-spaced lines + डबल-स्पेस लाइनों + + + Use wide lines + विस्तृत लाइनों का उपयोग करें + + + Define the spacing between lines + रेखाओं के बीच रिक्ति को परिभाषित करें + + + Lines spacing + लाइन्स रिक्ति + + + None + कोई नहीं + + + Color scheme to use for the Text Browser + पाठ ब्राउज़र के लिए उपयोग करने के लिए रंग योजना + + + Color scheme + रंग योजना + + + The appearance of the Text Browser with the current settings + वर्तमान सेटिंग्स के साथ पाठ ब्राउज़र की उपस्थिति + + + Insert the base path only, file name excluded + केवल आधार पथ डालें, फ़ाइल नाम को बाहर रखा गया + + + The given path doen't exists, or doesn't point to a folder + दिए गए पथ मौजूद नहीं है, या किसी फ़ोल्डर को इंगित नहीं करता है + + + Path for the database files + डेटाबेस फ़ाइलों के लिए पथ + + + Paths + पथ + + + Apply the current path + वर्तमान पथ लागू करें + + + Select the path through a dialog window + एक संवाद विंडो के माध्यम से पथ का चयन करें + + + Path where the logs data collection database is located + पथ जहां लॉग डेटा संग्रह डेटाबेस स्थित है + + + Logs data + लॉग डेटा + + + Path where the used files hashes database is located + पथ जहां इस्तेमाल की जाने वाली फ़ाइलों का डेटाबेस स्थित है + + + Used files + प्रयुक्त फाइलें + + + Backup options for the Logs Data database + Logs डेटा डेटाबेस के लिए बैकअप विकल्प + + + Backups + बैकअप + + + A new backup is made when closing LogDoctor after having succesfully edited the database + डेटाबेस को सफलतापूर्वक संपादित करने के बाद LogDoctor को बंद करते समय एक नया बैकअप बनाया जाता है + + + Backup the Logs Data database and keep + लॉग्स डेटा डेटाबेस को बैकअप करें और रखें + + + Whether it is allowed or denied to follow symlinks occuring in a path + क्या यह अनुमति है या एक पथ में होने वाले सिम्पलिंक का पालन करने से इनकार कर दिया जाता है + + + Follow symlinks + समलिंक्स का पालन करें + + + Default WebServer + डिफ़ॉल्ट वेबसर्वर + + + Usage control + प्रयोग नियंत्रण + + + Hide already used files + पहले से ही इस्तेमाल फ़ाइलों को छुपाएं + + + Size warnings + आकार चेतावनी + + + Warn me when using files with a size exceeding: + जब एक आकार से अधिक फ़ाइलों का उपयोग करते हैं तो मुझे चेतावनी दें: + + + Logs folder + लॉग्स फ़ोल्डर + + + Logs format string + लॉग्स प्रारूप स्ट्रिंग + + + Format string + फॉर्मेट स्ट्रिंग + + + Insert the format string you're using + प्रारूप स्ट्रिंग डालें जिसका आप उपयोग कर रहे हैं + + + Apply the current string + वर्तमान स्ट्रिंग लागू करें + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + वर्तमान में सहेजे गए स्ट्रिंग से एक नमूना लॉग लाइन उत्पन्न करें, यह जांचने के लिए कि क्या यह सही ढंग से स्वरूपित हो जाता है। +LogDoctor द्वारा विचार नहीं किया गया कोई भी क्षेत्र 'DISCARDED' के रूप में दिखाई देगा। + + + Generate sample + नमूना उत्पन्न करना + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + कृपया इस लाइन की शुद्धता की जांच करें। +'DISCARDED' के रूप में चिह्नित क्षेत्रों को सही ढंग से पार कर दिया गया है, लेकिन LogDoctor द्वारा नहीं माना जाता है + + + Open an help window + एक मदद विंडो खोलें + + + Help + सहायता + + + Select a log field + लॉग फ़ील्ड चुनें + + + Use warnlist for this field + इस क्षेत्र के लिए चेतावनी सूची का प्रयोग करें + + + Add the current line to the list + सूची में वर्तमान लाइन जोड़ें + + + Remove the selected item from the list + सूची से चयनित आइटम निकालें + + + Move the selected item down + चयनित आइटम को नीचे ले जाएँ + + + Use blacklist for this field + इस क्षेत्र के लिए ब्लैकलिस्ट का उपयोग करें + + + Add line + लाइन जोड़ें + + + Remove selection + चयन निकालें + + + Language + भाषा + + + Utilities + उपयोगिता + + + Tools + उपकरण + + + Games + खेल + + + Perform a version-check + एक संस्करण-चेक करें + + + Show some info about LogDoctor + LogDoctor के बारे में कुछ जानकारी + + + Open a block-note like window to write temporary text + अस्थायी पाठ लिखने के लिए विंडो की तरह एक ब्लॉक-नोट खोलें + + + Play CrissCross + क्रिसक्रॉस + + + Play Snake + खेल साँप + + + Show the changelog + Changelog + + + warnlist + चेतावनी + + + blacklist + ब्लैकलिस्ट + + + copy + प्रतिलिपि + + + copies + प्रतिलिपि + + + Check updates + अद्यतन की जाँच करें + + + Infos + जानकारी + + + BlockNote + ब्लॉकनोट + + + CrissCross + क्रिसक्रॉस + + + Snake + साँप + + + Changelog + Changelog + + + + RichText + + Select a file from the list + सूची से एक फ़ाइल का चयन करें + + + to inspect its content + अपनी सामग्री का निरीक्षण करना + + + Failed to read + पढ़ने में विफल + + + + SnakeGame + + PLAY + प्ले + + + Classic + क्लासिक + + + Hunt + हंट + + + Battle + युद्ध + + + Game Over + गेम ओवर + + + Your adversary fell in the water! + आपका आगमन पानी में गिर गया! + + + YOU WON! + आप चाहते हैं! + + + You fell in the water! + आप पानी में गिर गए! + + + YOU LOST! + आप बहुत कम! + + + Your adversary ate itself! + आपका स्वागत है! + + + You ate yourself! + आप खुद ही खाते हैं! + + + Your adversary ate you! + आपका स्वागत है! + + + You ate your adversary! + आप अपने साहसिक कार्य! + + + You ate each other! + आप एक दूसरे को ate! + + + MATCH IS DRAW! + मैच DRAW है! + + + + TR + + Unexpected WebServer + Unexpected WebServer + + + Logs Size Breakdown + लॉग्स साइज ब्रेकडाउन + + + Ignored + अनदेखा + + + Parsed + पार्स + + + Blacklisted + ब्लैकलिस्ट + + + Others + अन्य + + + from + से + + + to + to + + + Log Lines Marked as Warning + लॉग लाइन्स चेतावनी के रूप में चिह्नित + + + Time Taken to Serve Requests + सेवा अनुरोध पर समय लिया + + + Time of Day Count + दिन की गिनती का समय + + + Relational Count + सापेक्ष गणना + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + तारीख + + + Year + वर्ष + + + Month + महीना + + + Day + दिवस + + + Time + समय + + + Hour + घंटे + + + Minute + Minute + + + Second + दूसरा + + + Warning + चेतावनी + + + Protocol + प्रोटोकॉल + + + Method + विधि + + + URI + यूआरआई + + + Query + क्वेरी + + + Response code + प्रतिक्रिया कोड + + + Time taken + समय लिया + + + Bytes sent + Bytes भेजा + + + Bytes received + Bytes प्राप्त + + + Referrer + रेफ़र + + + Cookie + कुकी + + + Client + ग्राहक + + + User-agent + उपयोगकर्ता एजेंट + + + January + जनवरी + + + February + फ़रवरी + + + March + मार्च + + + April + अप्रैल + + + May + मई + + + June + जून + + + July + जुलाई + + + August + अगस्त + + + September + सितंबर + + + October + अक्टूबर + + + November + नवंबर + + + December + दिसम्बर + + + Sunday + रविवार + + + Monday + सोमवार + + + Tuesday + मंगलवार + + + Wednesday + बुधवार + + + Thursday + गुरुवार + + + Friday + शुक्रवार + + + Saturday + शनिवार + + + diff --git a/logdoctor/translations/LogDoctor_hu_HU.ts b/logdoctor/translations/LogDoctor_hu_HU.ts new file mode 100644 index 0000000..12e6dfa --- /dev/null +++ b/logdoctor/translations/LogDoctor_hu_HU.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Verziók + + + Version 4 + Verzió 4 + + + Version 3 + Version 3 + + + Version 2 + Verzió 2 + + + Version 1 + 1. verzió + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Épített szkriptek + + + Cross-platform compatibility: + Cross-platform kompatibilitás: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statisztika: + + + Warnings + Figyelmeztetés + + + Speed + Speed + + + Counts + Országok + + + Daytime + Naprakész + + + Relational + Kapcsolat + + + Globals + Globálisok + + + Translations: + Fordítások: + + + Italian + olasz + + + Spanish + spanyol + + + French + Francia + + + Tools: + Szerszámok: + + + Block note + Block Note + + + Utilities: + Utilities: + + + Infos viewer + Infos néző + + + Updates checker + Frissítések ellenőr + + + Themes: + Témák: + + + Dark + Dark + + + Light + Fény + + + Improvements and fixes + Javítások és javítások + + + New themes: + Új témák: + + + Ash + Ash + + + Candy + Candy + + + Forest + Erdő + + + Powder + por + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Frissített párbeszédek + + + Doxygen documentation + Doxigén dokumentáció + + + Mini-Games: + Mini-játékok: + + + Criss-cross + Criss-cross + + + Snake + Kígyó + + + Changed default paths + Változott alapértelmezett útvonalak + + + New game modes for Snake + Új játékmódok Snake + + + Hunt + Vadászat + + + Battle + Battle + + + New translations: + Új fordítások: + + + Japanese + Japán japán + + + Portuguese + Portugália + + + Code improvements + Kódjavítás + + + Performance improvements + Performance fejlesztések + + + Added tests suite: + Hozzáadott tesztek Suite: + + + white box tests + fehér doboz tesztek + + + Customized charts themes + Testreszabott diagramok témák + + + Fixes + Fixok + + + Tests improvements + Tesztek javítása + + + Docker support + Docker támogatás + + + Upgrade to C++20 + Frissítés a C++20-ra + + + Upgrade to Qt6 + A Qt6 frissítése + + + Restyled themes + Restyled témák + + + Redesigned configs section + Redesigned Conigs rész + + + Stability improvements + Stabilitási fejlesztések + + + Generating warnings dinamically + Figyelmeztetések generálása dinamikus + + + New tool: + Új eszköz: + + + Changelog + Változás + + + Tweakable parameters for some of the charts: + Tweakable paraméterek néhány táblázathoz: + + + Improved project structure + Javított projektstruktúra + + + Modernized Cmake usage + Modernizált Cmake használat + + + + Crapinfo + + Version + Verzió + + + Currently installed version of the software + Jelenleg telepített verziója a szoftver + + + Repository links + Repository linkek + + + Paths + Paths + + + The path of the executable file + A végrehajtható fájl útja + + + Executable + Kivégezhető + + + The path where the configuration file gets saved and searched in + Az az út, ahol a konfigurációs fájl megmentésre kerül és keresésre kerül + + + Configuration file + Konfigurációs fájl + + + The path where the application searches for extra resources + Az út, ahol az alkalmazás keresi az extra forrásokat + + + Application data + Alkalmazás adatok + + + + Crapnote + + Reduce the font size + Csökkentse a betűméretet + + + Font size + Font méret + + + Increase the font size + Növelje a betűméretet + + + + Crappath + + Choose + Válasszon + + + Cancel + Törlés + + + + Crapup + + Checking for updates + A frissítések ellenőrzése + + + New version available + Új verzió elérhető + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Új verzió áll rendelkezésre! +Kérjük, látogassa meg a LogDoctor git repository-ját, és kövesse az utasítást arról, hogyan frissítse + + + No update found + Nincs frissítés + + + LogDoctor is up-to-date + A LogDoctor naprakész + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Egy verziót futtatsz a jövőből! +A verzió túlmutat a jelenlegi upstream verzión +Ön fut az eredeti LogDoctor? +Kérjük, látogasson el a LogDoctor repository-jára, és friss verziót kapjon belőle + + + Failed to establish a connection + Nem sikerült létrehozni egy kapcsolatot + + + Connection error, please try again later + Csatlakozási hiba, kérlek próbálkozz újra később + + + Connection timed out + Connection időzített + + + Version check failed + Verziós ellenőrzés kudarcot vallott + + + An error occured while parsing: +version mark not found + hiba történt, míg a párosítás: +verziójel nem talált + + + An error occured while parsing: +malformed version + hiba történt, míg a párosítás: +malformált verzió + + + An error occured while comparing: +malformed upstream version + hiba történt, míg összehasonlítva: +malformed upstream verzió + + + + CrissCross + + Victory + Győzelem + + + You beated me! + Te megvertél! + + + This time you lost! + Ezúttal elvesztetted! + + + Draw + Rajz + + + Nice match + Szép meccs + + + + DialogBool + + Yes + Igen, + + + No + Nem + + + + DialogIda + + Ignore + Ignore + + + Discard + Discard + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Az egyik listának érvénytelen eleme van + + + An error occured while reading the configuration file + hiba történt a konfigurációs fájl olvasása közben + + + An error occured while parsing configuration file's data + hiba történt, miközben a konfigurációs fájl adatait felváltotta + + + Failed to create the configuration file's directory + Hibás létrehozni a konfigurációs fájl könyvtárát + + + Failed to create the configuration file + Hibás létrehozni a konfigurációs fájlt + + + An error occured while writing the configuration file + hiba történt a konfigurációs fájl írásakor + + + An error occured while preparing the configuration file's data + hiba történt, miközben elkészítette a konfigurációs fájl adatait + + + The path contains a symlink + Az út egy szimbolint tartalmaz + + + The file does not exist + A fájl nem létezik + + + Failed to create the database backups' directory + Hibázott, hogy létrehozza az adatbázis-mentés könyvtárát + + + Failed to copy the database file + Hibás az adatbázis fájl másolásához + + + Failed to update the backups + Hibás a biztonsági mentések frissítése + + + Failed to create the directory + Nem sikerült létrehozni a könyvtárat + + + Unrecognized entry + Ismeretlen belépés + + + Size of the file + A fájl mérete + + + Warning size parameter + Figyelmeztetés méret paraméter + + + Failed to read gzipped file + Hibás olvasni a gzipped fájlt + + + An error occured while parsing the format string + Egy hiba történt, miközben elválasztja a formátumot + + + Available memory + Elérhető emlék + + + Size of the logs + A logok mérete + + + An error occured while reading the gzipped file + hiba történt, miközben elolvasta a gzipped fájlt + + + An error occured while reading the file + hiba történt a fájl olvasása közben + + + Something failed while handling the file + Valami kudarcot vallott a fájl kezelése közben + + + An error occured while working on the database + hiba történt, miközben dolgozott az adatbázisban + + + Aborting + Abortusz + + + Invalid locale + Érvénytelen helyiség + + + Unexpected locale format + Váratlan helyi formátum + + + If you haven't manually edited the configuration file, +please report this issue + Ha nem szerkesztette manuálisan a konfigurációs fájlt, +Kérjük, jelentse be ezt a kérdést + + + The given locale is not an accepted language + Az adott helyiség nem elfogadott nyelv + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Ha szeretné, hogy ez a helyi LogDoctor, +Kérjük, kövesse az utasítást a repository oldalon + + + Configuration file not found + Konfigurációs fájl nem talált + + + Unable to retrieve the configuration file + Képtelen visszaszerezni a konfigurációs fájlt + + + Skipping + Skipping + + + An error occured while handling the configuration file + hiba történt a konfigurációs fájl kezelése közben + + + Failed to write the configuration file + Hiába írni a konfigurációs fájlt + + + Current configuration not saved + Jelenlegi konfiguráció nem mentett meg + + + File not readable + File nem olvasható + + + The file is not readable + A fájl nem olvasható + + + File not writable + File nem írható + + + The file is not writable + A fájl nem írható + + + Directory not writable + Igazgatóság nem írható + + + The directory is not writable + A könyvtár nem írható + + + Invalid path + Érvénytelen út + + + Failed applying configuration + Hibás konfiguráció alkalmazása + + + Invalid configuration lines + Érvénytelen konfigurációs vonalak + + + Has not been possible to apply some of the configurations + Nem lehetett alkalmazni néhány konfigurációt + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Ha úgy dönt, hogy folytatódik, az összes nem megfelelő konfiguráció elveszett +Tovább? + + + Failed to retrieve the help file + Hibás, hogy letöltse a segítség fájlt + + + An error occured while getting the help file + hiba történt, miközben megkapta a segítség fájlt + + + Additional resources can be downloaded from the git repo + További források letölthetők a git repo + + + Unable to retrieve the file + Képtelen visszaszerezni a fájlt + + + Invalid string + Érvénytelen sztring + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Az adott húr érvénytelen, és nem adható hozzá a listához + +Kérjük, korrigálja és újrapróbálja + + + QSql driver not found + QSql sofőr nem talált + + + Failed to retrieve the driver needed to handle the database + Az adatbázis kezeléséhez szükséges járművezető visszakeresése + + + File not found + File nem talált + + + Failed to retrieve the database file + Hibás, hogy letöltse az adatbázis fájlt + + + Create a new database? + Új adatbázis létrehozása? + + + The database contains an unexpected table + Az adatbázis váratlan táblát tartalmaz + + + Unexpected table + váratlan asztal + + + It seems that the database is missing a table + Úgy tűnik, hogy az adatbázis hiányzik egy táblázat + + + Table not found + Nem talált táblázat + + + The database contains an unexpected column + Az adatbázis váratlan oszlopot tartalmaz + + + Unexpected column + Váratlan oszlop + + + It seems that the table is missing a column + Úgy tűnik, hogy az asztal hiányzik egy oszlop + + + Column not found + Column nem talált + + + A column has an unexpected data-type + Egy oszlop váratlan adattípussal rendelkezik + + + Unexpected data-type + Váratlan adattípus + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Ez az adatbázis átnevezésre kerül egy nyomkövető ".copy"-val, és egy újat hoznak létre. +Tovább? + + + Database created + A létrehozott adatbázis + + + Successfully created a new database + Sikeresen létrehozott egy új adatbázist + + + Not a file + Nem fájl + + + The path was supposed to point to a file, but it doesn't + Az útnak egy fájlra kellett mutatnia, de nem + + + Please remove the conflict and retry + Kérjük, távolítsa el a konfliktust és a megtorlást + + + The database file is not readable + Az adatbázis fájl nem olvasható + + + Please set the proper permissions and retry +If this error persists, please report this issue + Kérjük, állítsa be a megfelelő engedélyeket és a visszavonást +Ha ez a hiba továbbra is fennáll, kérjük, jelentse be ezt a problémát + + + The database file is not writable + Az adatbázis fájl nem írható + + + Invalid database path + Érvénytelen adatbázis út + + + Failed creating database + Hibás adatbázis létrehozása + + + An error occured while creating the database + hiba történt az adatbázis létrehozása közben + + + Failed opening database + Hibás megnyitó adatbázis + + + An error occured while opening the database + hiba történt az adatbázis megnyitása közben + + + Failed executing on database + Hibás végrehajtás az adatbázisban + + + An error occured while executing a statement on the database + hiba történt, miközben egy nyilatkozatot végrehajtott az adatbázisban + + + Failed to backup database + Hibás az adatbázis mentése + + + Please report this issue + Kérjük, jelentse be ezt a problémát + + + Invalid log format string + Érvénytelen log formátum sztring + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Kérjük, ellenőrizze, hogy nincs hiba a WebServer +Ha elfogadják, ellenőrizze a typo jelenlétét +Ha minden rendben van, írja be ezt a kérdést + + + Log format error + Log formátum hiba + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + A log formátum nem lett beállítva, vagy érvénytelen +Kérjük, adja hozzá az érvényes egyet a konfigurációkban + + + Misconfigured log format + Független log formátum + + + No log field has been set in the current logs format, +making it useless to parse logs + Nincs log mező a jelenlegi logs formátumban, +haszontalanná teszi a logok elválasztását + + + Please set up a format which contains at least one field + Kérjük, hozzon létre egy formátumot, amely legalább egy mezőt tartalmaz + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Egy elválasztó hiányzik egy vagy több terület között, +Nehéz megalapozni a nettó határokat, +és esetleg helytelen adatok tárolásához vezet + + + Please set up a format which contains separators between fields + Kérjük, hozzon létre egy formátumot, amely a mezők közötti elválasztókat tartalmazza + + + Missing field in log format + Hiányzó mező log formátumban + + + An important field is missing from the provided format: + Egy fontos mező hiányzik a megadott formátumból: + + + The quality of the statistics may be seriously compromized + A statisztikák minősége súlyosan veszélyeztethető + + + Proceed anyway? + Eljárt egyébként? + + + 'Carriage Return' in log format + "Carriage Return" a log formátumban + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + A megadott formátum tartalmazza a „Carriage Return”-t. +Ez az adatvesztéshez vagy balesetekhez vezethet, ha nem használják óvatossággal + + + An error occured while parsing logs + Hiba történt, míg a naplókat + + + Failed defining type + Hibás meghatározási típus + + + Failed to determine the log type + Nem sikerült meghatározni a log típust + + + File already used + File már használt + + + The file has probably been used already + A fájlt valószínűleg már használták + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Engedjétek meg a figyelmeztetést, és használjátok azt egyébként, oszd meg és folytassátok, vagy Abort az egész folyamatot? + + + Duplicate file + Duplicate fájl + + + The file appears twice in the list of selections + A fájl kétszer jelenik meg a kiválasztások listáján + + + Failed updating hashes + Hibás frissítő hashok + + + An error occured while inserting the parsed files hashes into the database + hiba történt, miközben beilleszti a párosított fájlokat az adatbázisba + + + File exceeds warning size + File meghaladja a figyelmeztető méretet + + + The file's size exceeds the warning size + A fájl mérete meghaladja a figyelmeztető méretet + + + Not enough memory + Nem elég memória + + + The total size of the selected files exceeds the available memory + A kiválasztott fájlok teljes mérete meghaladja a rendelkezésre álló memóriát + + + Please free some resources, parse the files in different steps or split them into smaller units + Kérjük, ingyen néhány erőforrást, válassza ki a fájlokat különböző lépésekben, vagy oszd meg őket kisebb egységekre + + + Failed reading + Hibás olvasás + + + File is empty + File üres + + + The file is blank + A fájl üres + + + Failed to retrieve the selected file + Hibás a kiválasztott fájl visszakeresése + + + Discard it and continue, or Abort all and exit? + Fedezze fel és folytassa, vagy Abort minden és kilép? + + + No file to parse + Nincs fájl parse + + + The list of files to parse is empty + A fájlok listája a parse számára üres + + + Directory not found + Igazgatóság nem talált + + + The directory does not exists + A könyvtár nem létezik + + + Directory not readable + Igazgatóság nem olvasható + + + The directory is not readable + A könyvtár nem olvasható + + + Please set the proper permissions before to start + Kérjük, állítsa be a megfelelő engedélyeket, mielőtt elkezdené + + + Failed creating directory + Hibás létrehozó könyvtár + + + The path does not exists + Az út nem létezik + + + Data conversion failed + Az adatátalakítás kudarcot vallott + + + Failed to convert from '%1' to '%2' + Hibás, hogy áttérjen a "%1" -ról a "%2"-re + + + Failed to create statistics + Hibás, hogy statisztikákat hozzon létre + + + An error occured while processing + hiba történt a feldolgozás során + + + Cannot create statistics + Nem hozhat létre statisztikákat + + + No data has been found that matches with the currently set parameters + Nincs adat, amely megfelel a jelenleg meghatározott paramétereknek + + + Not a folder + Nem egy mappa + + + The path was supposed to point to a folder, but it doesn't + Az útnak egy mappára kellett mutatnia, de nem + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + A belépés átnevezésre kerül egy nyomkövető „mápiával”, és egy újat fognak létrehozni. +Tovább? + + + An error occured + hiba történt + + + Failed renaming + Hibás nevelés + + + An error occured while renaming + hiba történt, miközben megnevezték + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parse logs az Apache2 webkiszolgálótól + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse logs a Nginx webkiszolgálótól + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parse logs a Microsoft IIS webkiszolgálótól + + + IIS + IIS + + + Select/deselect all the files + Válassza/választsa az összes fájlt + + + All + Minden + + + Inspect a log file + Ellenőrizze a logfájlt + + + Name + név + + + Size + Méret + + + Refresh the list + Frissítse a listát + + + Total size of the parsed data + A párosított adatok teljes mérete + + + Total number of parsed lines + Összesített sorszám + + + Start parsing the selected files + Indítsa el a kiválasztott fájlokat + + + START + START + + + Time elapsed since the start + Az eleje óta eltelt idő + + + Average speed, in parsed data size per second + Átlagos sebesség, párosított adatméret másodpercenként + + + Web Server + Web Server + + + Select a Web Server + Válasszon egy Web Servert + + + Year + Év + + + Month + Hónap + + + Day + Nap + + + Hour + Óra + + + Draw the chart + Rajzolja a diagramot + + + Log line marked as Warning + Bejelentett Log line figyelmeztetésként + + + Date when the request arrived (YYYY-MM-DD) + Kérés időpontja (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Idő, amikor a kérés megérkezett (hh:mm:ss) + + + Protocol of the request + A kérelem jegyzőkönyve + + + Method of the request + A kérelem módszere + + + URI of the requested page + URI a kért oldalról + + + Query carried along with the URI + Az URI-vel folytatott Query + + + Response code from the server + Válasz kód a szerverről + + + User-agent of the client which made the request + Az ügyfél felhasználója, amely kérelmet nyújtott + + + IP address of the Client which made the request + Az Ügyfél IP-címe, amely kérelmet tett + + + Cookie used for the request + A kérelemhez használt cookie + + + The URL which redirected the Client to the requested page + Az URL, amely átirányította az Ügyfélt a kért oldalra + + + Size ib Bytes of the request, usually includes header and data + A kérelem ib Bytes mérete általában tartalmazza a vezetőt és az adatokat + + + Size in Bytes of the served content, usually includes header and data + Méret a kiszolgált tartalmakban, általában tartalmaz fejléct és adatokat + + + Time taken by the server to serve the content, in milliseconds + A kiszolgáló által készített idő a tartalom szolgálatára, milliszekundumokban + + + Only use lines in which the field is starting with this string + Csak olyan vonalak használata, amelyekben a mező ezen a sztringen kezdődik + + + Protocol: + Jegyzőkönyv: + + + Method: + Módszer: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Csak olyan vonalakat használ, amelyekben a mező megfelel ennek a nyilatkozatnak. +Használja a "!", "=", "<" vagy ">", hogy kijelentse, mit kell használni + + + Response: + Válasz: + + + Query: + Kérdés: + + + URI: + URI: + + + Filters + Szűrők + + + Count + Ország + + + Number of occurrences + Előfordulások száma + + + Item + Termék + + + Value of the field + A mező értéke + + + From: + Tól: + + + To: + To: + + + Select a log field to view + Válasszon egy log mezőt, hogy megtekinthesse + + + Field: + Field: + + + Filter: + Szűrő: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + A húrokkal csak az a vonalak, amelyekben a mező elkezdődik ezzel a sztringgel. +Számokkal használja a "!", "=", "<" vagy ">", hogy kijelentse, mit kell használni + + + Protocol + Protokoll + + + Method + Módszer + + + URI + URI + + + User-agent + Felhasználók + + + Most recurrent + Legismertebb + + + Most trafficked + A legtöbb forgalmat + + + Date ever + Dátum valaha + + + Day of the week + A hét napja + + + Hour of the day + A nap órája + + + Time taken + Idő vette + + + Bytes sent + Bytes küldött + + + Bytes received + A fogadások + + + Mean/Max performances + Mean/Max teljesítmények + + + Requests received + A kapott kérések + + + Total work + Teljes munka + + + General + Általános + + + Window + Window + + + Dialogs + párbeszédek + + + Charts + Charts + + + Appearance + Megjelenés + + + Speed + Speed + + + Relational + Kapcsolat + + + TextBrowser + TextBrowser + + + Databases + adatbázisok + + + Security + biztonság + + + Logs + Logok + + + Defaults + Alapértelmezések + + + Control + Ellenőrzés + + + Path + Path + + + Format + Format + + + Warnlists + Warnlists + + + Blacklists + Blacklists + + + Remember the window's position and size + Ne feledje az ablak pozícióját és méretét + + + Remember position and size + Ne feledje pozícióját és méretét + + + Remember window's position and size + Ne feledje az ablak pozícióját és méretét + + + Geometry + Geometria + + + Theme to use for the window + Téma az ablak használatához + + + Theme + Téma + + + Native + Natív + + + Light + Fény + + + Dark + Dark + + + Auto + Automata + + + Icons + Ikonok + + + Normal quantity of dialog messages shown + A párbeszéd üzeneteinek normál mennyisége + + + Normal + Normális + + + Dialogs from the main processes + A fő folyamatok párbeszédei + + + Dialogs emitted when parsing logs + A naplók kibocsátásakor közzétett párbeszédek + + + Logs parser + Logs parser + + + Dialogs emitted when viewing statistics + A statisztikák megtekintésekor kibocsátott párbeszédek + + + Statistics viewer + Statisztikai néző + + + Define the quantity of dialog mesages shown + Definiálja a dialógus-üzenetek mennyiségét + + + Dialogs level + párbeszéd szint + + + Reduced quantity of dialog messages shown + Csökkentett mennyiségű párbeszéd üzenet látható + + + Essential + Essential + + + Augmented quantity of dialog messages shown + Kibővített mennyiségű párbeszéd üzenet látható + + + Explanatory + Magyarázat + + + Theme to use for the Charts + Téma, hogy használja a Charts + + + Preview + Előnézet + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Ismételje meg a lépést az idő tengely, másodpercekben. +Az ugyanabban az intervallumban levő összes érték összeolvad, és az átlagos értéket fogják használni. + + + Time interval + Idő intervallum + + + The format to use for the labels of the time axis. + A formátum, hogy használja a címkék az idő tengely. + + + Time format + Idő formátum + + + The size of the pie + A pite mérete + + + Pie size + Pie méret + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + A szeletek maximális száma, amiből a pite össze lesz készítve. +A túlzott szeleteket egy átfogó szeletbe fogják csoportosítani. + + + Maximum slices + Maximális szeletek + + + Font to use for the Text Browser + Font, hogy használja a szöveges böngésző + + + Font + Font + + + Double-spaced lines + Kétoldalas vonalak + + + Use wide lines + Használjon széles vonalakat + + + Define the spacing between lines + Definiálja a vonalak közötti távolságot + + + Lines spacing + Lines csapás + + + None + Nem + + + Color scheme to use for the Text Browser + Színes rendszer a szöveges böngésző számára + + + Color scheme + Színrendszer + + + The appearance of the Text Browser with the current settings + A szöveges böngésző megjelenése a jelenlegi beállításokkal + + + Insert the base path only, file name excluded + Helyezze be az alapút csak, fájl neve kizárva + + + The given path doen't exists, or doesn't point to a folder + Az adott út nem létezik, vagy nem mutat egy mappára + + + Path for the database files + Path for the adatbázis fájlok + + + Paths + Paths + + + Apply the current path + Alkalmazza a jelenlegi utat + + + Select the path through a dialog window + Válassza ki az utat egy párbeszéd ablakon keresztül + + + Path where the logs data collection database is located + Ösvény, ahol a napló adatgyűjtési adatbázis található + + + Logs data + Logs adatok + + + Path where the used files hashes database is located + Ösvény, ahol a használt fájlok hashes adatbázis található + + + Used files + Használt fájlok + + + Backup options for the Logs Data database + Biztonsági lehetőségek a Logs Data adatbázishoz + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Egy új mentés történik, amikor bezárja a LogDoctor-t, miután sikeresen szerkesztette az adatbázist + + + Backup the Logs Data database and keep + Biztonsági mentés a Logs Data adatbázisban és tartsa + + + Whether it is allowed or denied to follow symlinks occuring in a path + Függetlenül attól, hogy megengedett vagy megtagadták-e az út során bekövetkező szimbolinokat + + + Follow symlinks + Kövesse a symlinkeket + + + Default WebServer + Alapértelmezett WebServer + + + Usage control + Használat ellenőrzés + + + Hide already used files + Hide már használt fájlok + + + Size warnings + Méret figyelmeztetések + + + Warn me when using files with a size exceeding: + Figyelj meg, amikor olyan fájlokat használsz, amelyek mérete meghaladja: + + + Logs folder + Logs mappa + + + Logs format string + Logs formátum string + + + Format string + Format sztring + + + Insert the format string you're using + Indítsa be a formátumot, amelyet használ + + + Apply the current string + Alkalmazza a jelenlegi sztringet + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Hozzon létre egy minta logvonalat a jelenleg mentett sztringből, ellenőrizze, hogy helyesen formázódik-e. +A LogDoctor által nem tekintett bármely mező úgy jelenik meg, mint 'DISCARDED' + + + Generate sample + Generált minta + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Kérjük, ellenőrizze a vonal helyességét. +A 'DISCARDED' jelzett mezőket helyesen elválasztották, de nem tekintik a LogDoctor + + + Open an help window + Nyisson meg egy segítség ablakot + + + Help + Segítség + + + Select a log field + Válasszon egy log mezőt + + + Use warnlist for this field + Használjon figyelmeztető listát ezen a területen + + + Add the current line to the list + Adja hozzá a jelenlegi sort a listához + + + Remove the selected item from the list + Távolítsa el a kiválasztott elemet a listából + + + Move the selected item down + Mozgassa le a kiválasztott elemet + + + Use blacklist for this field + Használjon feketelistát erre a mezőre + + + Add line + Add vonal + + + Remove selection + Távolítsa el a kiválasztást + + + Language + Nyelv + + + Utilities + Utilities + + + Tools + Eszközök + + + Games + Játékok + + + Perform a version-check + Végezzen egy verzió-check + + + Show some info about LogDoctor + Mutasson néhány információt a LogDoctor + + + Open a block-note like window to write temporary text + Nyisson meg egy blokkjegyet, mint az ablak, hogy írjon ideiglenes szöveget + + + Play CrissCross + Játék CrissCross + + + Play Snake + Játék kígyó + + + Show the changelog + Mutasd meg a változást + + + warnlist + figyelmeztetés + + + blacklist + Blacklist + + + copy + Másolás + + + copies + másolatok + + + Check updates + Ellenőrizze a frissítéseket + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Kígyó + + + Changelog + Változás + + + + RichText + + Select a file from the list + Válasszon egy fájlt a listából + + + to inspect its content + megvizsgálja tartalmát + + + Failed to read + Hiába olvasni + + + + SnakeGame + + PLAY + Útmutató + + + Classic + Klasszikus + + + Hunt + Vadászat + + + Battle + Battle + + + Game Over + Játék Over + + + Your adversary fell in the water! + Az ellenfeled beleesett a vízbe! + + + YOU WON! + Te vagy! + + + You fell in the water! + A vízbe esett! + + + YOU LOST! + LOST! + + + Your adversary ate itself! + Az ellenfeled megette magát! + + + You ate yourself! + Te etted magad! + + + Your adversary ate you! + Az ellenfeled megette! + + + You ate your adversary! + Te etted az ellenfeledet! + + + You ate each other! + Te etted egymást! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + Váratlan WebServer + + + Logs Size Breakdown + Logs Size Breakdown + + + Ignored + Ignor + + + Parsed + Szépség + + + Blacklisted + Blacklisted + + + Others + Mások + + + from + A + + + to + a + + + Log Lines Marked as Warning + Log Lines figyelmeztetésként + + + Time Taken to Serve Requests + Az idő a keresési igényekhez + + + Time of Day Count + Napi idő + + + Relational Count + Kapcsolati ország + + + FALSE + FALSE + + + TRUE + Útvonal + + + Date + Dátum + + + Year + Év + + + Month + Hónap + + + Day + Nap + + + Time + Idő + + + Hour + Óra + + + Minute + Minute + + + Second + Második + + + Warning + Figyelmeztetés + + + Protocol + Protokoll + + + Method + Módszer + + + URI + URI + + + Query + Kérdező + + + Response code + Válasz kód + + + Time taken + Idő vette + + + Bytes sent + Bytes küldött + + + Bytes received + A fogadások + + + Referrer + Referrer + + + Cookie + Sütik + + + Client + Ügyfél + + + User-agent + Felhasználók + + + January + Január + + + February + február + + + March + március + + + April + április + + + May + május + + + June + Június + + + July + július + + + August + augusztus + + + September + szeptember + + + October + október + + + November + november + + + December + December + + + Sunday + Vasárnap + + + Monday + Hétfő + + + Tuesday + Kedd + + + Wednesday + szerda + + + Thursday + Csütörtök + + + Friday + péntek + + + Saturday + szombat + + + diff --git a/logdoctor/translations/LogDoctor_id_ID.ts b/logdoctor/translations/LogDoctor_id_ID.ts new file mode 100644 index 0000000..12768c9 --- /dev/null +++ b/logdoctor/translations/LogDoctor_id_ID.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versions + + + Version 4 + Versi 4 + + + Version 3 + Versi 3 + + + Version 2 + Versi 2 + + + Version 1 + Versi 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Membangun skrip + + + Cross-platform compatibility: + Kecocokan platform silang: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistik: + + + Warnings + Warnings + + + Speed + Speed + + + Counts + Counts + + + Daytime + Daytime + + + Relational + Relational + + + Globals + Globals + + + Translations: + Translations: + + + Italian + Italian + + + Spanish + Spanish + + + French + French + + + Tools: + Alat: + + + Block note + Catatan blok + + + Utilities: + Utilities: + + + Infos viewer + Infos viewer + + + Updates checker + Memperbarui checker + + + Themes: + Tema: + + + Dark + Dark + + + Light + Light + + + Improvements and fixes + Perbaikan dan perbaikan + + + New themes: + Tema baru: + + + Ash + Ash + + + Candy + Candy + + + Forest + Forest + + + Powder + Powder + + + Restyled GUI + GUI + + + Restyled dialogs + Restyled dialog + + + Doxygen documentation + Dokumentasi Doxygen + + + Mini-Games: + Mini-Games: + + + Criss-cross + Criss-cross + + + Snake + Snake + + + Changed default paths + Mengubah jalur default + + + New game modes for Snake + Mode permainan baru untuk Snake + + + Hunt + Hunt + + + Battle + Battle + + + New translations: + Terjemahan baru: + + + Japanese + Japanese + + + Portuguese + Portuguese + + + Code improvements + Peningkatan kode + + + Performance improvements + Peningkatan kinerja + + + Added tests suite: + Ditambahkan suite tes: + + + white box tests + tes kotak putih + + + Customized charts themes + Tema grafik yang disesuaikan + + + Fixes + Fixes + + + Tests improvements + Peningkatan tes + + + Docker support + Dukungan Docker + + + Upgrade to C++20 + Upgrade ke C++20 + + + Upgrade to Qt6 + Upgrade ke Qt6 + + + Restyled themes + Tema bergaya + + + Redesigned configs section + Didesain ulang bagian konfigurasi + + + Stability improvements + Peningkatan stabilitas + + + Generating warnings dinamically + Menghasilkan peringatan dinamika + + + New tool: + Alat baru: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Parameter yang dapat dilipat untuk beberapa grafik: + + + Improved project structure + Peningkatan struktur proyek + + + Modernized Cmake usage + Penggunaan Cmake + + + + Crapinfo + + Version + Version + + + Currently installed version of the software + Saat ini menginstal versi perangkat lunak + + + Repository links + Repositori link + + + Paths + Paths + + + The path of the executable file + Jalur file yang dapat dieksekusi + + + Executable + Executable + + + The path where the configuration file gets saved and searched in + Jalur di mana file konfigurasi disimpan dan dicari + + + Configuration file + File konfigurasi + + + The path where the application searches for extra resources + Jalan di mana pencarian aplikasi untuk sumber daya tambahan + + + Application data + Database + + + + Crapnote + + Reduce the font size + Mengurangi ukuran font + + + Font size + Ukuran font + + + Increase the font size + Meningkatkan ukuran font + + + + Crappath + + Choose + Choose + + + Cancel + Cancel + + + + Crapup + + Checking for updates + Memeriksa pembaruan + + + New version available + Versi baru tersedia + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Versi baru tersedia! +Silakan kunjungi repositori LogDoctor dan ikuti instruksi tentang cara memperbarui + + + No update found + Tidak ada pembaruan yang ditemukan + + + LogDoctor is up-to-date + LogDoctor is up-to-date + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Anda menjalankan versi dari masa depan! +Versi Anda di luar versi upstream saat ini +Apakah Anda menjalankan LogDoctor asli? +Silakan kunjungi repositori LogDoctor dan dapatkan versi segar + + + Failed to establish a connection + Gagal untuk menjalin koneksi + + + Connection error, please try again later + Kesalahan koneksi, coba lagi nanti + + + Connection timed out + Koneksi waktu keluar + + + Version check failed + Pemeriksaan versi gagal + + + An error occured while parsing: +version mark not found + Kesalahan terjadi sementara parsing: +tanda versi tidak ditemukan + + + An error occured while parsing: +malformed version + Kesalahan terjadi sementara parsing: +versi rusak + + + An error occured while comparing: +malformed upstream version + Kesalahan terjadi sementara membandingkan: +versi hulu yang rusak + + + + CrissCross + + Victory + Victory + + + You beated me! + Dimuka! + + + This time you lost! + Kali ini hilang! + + + Draw + Draw + + + Nice match + Bagus pertandingan + + + + DialogBool + + Yes + Yes + + + No + No + + + + DialogIda + + Ignore + Ignore + + + Discard + Discard + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Salah satu daftar memiliki item yang tidak valid + + + An error occured while reading the configuration file + Kesalahan terjadi saat membaca file konfigurasi + + + An error occured while parsing configuration file's data + Kesalahan terjadi sementara membuat data file konfigurasi + + + Failed to create the configuration file's directory + Gagal untuk membuat direktori file konfigurasi + + + Failed to create the configuration file + Gagal untuk membuat file konfigurasi + + + An error occured while writing the configuration file + Kesalahan terjadi sementara menulis file konfigurasi + + + An error occured while preparing the configuration file's data + Kesalahan terjadi sambil menyiapkan data file konfigurasi + + + The path contains a symlink + Jalan berisi simlink + + + The file does not exist + File tidak ada + + + Failed to create the database backups' directory + Gagal untuk membuat direktori backup database + + + Failed to copy the database file + Gagal untuk menyalin file database + + + Failed to update the backups + Gagal untuk memperbarui cadangan + + + Failed to create the directory + Gagal untuk membuat direktori + + + Unrecognized entry + Masukan yang tidak dikenal + + + Size of the file + Ukuran file + + + Warning size parameter + Parameter ukuran peringatan + + + Failed to read gzipped file + Kegagalan membaca file gzipped + + + An error occured while parsing the format string + Kesalahan terjadi sementara parsing string format + + + Available memory + Memori yang tersedia + + + Size of the logs + Ukuran log + + + An error occured while reading the gzipped file + Kesalahan terjadi saat membaca file gzipped + + + An error occured while reading the file + Kesalahan terjadi saat membaca file + + + Something failed while handling the file + Sesuatu yang gagal saat menangani file + + + An error occured while working on the database + Kesalahan terjadi saat bekerja pada database + + + Aborting + Aborting + + + Invalid locale + Lokal + + + Unexpected locale format + Unexpected lokal format + + + If you haven't manually edited the configuration file, +please report this issue + Jika Anda belum secara manual mengedit file konfigurasi, +mohon laporkan masalah ini + + + The given locale is not an accepted language + Bahasa lokal yang diberikan bukan bahasa yang diterima + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Jika Anda ingin memiliki lokal ini di LogDoctor, +ikuti instruksi di halaman repositori + + + Configuration file not found + File konfigurasi tidak ditemukan + + + Unable to retrieve the configuration file + Tidak dapat mengambil file konfigurasi + + + Skipping + Skipping + + + An error occured while handling the configuration file + Kesalahan terjadi saat menangani file konfigurasi + + + Failed to write the configuration file + Gagal menulis file konfigurasi + + + Current configuration not saved + Konfigurasi saat ini tidak disimpan + + + File not readable + File tidak dapat dibaca + + + The file is not readable + File tidak dapat dibaca + + + File not writable + File tidak dapat ditulis + + + The file is not writable + File ini tidak dapat ditulis + + + Directory not writable + Directory not writable + + + The directory is not writable + Direktori ini tidak dapat ditulis + + + Invalid path + Jalan yang tidak valid + + + Failed applying configuration + Kegagalan menerapkan konfigurasi + + + Invalid configuration lines + Garis konfigurasi tidak valid + + + Has not been possible to apply some of the configurations + Tidak mungkin untuk menerapkan beberapa konfigurasi + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Jika Anda memilih untuk melanjutkan, semua konfigurasi yang tidak terapkan akan hilang +Continue? + + + Failed to retrieve the help file + Gagal untuk mengambil file bantuan + + + An error occured while getting the help file + Kesalahan terjadi saat mendapatkan file bantuan + + + Additional resources can be downloaded from the git repo + Sumber daya tambahan dapat diunduh dari repo git + + + Unable to retrieve the file + Tidak dapat mengambil file + + + Invalid string + Invalid string + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + string yang diberikan tidak valid dan tidak dapat ditambahkan ke daftar + +Silahkan memperbaikinya dan retry + + + QSql driver not found + Driver QSql tidak ditemukan + + + Failed to retrieve the driver needed to handle the database + Kegagalan untuk mengambil driver yang diperlukan untuk menangani database + + + File not found + File tidak ditemukan + + + Failed to retrieve the database file + Kegagalan untuk mengambil file database + + + Create a new database? + Buat database baru? + + + The database contains an unexpected table + Database mengandung tabel yang tak terduga + + + Unexpected table + Tabel yang tidak terkendali + + + It seems that the database is missing a table + Tampaknya database hilang tabel + + + Table not found + Tabel tidak ditemukan + + + The database contains an unexpected column + Database mengandung kolom yang tak terduga + + + Unexpected column + Kolom yang tidak terkendali + + + It seems that the table is missing a column + Tampaknya tabel hilang kolom + + + Column not found + Kolom tidak ditemukan + + + A column has an unexpected data-type + Kolom memiliki tipe data yang tak terduga + + + Unexpected data-type + Unexpected data-jenis + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Database ini akan berganti nama dengan trailing '.copy' dan yang baru akan dibuat. +Continue? + + + Database created + Database + + + Successfully created a new database + Database + + + Not a file + Tidak file + + + The path was supposed to point to a file, but it doesn't + Jalan seharusnya menunjuk ke file, tetapi tidak Meme it + + + Please remove the conflict and retry + Silahkan menghapus konflik dan retry + + + The database file is not readable + Database + + + Please set the proper permissions and retry +If this error persists, please report this issue + Silahkan atur izin dan pelayanan yang tepat +Jika kesalahan ini berlanjut, silakan laporkan masalah ini + + + The database file is not writable + Database + + + Invalid database path + Database + + + Failed creating database + Database + + + An error occured while creating the database + Kesalahan terjadi saat membuat database + + + Failed opening database + Database + + + An error occured while opening the database + Kesalahan terjadi saat membuka database + + + Failed executing on database + Eksekusi gagal pada database + + + An error occured while executing a statement on the database + Kesalahan terjadi sementara mengeksekusi pernyataan di database + + + Failed to backup database + Kegagalan database cadangan + + + Please report this issue + Silahkan laporkan masalah ini + + + Invalid log format string + Invalid format log string + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Silakan periksa bahwa tidak ada kesalahan yang dibuang oleh WebServer Anda +Jika diterima, silakan periksa kehadiran tipo di sini +Jika semuanya halus, silakan laporkan masalah ini + + + Log format error + Log format error + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Format log belum diatur, atau tidak valid +Silahkan tambahkan yang valid dalam konfigurasi + + + Misconfigured log format + Format log yang dikonfigurasi + + + No log field has been set in the current logs format, +making it useless to parse logs + Tidak ada field log yang telah diatur dalam format log saat ini, +membuatnya tidak berguna untuk membuat log + + + Please set up a format which contains at least one field + Silahkan mengatur format yang berisi setidaknya satu bidang + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Pemisah hilang antara satu atau lebih bidang, +membuatnya keras untuk membangun batas bersih, +dan mungkin menyebabkan menyimpan data yang salah + + + Please set up a format which contains separators between fields + Silahkan mengatur format yang mengandung pemisah antara bidang + + + Missing field in log format + Missing field dalam format log + + + An important field is missing from the provided format: + Bidang penting hilang dari format yang disediakan: + + + The quality of the statistics may be seriously compromized + Kualitas statistik mungkin benar-benar dikonfigurasi + + + Proceed anyway? + Bagaimanapun? + + + 'Carriage Return' in log format + 'Carriage Return' dalam format log + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Format yang disediakan berisi 'Carriage Return'. +Ini dapat menyebabkan kerugian data atau kecelakaan jika tidak digunakan dengan hati-hati + + + An error occured while parsing logs + Kesalahan terjadi sementara membuat log + + + Failed defining type + Jenis penentuan kegagalan + + + Failed to determine the log type + Gagal untuk menentukan jenis log + + + File already used + File sudah digunakan + + + The file has probably been used already + File ini mungkin telah digunakan + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Mengabaikan peringatan dan menggunakannya pula, Menundanya dan melanjutkan, atau Menguaikan seluruh proses? + + + Duplicate file + File Duplikat + + + The file appears twice in the list of selections + File muncul dua kali dalam daftar pilihan + + + Failed updating hashes + Berhenti updating hashes + + + An error occured while inserting the parsed files hashes into the database + Kesalahan terjadi sementara memasukkan file parsed hashes ke database + + + File exceeds warning size + File melebihi ukuran peringatan + + + The file's size exceeds the warning size + Ukuran file melebihi ukuran peringatan + + + Not enough memory + Tidak cukup memori + + + The total size of the selected files exceeds the available memory + Total ukuran file yang dipilih melebihi memori yang tersedia + + + Please free some resources, parse the files in different steps or split them into smaller units + Silakan gratis beberapa sumber daya, parse file dalam berbagai langkah atau membaginya menjadi unit yang lebih kecil + + + Failed reading + Pembacaan yang gagal + + + File is empty + File kosong + + + The file is blank + File kosong + + + Failed to retrieve the selected file + Gagal untuk mengambil file yang dipilih + + + Discard it and continue, or Abort all and exit? + Mengikatnya dan terus, atau menggandakan semua dan keluar? + + + No file to parse + Tidak ada file untuk parse + + + The list of files to parse is empty + Daftar file ke parse kosong + + + Directory not found + Direktori tidak ditemukan + + + The directory does not exists + Direktori tidak ada + + + Directory not readable + Direktori tidak dapat dibaca + + + The directory is not readable + Direktori tidak dapat dibaca + + + Please set the proper permissions before to start + Silahkan atur izin yang tepat sebelum memulai + + + Failed creating directory + Gagal membuat direktori + + + The path does not exists + Jalan tidak ada + + + Data conversion failed + Konversi data gagal + + + Failed to convert from '%1' to '%2' + Kegagalan untuk mengkonversi dari '%1' ke '%2' + + + Failed to create statistics + Gagal untuk membuat statistik + + + An error occured while processing + Kesalahan terjadi saat memproses + + + Cannot create statistics + Tidak dapat membuat statistik + + + No data has been found that matches with the currently set parameters + Tidak ada data yang telah ditemukan yang cocok dengan parameter yang ditetapkan saat ini + + + Not a folder + Tidak ada folder + + + The path was supposed to point to a folder, but it doesn't + Jalan seharusnya menunjuk ke folder, tetapi tidak + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Masuk akan berganti nama dengan trailing '.copy' dan yang baru akan dibuat. +Continue? + + + An error occured + Kesalahan terjadi + + + Failed renaming + Failed renaming + + + An error occured while renaming + Kesalahan terjadi sementara renaming + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Web server Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Web server Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Web server Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Pilih / pilih semua file + + + All + All + + + Inspect a log file + Periksa file log + + + Name + Name + + + Size + Size + + + Refresh the list + Menyegarkan daftar + + + Total size of the parsed data + Total ukuran data parsed + + + Total number of parsed lines + Jumlah total garis parsed + + + Start parsing the selected files + Mulai membuat file yang dipilih + + + START + START + + + Time elapsed since the start + Waktu berlalu sejak awal + + + Average speed, in parsed data size per second + Kecepatan rata-rata, dalam ukuran data parsed per detik + + + Web Server + Web Server + + + Select a Web Server + Web Server + + + Year + Year + + + Month + Month + + + Day + Day + + + Hour + Hour + + + Draw the chart + Gambar grafik + + + Log line marked as Warning + Garis log ditandai sebagai Peringatan + + + Date when the request arrived (YYYY-MM-DD) + Tanggal ketika permintaan tiba (YY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Waktu ketika permintaan tiba (h: mm: s) + + + Protocol of the request + Protokol permintaan + + + Method of the request + Metode permintaan + + + URI of the requested page + URI dari halaman yang diminta + + + Query carried along with the URI + Query dibawa bersama dengan URI + + + Response code from the server + Kode respons dari server + + + User-agent of the client which made the request + User-agent dari klien yang membuat permintaan + + + IP address of the Client which made the request + Alamat IP Klien yang membuat permintaan + + + Cookie used for the request + Cookie digunakan untuk permintaan + + + The URL which redirected the Client to the requested page + URL yang mengarahkan Klien ke halaman yang diminta + + + Size ib Bytes of the request, usually includes header and data + Ukuran ib Bytes permintaan, biasanya termasuk header dan data + + + Size in Bytes of the served content, usually includes header and data + Ukuran dalam Bytes konten yang disajikan, biasanya termasuk header dan data + + + Time taken by the server to serve the content, in milliseconds + Waktu yang diambil oleh server untuk melayani konten, dalam mili detik + + + Only use lines in which the field is starting with this string + Hanya menggunakan garis di mana lapangan dimulai dengan string ini + + + Protocol: + Protokol: + + + Method: + Metode: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Hanya menggunakan garis di mana lapangan cocok dengan pernyataan ini. +Gunakan '!', '=', '<' atau '>' untuk menyatakan apa yang harus digunakan + + + Response: + Response: + + + Query: + Query: + + + URI: + URI: + + + Filters + Filters + + + Count + Count + + + Number of occurrences + Jumlah kejadian + + + Item + Artikel + + + Value of the field + Nilai lapangan + + + From: + Dari: + + + To: + To: + + + Select a log field to view + Pilih kolom log untuk melihat + + + Field: + Field: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Dengan string, hanya garis di mana lapangan dimulai dengan string ini akan digunakan. +Dengan angka, gunakan '!', '=', '<' atau '>' untuk menyatakan apa yang harus digunakan + + + Protocol + Protocol + + + Method + Method + + + URI + URI + + + User-agent + User-agent + + + Most recurrent + Kebanyakan arus balik + + + Most trafficked + Kebanyakan lalu lintas + + + Date ever + Date ever + + + Day of the week + Hari minggu + + + Hour of the day + Jam sehari + + + Time taken + Time taken + + + Bytes sent + Bytes sent + + + Bytes received + Bytes received + + + Mean/Max performances + Mean/Max performances + + + Requests received + Permintaan diterima + + + Total work + Total pekerjaan + + + General + General + + + Window + Window + + + Dialogs + Dialog + + + Charts + Charts + + + Appearance + Appearance + + + Speed + Speed + + + Relational + Relational + + + TextBrowser + TextBrowser + + + Databases + Database + + + Security + Security + + + Logs + Logs + + + Defaults + Defaults + + + Control + Control + + + Path + Path + + + Format + Format + + + Warnlists + Warnlists + + + Blacklists + Blacklists + + + Remember the window's position and size + Ingat posisi jendela dan ukuran + + + Remember position and size + Ingat posisi dan ukuran + + + Remember window's position and size + Ingat posisi jendela dan ukuran + + + Geometry + Geometry + + + Theme to use for the window + Tema untuk digunakan untuk jendela + + + Theme + Theme + + + Native + Native + + + Light + Light + + + Dark + Dark + + + Auto + Auto + + + Icons + Icons + + + Normal quantity of dialog messages shown + Jumlah normal pesan dialog ditampilkan + + + Normal + Normal + + + Dialogs from the main processes + Dialog dari proses utama + + + Dialogs emitted when parsing logs + Dialog yang dipancarkan ketika membuat log + + + Logs parser + Logs parser + + + Dialogs emitted when viewing statistics + Dialog dipancarkan ketika melihat statistik + + + Statistics viewer + Database + + + Define the quantity of dialog mesages shown + Tentukan jumlah petunjuk dialog yang ditunjukkan + + + Dialogs level + Dialog + + + Reduced quantity of dialog messages shown + Mengurangi jumlah pesan dialog yang ditunjukkan + + + Essential + Essential + + + Augmented quantity of dialog messages shown + Jumlah pesan dialog yang ditentukan + + + Explanatory + Explanatory + + + Theme to use for the Charts + Tema untuk digunakan untuk Grafik + + + Preview + Preview + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Mewakili langkah dalam sumbu waktu, dalam detik. +Semua nilai yang jatuh di dalam interval yang sama akan digabungkan dan nilai berarti akan digunakan. + + + Time interval + Masa + + + The format to use for the labels of the time axis. + Format untuk digunakan untuk label sumbu waktu. + + + Time format + Format waktu + + + The size of the pie + Ukuran pie + + + Pie size + Ukuran pie + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Jumlah maksimum irisan bahwa pai akan terdiri dari. +Potongan yang luar biasa akan dikelompokkan menjadi satu irisan komprehensif. + + + Maximum slices + irisan maksimum + + + Font to use for the Text Browser + Font untuk digunakan untuk Browser Teks + + + Font + Font + + + Double-spaced lines + Garis dua ruang + + + Use wide lines + Gunakan garis lebar + + + Define the spacing between lines + Tentukan jarak antara garis + + + Lines spacing + Garis jarak + + + None + None + + + Color scheme to use for the Text Browser + Skema warna untuk digunakan untuk Browser Teks + + + Color scheme + Skema warna + + + The appearance of the Text Browser with the current settings + Tampilan Browser Teks dengan pengaturan saat ini + + + Insert the base path only, file name excluded + Masukkan path dasar saja, nama file dikecualikan + + + The given path doen't exists, or doesn't point to a folder + Jalur yang diberikan tidak ada, atau tidak menunjuk ke folder + + + Path for the database files + Path untuk file database + + + Paths + Paths + + + Apply the current path + Menerapkan jalan saat ini + + + Select the path through a dialog window + Pilih jalan melalui jendela dialog + + + Path where the logs data collection database is located + Path di mana database pengumpulan data log terletak + + + Logs data + Logs data + + + Path where the used files hashes database is located + Path di mana file yang digunakan memiliki database terletak + + + Used files + File yang digunakan + + + Backup options for the Logs Data database + Opsi cadangan untuk database Data Logs + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Cadangan baru dibuat ketika menutup LogDoctor setelah telah berhasil mengedit database + + + Backup the Logs Data database and keep + Backup database Logs Data dan simpan + + + Whether it is allowed or denied to follow symlinks occuring in a path + Apakah diperbolehkan atau ditolak untuk mengikuti gejala yang terjadi di jalan + + + Follow symlinks + Ikuti simlink + + + Default WebServer + WebServer + + + Usage control + Kontrol penggunaan + + + Hide already used files + Sembunyikan file yang sudah digunakan + + + Size warnings + Peringatan ukuran + + + Warn me when using files with a size exceeding: + Warn saya ketika menggunakan file dengan ukuran melebihi: + + + Logs folder + Logs folder + + + Logs format string + Logs format string + + + Format string + Catalog + + + Insert the format string you're using + Masukkan string format yang Anda gunakan + + + Apply the current string + Terapkan string saat ini + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Hasilkan lini log sampel dari string yang tersimpan saat ini, untuk memeriksa apakah itu diformat dengan benar. +Bidang apa pun yang tidak dipertimbangkan oleh LogDoctor akan muncul sebagai 'DISCARDED' + + + Generate sample + Hasilkan sampel + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Silakan periksa kebenaran garis ini. +Fields ditandai sebagai 'DISCARDED' mendapat parsed dengan benar, tetapi tidak dianggap oleh LogDoctor + + + Open an help window + Buka jendela bantuan + + + Help + Help + + + Select a log field + Pilih kolom log + + + Use warnlist for this field + Gunakan daftar peringatan untuk bidang ini + + + Add the current line to the list + Tambahkan garis saat ini ke daftar + + + Remove the selected item from the list + Hapus item yang dipilih dari daftar + + + Move the selected item down + Pindahkan item yang dipilih + + + Use blacklist for this field + Gunakan daftar hitam untuk bidang ini + + + Add line + Tambahkan garis + + + Remove selection + Hapus pilihan + + + Language + Language + + + Utilities + Utilities + + + Tools + Tools + + + Games + Games + + + Perform a version-check + Lakukan versi-check + + + Show some info about LogDoctor + Lihat beberapa info tentang LogDoctor + + + Open a block-note like window to write temporary text + Buka catatan blok seperti jendela untuk menulis teks sementara + + + Play CrissCross + Bermain CrisssCross + + + Play Snake + Bermain Ular + + + Show the changelog + Show the changelog + + + warnlist + warnlist + + + blacklist + blacklist + + + copy + copy + + + copies + copies + + + Check updates + Lihat pembaruan + + + Infos + Sitemap + + + BlockNote + Login + + + CrissCross + Login + + + Snake + Snake + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Pilih file dari daftar + + + to inspect its content + untuk memeriksa kontennya + + + Failed to read + Kegagalan membaca + + + + SnakeGame + + PLAY + PLAY + + + Classic + Classic + + + Hunt + Hunt + + + Battle + Battle + + + Game Over + Permainan Lebih + + + Your adversary fell in the water! + Saran Anda jatuh di air! + + + YOU WON! + YOU WON! + + + You fell in the water! + Anda jatuh di air! + + + YOU LOST! + YOU LOST! + + + Your adversary ate itself! + Nasihat Anda sendiri! + + + You ate yourself! + You ate yourself! + + + Your adversary ate you! + Nasihat Anda! + + + You ate your adversary! + Anda ucapkan saran Anda! + + + You ate each other! + Anda satu sama lain! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + WebServer + + + Logs Size Breakdown + Ukuran Log Breakdown + + + Ignored + Ignored + + + Parsed + Parsed + + + Blacklisted + Blacklisted + + + Others + Others + + + from + from + + + to + to + + + Log Lines Marked as Warning + Garis Log Ditandai sebagai Peringatan + + + Time Taken to Serve Requests + Waktu Dijemput untuk Melayani Permintaan + + + Time of Day Count + Waktu Hitungan Hari + + + Relational Count + Hitungan Relatif + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + Date + + + Year + Year + + + Month + Month + + + Day + Day + + + Time + Time + + + Hour + Hour + + + Minute + Minute + + + Second + Second + + + Warning + Warning + + + Protocol + Protocol + + + Method + Method + + + URI + URI + + + Query + Query + + + Response code + Kode respons + + + Time taken + Time taken + + + Bytes sent + Bytes sent + + + Bytes received + Bytes received + + + Referrer + Referrer + + + Cookie + Cookie + + + Client + Client + + + User-agent + User-agent + + + January + January + + + February + February + + + March + March + + + April + April + + + May + May + + + June + Juni + + + July + July + + + August + August + + + September + September + + + October + Oktober + + + November + November + + + December + December + + + Sunday + Sunday + + + Monday + Monday + + + Tuesday + Tuesday + + + Wednesday + Wednesday + + + Thursday + Thursday + + + Friday + Friday + + + Saturday + Saturday + + + diff --git a/logdoctor/translations/LogDoctor_it_IT.ts b/logdoctor/translations/LogDoctor_it_IT.ts index 7977f7b..985bd96 100644 --- a/logdoctor/translations/LogDoctor_it_IT.ts +++ b/logdoctor/translations/LogDoctor_it_IT.ts @@ -1058,6 +1058,30 @@ This may lead to data losses or crashes if not used with caution Il formato fornito contiene il 'Carriage Return'. Ciò potrebbe comportare perdite di dati o crash se non usato con cautela + + Failed to create the configuration file + Creazione del file di configurazione non riuscita + + + The path contains a symlink + Il percorso contiene un link simbolico + + + The file does not exist + Il file non esiste + + + Invalid path + Percorso non valido + + + Invalid database path + Percorso del database non valido + + + The path does not exists + Il percorso non esiste + GameDialog @@ -1390,8 +1414,7 @@ Ciò potrebbe comportare perdite di dati o crash se non usato con cautela TextBrowser - TextBrowser - + TextBrowser Font to use for the Text Browser @@ -1635,22 +1658,10 @@ I campi marcati come 'DISCARDED' sono stati applicati correttamente, m Tools Attrezzi - - Check updates - Controlla aggiornamenti - Perform a version-check Effettua un controllo della versione - - Infos - Informazioni - - - BlockNote - BloccoNote - Open a block-note like window to write temporary text Apri una finestra in stile blocco note per scrivere del testo temporaneo @@ -1735,18 +1746,10 @@ Per i numeri, usa '!', '=','<' or '>&ap Games Giochi - - CrissCross - Tris - Play CrissCross Gioca a Tris - - Snake - Snake - Play Snake Gioca a Snake @@ -1785,10 +1788,6 @@ I campi non considerati da LogDocrot appariranno come 'DISCARDED'Show some info about LogDoctor Mostra alcune informazioni riguardo LogDoctor - - Changelog - Cambiamenti - Show the changelog Mostra i cambiamenti @@ -1807,82 +1806,6 @@ Tutti i valori appartenenti allo stesso intervallo verranno accumulati e sarà u Time interval Intervallo di tempo - - 1 - 1 - - - 2 - 2 - - - 3 - 3 - - - 4 - 4 - - - 5 - 5 - - - 10 - 10 - - - 15 - 15 - - - 20 - 20 - - - 30 - 30 - - - 60 - 60 - - - 120 - 120 - - - 180 - 180 - - - 240 - 240 - - - 300 - 300 - - - 600 - 600 - - - 900 - 900 - - - 1200 - 1200 - - - 1800 - 1800 - - - 3600 - 3600 - The format to use for the labels of the time axis. Il formato da usare per le etichette dell'asse del tempo. @@ -1891,14 +1814,6 @@ Tutti i valori appartenenti allo stesso intervallo verranno accumulati e sarà u Time format Formato dell'orario - - hh:mm - hh:mm - - - hh - hh - The size of the pie La dimensione del grafico a torta @@ -1925,6 +1840,42 @@ Le porzioni in eccesso verratto raggruppate in una singola fetta. Appearance Aspetto + + Security + Sicurezza + + + Whether it is allowed or denied to follow symlinks occuring in a path + Se è permesso o negato di seguire i collegamenti simbolici all'interno di un percorso + + + Follow symlinks + Segui i link simbolici + + + Check updates + Controllo aggiornamenti + + + Infos + Informazioni + + + BlockNote + Blocco note + + + CrissCross + Tris + + + Snake + Snake + + + Changelog + Cambiamenti + RichText diff --git a/logdoctor/translations/LogDoctor_ja_JP.ts b/logdoctor/translations/LogDoctor_ja_JP.ts index 0425903..a209111 100644 --- a/logdoctor/translations/LogDoctor_ja_JP.ts +++ b/logdoctor/translations/LogDoctor_ja_JP.ts @@ -1058,6 +1058,30 @@ This may lead to data losses or crashes if not used with caution 提供された形式には「Carriage Return」が含まれています。 注意して使用しないと、データの損失やクラッシュが発生する可能性があります + + Failed to create the configuration file + 設定ファイルを作成する失敗 + + + The path contains a symlink + パスには、symlink が含まれています + + + The file does not exist + ファイルが存在しない + + + Invalid path + 無効なパス + + + Invalid database path + 無効なデータベースパス + + + The path does not exists + パスが存在しません + GameDialog @@ -1634,22 +1658,10 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not conside Tools ツール - - Check updates - 更新を確認する - Perform a version-check バージョンチェックを実行する - - Infos - 情報 - - - BlockNote - ブロックノート - Open a block-note like window to write temporary text ブロックノートのようなウィンドウを開いて、一時的なテキストを書き込みます @@ -1734,18 +1746,10 @@ With numbers, use '!', '=','<' or '>&ap Games ゲーム - - CrissCross - クリスクロス - Play CrissCross クリスクロスをプレイ - - Snake - - Play Snake スネークをプレイ @@ -1784,10 +1788,6 @@ LogDoctor によって考慮されないフィールドは、「DISCARDED」と Show some info about LogDoctor LogDoctor に関する情報を表示します - - Changelog - 変更履歴 - Show the changelog 変更ログを表示する @@ -1806,82 +1806,6 @@ All the values falling inside the same interval will be merged and the mean valu Time interval 時間間隔 - - 1 - 1 - - - 2 - 2 - - - 3 - 3 - - - 4 - 4 - - - 5 - 5 - - - 10 - 10 - - - 15 - 15 - - - 20 - 20 - - - 30 - 30 - - - 60 - 60 - - - 120 - 120 - - - 180 - 180 - - - 240 - 240 - - - 300 - 300 - - - 600 - 600 - - - 900 - 900 - - - 1200 - 1200 - - - 1800 - 1800 - - - 3600 - 3600 - The format to use for the labels of the time axis. 時間軸のラベルに使用する形式。 @@ -1890,14 +1814,6 @@ All the values falling inside the same interval will be merged and the mean valu Time format 時刻形式 - - hh:mm - hh:mm - - - hh - hh - The size of the pie パイの大きさ @@ -1924,6 +1840,42 @@ Exceeding slices will be grouped into one comprehensive slice. Appearance 外観 + + Security + セキュリティ + + + Whether it is allowed or denied to follow symlinks occuring in a path + パスで発生したシンリンクに従うことを許可または拒否するかどうか + + + Follow symlinks + シンポジウムのフォロー + + + Check updates + 更新情報 + + + Infos + インフォメーション + + + BlockNote + ブロックノート + + + CrissCross + クリスクロス + + + Snake + + + + Changelog + 変更履歴 + RichText diff --git a/logdoctor/translations/LogDoctor_ko_KO.ts b/logdoctor/translations/LogDoctor_ko_KO.ts new file mode 100644 index 0000000..636c41a --- /dev/null +++ b/logdoctor/translations/LogDoctor_ko_KO.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + 이름 * + + + Version 4 + 버전 4 + + + Version 3 + 버전 3 + + + Version 2 + 버전 2 + + + Version 1 + 버전 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + 스크립트 + + + Cross-platform compatibility: + 크로스 플랫폼 호환성: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + 통계: + + + Warnings + 제품정보 + + + Speed + 제품 정보 + + + Counts + 제품정보 + + + Daytime + 일대일 + + + Relational + 관련 기사 + + + Globals + 글로벌 + + + Translations: + 번역: + + + Italian + Italian + + + Spanish + Spanish + + + French + French + + + Tools: + 도구: + + + Block note + 블록 노트 + + + Utilities: + 자료: + + + Infos viewer + 정보 뷰어 + + + Updates checker + 공지사항 + + + Themes: + 주제 : + + + Dark + Dark + + + Light + 제품 정보 + + + Improvements and fixes + 개선 및 수정 + + + New themes: + 새로운 테마: + + + Ash + 으로 + + + Candy + 뚱 베어 + + + Forest + 이름 * + + + Powder + 분말 분말 + + + Restyled GUI + 재스타일 GUI + + + Restyled dialogs + Restyled 대화 상자 + + + Doxygen documentation + Doxygen 문서 + + + Mini-Games: + 소형 게임: + + + Criss-cross + Criss 크로스 + + + Snake + 뚱 베어 + + + Changed default paths + 기본 경로 변경 + + + New game modes for Snake + Snake를위한 새로운 게임 모드 + + + Hunt + 팟캐스트 + + + Battle + 배틀그라운드 + + + New translations: + 새로운 번역: + + + Japanese + Japanese + + + Portuguese + Portuguese + + + Code improvements + Code 개선 + + + Performance improvements + 성능 향상 + + + Added tests suite: + 추가 테스트 스위트: + + + white box tests + 백색 상자 시험 + + + Customized charts themes + 사용자 정의 차트 테마 + + + Fixes + 수정 사항 + + + Tests improvements + 시험 개선 + + + Docker support + Docker 지원 + + + Upgrade to C++20 + C++20로 업그레이드 + + + Upgrade to Qt6 + Qt6로 업그레이드 + + + Restyled themes + Restyled 테마 + + + Redesigned configs section + Redesigned 구성 + + + Stability improvements + 안정성 향상 + + + Generating warnings dinamically + dinamically 경고 생성 + + + New tool: + 새로운 도구: + + + Changelog + 공지사항 + + + Tweakable parameters for some of the charts: + 몇몇의 도표를 위한 Tweakable 모수: + + + Improved project structure + 향상된 프로젝트 구조 + + + Modernized Cmake usage + 연락처 Cmake 사용법 + + + + Crapinfo + + Version + 이름 * + + + Currently installed version of the software + 현재 소프트웨어 버전 설치 + + + Repository links + 관련 링크 + + + Paths + 오시는 길 + + + The path of the executable file + 실행 가능한 파일의 경로 + + + Executable + 실행하기 + + + The path where the configuration file gets saved and searched in + 설정파일이 저장되고 검색된 경로 + + + Configuration file + 구성 파일 + + + The path where the application searches for extra resources + 추가 리소스를 검색하는 경로 + + + Application data + 신청 자료 + + + + Crapnote + + Reduce the font size + 글꼴 크기를 감소 + + + Font size + 이름 * + + + Increase the font size + 글꼴 크기를 증가 + + + + Crappath + + Choose + 제품 정보 + + + Cancel + 이름 * + + + + Crapup + + Checking for updates + 자주 묻는 질문 + + + New version available + 새 버전 사용 가능 + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + 새로운 버전이 있습니다! +LogDoctor의 git 저장소를 방문하여 업데이트하는 방법에 대한 지침을 따르십시오 + + + No update found + 자주 묻는 질문 + + + LogDoctor is up-to-date + LogDoctor는 최신입니다 + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + 당신은 미래에서 버전을 실행! +버전은 현재 업스트림 버전 이상입니다. +원래 LogDoctor를 실행하고 있습니까? +LogDoctor의 저장소를 방문 하 고 그것의 신선한 버전을 얻을 + + + Failed to establish a connection + 연결 설정 실패 + + + Connection error, please try again later + 연결 오류, 나중에 다시 시도 + + + Connection timed out + 연결 시간 + + + Version check failed + 버전 확인 실패 + + + An error occured while parsing: +version mark not found + 파싱 중에 오류가 발생했습니다. +버전 표시 찾을 수 없습니다 + + + An error occured while parsing: +malformed version + 파싱 중에 오류가 발생했습니다. +잘못된 버전 + + + An error occured while comparing: +malformed upstream version + 오류가 발생했습니다. +업스트림 버전 + + + + CrissCross + + Victory + Victory + + + You beated me! + 당신은 나를 beated! + + + This time you lost! + 당신이 잃어버린 시간! + + + Draw + 드로잉 + + + Nice match + 좋은 경기 + + + + DialogBool + + Yes + 이름 * + + + No + 없음 + + + + DialogIda + + Ignore + 이름 * + + + Discard + 팟캐스트 + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + 목록 중 하나는 잘못된 항목이 있습니다 + + + An error occured while reading the configuration file + 설정 파일을 읽는 동안 오류가 발생했습니다 + + + An error occured while parsing configuration file's data + 설정파일의 데이터를 파싱하면서 오류가 발생했습니다 + + + Failed to create the configuration file's directory + 구성 파일의 디렉토리를 만들 실패 + + + Failed to create the configuration file + 구성 파일을 만들 실패 + + + An error occured while writing the configuration file + 설정파일을 작성하면서 오류가 발생했습니다 + + + An error occured while preparing the configuration file's data + 설정파일의 데이터를 준비하면서 오류 발생 + + + The path contains a symlink + 경로는 symlink를 포함합니다 + + + The file does not exist + 파일이 존재하지 않습니다 + + + Failed to create the database backups' directory + 데이터베이스 백업의 디렉토리를 만들 실패 + + + Failed to copy the database file + 데이터베이스 파일을 복사하는 실패 + + + Failed to update the backups + 백업을 업데이트하는 실패 + + + Failed to create the directory + 디렉토리를 만들 실패 + + + Unrecognized entry + 인증 기관 + + + Size of the file + 파일 크기 + + + Warning size parameter + 공급 업체 + + + Failed to read gzipped file + gzipped 파일을 읽는 실패 + + + An error occured while parsing the format string + 형식 문자열을 파싱하는 동안 오류가 발생했습니다 + + + Available memory + 사용 가능한 메모리 + + + Size of the logs + 로그의 크기 + + + An error occured while reading the gzipped file + gzipped 파일을 읽는 동안 오류 발생 + + + An error occured while reading the file + 오류가 발생하면서 파일을 읽고 + + + Something failed while handling the file + 파일을 처리하는 동안 뭔가 실패 + + + An error occured while working on the database + 오류가 발생했습니다 + + + Aborting + 제품정보 + + + Invalid locale + 잘못된 locale + + + Unexpected locale format + 로컬 형식 + + + If you haven't manually edited the configuration file, +please report this issue + 구성 파일을 수동으로 편집하지 않은 경우, +자주 묻는 질문 + + + The given locale is not an accepted language + 주어진 locale는 허용되지 않습니다 언어 + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + LogDoctor의이 Locale을 가지고 싶다면, +관련사이트 + + + Configuration file not found + 찾을 수 없음 + + + Unable to retrieve the configuration file + 구성 파일을 검색할 수 없습니다 + + + Skipping + 공지사항 + + + An error occured while handling the configuration file + 설정파일을 처리하면서 오류가 발생했습니다 + + + Failed to write the configuration file + 설정 파일을 작성하는 실패 + + + Current configuration not saved + 현재 구성 저장되지 않음 + + + File not readable + 읽을 수없는 파일 + + + The file is not readable + 파일은 읽을 수 없습니다 + + + File not writable + 파일 writable + + + The file is not writable + 파일은 쓸 수 없습니다 + + + Directory not writable + 사이트 맵 + + + The directory is not writable + 디렉토리는 writable 되지 않습니다 + + + Invalid path + 잘못된 경로 + + + Failed applying configuration + Failed 적용 구성 + + + Invalid configuration lines + 잘못된 구성 라인 + + + Has not been possible to apply some of the configurations + 구성의 일부를 적용 할 수 없습니다 + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + 진행을 선택하면, 모든 unapplied 구성이 손실됩니다. +계속? + + + Failed to retrieve the help file + 도움 파일을 검색 실패 + + + An error occured while getting the help file + 오류가 발생하면서 도움말 파일을 얻기 + + + Additional resources can be downloaded from the git repo + 추가 리소스는 git repo에서 다운로드 할 수 있습니다 + + + Unable to retrieve the file + 파일 검색 + + + Invalid string + 잘못된 문자열 + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + 주어진 문자열은 유효하지 않고 목록에 추가 할 수 없습니다. + +견적 요청 + + + QSql driver not found + QSql 드라이버를 찾을 수 없습니다 + + + Failed to retrieve the driver needed to handle the database + 데이터베이스를 처리하는 데 필요한 드라이버를 검색 + + + File not found + 찾을 수 없음 + + + Failed to retrieve the database file + 데이터베이스 파일을 검색 + + + Create a new database? + 새 데이터베이스 만들기? + + + The database contains an unexpected table + 데이터베이스에는 예기치 않은 테이블이 있습니다 + + + Unexpected table + 옵션 정보 + + + It seems that the database is missing a table + 그것은 데이터베이스가 테이블을 누락한다는 것 같다 + + + Table not found + 찾을 수 없음 + + + The database contains an unexpected column + 데이터베이스에는 예기치 않은 열이 있습니다 + + + Unexpected column + 관련 항목 + + + It seems that the table is missing a column + 테이블이 열을 누락한다는 것 같습니다 + + + Column not found + 찾을 수 없음 + + + A column has an unexpected data-type + 열에는 예상치 못한 데이터 유형이 있습니다 + + + Unexpected data-type + Unexpected 데이터 유형 + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + 이 데이터베이스는 trailing '.copy'로 이름을 변경하고 새로운 것을 만들 것입니다. +계속? + + + Database created + 데이터베이스 생성 + + + Successfully created a new database + 성공적으로 새로운 데이터베이스를 만들었습니다 + + + Not a file + 파일 없음 + + + The path was supposed to point to a file, but it doesn't + 경로는 파일에 가리키지만, 그렇지 않습니다 + + + Please remove the conflict and retry + 분쟁과 재해를 제거하십시오 + + + The database file is not readable + 데이터베이스 파일은 읽을 수 없습니다 + + + Please set the proper permissions and retry +If this error persists, please report this issue + 자주 묻는 질문 +이 오류가 발생하면 이 문제를 보고하십시오 + + + The database file is not writable + 데이터베이스 파일은 쓸 수 없습니다 + + + Invalid database path + 잘못된 데이터베이스 경로 + + + Failed creating database + 데이터베이스 생성 + + + An error occured while creating the database + 오류가 발생하면서 데이터베이스 생성 + + + Failed opening database + Failed 오픈 데이터베이스 + + + An error occured while opening the database + 오류가 발생하면서 데이터베이스를 열 + + + Failed executing on database + Failed executing 에 데이터베이스 + + + An error occured while executing a statement on the database + 오류가 발생하면서 데이터베이스에 대한 진술을 실행 + + + Failed to backup database + 백업 데이터베이스에 실패 + + + Please report this issue + 이 문제를 보고하십시오 + + + Invalid log format string + 잘못된 로그 형식 문자열 + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + WebServer에 의해 오류가 발생하지 않도록 확인하십시오. +받아 들일 경우, 여기에서 오타의 존재를 확인하십시오. +모든 것이 괜찮으면, 이 문제를 보고하십시오 + + + Log format error + 로그 형식 오류 + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + 로그 형식이 설정되지 않았거나 잘못된 것은 +구성에서 유효한 것을 추가하십시오 + + + Misconfigured log format + Misconfigured 로그 형식 + + + No log field has been set in the current logs format, +making it useless to parse logs + 로그 필드가 현재 로그 형식으로 설정되지 않았습니다. +로그를 파는 것은 쓸모 없다 + + + Please set up a format which contains at least one field + 적어도 하나의 필드를 포함하는 형식을 설정하십시오 + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + 분리기는 1개 이상 분야 사이 누락됩니다, +그것은 그물 경계를 설치하기 어렵다, +incorrect 데이터를 저장하는 것이 가능 + + + Please set up a format which contains separators between fields + 필드 사이 분리기를 포함하는 형식을 설정하십시오 + + + Missing field in log format + 로그 형식의 Missing 필드 + + + An important field is missing from the provided format: + 중요한 필드는 제공된 형식으로 누락됩니다: + + + The quality of the statistics may be seriously compromized + 통계의 품질은 심각하게 비교될 수 있습니다 + + + Proceed anyway? + 어떤 방법? + + + 'Carriage Return' in log format + 'Carriage Return' 로그 형식 + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + 제공되는 형식은 'Carriage Return'을 포함합니다. +이 데이터 손실 또는 충돌로 인해 caution에 사용되지 않는 경우 + + + An error occured while parsing logs + 로그를 파싱하면서 오류가 발생했습니다 + + + Failed defining type + 실패한 defining 유형 + + + Failed to determine the log type + 로그 유형을 결정하기 위해 실패 + + + File already used + 파일 이미 사용 + + + The file has probably been used already + 이 파일은 이미 사용되었습니다 + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + 경고를 무시하고 어쨌든 사용, 그것을 Discard 및 계속, 또는 전체 과정을 압수? + + + Duplicate file + 중복 파일 + + + The file appears twice in the list of selections + 파일은 선택 목록에서 두 번 나타납니다 + + + Failed updating hashes + 실패 updating hashes + + + An error occured while inserting the parsed files hashes into the database + 오류가 발생하면서 파싱된 파일 hashes를 데이터베이스에 삽입 + + + File exceeds warning size + 파일 초과 경고 크기 + + + The file's size exceeds the warning size + 파일의 크기는 경고 크기를 초과 + + + Not enough memory + 충분히 기억 + + + The total size of the selected files exceeds the available memory + 선택한 파일의 총 크기가 가능한 메모리를 초과합니다 + + + Please free some resources, parse the files in different steps or split them into smaller units + 다른 단계로 파일을 파거나 더 작은 단위로 나눕니다 + + + Failed reading + 실패한 독서 + + + File is empty + 파일이 빈 + + + The file is blank + 파일은 공백입니다 + + + Failed to retrieve the selected file + 선택한 파일을 검색 + + + Discard it and continue, or Abort all and exit? + 그것을 읽고 계속, 또는 모든 및 출구를 압도? + + + No file to parse + 파일 없음 + + + The list of files to parse is empty + 파일 목록은 parse가 빈다 + + + Directory not found + 찾을 수 없음 + + + The directory does not exists + 디렉토리는 존재하지 않습니다 + + + Directory not readable + 사이트 맵 + + + The directory is not readable + 디렉토리는 읽을 수 없습니다 + + + Please set the proper permissions before to start + 시작하기 전에 적절한 권한을 설정하십시오 + + + Failed creating directory + Failed 생성 디렉토리 + + + The path does not exists + 경로는 존재하지 않습니다 + + + Data conversion failed + 데이터 변환 실패 + + + Failed to convert from '%1' to '%2' + '%1'에서 '%2'로 변환 + + + Failed to create statistics + 통계를 생성하는 실패 + + + An error occured while processing + 처리 중에 오류가 발생했습니다 + + + Cannot create statistics + 통계를 만들 수 없습니다 + + + No data has been found that matches with the currently set parameters + 데이터는 현재 설정된 매개 변수와 일치한다는 것을 발견했습니다 + + + Not a folder + 폴더 없음 + + + The path was supposed to point to a folder, but it doesn't + 경로는 폴더에 가리키지만, 그렇지 않습니다 + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + 이 항목은 trailing '.copy'로 이름을 변경하고 새로운 것을 만들 것입니다. +계속? + + + An error occured + 오류 발생 + + + Failed renaming + 실패 renaming + + + An error occured while renaming + renaming 동안 오류 발생 + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Apache2 웹 서버에서 로그 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Nginx 웹 서버에서 Parse 로그 + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Microsoft IIS 웹 서버의 로그 + + + IIS + IIS + + + Select/deselect all the files + 선택/모든 파일을 선택 + + + All + 모든 것 + + + Inspect a log file + 로그 파일 검사 + + + Name + 이름 * + + + Size + 크기 (mm) + + + Refresh the list + 자주 묻는 질문 + + + Total size of the parsed data + 파싱된 자료의 총 크기 + + + Total number of parsed lines + 파싱 라인의 총 수 + + + Start parsing the selected files + 선택한 파일을 파싱 시작 + + + START + 기타 + + + Time elapsed since the start + 시작부터 시간 탈출 + + + Average speed, in parsed data size per second + 평균 속도, 초당 파열된 데이터 크기 + + + Web Server + 웹 서버 + + + Select a Web Server + 웹 서버 선택 + + + Year + 1 년 + + + Month + 월~금 + + + Day + * 이름 + + + Hour + 시간 + + + Draw the chart + 차트를 그리기 + + + Log line marked as Warning + 공지사항 + + + Date when the request arrived (YYYY-MM-DD) + 요청이 도착했을 때 날짜 (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + 요청이 도착했을 때 시간 (h:mm:ss) + + + Protocol of the request + 요청의 프로토콜 + + + Method of the request + 요청 방법 + + + URI of the requested page + 요청된 페이지의 URI + + + Query carried along with the URI + URI와 함께 수행 된 쿼리 + + + Response code from the server + 서버의 응답 코드 + + + User-agent of the client which made the request + 요청을 만든 클라이언트의 User-agent + + + IP address of the Client which made the request + 고객의 IP 주소 + + + Cookie used for the request + 요청에 사용되는 쿠키 + + + The URL which redirected the Client to the requested page + 클라이언트를 요청한 페이지로 리디렉션하는 URL + + + Size ib Bytes of the request, usually includes header and data + 요청의 크기 ib 바이트, 보통 헤더 및 데이터를 포함 + + + Size in Bytes of the served content, usually includes header and data + 제공된 내용의 바이트 크기, 보통 헤더 및 데이터를 포함합니다 + + + Time taken by the server to serve the content, in milliseconds + 서버가 콘텐츠, milliseconds에서 제공하는 시간 + + + Only use lines in which the field is starting with this string + 이 문자열로 시작되는 필드만 사용 + + + Protocol: + 의정서: + + + Method: + 방법: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + 이 문에 해당 필드가 일치하는 줄만 사용합니다. +'!', '=','<' 또는 '>'를 사용하여 사용하는 것을 선언합니다 + + + Response: + 응답: + + + Query: + 질문: + + + URI: + URI: + + + Filters + 필터링 + + + Count + 제품정보 + + + Number of occurrences + 파기방법 + + + Item + 제품 정보 + + + Value of the field + 분야의 가치 + + + From: + 가격 : + + + To: + 에: + + + Select a log field to view + 본문 바로가기 + + + Field: + 유형: + + + Filter: + 필터: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + 문자열로, 필드가 이 문자열로 시작하는 줄만 사용됩니다. +숫자로, '!', '=', '<' 또는 '>'를 사용하여 어떤 사용을 선언합니다 + + + Protocol + 프로젝트 + + + Method + 제품 설명 + + + URI + URI + + + User-agent + 사용자 시약 + + + Most recurrent + 가장 recurrent + + + Most trafficked + 큰 가슴 + + + Date ever + 현재 위치 + + + Day of the week + 일주일의 날 + + + Hour of the day + 당일의 시간 + + + Time taken + 자주 묻는 질문 + + + Bytes sent + Bytes 전송 + + + Bytes received + Bytes 수신 + + + Mean/Max performances + 평균/최대 성과 + + + Requests received + 견적 요청 + + + Total work + 전체 작업 + + + General + 주요사업 + + + Window + (주) + + + Dialogs + 디아로그 + + + Charts + 언어 선택 + + + Appearance + 이름 * + + + Speed + 제품 정보 + + + Relational + 관련 기사 + + + TextBrowser + 본문바로가기 + + + Databases + 관련 기사 + + + Security + 보안 보안 + + + Logs + 제품정보 + + + Defaults + 기본 사항 + + + Control + 제품정보 + + + Path + 오시는길 + + + Format + 지원하다 + + + Warnlists + 연락처 + + + Blacklists + 블랙리스트 + + + Remember the window's position and size + 창의 위치와 크기를 기억하십시오 + + + Remember position and size + 위치 및 크기 + + + Remember window's position and size + 창의 위치와 크기를 기억하십시오 + + + Geometry + 관련 기사 + + + Theme to use for the window + 창을 사용할 테마 + + + Theme + 이름 * + + + Native + 이름 * + + + Light + 제품 정보 + + + Dark + Dark + + + Auto + 제품정보 + + + Icons + 아이콘 + + + Normal quantity of dialog messages shown + 표시된 대화 상자 메시지의 정상적인 수량 + + + Normal + Normal + + + Dialogs from the main processes + 주요 프로세스의 Dialogs + + + Dialogs emitted when parsing logs + 로그를 파싱 할 때 Dialogs 방출 + + + Logs parser + 로그 파서 + + + Dialogs emitted when viewing statistics + 통계를 볼 때 방출되는 Dialogs + + + Statistics viewer + 통계 뷰어 + + + Define the quantity of dialog mesages shown + 표시된 대화 상자 mesages의 수량 정의 + + + Dialogs level + Dialogs 수준 + + + Reduced quantity of dialog messages shown + 표시된 대화 상자 메시지의 감소된 수량 + + + Essential + * 필수 + + + Augmented quantity of dialog messages shown + 표시된 대화 상자 메시지의 증강 수량 + + + Explanatory + 회사 소개 + + + Theme to use for the Charts + 차트를 사용하는 테마 + + + Preview + 다운로드 + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + 몇 초에 시간 축에서 단계를 나타냅니다. +동일한 간격 안쪽에 떨어지는 모든 가치는 합병되고 의미있는 가치는 사용될 것입니다. + + + Time interval + 시간 간격 + + + The format to use for the labels of the time axis. + 시간 축의 라벨에 사용할 수있는 형식. + + + Time format + 시간 형식 + + + The size of the pie + 파이의 크기 + + + Pie size + 파이 크기 + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + 파이가 구성되는 슬라이스의 최대 수. +흥분 슬라이스는 하나의 포괄적인 슬라이스로 그룹화됩니다. + + + Maximum slices + 최대 조각 + + + Font to use for the Text Browser + Text Browser를 사용하는 글꼴 + + + Font + 이름 * + + + Double-spaced lines + 두 배 공간 선 + + + Use wide lines + 다양한 라인 사용 + + + Define the spacing between lines + 줄 사이에 간격을 정의 + + + Lines spacing + 라인 간격 + + + None + 이름 * + + + Color scheme to use for the Text Browser + Text Browser를 사용하는 색상 계획 + + + Color scheme + 색깔 계획 + + + The appearance of the Text Browser with the current settings + 현재 설정과 텍스트 브라우저의 외관 + + + Insert the base path only, file name excluded + 기본 경로 만 삽입, 파일 이름 제외 + + + The given path doen't exists, or doesn't point to a folder + 주어진 경로 doen't 존재, 또는 폴더에 포인트가 없습니다 + + + Path for the database files + 데이터베이스 파일 경로 + + + Paths + 오시는 길 + + + Apply the current path + 현재 경로 적용 + + + Select the path through a dialog window + 대화 창을 통해 경로 선택 + + + Path where the logs data collection database is located + 로그 데이터 수집 데이터베이스가 있는 경로 + + + Logs data + 로그 데이터 + + + Path where the used files hashes database is located + 사용되는 파일 hashes 데이터베이스가 있는 경로 + + + Used files + 관련 파일 + + + Backup options for the Logs Data database + Logs Data 데이터베이스에 대한 백업 옵션 + + + Backups + 지원하다 + + + A new backup is made when closing LogDoctor after having succesfully edited the database + 새로운 백업은 데이터베이스를 succesfully 편집 한 후 LogDoctor를 닫을 때 이루어집니다 + + + Backup the Logs Data database and keep + Logs Data 데이터베이스 백업 및 유지 + + + Whether it is allowed or denied to follow symlinks occuring in a path + symlinks가 경로에서 발생하도록 허용하거나 거부 여부 + + + Follow symlinks + symlinks를 따르십시오 + + + Default WebServer + 기본 WebServer + + + Usage control + 사용법 통제 + + + Hide already used files + 이미 사용 된 파일 숨기기 + + + Size warnings + 크기 경고 + + + Warn me when using files with a size exceeding: + 파일 크기를 초과하면 Warn me: + + + Logs folder + 로그 폴더 + + + Logs format string + 로그 형식 문자열 + + + Format string + 형식 문자열 + + + Insert the format string you're using + 형식 문자열을 삽입하세요 + + + Apply the current string + 현재 문자열을 적용 + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + 현재 저장된 문자열에서 샘플 로그 라인을 생성하여 올바르게 포맷 된 경우 확인하십시오. +LogDoctor에 의해 고려되지 않은 필드는 'DISCARDED' 로 표시됩니다 + + + Generate sample + 샘플 생성 + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + 이 선의 정정을 확인하십시오. +'DISCARDED' 로 표시된 필드는 제대로 파싱되었지만 LogDoctor에 의해 고려되지 않습니다 + + + Open an help window + 도움말 창 열기 + + + Help + 지원하다 + + + Select a log field + 로그 필드 선택 + + + Use warnlist for this field + 이 분야에 대한 warnlist 사용 + + + Add the current line to the list + 현재 줄을 리스트에 추가 + + + Remove the selected item from the list + 목록에서 선택한 항목을 제거 + + + Move the selected item down + 선택된 아이템을 이동 + + + Use blacklist for this field + 이 분야의 blacklist 사용 + + + Add line + 관련 제품 + + + Remove selection + 자주 묻는 질문 + + + Language + * 이름 + + + Utilities + (주) + + + Tools + 제품정보 + + + Games + (주) + + + Perform a version-check + 버전 검사 수행 + + + Show some info about LogDoctor + LogDoctor에 대한 몇 가지 정보를 표시 + + + Open a block-note like window to write temporary text + 창 같은 블록 노트를 열고 임시 텍스트를 작성 + + + Play CrissCross + 놀이 CrissCross + + + Play Snake + 놀이 Snake + + + Show the changelog + changelog 보기 + + + warnlist + 관련 상품 + + + blacklist + 블랙리스트 + + + copy + 이름 * + + + copies + 이름 * + + + Check updates + 자주 묻는 질문 + + + Infos + 제품정보 + + + BlockNote + 블록 노트 + + + CrissCross + 콜롬비아 + + + Snake + 뚱 베어 + + + Changelog + 공지사항 + + + + RichText + + Select a file from the list + 목록에서 파일 선택 + + + to inspect its content + 그 내용을 검사 + + + Failed to read + 자주 묻는 질문 + + + + SnakeGame + + PLAY + 공지사항 + + + Classic + Classic + + + Hunt + 팟캐스트 + + + Battle + 배틀그라운드 + + + Game Over + 게임 오버 + + + Your adversary fell in the water! + 당신의 모험은 물에 떨어졌다! + + + YOU WON! + 안녕하세요! + + + You fell in the water! + 물에 떨어졌다! + + + YOU LOST! + 고맙습니다! + + + Your adversary ate itself! + 당신의 모험은 스스로! + + + You ate yourself! + 너 자신! + + + Your adversary ate you! + 당신의 모험은 당신을! + + + You ate your adversary! + 당신은 당신의 모험을! + + + You ate each other! + 당신은 서로 ate! + + + MATCH IS DRAW! + MATCH는 죽어! + + + + TR + + Unexpected WebServer + WebServer를 비교 + + + Logs Size Breakdown + 로그 크기 Breakdown + + + Ignored + 이름 * + + + Parsed + 뚱 베어 + + + Blacklisted + 블랙리스트 + + + Others + 기타 + + + from + 이름 * + + + to + 으로 + + + Log Lines Marked as Warning + 공지사항 + + + Time Taken to Serve Requests + Time 소요 에 Serve 요청 + + + Time of Day Count + 일의 시간 + + + Relational Count + 관계 + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + (주) + + + Year + 1 년 + + + Month + 월~금 + + + Day + * 이름 + + + Time + (주) + + + Hour + 시간 + + + Minute + 이름 * + + + Second + 2 년 + + + Warning + 제품정보 + + + Protocol + 프로젝트 + + + Method + 제품 설명 + + + URI + URI + + + Query + 글쓰기 + + + Response code + 응답 코드 + + + Time taken + 자주 묻는 질문 + + + Bytes sent + Bytes 전송 + + + Bytes received + Bytes 수신 + + + Referrer + 회사 소개 + + + Cookie + 아사쿠사 + + + Client + 회사 소개 + + + User-agent + 사용자 시약 + + + January + 1월 1일 + + + February + 2 월 + + + March + 3 월 + + + April + 4 월 + + + May + 5 월 + + + June + 6 월 + + + July + 7 월 + + + August + 8 월 + + + September + 9 월 + + + October + 10월 + + + November + 11 월 + + + December + 12 월 + + + Sunday + 주 메뉴 + + + Monday + 월요일, 월요일 + + + Tuesday + * 이름 + + + Wednesday + Wednesday + + + Thursday + 주 메뉴 + + + Friday + 월~금 + + + Saturday + Saturday + + + diff --git a/logdoctor/translations/LogDoctor_lt_LI.ts b/logdoctor/translations/LogDoctor_lt_LI.ts new file mode 100644 index 0000000..3f6bc82 --- /dev/null +++ b/logdoctor/translations/LogDoctor_lt_LI.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versijos + + + Version 4 + 4 versija + + + Version 3 + 3 versija + + + Version 2 + 2 versija + + + Version 1 + 1 versija + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Sukurti scenarijus + + + Cross-platform compatibility: + Kryžminis perono suderinamumas: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistika: + + + Warnings + Įspėjimai + + + Speed + Greitis + + + Counts + Kraštai + + + Daytime + Dienos + + + Relational + Santykis + + + Globals + Gėlės + + + Translations: + Vertimai: + + + Italian + Italų + + + Spanish + Ispanų + + + French + Prancūzų + + + Tools: + Įrankiai: + + + Block note + Bloko pastaba + + + Utilities: + Paslaugos: + + + Infos viewer + Infosų žiūryklė + + + Updates checker + Atnaujinimų tikrintuvas + + + Themes: + Temos: + + + Dark + Tamsus + + + Light + Šviesa + + + Improvements and fixes + Patobulinimai ir pataisymai + + + New themes: + Naujos temos: + + + Ash + Pelenai + + + Candy + Saldainiai + + + Forest + Miškas + + + Powder + Milteliai + + + Restyled GUI + Name + + + Restyled dialogs + Restyled dialogs + + + Doxygen documentation + Deguonies dokumentai + + + Mini-Games: + Mini- Žaidimai: + + + Criss-cross + Kristo- kryžius + + + Snake + Gyvatė + + + Changed default paths + Pakeisti numatytieji keliai + + + New game modes for Snake + Naujas žaidimas režimai Gyvatė + + + Hunt + Hantas + + + Battle + Mūšis + + + New translations: + Nauji vertimai: + + + Japanese + Japonų + + + Portuguese + Portugalų + + + Code improvements + Kodeksai + + + Performance improvements + Našumas + + + Added tests suite: + Pridėtas testavimo rinkinys: + + + white box tests + Baltų dėžių bandymai + + + Customized charts themes + Pritaikytos diagramų temos + + + Fixes + Fiksuoti + + + Tests improvements + Testų tobulinimas + + + Docker support + Gydytojo palaikymas + + + Upgrade to C++20 + Modernizuoti iki C++20 + + + Upgrade to Qt6 + Patobulintas iki Qt6 + + + Restyled themes + Atnaujintos temos + + + Redesigned configs section + Redesigned configs section + + + Stability improvements + Stabilumo didinimas + + + Generating warnings dinamically + Dinamiškai generuojantys įspėjimai + + + New tool: + Nauja priemonė: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Tankūs kai kurių schemų parametrai: + + + Improved project structure + Patobulinta projekto struktūra + + + Modernized Cmake usage + Modernizuotas Comment + + + + Crapinfo + + Version + Versija + + + Currently installed version of the software + Dabar įdiegta programinės įrangos versija + + + Repository links + Saugyklos nuorodos + + + Paths + Keliai + + + The path of the executable file + vykdomojo failo kelias + + + Executable + Comment + + + The path where the configuration file gets saved and searched in + Kelias, kuriame išsaugomas ir ieškomas konfigūracijos failas + + + Configuration file + Konfigūravimo failas + + + The path where the application searches for extra resources + Kelias, kuriuo programa ieško papildomų išteklių + + + Application data + NAME OF TRANSLATORS + + + + Crapnote + + Reduce the font size + Sumažinti šrifto dydį + + + Font size + Šrifto dydis + + + Increase the font size + Padidinti šrifto dydį + + + + Crappath + + Choose + Pasirinkite + + + Cancel + Atsisakyti + + + + Crapup + + Checking for updates + Patikrinti, ar nėra atnaujinimų + + + New version available + Turima nauja versija + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Nauja versija yra prieinama! +Prašome aplankyti LogDoctor git saugyklos ir sekite instrukcijas, kaip atnaujinti + + + No update found + No update found + + + LogDoctor is up-to-date + LogDoctor yra iki datos + + + :/ + : / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Tu vadovauji versijai iš ateities! +Jūsų versija yra už dabartinės į priekį versija +Tu vadovauji originalui LogDaktarui? +Prašome aplankyti LogDoctor saugyklA ir gauti naują versiją + + + Failed to establish a connection + Nepavyko nustatyti ryšio + + + Connection error, please try again later + Prisijungimo klaida, bandykite vėliau dar kartą + + + Connection timed out + Connection timed out + + + Version check failed + Versijos tikrinimas nepavyko + + + An error occured while parsing: +version mark not found + An error occured while parsing: +version mark not found + + + An error occured while parsing: +malformed version + An error occured while parsing: +malformed version + + + An error occured while comparing: +malformed upstream version + Klaida lyginant: +deformuota pirmesnė versija + + + + CrissCross + + Victory + Pergalė + + + You beated me! + Tu mane mušei! + + + This time you lost! + Šįkart tu pralaimėjai! + + + Draw + Piešti + + + Nice match + Geros rungtynės + + + + DialogBool + + Yes + Taip + + + No + Nr + + + + DialogIda + + Ignore + Ignoruoti + + + Discard + Išmeskite + + + Abort + Nutraukti + + + + DialogMsg + + Ok + Gerai + + + + DialogSec + + One of the lists has an invalid item + NAME OF TRANSLATORS + + + An error occured while reading the configuration file + Klaida skaitant konfigūracijos failą + + + An error occured while parsing configuration file's data + An error occured while parsing configuration file's data + + + Failed to create the configuration file's directory + Nepavyko sukurti konfigūracijos failo katalogo + + + Failed to create the configuration file + Nepavyko sukurti konfigūracijos failo + + + An error occured while writing the configuration file + Klaida įrašant konfigūracijos failą + + + An error occured while preparing the configuration file's data + Ruošiant konfigūracijos failo duomenis įvyko klaida + + + The path contains a symlink + Kelias turi simbolinę nuorodą + + + The file does not exist + Failas neegzistuoja + + + Failed to create the database backups' directory + Nepavyko sukurti duomenų bazės atsarginių kopijų katalogo + + + Failed to copy the database file + Nepavyko nukopijuoti duomenų bazės failo + + + Failed to update the backups + Nepavyko atnaujinti atsarginių kopijų + + + Failed to create the directory + Nepavyko sukurti aplanko + + + Unrecognized entry + Neidentifikuotas įrašas + + + Size of the file + Failo dydis + + + Warning size parameter + Įspėjimo dydžio parametras + + + Failed to read gzipped file + Nepavyko perskaityti gzipped failo + + + An error occured while parsing the format string + An error occured while parsing the format string + + + Available memory + Turima atmintis + + + Size of the logs + Rąstų dydis + + + An error occured while reading the gzipped file + Klaida skaitant gzipped failą + + + An error occured while reading the file + Klaida skaitant failą + + + Something failed while handling the file + Kažkas nepavyko tvarkant failą + + + An error occured while working on the database + Klaida dirbant duomenų bazėje + + + Aborting + Atsisakymas + + + Invalid locale + Klaidinga locale + + + Unexpected locale format + Neigiama lokalės forma + + + If you haven't manually edited the configuration file, +please report this issue + If you haven't manually edited the configuration file, +please report this issue + + + The given locale is not an accepted language + NAME OF TRANSLATORS + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Norite, kad šis lokalas būtų LogDaktare, +Prašome sekti saugyklos puslapio instrukciją + + + Configuration file not found + Konfigūravimo failas nerastas + + + Unable to retrieve the configuration file + Nepavyko gauti konfigūracijos failo + + + Skipping + Praleidimas + + + An error occured while handling the configuration file + An error occured while handling the configuration file + + + Failed to write the configuration file + Nepavyko įrašyti konfigūracijos failo + + + Current configuration not saved + NAME OF TRANSLATORS + + + File not readable + Failas neperskaitomas + + + The file is not readable + Failas neperskaitomas + + + File not writable + Failas neįrašomas + + + The file is not writable + Failas nėra įrašomas + + + Directory not writable + Aplankas nerašomas + + + The directory is not writable + Aplankas nėra įrašomas + + + Invalid path + Klaidingas kelias + + + Failed applying configuration + Nepavyko taikyti konfigūracijos + + + Invalid configuration lines + Klaidingos konfigūracijos linijos + + + Has not been possible to apply some of the configurations + Nepavyko taikyti kai kurių konfigūracijų + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + + + Failed to retrieve the help file + Nepavyko gauti pagalbos failo + + + An error occured while getting the help file + Gaunant pagalbos failą įvyko klaida + + + Additional resources can be downloaded from the git repo + papildomus išteklius galima atsisiųsti iš git atpirkimo + + + Unable to retrieve the file + Nepavyko gauti failo + + + Invalid string + Klaidinga eilutė + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Nurodyta eilutė yra netinkama ir negali būti pridėta į sąrašą + +Užpildykite ir bandykite dar kartą + + + QSql driver not found + Name + + + Failed to retrieve the driver needed to handle the database + Failed to retrieve the driver needed to handle the database + + + File not found + Failas nerastas + + + Failed to retrieve the database file + Nepavyko gauti duomenų bazės failo + + + Create a new database? + Sukurti naują duomenų bazę? + + + The database contains an unexpected table + Duomenų bazėje yra netikėta lentelė + + + Unexpected table + Neigiama lentelė + + + It seems that the database is missing a table + Atrodo, kad duomenų bazėje trūksta stalo + + + Table not found + Lentelė nerasta + + + The database contains an unexpected column + NAME OF TRANSLATORS + + + Unexpected column + Neigiama skiltis + + + It seems that the table is missing a column + Atrodo, kad lentelė trūksta stulpelį + + + Column not found + Stulpelis nerastas + + + A column has an unexpected data-type + Stulpelis turi netikėtų duomenų tipą + + + Unexpected data-type + Neigiama duomenų rūšis + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + + + Database created + Sukurta duomenų bazė + + + Successfully created a new database + Sėkmingai sukurta nauja duomenų bazė + + + Not a file + Ne failas + + + The path was supposed to point to a file, but it doesn't + Kelias turėjo nurodyti failą, bet jis neturi + + + Please remove the conflict and retry + Prašau pašalinti konfliktą ir bandykite dar kartą + + + The database file is not readable + NAME OF TRANSLATORS + + + Please set the proper permissions and retry +If this error persists, please report this issue + Prašome nustatyti tinkamus leidimus ir bandykite dar kartą +III PRIEDAS + + + The database file is not writable + Duomenų bazės failas nėra įrašomas + + + Invalid database path + Blogas duomenų bazės kelias + + + Failed creating database + Nepavyko sukurti duomenų bazės + + + An error occured while creating the database + Klaida kuriant duomenų bazę + + + Failed opening database + Nepavyko atverti duomenų bazės + + + An error occured while opening the database + Klaida atveriant duomenų bazę + + + Failed executing on database + Nepavyko vykdyti duomenų bazėje + + + An error occured while executing a statement on the database + An error occured while executing a statement on the database + + + Failed to backup database + Failed to backup database + + + Please report this issue + Prašome pranešti apie šį klausimą + + + Invalid log format string + Bloga žurnalo formato eilutė + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Prašome patikrinti, ar jūsų WebServer neįmetė klaidos +Renkantis sprendimą, prašome patikrinti, ar čia yra tipo +III PRIEDAS + + + Log format error + Žurnalo formato klaida + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Žurnalo formatas nebuvo nustatytas arba yra netinkamas +Prašome pridėti teisingą konfigūraciją + + + Misconfigured log format + Klaidingas žurnalo formatas + + + No log field has been set in the current logs format, +making it useless to parse logs + NAME OF TRANSLATORS +kad ji nenaudinga nagrinėti rąstų + + + Please set up a format which contains at least one field + Prašome nustatyti formatą, kuris turi bent vieną lauką + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + tarp vieno ar kelių laukų trūksta skirtuko, +sunku nustatyti neto ribas, +ir gali sukelti saugoti neteisingus duomenis + + + Please set up a format which contains separators between fields + Please set up a format which contains separators between fields + + + Missing field in log format + Trūkstamas laukas žurnalo formatu + + + An important field is missing from the provided format: + Pateiktame formate trūksta svarbaus laukelio: + + + The quality of the statistics may be seriously compromized + Statistinių duomenų kokybė gali būti rimtai skatinama + + + Proceed anyway? + Vistiek tęsi? + + + 'Carriage Return' in log format + 'Vežimo grąža' žurnalo formatu + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Pateiktame formate yra "Carriage Return". +Trūksta duomenų arba jie gali nukristi, jei nebus naudojami atsargiai + + + An error occured while parsing logs + Klaida apdorojant žurnalus + + + Failed defining type + Nepavyko apibrėžti tipo + + + Failed to determine the log type + Nepavyko nustatyti žurnalo tipo + + + File already used + Failas jau naudotas + + + The file has probably been used already + Failas tikriausiai jau buvo naudotas + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignoruoti įspėjimą ir vistiek jį naudoti, atsisakyti jį ir tęsti, arba nutraukti visą procesą? + + + Duplicate file + Kopijuoti failą + + + The file appears twice in the list of selections + Failas atrankos sąraše rodomas du kartus + + + Failed updating hashes + Failed updating hashes + + + An error occured while inserting the parsed files hashes into the database + An error occured while inserting the parsed files hashes into the database + + + File exceeds warning size + Failas viršija perspėjimo dydį + + + The file's size exceeds the warning size + Failo dydis viršija perspėjimo dydį + + + Not enough memory + Trūksta atminties + + + The total size of the selected files exceeds the available memory + Bendras pasirinktų failų dydis viršija turimą atmintinę + + + Please free some resources, parse the files in different steps or split them into smaller units + Prašome išlaisvinti kai kuriuos resursus, išanalizuoti failus skirtingais etapais arba suskaidyti juos į mažesnius vienetus + + + Failed reading + Nepavyko perskaityti + + + File is empty + Failas tuščias + + + The file is blank + Failas tuščias + + + Failed to retrieve the selected file + Nepavyko gauti pažymėto failo + + + Discard it and continue, or Abort all and exit? + Naikinti jį ir tęsti, arba nutraukti viską ir išeiti? + + + No file to parse + Failo skaitymui nėra + + + The list of files to parse is empty + Failų, kuriuos reikia perskaityti, sąrašas tuščias + + + Directory not found + Aplankas nerastas + + + The directory does not exists + Aplankas neegzistuoja + + + Directory not readable + Aplankas neperskaitomas + + + The directory is not readable + Aplankas nėra perskaitomas + + + Please set the proper permissions before to start + Prašome nustatyti tinkamus leidimus prieš pradedant + + + Failed creating directory + Nepavyko sukurti aplanko + + + The path does not exists + Kelias neegzistuoja + + + Data conversion failed + Data conversion failed + + + Failed to convert from '%1' to '%2' + Nepavyko konvertuoti iš '%1' į '%2' + + + Failed to create statistics + Nepavyko sukurti statistikos + + + An error occured while processing + An error occured while processing + + + Cannot create statistics + Nepavyko sukurti statistikos + + + No data has been found that matches with the currently set parameters + No data has been found that matches with the currently set parameters + + + Not a folder + Ne aplankas + + + The path was supposed to point to a folder, but it doesn't + Kelias turėjo nukreipti į aplanką, bet jis neturi + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + įrašas bus pervadintas su sekančiu ".copy" ir bus sukurtas naujas. +Tęsti? + + + An error occured + Įvyko klaida + + + Failed renaming + Nepavyko pervadinti + + + An error occured while renaming + Klaida pervadinant + + + + GameDialog + + Ok + Gerai + + + + MainWindow + + Parse logs from the Apache2 web server + Rąstai iš Apache2 interneto serverio + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Skaidyti žurnalus iš Nginx žiniatinklio serverio + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Skaitymo žurnalai iš "Microsoft IIS" interneto serverio + + + IIS + IIS + + + Select/deselect all the files + Žymėti / pašalinti visus failus + + + All + All + + + Inspect a log file + Patikrinti žurnalo failą + + + Name + Pavadinimas + + + Size + Dydis + + + Refresh the list + Atnaujinti sąrašą + + + Total size of the parsed data + Bendras apdorotų duomenų dydis + + + Total number of parsed lines + Bendras perskirtų linijų skaičius + + + Start parsing the selected files + Pradėti pasirinktų failų apdorojimą + + + START + PLAČIAU + + + Time elapsed since the start + Laikas nuo pradžios + + + Average speed, in parsed data size per second + Vidutinis greitis, analizuojamų duomenų dydis per sekundę + + + Web Server + žiniatinklio serveris + + + Select a Web Server + Pasirinkite žiniatinklio serverį + + + Year + Metai + + + Month + Mėnuo + + + Day + Diena + + + Hour + Valanda + + + Draw the chart + Lygiosios diagramos + + + Log line marked as Warning + Žurnalo eilutė, pažymėta kaip įspėjimas + + + Date when the request arrived (YYYY-MM-DD) + Prašymo gavimo data (YYYYY-MM- DD) + + + Time when the request arrived (hh:mm:ss) + Prašymo pateikimo laikas (hh: mm: ss) + + + Protocol of the request + Prašymo protokolas + + + Method of the request + Prašymo pateikimo būdas + + + URI of the requested page + Prašomo puslapio URI + + + Query carried along with the URI + Kartu su URI atliekama užklausA + + + Response code from the server + Serverio atsakymo kodas + + + User-agent of the client which made the request + Prašymą pateikusio kliento naudotojas + + + IP address of the Client which made the request + užklausą pateikusio kliento IP adresas + + + Cookie used for the request + Slapukas, naudojamas prašymui + + + The URL which redirected the Client to the requested page + URL, kuris nukreipti klientą į prašomą puslapį + + + Size ib Bytes of the request, usually includes header and data + NAME OF TRANSLATORS + + + Size in Bytes of the served content, usually includes header and data + Tiekiamo turinio dydis baitais, paprastai apima antraštę ir duomenis + + + Time taken by the server to serve the content, in milliseconds + Serverio laikas turiniui pateikti milisekundėmis + + + Only use lines in which the field is starting with this string + Naudokite tik eilutes, kuriose laukas prasideda šia eilute + + + Protocol: + Protokolas: + + + Method: + metodas: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + + + Response: + atsakas: + + + Query: + užklausA: + + + URI: + URI: + + + Filters + Filtrai + + + Count + Skaičius + + + Number of occurrences + Atvejų skaičius + + + Item + Punktas + + + Value of the field + Laukelio reikšmė + + + From: + nuo: + + + To: + Kam: + + + Select a log field to view + Parinkite žurnalų lauką peržiūrai + + + Field: + laukas: + + + Filter: + Filtras: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Eilutėmis bus naudojamos tik eilutės, kuriose laukas prasideda šia eilute. +Number, use '!', '=', '<' arba '> nurodyti, ką naudoti + + + Protocol + Protokolas + + + Method + metodas + + + URI + URI + + + User-agent + Vartotojo agentas + + + Most recurrent + Dažniausiai pasikartojantys + + + Most trafficked + Didžioji dalis prekybos + + + Date ever + Data kada + + + Day of the week + Savaitės diena + + + Hour of the day + Dienos valanda + + + Time taken + Laikas + + + Bytes sent + Siunčiami baitai + + + Bytes received + Gauti baitai + + + Mean/Max performances + Vidutiniai / maksimalūs rezultatai + + + Requests received + Gauti prašymai + + + Total work + Darbai iš viso + + + General + Bendrosios nuostatos + + + Window + Langas + + + Dialogs + Dialogai + + + Charts + Grafikai + + + Appearance + Išvaizda + + + Speed + Greitis + + + Relational + Santykis + + + TextBrowser + Comment + + + Databases + Duomenų bazės + + + Security + Saugumas + + + Logs + Žurnalai + + + Defaults + Defaults + + + Control + Kontrolė + + + Path + Kelias + + + Format + Formatas + + + Warnlists + Kariniai sąrašai + + + Blacklists + Juodieji sąrašai + + + Remember the window's position and size + Prisiminti lango padėtį ir dydį + + + Remember position and size + Prisiminti padėtį ir dydį + + + Remember window's position and size + Prisiminti lango padėtį ir dydį + + + Geometry + Geometrija + + + Theme to use for the window + Theme to use for the window + + + Theme + Tema + + + Native + Savybė + + + Light + Šviesa + + + Dark + Tamsus + + + Auto + Auto + + + Icons + Ženkliukai + + + Normal quantity of dialog messages shown + Normal quantity of dialog messages shown + + + Normal + Normalus + + + Dialogs from the main processes + Dialogs from the main processes + + + Dialogs emitted when parsing logs + Dialogs emitted when parsing logs + + + Logs parser + Žurnalų analizatorius + + + Dialogs emitted when viewing statistics + Dialogs emitted when viewing statistics + + + Statistics viewer + Comment + + + Define the quantity of dialog mesages shown + Define the quantity of dialog mesages shown + + + Dialogs level + Dialogų lygis + + + Reduced quantity of dialog messages shown + Reduced quantity of dialog messages shown + + + Essential + esminis + + + Augmented quantity of dialog messages shown + Noun, name of the user action + + + Explanatory + Aiškinimas + + + Theme to use for the Charts + Theme to use for the Charts + + + Preview + Peržiūra + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Time ašyje - po kelių sekundžių. +Sumontuotos visos tame pačiame intervale esančios vertės ir naudojama vidutinė vertė. + + + Time interval + Laiko intervalas + + + The format to use for the labels of the time axis. + Laiko ašies etikečių formatas. + + + Time format + Laiko formatas + + + The size of the pie + Picos dydis + + + Pie size + Pie dydis + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Didžiausias gabalėlių, iš kurių bus sudarytas pyragas, skaičius. +Viršyčiai bus suskirstyti į vieną išsamią skiltį. + + + Maximum slices + Maximum slices + + + Font to use for the Text Browser + Šriftas, naudojamas tekstų naršyklei + + + Font + Šriftas + + + Double-spaced lines + Dviaukštės linijos + + + Use wide lines + Naudokite plačias linijas + + + Define the spacing between lines + Apibrėžti tarpus tarp eilučių + + + Lines spacing + Linijų tarpai + + + None + Nieko + + + Color scheme to use for the Text Browser + Name + + + Color scheme + Spalvų schema + + + The appearance of the Text Browser with the current settings + Name + + + Insert the base path only, file name excluded + Insert the base path only, file name excluded + + + The given path doen't exists, or doesn't point to a folder + Nurodytas kelias neegzistuoja arba nenurodo aplanko + + + Path for the database files + Kelias duomenų bazės failams + + + Paths + Keliai + + + Apply the current path + Pritaikyti dabartinį kelią + + + Select the path through a dialog window + Pasirinkite kelią per dialogo langą + + + Path where the logs data collection database is located + Kelis, kuriame yra duomenų rinkimo duomenų bazė + + + Logs data + Rąstų duomenys + + + Path where the used files hashes database is located + Kelias, kuriuo yra naudojama failų skalių duomenų bazė + + + Used files + Panaudoti failai + + + Backup options for the Logs Data database + Žurnalų duomenų bazės atsarginės kopijos parinktys + + + Backups + Atsarginės kopijos + + + A new backup is made when closing LogDoctor after having succesfully edited the database + NAME OF TRANSLATORS + + + Backup the Logs Data database and keep + Name + + + Whether it is allowed or denied to follow symlinks occuring in a path + NAME OF TRANSLATORS + + + Follow symlinks + Sekite simbolines nuorodas + + + Default WebServer + NAME OF TRANSLATORS + + + Usage control + Naudojimo kontrolė + + + Hide already used files + Slėpti jau naudotus failus + + + Size warnings + Įspėjimai dėl dydžio + + + Warn me when using files with a size exceeding: + Įspėkite mane, kai naudojate didesnio dydžio failus: + + + Logs folder + Žurnalų aplankas + + + Logs format string + Žurnalų formato eilutė + + + Format string + Formos eilutė + + + Insert the format string you're using + Įterpti naudojamą formato eilutę + + + Apply the current string + Pritaikyti dabartinę eilutę + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + + + Generate sample + Sugeneruoti mėginį + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Prašome patikrinti šios eilutės teisingumą. +Laukai, pažymėti kaip 'DISCARDED' gavo perskaityti teisingai, bet nėra laikomas LogDoctor + + + Open an help window + Open an help window + + + Help + Žinynas + + + Select a log field + Pasirinkite žurnalo lauką + + + Use warnlist for this field + Use warnlist for this field + + + Add the current line to the list + Pridėti esamą eilutę į sąrašą + + + Remove the selected item from the list + Pašalinti pažymėtą elementą iš sąrašo + + + Move the selected item down + NAME OF TRANSLATORS + + + Use blacklist for this field + Naudokite juodąjį sąrašą šiam laukui + + + Add line + Pridėti eilutę + + + Remove selection + Pašalinti žymėjimą + + + Language + Kalba + + + Utilities + Paslaugos + + + Tools + Įrankiai + + + Games + Žaidimai + + + Perform a version-check + Perform a version-check + + + Show some info about LogDoctor + Rodyti informaciją apie LogDoctor + + + Open a block-note like window to write temporary text + Open a block-note like window to write temporary text + + + Play CrissCross + Žaisti CrisCross + + + Play Snake + Groti gyvatę + + + Show the changelog + Rodyti changelog + + + warnlist + warnlist + + + blacklist + juodasis sąrašas + + + copy + kopija + + + copies + kopijos + + + Check updates + Patikrinti atnaujinimus + + + Infos + Infosas + + + BlockNote + Comment + + + CrissCross + CrisCross + + + Snake + Gyvatė + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Pasirinkite failą iš sąrašo + + + to inspect its content + tikrinti jo turinį + + + Failed to read + Nepavyko perskaityti + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klasikinis + + + Hunt + Hantas + + + Battle + Mūšis + + + Game Over + Žaidimas baigtas + + + Your adversary fell in the water! + Tavo priešas krito į vandenį! + + + YOU WON! + Tu nori! + + + You fell in the water! + Tu įkritai į vandenį! + + + YOU LOST! + Tu tyli! + + + Your adversary ate itself! + Tavo priešas pats suvalgė! + + + You ate yourself! + Tu valgei save! + + + Your adversary ate you! + Tavo priešininkas tave suėdė! + + + You ate your adversary! + Tu suėmei savo priešą! + + + You ate each other! + Tu valgei vienas kitą! + + + MATCH IS DRAW! + MAIŠAS BRAUTAS! + + + + TR + + Unexpected WebServer + Neigiama WebServer + + + Logs Size Breakdown + Rąstų dydžio suskirstymas + + + Ignored + Ignoruotas + + + Parsed + Parsed + + + Blacklisted + Name + + + Others + Kiti + + + from + nuo + + + to + iki + + + Log Lines Marked as Warning + Žurnalo eilutės pažymėtos kaip įspėjimas + + + Time Taken to Serve Requests + Time Taken to Serve Requests + + + Time of Day Count + Dienos skaičius + + + Relational Count + Santykių skaičius + + + FALSE + FALSE + + + TRUE + TITE + + + Date + Data + + + Year + Metai + + + Month + Mėnuo + + + Day + Diena + + + Time + Laikas + + + Hour + Valanda + + + Minute + minutė + + + Second + 2 + + + Warning + Įspėjimas + + + Protocol + Protokolas + + + Method + metodas + + + URI + URI + + + Query + NAME OF TRANSLATORS + + + Response code + atsakymo kodas + + + Time taken + Laikas + + + Bytes sent + Siunčiami baitai + + + Bytes received + Gauti baitai + + + Referrer + Skaitytojas + + + Cookie + Sausainiai + + + Client + Klientas + + + User-agent + Vartotojo agentas + + + January + Sausis + + + February + Vasaris + + + March + Kovas + + + April + Balandis + + + May + Gegužės mėn + + + June + Birželis + + + July + Liepa + + + August + Rugpjūtis + + + September + Rugsėjis + + + October + Spalis + + + November + Lapkritis + + + December + Gruodis + + + Sunday + Sekmadienis + + + Monday + pirmadienis + + + Tuesday + Antradienis + + + Wednesday + Trečiadienis + + + Thursday + Ketvirtadienis + + + Friday + Penktadienis + + + Saturday + Šeštadienis + + + diff --git a/logdoctor/translations/LogDoctor_lv_LA.ts b/logdoctor/translations/LogDoctor_lv_LA.ts new file mode 100644 index 0000000..9d38f11 --- /dev/null +++ b/logdoctor/translations/LogDoctor_lv_LA.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versijas + + + Version 4 + versija + + + Version 3 + versija + + + Version 2 + versija + + + Version 1 + versija + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Būvēt skriptus + + + Cross-platform compatibility: + Šķērsplatformu savietojamība: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistika: + + + Warnings + Brīdinājumi + + + Speed + Ātrums + + + Counts + Skaitļi + + + Daytime + Dienas laiks + + + Relational + Saistība + + + Globals + Globālie + + + Translations: + Tulkojumi: + + + Italian + Itāļu + + + Spanish + Spāņu + + + French + Franču + + + Tools: + Rīki: + + + Block note + Bloka piezīme + + + Utilities: + Komunālie pakalpojumi: + + + Infos viewer + Informācijas skatītājs + + + Updates checker + Atjaunina pārbaudītāju + + + Themes: + Tēmas: + + + Dark + Tumšs + + + Light + Gaišs + + + Improvements and fixes + Uzlabojumi un labojumi + + + New themes: + Jaunas tēmas: + + + Ash + Pelni + + + Candy + Saldumi + + + Forest + Mežs + + + Powder + Pulveris + + + Restyled GUI + Izmainīta saskarne + + + Restyled dialogs + Pārstilēti dialogi + + + Doxygen documentation + Dokumentācija + + + Mini-Games: + Mini- Games: + + + Criss-cross + Krusta krusts + + + Snake + Čūska + + + Changed default paths + Mainīti noklusētie ceļi + + + New game modes for Snake + Jauni spēles režīmi čūskai + + + Hunt + Medības + + + Battle + Kauja + + + New translations: + Jauni tulkojumi: + + + Japanese + Japānas + + + Portuguese + Portugāļu + + + Code improvements + Kodeksa uzlabojumi + + + Performance improvements + Darbības uzlabojumi + + + Added tests suite: + Papildu testi: + + + white box tests + baltās kastes testi + + + Customized charts themes + Pielāgotas karšu tēmas + + + Fixes + Fiksācijas + + + Tests improvements + Testu uzlabojumi + + + Docker support + Docker atbalsts + + + Upgrade to C++20 + Modernizācija uz C++20 + + + Upgrade to Qt6 + Modernizēt uz Qt6 + + + Restyled themes + Pārveidot tēmas + + + Redesigned configs section + Pārveidota konfigurācijas sadaļa + + + Stability improvements + Stabilitātes uzlabojumi + + + Generating warnings dinamically + Brīdinājumu ģenerēšana dinamiski + + + New tool: + Jauns rīks: + + + Changelog + Izmaiņu žurnāls + + + Tweakable parameters for some of the charts: + Mainīgi parametri dažām kartēm: + + + Improved project structure + Uzlabota projekta struktūra + + + Modernized Cmake usage + Modernizēts Make izmantošana + + + + Crapinfo + + Version + Versija + + + Currently installed version of the software + Šobrīd instalētā programmatūras versija + + + Repository links + Krātuves saites + + + Paths + Ceļš + + + The path of the executable file + Ceļš uz izpildāmo failu + + + Executable + Izpildāmais + + + The path where the configuration file gets saved and searched in + Ceļš, kurā tiek saglabāts un meklēts konfigurācijas fails + + + Configuration file + Konfigurācijas fails + + + The path where the application searches for extra resources + Ceļš, kur programma meklē papildus resursus + + + Application data + Lietotnes dati + + + + Crapnote + + Reduce the font size + Samazināt fonta izmēru + + + Font size + Fonta izmērs + + + Increase the font size + Palielināt fonta izmēru + + + + Crappath + + Choose + Izvēlēties + + + Cancel + Atcelt + + + + Crapup + + Checking for updates + Meklē atjauninājumus + + + New version available + Pieejama jauna versija + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Ir pieejama jauna versija! +Lūdzu, apmeklējiet LogDoctor git repozitoriju un izpildiet norādījumus par to, kā atjaunināt + + + No update found + Nav atrasta atjaunināšana + + + LogDoctor is up-to-date + LogDoctor ir atjaunināts + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Tu vadi versiju no nākotnes! +Jūsu versija ir ārpus pašreizējās augšpusējās versijas +Vai tu vadi oriģinālu LogDoctor? +Lūdzu, apmeklējiet LogDoctor krātuvi un saņemiet jaunu tās versiju + + + Failed to establish a connection + Neizdevās izveidot savienojumu + + + Connection error, please try again later + Savienojuma kļūda, lūdzu mēģiniet vēlāk vēlreiz + + + Connection timed out + Savienojums noildzis + + + Version check failed + Versijas pārbaude neveiksmīga + + + An error occured while parsing: +version mark not found + Gadījās kļūda analizējot: +versijas zīme nav atrasta + + + An error occured while parsing: +malformed version + Gadījās kļūda analizējot: +Bojāta versija + + + An error occured while comparing: +malformed upstream version + Gadījās kļūda salīdzinot: +Bojāta augšpusēja versija + + + + CrissCross + + Victory + Uzvara + + + You beated me! + Tu mani siti! + + + This time you lost! + Šoreiz tu zaudēji! + + + Draw + Zīmēt + + + Nice match + Jauka sakritība + + + + DialogBool + + Yes + + + + No + + + + + DialogIda + + Ignore + Ignorēt + + + Discard + Izmest + + + Abort + Pārtraukt + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Viens no sarakstiem nav derīgs + + + An error occured while reading the configuration file + Gadījās kļūda lasot konfigurācijas failu + + + An error occured while parsing configuration file's data + Gadījās kļūda analizējot konfigurācijas faila datus + + + Failed to create the configuration file's directory + Neizdevās izveidot konfigurācijas faila mapi + + + Failed to create the configuration file + Neizdevās izveidot konfigurācijas failu + + + An error occured while writing the configuration file + Kļūda rakstot konfigurācijas failu + + + An error occured while preparing the configuration file's data + Kļūda sagatavojot konfigurācijas faila datus + + + The path contains a symlink + Ceļš satur simlinku + + + The file does not exist + Fails neeksistē + + + Failed to create the database backups' directory + Neizdevās izveidot datubāzes rezerves kopiju mapi + + + Failed to copy the database file + Neizdevās kopēt datubāzes failu + + + Failed to update the backups + Neizdevās atjaunināt rezerves kopijas + + + Failed to create the directory + Neizdevās izveidot mapi + + + Unrecognized entry + Neatpazīts ieraksts + + + Size of the file + Faila izmērs + + + Warning size parameter + Brīdinājuma izmēra parametrs + + + Failed to read gzipped file + Neizdevās nolasīt gziped failu + + + An error occured while parsing the format string + Gadījās kļūda analizējot formāta virkni + + + Available memory + Pieejamā atmiņa + + + Size of the logs + Logu izmērs + + + An error occured while reading the gzipped file + Gadījās kļūda lasot gzipped failu + + + An error occured while reading the file + Gadījās kļūda lasot failu + + + Something failed while handling the file + Strādājot ar failu, kaut kas neizdevās + + + An error occured while working on the database + Gadījās kļūda strādājot datubāzē + + + Aborting + Pārtrauc + + + Invalid locale + Nederīga lokalizācija + + + Unexpected locale format + Negaidīts lokalizācijas formāts + + + If you haven't manually edited the configuration file, +please report this issue + Ja neesat manuāli rediģējis konfigurācijas failu, +Lūdzu, ziņojiet par šo jautājumu + + + The given locale is not an accepted language + Norādītā locale nav pieņemama valoda + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Ja vēlaties, lai šī lokalizācija būtu Logdoktorā, +Lūdzu, izpildiet norādījumus repozitorija lapā + + + Configuration file not found + Konfigurācijas fails nav atrasts + + + Unable to retrieve the configuration file + Neizdevās ielādēt konfigurācijas failu + + + Skipping + Izlaist + + + An error occured while handling the configuration file + kļūda strādājot ar konfigurācijas failu + + + Failed to write the configuration file + Neizdevās ierakstīt konfigurācijas failu + + + Current configuration not saved + Pašreizējā konfigurācija nav saglabāta + + + File not readable + Fails nav lasāms + + + The file is not readable + Fails nav lasāms + + + File not writable + Fails nav rakstāms + + + The file is not writable + Fails nav rakstāms + + + Directory not writable + Mape nav rakstāma + + + The directory is not writable + Mape nav rakstāma + + + Invalid path + Nederīgs ceļš + + + Failed applying configuration + Neizdevās piemērot konfigurāciju + + + Invalid configuration lines + Nederīgas konfigurācijas rindas + + + Has not been possible to apply some of the configurations + Nav bijis iespējams piemērot dažas konfigurācijas + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Ja izvēlaties turpināt, visas neizmantotās konfigurācijas tiks zaudētas +Turpināt? + + + Failed to retrieve the help file + Neizdevās iegūt palīdzības failu + + + An error occured while getting the help file + Kļūda saņemot palīdzības failu + + + Additional resources can be downloaded from the git repo + Papildu resursus var lejupielādēt no git repo + + + Unable to retrieve the file + Neizdevās ielādēt failu + + + Invalid string + Nederīga virkne + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Norādītā virkne nav derīga un nevar tikt pievienota sarakstam + +Lūdzu, izlabojiet to un vēlreiz + + + QSql driver not found + QSql draiveris nav atrasts + + + Failed to retrieve the driver needed to handle the database + Neizdevās ielādēt draiveri, kas nepieciešams datubāzes apstrādei + + + File not found + Fails nav atrasts + + + Failed to retrieve the database file + Neizdevās iegūt datubāzes failu + + + Create a new database? + Izveidot jaunu datubāzi? + + + The database contains an unexpected table + Datu bāze satur negaidītu tabulu + + + Unexpected table + Negaidīta tabula + + + It seems that the database is missing a table + Šķiet, ka datu bāzē trūkst tabulas + + + Table not found + Tabula nav atrasta + + + The database contains an unexpected column + Datubāze satur neparedzētu kolonnu + + + Unexpected column + Negaidīta kolonna + + + It seems that the table is missing a column + Šķiet, ka tabulā trūkst kolonnas + + + Column not found + Kolonna nav atrasta + + + A column has an unexpected data-type + Kolonnai ir negaidīts datu tips + + + Unexpected data-type + Negaidīts datu veids + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Šī datubāze tiks pārdēvēta ar trailing '. copy' un tiks izveidota jauna. +Turpināt? + + + Database created + Izveidota datubāze + + + Successfully created a new database + Veiksmīgi izveidota jauna datubāze + + + Not a file + Nav fails + + + The path was supposed to point to a file, but it doesn't + Ceļš bija domāts, lai norādītu uz failu, bet tas nav + + + Please remove the conflict and retry + Lūdzu, izņemiet konfliktu un vēlreiz mēģināt + + + The database file is not readable + Datubāzes fails nav lasāms + + + Please set the proper permissions and retry +If this error persists, please report this issue + Lūdzu, norādiet pienācīgas atļaujas un vēlreiz +Ja šī kļūda saglabājas, lūdzu ziņojiet par šo jautājumu + + + The database file is not writable + Datubāzes fails nav rakstāms + + + Invalid database path + Nederīgs datubāzes ceļš + + + Failed creating database + Neizdevās izveidot datubāzi + + + An error occured while creating the database + Gadījās kļūda veidojot datubāzi + + + Failed opening database + Neizdevās atvērt datubāzi + + + An error occured while opening the database + Gadījās kļūda atverot datubāzi + + + Failed executing on database + Neizdevās izpildīt datubāzē + + + An error occured while executing a statement on the database + Gadījās kļūda izpildot paziņojumu datubāzē + + + Failed to backup database + Neizdevās dublēt datubāzi + + + Please report this issue + Lūdzu ziņojiet par šo jautājumu + + + Invalid log format string + Nederīga žurnāla formāta virkne + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Lūdzu pārbaudiet, vai jūsu WebServer nav kļūdu +Ja to pieņem, lūdzu, pārbaudiet tīfa klātbūtni šeit +Ja viss ir labi, lūdzu, ziņojiet par šo jautājumu + + + Log format error + Žurnāla formāta kļūda + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Žurnāla formāts nav iestatīts vai ir nederīgs +Pievienojiet derīgu konfigurācijās + + + Misconfigured log format + Kļūdains žurnāla formāts + + + No log field has been set in the current logs format, +making it useless to parse logs + Nav žurnāla lauks ir iestatīts pašreizējā žurnālu formātā, +padarot to bezjēdzīgi, lai parse baļķi + + + Please set up a format which contains at least one field + Lūdzu izveidojiet formātu, kurā ir vismaz viens lauks + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Starp vienu vai vairākiem laukiem trūkst atdalītāja, +sarežģīt tīklu savienošanu, +un, iespējams, noved pie nepareizu datu glabāšanas + + + Please set up a format which contains separators between fields + Lūdzu iestatiet formātu, kas satur atdalītājus starp laukiem + + + Missing field in log format + Nav lauka žurnāla formātā + + + An important field is missing from the provided format: + Sniegtajā formātā trūkst svarīga lauka: + + + The quality of the statistics may be seriously compromized + Statistikas kvalitāti var nopietni kompromitēt + + + Proceed anyway? + Tik un tā turpināt? + + + 'Carriage Return' in log format + 'Karriage Return' žurnāla formātā + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Sniegtajā formātā ir "Karjeras atgriešanās". +Tas var izraisīt datu zudumus vai avārijas, ja netiek lietots piesardzīgi + + + An error occured while parsing logs + Gadījās kļūda analizējot žurnālus + + + Failed defining type + Neizdevās definēt tipu + + + Failed to determine the log type + Neizdevās noteikt žurnāla tipu + + + File already used + Fails jau izmantots + + + The file has probably been used already + Fails, iespējams, jau ir izmantots + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorēt brīdinājumu un izmantot to anyway, Izmest to un turpināt, vai pārtraukt visu procesu? + + + Duplicate file + Dublēt + + + The file appears twice in the list of selections + Fails atlases sarakstā parādās divas reizes + + + Failed updating hashes + Neizdevās atjaunināt hashes + + + An error occured while inserting the parsed files hashes into the database + Gadījās kļūda ievietojot parsētos failus datubāzē + + + File exceeds warning size + Fails pārsniedz brīdinājuma izmēru + + + The file's size exceeds the warning size + Faila izmērs pārsniedz brīdinājuma izmēru + + + Not enough memory + Nepietiek atmiņas + + + The total size of the selected files exceeds the available memory + Kopējais izvēlēto failu izmērs pārsniedz pieejamo atmiņu + + + Please free some resources, parse the files in different steps or split them into smaller units + Lūdzu atbrīvot dažus resursus, analizēt failus dažādos posmos vai sadalīt tos mazākās vienībās + + + Failed reading + Neizdevās nolasīt + + + File is empty + Fails ir tukšs + + + The file is blank + Fails ir tukšs + + + Failed to retrieve the selected file + Neizdevās iegūt izvēlēto failu + + + Discard it and continue, or Abort all and exit? + Izmest un turpināt, vai pārtraukt visu un iziet? + + + No file to parse + Nav faila, ko analizēt + + + The list of files to parse is empty + Parsējamo failu saraksts ir tukšs + + + Directory not found + Mape nav atrasta + + + The directory does not exists + Mape neeksistē + + + Directory not readable + Mape nav lasāma + + + The directory is not readable + Mape nav lasāma + + + Please set the proper permissions before to start + Lūdzu, iestatiet pareizas atļaujas, pirms sākt + + + Failed creating directory + Neizdevās izveidot mapi + + + The path does not exists + Ceļš nepastāv + + + Data conversion failed + Datu konvertēšana neizdevās + + + Failed to convert from '%1' to '%2' + Neizdevās pārveidot no '%1' uz '%2' + + + Failed to create statistics + Neizdevās izveidot statistiku + + + An error occured while processing + Gadījās kļūda apstrādājot + + + Cannot create statistics + Nevar izveidot statistiku + + + No data has been found that matches with the currently set parameters + Netika atrasti dati, kas atbilstu šobrīd iestatītajiem parametriem + + + Not a folder + Nav mape + + + The path was supposed to point to a folder, but it doesn't + Ceļš bija paredzēts, lai norādītu uz mapi, bet tas nav + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Ieraksts tiks pārdēvēts ar trailing '.copy' un tiks izveidots jauns. +Turpināt? + + + An error occured + Gadījās kļūda + + + Failed renaming + Neizdevās pārdēvēt + + + An error occured while renaming + Gadījās kļūda pārdēvējot + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parsēt žurnālus no Apache2 tīmekļa servera + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parsēt žurnālus no Nginx tīmekļa servera + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parsēt žurnālus no Microsoft IIS tīmekļa servera + + + IIS + IIS + + + Select/deselect all the files + Izvēlieties/izvēlieties visus failus + + + All + Visi + + + Inspect a log file + Aplūkot žurnāla failu + + + Name + Nosaukums + + + Size + Izmērs + + + Refresh the list + Atsvaidzināt sarakstu + + + Total size of the parsed data + Parsēto datu kopējais apjoms + + + Total number of parsed lines + Parsēto rindu kopskaits + + + Start parsing the selected files + Sākt izvēlēto failu parsēšanu + + + START + SĀKUMS + + + Time elapsed since the start + Laiks kopš sākuma + + + Average speed, in parsed data size per second + Vidējais ātrums, parsētā datu izmērā sekundē + + + Web Server + Tīmekļa serveris + + + Select a Web Server + Izvēlieties tīmekļa serveri + + + Year + Gads + + + Month + Mēnesis + + + Day + Diena + + + Hour + Stunda + + + Draw the chart + Zīmēt tabulu + + + Log line marked as Warning + Žurnāla rinda atzīmēta kā brīdinājums + + + Date when the request arrived (YYYY-MM-DD) + Datums, kad saņemts pieprasījums (GGGG-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Pieprasījuma ierašanās laiks (hh:mm:ss) + + + Protocol of the request + Pieprasījuma protokols + + + Method of the request + Pieprasījuma veids + + + URI of the requested page + Pieprasītās lapas URI + + + Query carried along with the URI + Vaicājums, ko ved kopā ar URI + + + Response code from the server + Servera atbildes kods + + + User-agent of the client which made the request + Klienta, kas iesniedzis pieprasījumu, lietotāja aģents + + + IP address of the Client which made the request + Tā Klienta IP adrese, kurš iesniedzis pieprasījumu + + + Cookie used for the request + Pieprasījumam izmantotā sīkdatne + + + The URL which redirected the Client to the requested page + URL, kas pāradresēja klientu uz pieprasīto lapu + + + Size ib Bytes of the request, usually includes header and data + Izmērs ib pieprasījuma baiti, parasti ietver galvenes un datus + + + Size in Bytes of the served content, usually includes header and data + Apkalpotā satura baitos izmērs parasti ietver galvenes un datus + + + Time taken by the server to serve the content, in milliseconds + Servera patērētais laiks, lai apkalpotu saturu, milisekundēs + + + Only use lines in which the field is starting with this string + Lietot tikai rindas, kurās lauks sākas ar šo rindu + + + Protocol: + Protokols: + + + Method: + Metode: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Izmantojiet tikai rindas, kurās lauks atbilst šim apgalvojumam. +Izmantojiet '!', '=', '<' vai '>', lai paziņotu, ko izmantot + + + Response: + Atbilde: + + + Query: + Vaicājums: + + + URI: + URI: + + + Filters + Filtri + + + Count + Skaits + + + Number of occurrences + Atgadījumu skaits + + + Item + Postenis + + + Value of the field + Lauka vērtība + + + From: + No: + + + To: + Kam: + + + Select a log field to view + Izvēlieties skatāmo žurnāla lauku + + + Field: + Lauks: + + + Filter: + Filtrs: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Ar virknēm tiks izmantotas tikai tās rindas, kurās lauks sākas ar šo virkni. +Ar skaitļiem izmantojiet '!', '=', '<' vai '>', lai paziņotu, ko izmantot + + + Protocol + Protokols + + + Method + Metode + + + URI + URI + + + User-agent + Lietotāja aģents + + + Most recurrent + Visbiežāk + + + Most trafficked + Lielākā daļa pārdoto + + + Date ever + Datums jebkad + + + Day of the week + Nedēļas diena + + + Hour of the day + Dienas stunda + + + Time taken + Laiks + + + Bytes sent + Nosūtītie baiti + + + Bytes received + Saņemtie baiti + + + Mean/Max performances + Vidējais/maksimālais sniegums + + + Requests received + Saņemtie pieprasījumi + + + Total work + Kopējais darbs + + + General + Pamata + + + Window + Logs + + + Dialogs + Dialogi + + + Charts + Diagrammas + + + Appearance + Izskats + + + Speed + Ātrums + + + Relational + Saistība + + + TextBrowser + Teksta pārlūks + + + Databases + Datu bāzes + + + Security + Drošība + + + Logs + Žurnāli + + + Defaults + Noklusētie + + + Control + Kontrole + + + Path + Ceļš + + + Format + Formāts + + + Warnlists + Brīžu saraksts + + + Blacklists + Melnie saraksti + + + Remember the window's position and size + Atcerēties loga novietojumu un izmēru + + + Remember position and size + Atcerēties pozīciju un izmēru + + + Remember window's position and size + Atcerēties loga novietojumu un izmēru + + + Geometry + Ģeometrija + + + Theme to use for the window + Loga tēma + + + Theme + Tēma + + + Native + Vietējais iedzīvotājs + + + Light + Gaišs + + + Dark + Tumšs + + + Auto + Auto + + + Icons + Ikonas + + + Normal quantity of dialog messages shown + Normāls dialoga ziņojumu daudzums + + + Normal + Normāls + + + Dialogs from the main processes + Dialogi no galvenajiem procesiem + + + Dialogs emitted when parsing logs + Logi, kas tiek emitēti, analizējot žurnālus + + + Logs parser + Žurnālu parsētājs + + + Dialogs emitted when viewing statistics + Logi, kas tiek emitēti skatīšanās statistikā + + + Statistics viewer + Statistikas skatītājs + + + Define the quantity of dialog mesages shown + Definēt dialoglodziņu skaitu + + + Dialogs level + Dialogu līmenis + + + Reduced quantity of dialog messages shown + Samazināts dialoga vēstuļu daudzums + + + Essential + Būtiska + + + Augmented quantity of dialog messages shown + Palielināts dialoga ziņojumu skaits + + + Explanatory + Paskaidrojums + + + Theme to use for the Charts + Tēma, ko izmantot kartēm + + + Preview + Priekšskatījums + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Atveido soli laika asī, sekundēs. +Visas vērtības, kas ietilpst vienā intervālā, tiks apvienotas un tiks izmantota vidējā vērtība. + + + Time interval + Laika intervāls + + + The format to use for the labels of the time axis. + Laika ass marķējumam izmantojamais formāts. + + + Time format + Laika formāts + + + The size of the pie + Pīrāga lielums + + + Pie size + Maisa izmērs + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Maksimālais šķēļu skaits, no kuras sastāvēs pīrāgs. +pārsniedz šķēles tiks sagrupētas vienā visaptverošā šķēlē. + + + Maximum slices + Maksimālās šķēles + + + Font to use for the Text Browser + Teksta pārlūka fonts + + + Font + Fonts + + + Double-spaced lines + Dubultatstarpes + + + Use wide lines + Lietot platas līnijas + + + Define the spacing between lines + Definēt atstarpi starp līnijām + + + Lines spacing + Atstatums starp līnijām + + + None + Nav + + + Color scheme to use for the Text Browser + Teksta pārlūka krāsu shēma + + + Color scheme + Krāsu shēma + + + The appearance of the Text Browser with the current settings + Teksta pārlūka izskats ar pašreizējiem iestatījumiem + + + Insert the base path only, file name excluded + Ievietot tikai bāzes ceļu, izslēgts faila nosaukums + + + The given path doen't exists, or doesn't point to a folder + Dotais ceļš neeksistē vai nenorāda uz mapi + + + Path for the database files + Ceļš datubāzes failiem + + + Paths + Ceļš + + + Apply the current path + Pielietot pašreizējo ceļu + + + Select the path through a dialog window + Izvēlieties ceļu caur dialoga logu + + + Path where the logs data collection database is located + Ceļš, kur atrodas žurnāla datu vākšanas datubāze + + + Logs data + Žurnālu dati + + + Path where the used files hashes database is located + Ceļš, kur atrodas izmantotā failu kontrolsaraksta datubāze + + + Used files + Izmantotie faili + + + Backup options for the Logs Data database + Žurnālu datu datubāzes rezerves kopēšanas opcijas + + + Backups + Rezerves + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Jauna rezerves kopija tiek veikta aizverot LogDoctor pēc veiksmīgas datubāzes rediģēšanasName + + + Backup the Logs Data database and keep + Kopē žurnālu datu datubāzi un saglabā + + + Whether it is allowed or denied to follow symlinks occuring in a path + Vai ir atļauts vai nav liegts sekot simlinkiem, kas notiek ceļā + + + Follow symlinks + Sekot simsaites + + + Default WebServer + Noklusētais WebServer + + + Usage control + Lietošanas kontrole + + + Hide already used files + Slēpt jau izmantotos failus + + + Size warnings + Brīdinājumi par izmēru + + + Warn me when using files with a size exceeding: + Brīdināt mani, lietojot failus, kuru izmērs pārsniedz: + + + Logs folder + Žurnālu mape + + + Logs format string + Žurnālu formāta virkne + + + Format string + Formāta virkne + + + Insert the format string you're using + Iespraust Tabulu + + + Apply the current string + Pielietot aktīvo virkni + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Ģenerēt paraugu žurnāla rindu no šobrīd saglabātās virknes, lai pārbaudītu, vai tas tiek pareizi formatēts. +Jebkurš lauks, ko logDoctor neuzskata, parādīsies kā 'DISCARDED' + + + Generate sample + Vispārējs + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Lūdzu, pārbaudiet šīs rindas pareizību. +Lauki, kas atzīmēti kā 'DISCARDED' tika parsēti pareizi, bet logDoctor tos neuzskata + + + Open an help window + Atveriet palīdzības logu + + + Help + Palīdzība + + + Select a log field + Izvēlieties žurnāla lauku + + + Use warnlist for this field + Lietot šajā laukā brīdinājumu sarakstu + + + Add the current line to the list + Pievienot pašreizējo rindu sarakstam + + + Remove the selected item from the list + Izņemt izvēlēto ierakstu no saraksta + + + Move the selected item down + Pārvietot izvēlēto vienību uz leju + + + Use blacklist for this field + Lietot melno sarakstu šim laukam + + + Add line + Pievienot rindu + + + Remove selection + Izņemt izvēlēto + + + Language + Valoda + + + Utilities + Komunālie pakalpojumi + + + Tools + Rīki + + + Games + Spēles + + + Perform a version-check + Veikt versiju pārbaudi + + + Show some info about LogDoctor + Rādīt informāciju par LogDoctor + + + Open a block-note like window to write temporary text + Atveriet bloknoti kā logu pagaidu teksta rakstīšanai + + + Play CrissCross + Spēlēt CrissCross + + + Play Snake + Spēlēt čūsku + + + Show the changelog + Rādīt izmaiņu žurnālu + + + warnlist + brīdinājuma saraksts + + + blacklist + melnais saraksts + + + copy + eksemplārs + + + copies + kopijas + + + Check updates + Pārbaudīt atjauninājumus + + + Infos + Informācija + + + BlockNote + BlokNote + + + CrissCross + CrissCross + + + Snake + Čūska + + + Changelog + Izmaiņu žurnāls + + + + RichText + + Select a file from the list + Izvēlieties failu no saraksta + + + to inspect its content + pārbaudīt tā saturu + + + Failed to read + Neizdevās nolasīt + + + + SnakeGame + + PLAY + Spēlēt + + + Classic + Classic + + + Hunt + Medības + + + Battle + Kauja + + + Game Over + Spēle beigusies + + + Your adversary fell in the water! + Tavs pretinieks nokrita ūdenī! + + + YOU WON! + JŪS ESAT! + + + You fell in the water! + Tu nokriti ūdenī! + + + YOU LOST! + MĪLESTĪBA! + + + Your adversary ate itself! + Jūsu pretinieks ēda pats sevi! + + + You ate yourself! + Tu ēdi sevi! + + + Your adversary ate you! + Pretinieks tevi apēda! + + + You ate your adversary! + Tu ēdi savu pretinieku! + + + You ate each other! + Tu ēdi viens otru! + + + MATCH IS DRAW! + MAČS IR DRAW! + + + + TR + + Unexpected WebServer + Negaidīts tīmekļa serveris + + + Logs Size Breakdown + Žurnālu izmērs sadalījums + + + Ignored + Ignorēts + + + Parsed + Parsēts + + + Blacklisted + Melns + + + Others + Citi + + + from + No + + + to + līdz + + + Log Lines Marked as Warning + Žurnāla rindas atzīmētas kā brīdinājums + + + Time Taken to Serve Requests + Laiks, kas nepieciešams, lai kalpotu Dievam + + + Time of Day Count + Dienas laiks + + + Relational Count + Attiecību skaits + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + Datums + + + Year + Gads + + + Month + Mēnesis + + + Day + Diena + + + Time + Laiks + + + Hour + Stunda + + + Minute + Minūte + + + Second + Otrā + + + Warning + Brīdinājums + + + Protocol + Protokols + + + Method + Metode + + + URI + URI + + + Query + Vaicājums + + + Response code + Atbildes kods + + + Time taken + Laiks + + + Bytes sent + Nosūtītie baiti + + + Bytes received + Saņemtie baiti + + + Referrer + Atzinuma pieprasītājs + + + Cookie + Sīkdatnes + + + Client + Klients + + + User-agent + Lietotāja aģents + + + January + Janvāris + + + February + Februāris + + + March + Marts + + + April + Aprīlis + + + May + Maijs + + + June + Jūnijs + + + July + Jūlijs + + + August + Augusts + + + September + Septembris + + + October + Oktobris + + + November + Novembris + + + December + Decembris + + + Sunday + Svētdiena + + + Monday + Pirmdiena + + + Tuesday + Otrdiena + + + Wednesday + Trešdiena + + + Thursday + Ceturtdiena + + + Friday + Piektdiena + + + Saturday + Sestdiena + + + diff --git a/logdoctor/translations/LogDoctor_ms_MA.ts b/logdoctor/translations/LogDoctor_ms_MA.ts new file mode 100644 index 0000000..47971e0 --- /dev/null +++ b/logdoctor/translations/LogDoctor_ms_MA.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versi + + + Version 4 + Versi 4 + + + Version 3 + Versi 3 + + + Version 2 + Versi 2 + + + Version 1 + Versi 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Skrip Build + + + Cross-platform compatibility: + Keserasian lintas platform: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistik: + + + Warnings + Amaran + + + Speed + Kelajuan + + + Counts + Counts + + + Daytime + Hari Hari Ini + + + Relational + Hubungan + + + Globals + Spanyol + + + Translations: + Terjemahan Terjemahan Terjemahan: + + + Italian + Italia + + + Spanish + Spanyol + + + French + Perancis + + + Tools: + Alat-alat: + + + Block note + Catatan blok ologo + + + Utilities: + Utilitas: + + + Infos viewer + Pelihat biodata + + + Updates checker + Pemeriksa Update FBI + + + Themes: + Tema: + + + Dark + Kegelapan + + + Light + Terang + + + Improvements and fixes + Peningkatan dan perbaikan + + + New themes: + Tema ikon baru: + + + Ash + ash + + + Candy + Gula-gula + + + Forest + Hutan + + + Powder + Powder + + + Restyled GUI + GUI Restyled + + + Restyled dialogs + dialog Restyle + + + Doxygen documentation + Dokumentasi XDoxygen + + + Mini-Games: + permainan-mini: + + + Criss-cross + Criss-cross + + + Snake + Ular + + + Changed default paths + Laluan default berubah + + + New game modes for Snake + Mode permainan baru untuk Snake + + + Hunt + Perancis + + + Battle + Pertempuran + + + New translations: + Terjemahan baru: + + + Japanese + Jepang + + + Portuguese + Portugis + + + Code improvements + Peningkatan Kode code AWAS + + + Performance improvements + Perbaikan Kinerja Kinerja + + + Added tests suite: + Suite tes tambahan: + + + white box tests + Tes kotak putih + + + Customized charts themes + Tema-tema grafik terkustomisasi + + + Fixes + Fixes + + + Tests improvements + Peningkatan uji klinis + + + Docker support + Dukungan Docker + + + Upgrade to C++20 + Funding ke C++20 + + + Upgrade to Qt6 + Upgrade ke Qt6 + + + Restyled themes + Tema-tema bergaya ulang + + + Redesigned configs section + Bagian konfigurasi dirancang ulang + + + Stability improvements + Peningkatan Stabilitas + + + Generating warnings dinamically + Mengancamkan peringatan yang menakjubkan + + + New tool: + Alat baru: + + + Changelog + Entri Changelog + + + Tweakable parameters for some of the charts: + Parameter yang menarik untuk beberapa grafik: + + + Improved project structure + Struktur proyek ditingkatkan + + + Modernized Cmake usage + Dimodernisasi Penggunaan Cmake + + + + Crapinfo + + Version + Versi + + + Currently installed version of the software + Anjuta saat ini memasang versi perangkat lunak + + + Repository links + link repositori + + + Paths + Path + + + The path of the executable file + Jalur dari berkas yang dapat dieksekusi + + + Executable + Boleh Dilaksanakan + + + The path where the configuration file gets saved and searched in + Jalur dimana berkas konfigurasi disimpan dan dicari + + + Configuration file + Berkas konfigurasi profil + + + The path where the application searches for extra resources + Jalur dimana aplikasi mencari sumber daya tambahan + + + Application data + Data aplikasi + + + + Crapnote + + Reduce the font size + Kurangkan ukuran font + + + Font size + Ukuran font Ufuk + + + Increase the font size + Besarkan ukuran font + + + + Crappath + + Choose + Pilih + + + Cancel + Batal + + + + Crapup + + Checking for updates + Memeriksa pemutakhiran + + + New version available + Versi baru yang tersedia + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Versi baru tersedia! +Silakan kunjungi repositori git LogDoctor dan ikuti instruksi tentang bagaimana melakukan pembaruan + + + No update found + Tak ditemukan pemutakhiran + + + LogDoctor is up-to-date + LogDoktor terkini + + + :/ + -/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Kau menjalankan versi dari masa depan! +Versi Anda jauh dari versi hulu saat ini +Apa kau menjalankan LogDoctor asli? +Sila kunjungi repositori LogDoctor dan dapatkan versi baru darinya + + + Failed to establish a connection + Gagal menjalin sambungan + + + Connection error, please try again later + Sambungan error, silakan coba lagi nanti + + + Connection timed out + Sambungan '%s' kehabisan waktu + + + Version check failed + Gagal memeriksa Versi Versi Versi + + + An error occured while parsing: +version mark not found + Kesalahan yang terjadi ketika parsing: +Tanda versi tidak ditemukan + + + An error occured while parsing: +malformed version + Kesalahan yang terjadi ketika parsing: +versi cacat + + + An error occured while comparing: +malformed upstream version + Kesalahan terjadi ketika membandingkan: +Versi hulu cacat rupaf + + + + CrissCross + + Victory + Victory + + + You beated me! + Kau mengancamku! + + + This time you lost! + Kali ini kau kalah! + + + Draw + Lukis + + + Nice match + Pertandingan yang bagus + + + + DialogBool + + Yes + Ya + + + No + Tidak + + + + DialogIda + + Ignore + Abaikan + + + Discard + Discard + + + Abort + Batal + + + + DialogMsg + + Ok + ♪ Ok Ok ♪ + + + + DialogSec + + One of the lists has an invalid item + Salah satu daftar memiliki item tidak sah + + + An error occured while reading the configuration file + Kesalahan gnoza terjadi ketika membaca berkas konfigurasi + + + An error occured while parsing configuration file's data + Kesalahan gongori terjadi ketika menghurai data berkas konfigurasi + + + Failed to create the configuration file's directory + Gagal untuk membuat direktori berkas konfigurasi + + + Failed to create the configuration file + Gagal untuk membuat berkas konfigurasi + + + An error occured while writing the configuration file + Kesalahan gongori terjadi ketika menulis berkas konfigurasi + + + An error occured while preparing the configuration file's data + Kesalahan phylin terjadi ketika mempersiapkan data berkas konfigurasi + + + The path contains a symlink + Jalur tersebut berisi pautan simbolik + + + The file does not exist + Berkas tidak ada + + + Failed to create the database backups' directory + Gagal membuat direktori backup pangkalan data + + + Failed to copy the database file + Gagal menyalin berkas basis data + + + Failed to update the backups + Gagal memutakhirkan backup + + + Failed to create the directory + Gagal membuat direktori + + + Unrecognized entry + Entri tak dikenal + + + Size of the file + Ukuran file + + + Warning size parameter + Parameter ukuran peringatan away + + + Failed to read gzipped file + Gagal membaca file zipped + + + An error occured while parsing the format string + Kesalahan gnonia terjadi ketika menghurai format string + + + Available memory + Memori tersedia available + + + Size of the logs + Ukuran log + + + An error occured while reading the gzipped file + Kesalahan gondok terjadi ketika membaca berkas gitped + + + An error occured while reading the file + Kesalahan yang terjadi ketika membaca file + + + Something failed while handling the file + Sesuatu yang gagal ketika menangani file + + + An error occured while working on the database + Kesalahan yang terjadi ketika mengerjakan database + + + Aborting + Membatalkan + + + Invalid locale + Lokal tidak sah + + + Unexpected locale format + Format locale tidak terduga PGP + + + If you haven't manually edited the configuration file, +please report this issue + Jika anda belum menyunting berkas konfigurasi secara manual, +Sila laporkan isu ini + + + The given locale is not an accepted language + Bahasa lokal yang diberikan bukanlah bahasa yang diterima + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Jika Anda ingin memiliki lokal ini di LogDoctor, +Sila ikuti arahan di halaman repositori + + + Configuration file not found + Berkas konfigurasi gagal ditemukan + + + Unable to retrieve the configuration file + Tidak dapat diambil file konfigurasi + + + Skipping + Melangkahkan + + + An error occured while handling the configuration file + Kesalahan morfida terjadi ketika menangani berkas konfigurasi + + + Failed to write the configuration file + Gagal menulis berkas konfigurasi + + + Current configuration not saved + Konfigurasi Alfa saat ini tidak disimpan + + + File not readable + Berkas lemagon tidak dapat dibaca + + + The file is not readable + Berkas ini tidak dapat dibaca + + + File not writable + Fail tidak boleh tulis + + + The file is not writable + Berkas ini tidak boleh ditulis + + + Directory not writable + Direktori tidak boleh ditulis + + + The directory is not writable + Direktori tidak boleh ditulis + + + Invalid path + Path tidak sah + + + Failed applying configuration + Gagal menerapkan konfigurasi + + + Invalid configuration lines + Garis konfigurasi tidak sah + + + Has not been possible to apply some of the configurations + Telah tidak memungkinkan untuk menerapkan beberapa konfigurasi + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Jika Anda memilih untuk melanjutkan, semua konfigurasi yang tidak diterapkan akan hilang +Lanjutkan? + + + Failed to retrieve the help file + Gagal mendapatkan kembali file bantuan + + + An error occured while getting the help file + Kesalahan yang terjadi ketika mendapatkan file bantuan + + + Additional resources can be downloaded from the git repo + Sumber daya tambahan yang dapat diunduh dari repo git + + + Unable to retrieve the file + Tidak dapat mengambil file + + + Invalid string + untaian tidak sah + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + rentetan yang diberikan tidak sah dan tidak dapat ditambahkan ke daftar + +Tolong perbaiki dan coba lagi + + + QSql driver not found + Driver QSql tidak ditemukan + + + Failed to retrieve the driver needed to handle the database + Gagal mendapatkan kembali driver yang diperlukan untuk menangani database + + + File not found + Berkas tidak ditemukan + + + Failed to retrieve the database file + Gagal mendapatkan kembali berkas basis data + + + Create a new database? + Kau membuat database baru? + + + The database contains an unexpected table + Basis data ini berisi tabel yang tak terduga + + + Unexpected table + Tabel tidak dijangkakan ditak diduga + + + It seems that the database is missing a table + Tampaknya database kehilangan meja + + + Table not found + Tabel madya tidak ditemukan + + + The database contains an unexpected column + Basis data ini berisi kolom yang tidak terduga + + + Unexpected column + Kolom Tak Terduga Penggubah + + + It seems that the table is missing a column + Tampaknya tabel kehilangan kolom + + + Column not found + Kolum tidak ditemukan + + + A column has an unexpected data-type + Kolom A memiliki tipe-data yang tak terduga + + + Unexpected data-type + Data-type tidak terduga mentak didugafig + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Pangkalan data ini akan diganti namanya dengan '.copy' dan yang baru akan dibuat. +Lanjutkan? + + + Database created + Pangkalan data dibuat + + + Successfully created a new database + Telah berhasil membuat basis data baru + + + Not a file + Bukan berkas + + + The path was supposed to point to a file, but it doesn't + Jalur seharusnya menunjuk ke file, tapi tidak + + + Please remove the conflict and retry + Sila hapus konflik dan coba lagi + + + The database file is not readable + Berkas basis data tidak dapat dibaca + + + Please set the proper permissions and retry +If this error persists, please report this issue + Tolong atur hak akses dan coba lagi +Jika kesalahan ini berlanjut, harap laporkan masalah ini + + + The database file is not writable + Berkas pangkalan data ketakdapatan tidak boleh ditulis + + + Invalid database path + Path pangkalan data tidak sah + + + Failed creating database + Gagal membuat basis data + + + An error occured while creating the database + Kesalahan terjadi ketika membuat basis data + + + Failed opening database + Gagal membuka database + + + An error occured while opening the database + Kesalahan yang terjadi ketika membuka basis data + + + Failed executing on database + Gagal melaksanakan pada pangkalan data + + + An error occured while executing a statement on the database + Kesalahan gonoid terjadi ketika mengeksekusi pernyataan di basis data + + + Failed to backup database + Gagal untuk backup database + + + Please report this issue + Sila laporkan isu ini + + + Invalid log format string + Rentetan format log tidak sah + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Tolong periksa bahwa tidak ada kesalahan yang dilemparkan oleh WebServer Anda +Jika diterima, tolong periksa keberadaan ketik di sini. +Jika semuanya baik-baik saja, tolong laporkan masalah ini + + + Log format error + Kesalahan format log + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Format log belum ditetapkan, atau tidak sah +** Harap tambah yang valid pada konfigurasi ** + + + Misconfigured log format + Format log salah konfigurasi + + + No log field has been set in the current logs format, +making it useless to parse logs + Tidak ada log field telah ditetapkan dalam format log saat ini, +Ke log + + + Please set up a format which contains at least one field + Sila tetapkan format yang sekurang-kurangnya memuat satu medan + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Pemisah pemisah hilang antara satu atau lebih bidang, +Membuatnya sulit untuk menetapkan batas bersih, +dan mungkin mengarah ke penyimpanan data yang salah + + + Please set up a format which contains separators between fields + Sila tetapkan format yang berisi pemisah antar ruas + + + Missing field in log format + Field hilang pada format log + + + An important field is missing from the provided format: + Sebuah bidang penting hilang dari format yang disediakan: + + + The quality of the statistics may be seriously compromized + Kualitas statistik mungkin serius dikompromikan + + + Proceed anyway? + Lanjutkan? + + + 'Carriage Return' in log format + 'Kembali Carriage' dalam format log + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Format yang disediakan berisi 'Pengembaraan Kembali'. +Ini mungkin menyebabkan kerugian data atau kecelakaan jika tidak digunakan dengan hati-hati + + + An error occured while parsing logs + Ralat terjadi ketika mengurai log + + + Failed defining type + Gagal mendefinisikan tipe + + + Failed to determine the log type + Gagal menentukan jenis log + + + File already used + Berkas afforder sudah digunakan + + + The file has probably been used already + Berkas mungkin sudah digunakan + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Abaikan peringatan dan menggunakannya, abaikan dan lanjutkan, atau batalkan seluruh proses? + + + Duplicate file + Duplikasi berkas + + + The file appears twice in the list of selections + Berkas tersebut muncul dua kali dalam daftar pemilihan + + + Failed updating hashes + Gagal memperbarui hashes + + + An error occured while inserting the parsed files hashes into the database + Kesalahan gongori terjadi ketika memasukkan file terurai hashes ke dalam database + + + File exceeds warning size + Berkas melebihi ukuran peringatan + + + The file's size exceeds the warning size + Ukuran berkas ini melebihi ukuran peringatan + + + Not enough memory + Memori tidak cukup + + + The total size of the selected files exceeds the available memory + ukuran total dari berkas terpilih melebihi memori yang tersedia + + + Please free some resources, parse the files in different steps or split them into smaller units + Tolong bebaskan beberapa sumber daya, uraikan file dalam langkah yang berbeda atau bagi mereka ke dalam unit yang lebih kecil + + + Failed reading + Gagal membaca + + + File is empty + Berkas fardin kosong + + + The file is blank + Berkasnya kosong + + + Failed to retrieve the selected file + Gagal mendapatkan kembali fail yang dipilih + + + Discard it and continue, or Abort all and exit? + Abaikan dan lanjutkan, atau batalkan semua dan keluar? + + + No file to parse + Tidak ada file untuk di-parse + + + The list of files to parse is empty + Senarai fail yang akan dihurai adalah kosong + + + Directory not found + Direktori tidak ditemukan + + + The directory does not exists + Direktori tidak ada + + + Directory not readable + Direktori tidak dapat dibaca + + + The directory is not readable + Direktori tidak dapat dibaca + + + Please set the proper permissions before to start + Silakan tetapkan hak akses sebelum memulai + + + Failed creating directory + Gagal membuat direktori + + + The path does not exists + Jalan tidak ada + + + Data conversion failed + konversi data gagal + + + Failed to convert from '%1' to '%2' + Gagal konversi dari '%1' ke '%2' + + + Failed to create statistics + Gagal membuat statistik + + + An error occured while processing + Kesalahan terjadi ketika memproses + + + Cannot create statistics + Tidak dapat membuat statistik + + + No data has been found that matches with the currently set parameters + Tidak ada data yang ditemukan yang cocok dengan parameter yang kini ditetapkan + + + Not a folder + Tidak ada folder + + + The path was supposed to point to a folder, but it doesn't + Jalur seharusnya menunjuk ke folder, tapi tidak + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Entri akan diganti namanya dengan '.copy' dan yang baru akan dibuat. +Lanjutkan? + + + An error occured + Kesalahan yang terjadi + + + Failed renaming + Gagal menamakan semula + + + An error occured while renaming + Kesalahan terjadi ketika mengganti nama + + + + GameDialog + + Ok + ♪ Ok Ok ♪ + + + + MainWindow + + Parse logs from the Apache2 web server + Log log log dari pelayan web Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Memo log dari server web Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Log log dari server web Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Pilih/hapus semua berkas + + + All + Semua + + + Inspect a log file + Periksalah sebuah berkas log + + + Name + Nama + + + Size + ukuran + + + Refresh the list + Anda akan menyegarkan daftar + + + Total size of the parsed data + Ukuran total data yang telah diurai + + + Total number of parsed lines + Jumlah jumlah baris terurai + + + Start parsing the selected files + Tak dapat membuka berkas yang dipilih + + + START + START + + + Time elapsed since the start + Waktu berlalu sejak awal + + + Average speed, in parsed data size per second + Kecepatan rata-rata, dalam ukuran data terurai per detik + + + Web Server + Web Server + + + Select a Web Server + Unik Web + + + Year + Tahun + + + Month + Bulan + + + Day + Hari + + + Hour + Hari Jam + + + Draw the chart + Lukis bagan + + + Log line marked as Warning + Baris log log yang ditandai sebagai Peringatan + + + Date when the request arrived (YYYY-MM-DD) + Tanggal ketika permintaan tiba (TTTT-BB-HHH) + + + Time when the request arrived (hh:mm:ss) + Waktu ketika permintaan tiba (hhh:mm:ss) + + + Protocol of the request + Protokol permintaan + + + Method of the request + Metode permohonan + + + URI of the requested page + URI dari halaman yang diminta + + + Query carried along with the URI + Pertanyaan yang dibawa bersama dengan URI + + + Response code from the server + Kode balasan dari server + + + User-agent of the client which made the request + Pengguna-agen dari klien yang membuat permintaan + + + IP address of the Client which made the request + Alamat IP dari Klien yang membuat permintaan + + + Cookie used for the request + Cookie yang digunakan untuk permintaan + + + The URL which redirected the Client to the requested page + URL yang mengarahkan Klien ke halaman yang diminta + + + Size ib Bytes of the request, usually includes header and data + Ukuran ib Byte permintaan, biasanya termasuk header dan data + + + Size in Bytes of the served content, usually includes header and data + Sizez dalam Byte dari konten yang disajikan, biasanya termasuk header dan data + + + Time taken by the server to serve the content, in milliseconds + Waktu yang diambil oleh server untuk melayani isi, dalam milidetik + + + Only use lines in which the field is starting with this string + Hanya mengunakan baris dimana medan dimulai dengan string ini + + + Protocol: + Protokol Ubuntu: + + + Method: + Metode Bahasa: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Dia hanya menggunakan garis di mana medannya cocok dengan pernyataan ini. +Guna '!', '=', '<' atau '>' untuk menyatakan apa yang harus digunakan + + + Response: + Sambutan: + + + Query: + Pertanyaan: + + + URI: + URI: + + + Filters + Tapisan + + + Count + Count + + + Number of occurrences + Nomor kejadian + + + Item + Item + + + Value of the field + Nilai padang + + + From: + Dari: + + + To: + To: + + + Select a log field to view + Lubnan memilih medan log untuk dilihat + + + Field: + Medan: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Dengan senar, hanya baris di mana bidang dimulai dengan string ini akan digunakan. +Dengan angka-angka, gunakan '!', '=', '<' atau '>' untuk menyatakan apa yang harus digunakan + + + Protocol + Protokol + + + Method + Metode + + + URI + URI + + + User-agent + Pengguna-agen + + + Most recurrent + Paling berulang + + + Most trafficked + Yang Paling trafficked + + + Date ever + Tarikh yang pernah + + + Day of the week + Hari hari minggu + + + Hour of the day + Hari kiamat + + + Time taken + Waktu diambil + + + Bytes sent + Byte yang dikirim + + + Bytes received + Semua Byte diterima + + + Mean/Max performances + Penampilan Min/Max + + + Requests received + Permintaan diminta + + + Total work + Total pekerjaan + + + General + Umum + + + Window + Jendela + + + Dialogs + Dialog + + + Charts + Charts + + + Appearance + Penampilan + + + Speed + Kelajuan + + + Relational + Hubungan + + + TextBrowser + Pelayar Teks + + + Databases + Pangkalan Data + + + Security + Keamanan + + + Logs + Perancis + + + Defaults + Default + + + Control + Kendali + + + Path + Path + + + Format + Format + + + Warnlists + Daftar amaran + + + Blacklists + Daftar Hitam + + + Remember the window's position and size + Ingat posisi dan ukuran jendela + + + Remember position and size + Ingat posisi dan ukuran + + + Remember window's position and size + Ingat posisi dan ukuran jendela + + + Geometry + Geometri + + + Theme to use for the window + Tema untuk digunakan pada jendela + + + Theme + Tema + + + Native + Penduduk Asli + + + Light + Terang + + + Dark + Kegelapan + + + Auto + Oto + + + Icons + Ikon + + + Normal quantity of dialog messages shown + Kuantiti normal dari pesan dialog yang ditampilkan + + + Normal + ♪ Normal ♪ + + + Dialogs from the main processes + Dialog dari proses utama + + + Dialogs emitted when parsing logs + Dialog keropos muncul saat mengurai log + + + Logs parser + Pengurai log + + + Dialogs emitted when viewing statistics + Dialog yang dipancarkan sewaktu melihat statistik + + + Statistics viewer + Pemerhati Statistik + + + Define the quantity of dialog mesages shown + Takrifkan kuantitas mesage dialog yang dipaparkan + + + Dialogs level + Aras Dialog Khayalan + + + Reduced quantity of dialog messages shown + Kuantiti yang kecilkan dari pesan dialog yang ditampilkan + + + Essential + Essential + + + Augmented quantity of dialog messages shown + Kuantiti augmented dari pesan dialog yang ditampilkan + + + Explanatory + Penjelasan + + + Theme to use for the Charts + Tema untuk digunakan pada Charts + + + Preview + Pratonton + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Mewakili langkah dalam sumbu waktu, dalam detik. +Semua nilai yang jatuh di dalam interval yang sama akan digabung dan nilai mean akan digunakan. + + + Time interval + Waktu selang + + + The format to use for the labels of the time axis. + Format untuk digunakan untuk label sumbu waktu. + + + Time format + Waktu format + + + The size of the pie + Ukuran pai + + + Pie size + Pie size + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Jumlah maksimum irisan yang akan digubah oleh pai. +Potongan-irisan yang luar biasa akan dikelompokkan menjadi satu bagian yang komprehensif. + + + Maximum slices + Hirisan maksimum + + + Font to use for the Text Browser + Fonta untuk digunakan pada Pelungsur Teks + + + Font + Fonta + + + Double-spaced lines + Baris ganda ruang + + + Use wide lines + Guna garis lebar + + + Define the spacing between lines + Tentukan jarak antara baris + + + Lines spacing + Langkauan baris + + + None + Amerika/None + + + Color scheme to use for the Text Browser + Skema warna yang digunakan untuk Pelungsur Teks + + + Color scheme + Skema warna + + + The appearance of the Text Browser with the current settings + Kemunculan Pelungsur Teks dengan pengaturan saat ini + + + Insert the base path only, file name excluded + Hanya masukkan jalur dasar, nama berkas dikecualikan + + + The given path doen't exists, or doesn't point to a folder + Path yang diberikan tidak ada, atau tidak menunjuk ke folder + + + Path for the database files + Path untuk berkas basis data + + + Paths + Path + + + Apply the current path + Terapkan jalan yang sekarang + + + Select the path through a dialog window + Pilih jalur melalui jendela dialog + + + Path where the logs data collection database is located + Path di mana database koleksi data log terletak + + + Logs data + Data logs + + + Path where the used files hashes database is located + Path di mana file yang digunakan hashes database terletak + + + Used files + Semua berkas yang digunakan + + + Backup options for the Logs Data database + Name + + + Backups + Sandar + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Sebuah backup baru dibuat ketika menutup LogDoctor setelah memiliki successfully edited database + + + Backup the Logs Data database and keep + Dan simpan database Data Logs + + + Whether it is allowed or denied to follow symlinks occuring in a path + Apakah tidak diizinkan atau ditolak untuk mengikuti symlink yang terjadi di jalur + + + Follow symlinks + Ikuti symlinks + + + Default WebServer + Default + + + Usage control + Pengontrol penggunaan teropong + + + Hide already used files + Sembunyi berkas yang sudah digunakan + + + Size warnings + Peringatan Saiz Saraf + + + Warn me when using files with a size exceeding: + Peringatkan saya ketika menggunakan file dengan ukuran melebihi: + + + Logs folder + Folder log + + + Logs format string + Format string logs + + + Format string + Format string + + + Insert the format string you're using + Masukkan format string yang anda gunakan + + + Apply the current string + * Terapkan string saat ini + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Polynapel menghasilkan log baris sampel dari string yang kini disimpan, untuk memeriksa apakah akan diformat dengan benar. +Bidang apapun yang tidak dianggap oleh LogDoctor akan muncul sebagai 'DISCARDED' + + + Generate sample + Contoh hasil sampel + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Sila periksa kebenaran baris ini. +Lapangan-lapangan yang ditandai sebagai 'DISCARDED' mendapat terurai dengan benar, tetapi tidak dipertimbangkan oleh LogDoctor + + + Open an help window + Buka jendela bantuan + + + Help + Bantuan + + + Select a log field + Woadin Pilih medan log + + + Use warnlist for this field + Gunakan daftar peringatan untuk bidang ini + + + Add the current line to the list + Tambahkan baris saat ini ke senarai + + + Remove the selected item from the list + Buang item yang dipilih dari senarai + + + Move the selected item down + Pindah teks yang dipilih ke bawah + + + Use blacklist for this field + Use blacklist untuk bidang ini + + + Add line + Tambah baris + + + Remove selection + Pemilihan + + + Language + Bahasa + + + Utilities + Utilitas + + + Tools + Alat + + + Games + Permainan + + + Perform a version-check + Lakukan suatu versi-check + + + Show some info about LogDoctor + ¡Tampilkan beberapa info tentang LogDoktor + + + Open a block-note like window to write temporary text + Buka sebuah blok-note seperti jendela untuk menulis teks sementara + + + Play CrissCross + [Cross + + + Play Snake + Snake + + + Show the changelog + Lihat log perubahan + + + warnlist + (Inggris) + + + blacklist + ♪ Daftar hitam ♪ + + + copy + salinan + + + copies + salinan + + + Check updates + Periksa pemutakhiran + + + Infos + Blog + + + BlockNote + Nobel + + + CrissCross + Coross + + + Snake + Ular + + + Changelog + Entri Changelog + + + + RichText + + Select a file from the list + Pilih sebuah berkas dari daftar + + + to inspect its content + Untuk memeriksa isinya + + + Failed to read + Gagal untuk membaca + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klasik + + + Hunt + Perancis + + + Battle + Pertempuran + + + Game Over + Permainan Kaisar + + + Your adversary fell in the water! + Musuhmu jatuh ke air! + + + YOU WON! + Kau menang! + + + You fell in the water! + Kau jatuh ke air! + + + YOU LOST! + Kau kalah! + + + Your adversary ate itself! + Musuhmu memakan dirinya sendiri! + + + You ate yourself! + Kau makan sendiri! + + + Your adversary ate you! + Musuhmu memakanmu! + + + You ate your adversary! + Kau memakan musuhmu! + + + You ate each other! + Kau saling memakan! + + + MATCH IS DRAW! + Watchthax MATCH DRAW! + + + + TR + + Unexpected WebServer + Penerang Web Tak Terjangkau Episoda + + + Logs Size Breakdown + Perpecahan Ukuran Logis + + + Ignored + Diabaikan + + + Parsed + Perancis + + + Blacklisted + Didaftar Hitam + + + Others + Lainnya + + + from + Dari + + + to + Ke + + + Log Lines Marked as Warning + Log Log Lines Ditandai sebagai Peringatan + + + Time Taken to Serve Requests + Waktu yang Diambil untuk Melayani Permintaan + + + Time of Day Count + Waktu untuk menghitung hari + + + Relational Count + Hitungan Hubungan + + + FALSE + PALSU PALSU + + + TRUE + TRUE + + + Date + Tarikh + + + Year + Tahun + + + Month + Bulan + + + Day + Hari + + + Time + Waktu + + + Hour + Hari Jam + + + Minute + Minit + + + Second + Kedua + + + Warning + Amaran + + + Protocol + Protokol + + + Method + Metode + + + URI + URI + + + Query + Pertanyaan + + + Response code + Kode Response + + + Time taken + Waktu diambil + + + Bytes sent + Byte yang dikirim + + + Bytes received + Semua Byte diterima + + + Referrer + Referrer + + + Cookie + Cecikut + + + Client + Klien + + + User-agent + Pengguna-agen + + + January + Januari + + + February + 2010, 7 Februari + + + March + 2010, 7 Maret + + + April + April + + + May + Mei + + + June + Juni Juni + + + July + Juli + + + August + Ogos + + + September + Perancis + + + October + Oktober + + + November + November + + + December + Amerika Serikat + + + Sunday + Ahad + + + Monday + Isnin + + + Tuesday + Selasa + + + Wednesday + Rabu + + + Thursday + Khamis + + + Friday + Jumat + + + Saturday + Sabtu + + + diff --git a/logdoctor/translations/LogDoctor_nb_NB.ts b/logdoctor/translations/LogDoctor_nb_NB.ts new file mode 100644 index 0000000..7eacc0a --- /dev/null +++ b/logdoctor/translations/LogDoctor_nb_NB.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versjoner + + + Version 4 + Versjon 4 + + + Version 3 + Versjon 3 + + + Version 2 + Versjon 2 + + + Version 1 + Versjon 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Bygg skript + + + Cross-platform compatibility: + Overplattformskompatibilitet: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistikk: + + + Warnings + Advarsler + + + Speed + Hastighet + + + Counts + Teller + + + Daytime + dagtid + + + Relational + Relasjonell + + + Globals + Globale + + + Translations: + Oversettelser: + + + Italian + Italiensk + + + Spanish + Spansk + + + French + fransk + + + Tools: + Verktøy: + + + Block note + Blokkeringsnotat + + + Utilities: + Verktøy: + + + Infos viewer + Infovisning + + + Updates checker + Oppdateringskontroll + + + Themes: + Temaer: + + + Dark + Mørke + + + Light + Lys + + + Improvements and fixes + Forbedringer og rettelser + + + New themes: + Nye temaer: + + + Ash + Ash + + + Candy + Candy + + + Forest + Skog + + + Powder + Powder + + + Restyled GUI + Omstylet GUI + + + Restyled dialogs + Omformede dialoger + + + Doxygen documentation + Doxygen-dokumentasjon + + + Mini-Games: + Minispill: + + + Criss-cross + Criss-cross + + + Snake + Slange + + + Changed default paths + Endrede standardstier + + + New game modes for Snake + Nye spillmoduser for Snake + + + Hunt + Hunt + + + Battle + Slaget + + + New translations: + Nye oversettelser: + + + Japanese + Japansk + + + Portuguese + Portugisisk + + + Code improvements + Kodeforbedringer + + + Performance improvements + Effektforbedringer + + + Added tests suite: + Lagt til testsuite: + + + white box tests + hvit boks tester + + + Customized charts themes + Tilpassede karttemaer + + + Fixes + Løsninger + + + Tests improvements + Tester forbedringer + + + Docker support + Docker støtte + + + Upgrade to C++20 + Oppgradering til C++20 + + + Upgrade to Qt6 + Oppgrader til Qt6 + + + Restyled themes + Omstylede temaer + + + Redesigned configs section + Omdesignet konfigurasjonsseksjon + + + Stability improvements + stabilitetsforbedringer + + + Generating warnings dinamically + Produksjon av advarsler dinamisk + + + New tool: + Nytt verktøy: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Justerbare parametere for noen av diagrammene: + + + Improved project structure + Forbedret prosjektstruktur + + + Modernized Cmake usage + Modernisert Cmake bruk + + + + Crapinfo + + Version + Utgave + + + Currently installed version of the software + For tiden installert versjon av programvaren + + + Repository links + Arkivlenker + + + Paths + Stier + + + The path of the executable file + Stien til den kjørbare fila + + + Executable + Brukbar + + + The path where the configuration file gets saved and searched in + Stien der konfigurasjonsfilen lagres og søkes i + + + Configuration file + Konfigurasjonsfil + + + The path where the application searches for extra resources + Stien der programmet søker etter ekstra ressurser + + + Application data + Søknadsdata + + + + Crapnote + + Reduce the font size + Reduser skriftstørrelsen + + + Font size + Skriftstørrelse + + + Increase the font size + Øk skriftstørrelsen + + + + Crappath + + Choose + Velg + + + Cancel + Avbryt + + + + Crapup + + Checking for updates + Sjekker etter oppdateringer + + + New version available + Ny versjon tilgjengelig + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + En ny versjon er tilgjengelig! +Vennligst besøk LogDoctors git-arkiv og følg instruksjonen om hvordan du oppdaterer + + + No update found + Ingen oppdatering funnet + + + LogDoctor is up-to-date + LogDoctor er oppdatert + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Du kjører en versjon fra fremtiden! +Din versjon er utenfor gjeldende oppstrømsversjon +Kjører du den originale loggdoktoren? +Vennligst besøk LogDoctors lager og få en ny versjon av det + + + Failed to establish a connection + Klarte ikke å opprette en tilkobling + + + Connection error, please try again later + Tilkoblingsfeil, prøv igjen senere + + + Connection timed out + Tilkobling tidsavbrudd + + + Version check failed + Sjekk av versjon mislyktes + + + An error occured while parsing: +version mark not found + En feil oppstod under tolking: +ikke funnet versjonsmerke + + + An error occured while parsing: +malformed version + En feil oppstod under tolking: +feilutformet versjon + + + An error occured while comparing: +malformed upstream version + En feil oppstod under sammenligning: +feilutformet oppstrøms versjon + + + + CrissCross + + Victory + Victory + + + You beated me! + Du bettet meg! + + + This time you lost! + Denne gangen tapte du! + + + Draw + Tegn + + + Nice match + Fin kamp + + + + DialogBool + + Yes + Ja + + + No + Nei + + + + DialogIda + + Ignore + Ignorer + + + Discard + Forkast + + + Abort + Avbryt + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + En av listene har et ugyldig element + + + An error occured while reading the configuration file + En feil oppstod under lesing av konfigurasjonsfil + + + An error occured while parsing configuration file's data + En feil oppstod under tolking av konfigurasjonsfilens data + + + Failed to create the configuration file's directory + Klarte ikke å opprette konfigurasjonsfilkatalogen + + + Failed to create the configuration file + Klarte ikke å opprette konfigurasjonsfil + + + An error occured while writing the configuration file + Det oppstod en feil ved skriving av konfigurasjonsfil + + + An error occured while preparing the configuration file's data + En feil oppstod under utarbeidelsen av konfigurasjonsfilens data + + + The path contains a symlink + Banen inneholder en symbolsk + + + The file does not exist + Filen eksisterer ikke + + + Failed to create the database backups' directory + Klarte ikke å opprette databasens sikkerhetskopimappe + + + Failed to copy the database file + Klarte ikke kopiere databasefilen + + + Failed to update the backups + Klarte ikke oppdatere sikkerhetskopiene + + + Failed to create the directory + Klarte ikke å opprette katalogen + + + Unrecognized entry + Ukjent oppføring + + + Size of the file + Størrelse på filen + + + Warning size parameter + Parameter for varslingsstørrelse + + + Failed to read gzipped file + Klarte ikke å lese gzipped-fil + + + An error occured while parsing the format string + En feil oppstod under tolking av formatstrengen + + + Available memory + Tilgjengelig minne + + + Size of the logs + Størrelse på loggene + + + An error occured while reading the gzipped file + En feil oppstod ved lesing av gzipped-fil + + + An error occured while reading the file + En feil oppstod under lesing av filen + + + Something failed while handling the file + Noe mislyktes under håndtering av filen + + + An error occured while working on the database + En feil oppstod under arbeid med databasen + + + Aborting + Stopper + + + Invalid locale + Ugyldig lokalisering + + + Unexpected locale format + Uventet lokalformat + + + If you haven't manually edited the configuration file, +please report this issue + Hvis du ikke manuelt har redigert konfigurasjonsfilen, +Vennligst rapporter dette problemet + + + The given locale is not an accepted language + Den gitte lokaliteten er ikke et akseptert språk + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Hvis du vil ha dette stedet i LogDoctor, +Vennligst følg instruksjonen på arkivsiden + + + Configuration file not found + Oppsettsfil ikke funnet + + + Unable to retrieve the configuration file + Klarte ikke å hente oppsettsfilen + + + Skipping + Hopper + + + An error occured while handling the configuration file + En feil oppstod under håndtering av konfigurasjonsfilen + + + Failed to write the configuration file + Klarte ikke å skrive konfigurasjonsfil + + + Current configuration not saved + Nåværende konfigurasjon ikke lagret + + + File not readable + Fil ikke lesbar + + + The file is not readable + Filen er ikke lesbar + + + File not writable + Fil ikke skrivbar + + + The file is not writable + Filen er ikke skrivbar + + + Directory not writable + Katalogen kan ikke skrives + + + The directory is not writable + Katalogen er ikke skrivbar + + + Invalid path + Ugyldig sti + + + Failed applying configuration + Klarte ikke å bruke oppsett + + + Invalid configuration lines + Ugyldige konfigurasjonslinjer + + + Has not been possible to apply some of the configurations + Har ikke vært mulig å bruke noen av konfigurasjonene + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Hvis du velger å fortsette, vil alle uanvendte konfigurasjoner gå tapt +Fortsett? + + + Failed to retrieve the help file + Klarte ikke å hente hjelpfilen + + + An error occured while getting the help file + En feil oppstod mens hjelpfilen ble hentet + + + Additional resources can be downloaded from the git repo + Ekstra ressurser kan lastes ned fra git repo + + + Unable to retrieve the file + Klarte ikke å hente filen + + + Invalid string + Ugyldig streng + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Den gitte strengen er ugyldig og kan ikke legges til i listen + +Vennligst rett det og prøv på nytt + + + QSql driver not found + QSql driver ikke funnet + + + Failed to retrieve the driver needed to handle the database + Klarte ikke å hente driveren som er nødvendig for å håndtere databasen + + + File not found + Fil ikke funnet + + + Failed to retrieve the database file + Klarte ikke å hente databasefilen + + + Create a new database? + Opprette en ny database? + + + The database contains an unexpected table + Databasen inneholder en uventet tabell + + + Unexpected table + Uventet tabell + + + It seems that the database is missing a table + Det ser ut til at databasen mangler en tabell + + + Table not found + Tabell ikke funnet + + + The database contains an unexpected column + Databasen inneholder en uventet kolonne + + + Unexpected column + Uventet kolonne + + + It seems that the table is missing a column + Det ser ut til at tabellen mangler en kolonne + + + Column not found + Kolonne ikke funnet + + + A column has an unexpected data-type + En kolonne har en uventet datatype + + + Unexpected data-type + Uventet datatype + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Denne databasen vil få nytt navn med et etterfølgende «.copy » og en ny opprettes. +Fortsett? + + + Database created + Database opprettet + + + Successfully created a new database + Laget en ny database + + + Not a file + Ikke en fil + + + The path was supposed to point to a file, but it doesn't + Veien skulle peke på en fil, men den gjør ikke + + + Please remove the conflict and retry + Ta bort konflikten og prøv på nytt + + + The database file is not readable + Databasefilen er ikke lesbar + + + Please set the proper permissions and retry +If this error persists, please report this issue + Vennligst angi riktige tillatelser og prøv på nytt +Hvis denne feilen varer, vennligst rapporter dette problemet + + + The database file is not writable + Databasefilen er ikke skrivbar + + + Invalid database path + Ugyldig databasesti + + + Failed creating database + Klarte ikke å opprette database + + + An error occured while creating the database + En feil oppstod under oppretting av databasen + + + Failed opening database + Kunne ikke åpne database + + + An error occured while opening the database + En feil oppstod under åpning av databasen + + + Failed executing on database + Kunne ikke kjøre på databasen + + + An error occured while executing a statement on the database + En feil oppstod under utførelse av en erklæring i databasen + + + Failed to backup database + Klarte ikke å sikkerhetskopiere databasen + + + Please report this issue + Vennligst rapporter dette problemet + + + Invalid log format string + Ugyldig loggformatstreng + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Sjekk at ingen feil er kastet av din WebServer +Hvis det blir akseptert, vennligst sjekk tilstedeværelsen av en type her +Hvis alt er bra, vennligst rapporter dette problemet + + + Log format error + Feil i loggformat + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Loggformatet er ikke satt, eller ugyldig +Legg til en gyldig i konfigurasjonene + + + Misconfigured log format + Feilkonfigurert loggformat + + + No log field has been set in the current logs format, +making it useless to parse logs + Ingen loggfelt har blitt satt i gjeldende loggformat, +Gjør det ubrukelig å tolke logger + + + Please set up a format which contains at least one field + Vennligst sett opp et format som inneholder minst ett felt + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + En separator mangler mellom ett eller flere felt. +gjør det vanskelig å etablere nettogrenser, +og muligens fører til å lagre feil data + + + Please set up a format which contains separators between fields + Vennligst sett opp et format som inneholder separatorer mellom felt + + + Missing field in log format + Manglende felt i loggformat + + + An important field is missing from the provided format: + Et viktig felt mangler fra det angitte formatet: + + + The quality of the statistics may be seriously compromized + Kvaliteten på statistikken kan bli alvorlig kompromittert + + + Proceed anyway? + Fortsett likevel? + + + 'Carriage Return' in log format + 'Carriage Return' i loggformat + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Det angitte formatet inneholder 'Carriage Return'. +Dette kan føre til tap av data eller krasj hvis det ikke brukes med forsiktighet + + + An error occured while parsing logs + En feil oppstod under tolking av logger + + + Failed defining type + Klarte ikke å definere type + + + Failed to determine the log type + Klarte ikke å bestemme loggtypen + + + File already used + Fil som allerede er brukt + + + The file has probably been used already + Filen har sannsynligvis allerede blitt brukt + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorer advarselen og bruk den uansett, kast den og fortsett eller avbryt hele prosessen? + + + Duplicate file + Kopier fil + + + The file appears twice in the list of selections + Filen vises to ganger i listen over utvalg + + + Failed updating hashes + Klarte ikke å oppdatere hashes + + + An error occured while inserting the parsed files hashes into the database + En feil oppstod mens de tolkede filene settes inn i databasen + + + File exceeds warning size + Filen overstiger advarselsstørrelsen + + + The file's size exceeds the warning size + Filens størrelse overstiger advarselsstørrelsen + + + Not enough memory + Ikke nok minne + + + The total size of the selected files exceeds the available memory + Den totale størrelsen på de valgte filene overstiger det tilgjengelige minnet + + + Please free some resources, parse the files in different steps or split them into smaller units + Vennligst frigjør noen ressurser, tolke filene i ulike trinn eller splitte dem i mindre enheter + + + Failed reading + Klarte ikke å lese + + + File is empty + Filen er tom + + + The file is blank + Filen er tom + + + Failed to retrieve the selected file + Klarte ikke å hente den valgte filen + + + Discard it and continue, or Abort all and exit? + Kast det og fortsett, eller avbryt alle og avslutte? + + + No file to parse + Ingen fil å tolke + + + The list of files to parse is empty + Listen over filer å tolke er tom + + + Directory not found + Katalogen ble ikke funnet + + + The directory does not exists + Katalogen eksisterer ikke + + + Directory not readable + Katalogen kan ikke leses + + + The directory is not readable + Katalogen er ikke lesbar + + + Please set the proper permissions before to start + Angi riktige tillatelser før du starter + + + Failed creating directory + Klarte ikke å opprette katalog + + + The path does not exists + Veien eksisterer ikke + + + Data conversion failed + Datakonvertering mislyktes + + + Failed to convert from '%1' to '%2' + Klarte ikke å konvertere fra '%1' til '%2' + + + Failed to create statistics + Klarte ikke å opprette statistikk + + + An error occured while processing + En feil oppstod under behandling + + + Cannot create statistics + Kan ikke opprette statistikk + + + No data has been found that matches with the currently set parameters + Ingen data har blitt funnet som matcher med de aktuelle parametrene + + + Not a folder + Ikke en mappe + + + The path was supposed to point to a folder, but it doesn't + Veien skulle peke på en mappe, men den er ikke + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Opptaket vil bli omdøpt med en etterfølgende ".copy" og en ny vil bli opprettet. +Fortsett? + + + An error occured + Det oppstod en feil + + + Failed renaming + Klarte ikke endre navn + + + An error occured while renaming + En feil oppstod under endring av navn + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Tolk logger fra Apache2-webserveren + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Tolkelogger fra Nginx webserver + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Tolkelogger fra Microsoft IIS webserver + + + IIS + IIS + + + Select/deselect all the files + Velg/avvelg alle filene + + + All + Alle + + + Inspect a log file + Sjekk en loggfil + + + Name + Navn + + + Size + Størrelse + + + Refresh the list + Oppdater listen + + + Total size of the parsed data + Total størrelse på tolkede data + + + Total number of parsed lines + Totalt antall tolkede linjer + + + Start parsing the selected files + Begynn å tolke de valgte filene + + + START + START + + + Time elapsed since the start + Tiden gikk ut siden starten + + + Average speed, in parsed data size per second + Gjennomsnittlig hastighet i tolket datastørrelse per sekund + + + Web Server + Nettserver + + + Select a Web Server + Velg en webserver + + + Year + År + + + Month + Måned + + + Day + dag + + + Hour + time + + + Draw the chart + Tegn diagrammet + + + Log line marked as Warning + Logg linje merket som advarsel + + + Date when the request arrived (YYYY-MM-DD) + Dato når forespørselen kom (ÅÅÅÅ-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Tid når forespørselen kom (hh:mm:ss) + + + Protocol of the request + Protokoll av anmodningen + + + Method of the request + Fremgangsmåte for forespørselen + + + URI of the requested page + Adresse til den ønskede siden + + + Query carried along with the URI + Forespørsel ført sammen med URI + + + Response code from the server + Svarkode fra serveren + + + User-agent of the client which made the request + Kundens brukeragent som forespørselen + + + IP address of the Client which made the request + IP-adresse til kunden som gjorde forespørselen + + + Cookie used for the request + Informasjonskapsler som brukes til forespørselen + + + The URL which redirected the Client to the requested page + URLen som omdirigerte klienten til den ønskede siden + + + Size ib Bytes of the request, usually includes header and data + Størrelse ib Byte av forespørselen, vanligvis inkluderer header og data + + + Size in Bytes of the served content, usually includes header and data + Størrelse i byte av det serverte innholdet, vanligvis inkluderer header og data + + + Time taken by the server to serve the content, in milliseconds + Tid tatt av serveren til å betjene innholdet i millisekunder + + + Only use lines in which the field is starting with this string + Bare bruk linjer der feltet starter med denne strengen + + + Protocol: + Protokoll: + + + Method: + Metode: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Bare bruk linjer der feltet samsvarer med denne uttalelsen. +Bruk "!", "=", "<" eller ">" for å erklære hva du skal bruke + + + Response: + Svar: + + + Query: + Spørring: + + + URI: + Adresse: + + + Filters + Filtre + + + Count + Teller + + + Number of occurrences + Antall hendelser + + + Item + Artikkel + + + Value of the field + Verdi av feltet + + + From: + Fra: + + + To: + Til: + + + Select a log field to view + Velg et loggfelt som skal vises + + + Field: + Felt: + + + Filter: + Filtrer: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Med strenger vil bare linjene der feltet starter med denne strengen bli brukt. +Med tall, bruk "!", "=", "<" eller ">" for å erklære hva du skal bruke + + + Protocol + Protokoll + + + Method + Metode + + + URI + URL + + + User-agent + Brukeragent + + + Most recurrent + Mest gjentakende + + + Most trafficked + Mest trafikkert + + + Date ever + Dato noensinne + + + Day of the week + Ukens dag + + + Hour of the day + time på dagen + + + Time taken + Tid tatt + + + Bytes sent + Byte sendt + + + Bytes received + Byte mottatt + + + Mean/Max performances + Gjennomsnittlig/maks ytelser + + + Requests received + Forespørsler mottatt + + + Total work + Totalarbeid + + + General + Generelt + + + Window + Vindu + + + Dialogs + Dialoger + + + Charts + Charts + + + Appearance + Utseende + + + Speed + Hastighet + + + Relational + Relasjonell + + + TextBrowser + Tekstbrowser + + + Databases + Databaser + + + Security + Sikkerhet + + + Logs + Logger + + + Defaults + Standard + + + Control + Kontroll + + + Path + Sti + + + Format + Formater + + + Warnlists + Varsellister + + + Blacklists + Blacklists + + + Remember the window's position and size + Husk vinduets posisjon og størrelse + + + Remember position and size + Husk posisjon og størrelse + + + Remember window's position and size + Husk vinduets posisjon og størrelse + + + Geometry + Geometri + + + Theme to use for the window + Tema som skal brukes i vinduet + + + Theme + Tema + + + Native + Innfødt + + + Light + Lys + + + Dark + Mørke + + + Auto + Auto + + + Icons + Ikoner + + + Normal quantity of dialog messages shown + Normal mengde dialogmeldinger vist + + + Normal + Normal + + + Dialogs from the main processes + Dialoger fra hovedprosessene + + + Dialogs emitted when parsing logs + Dialoger sendt når du tolker logger + + + Logs parser + Loggtolker + + + Dialogs emitted when viewing statistics + Dialoger som sendes ut ved visning av statistikk + + + Statistics viewer + Statistikkvisning + + + Define the quantity of dialog mesages shown + Definer mengden dialog mesage vist + + + Dialogs level + Dialognivå + + + Reduced quantity of dialog messages shown + Redusert antall meldinger som vises + + + Essential + Viktig + + + Augmented quantity of dialog messages shown + Augmentert antall meldinger som vises + + + Explanatory + Forklaring + + + Theme to use for the Charts + Tema som skal brukes på diagrammene + + + Preview + Forhåndsvisning + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Representerer et skritt i tidsaksen, i sekunder. +Alle verdier som faller innenfor samme intervall vil bli slått sammen og gjennomsnittlig verdi vil bli brukt. + + + Time interval + Tidsintervall + + + The format to use for the labels of the time axis. + Format som skal brukes til etikettene på tidsaksen. + + + Time format + Tidsformat + + + The size of the pie + Størrelsen på kaken + + + Pie size + Pie størrelse + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Det maksimale antall skiver som paien vil være sammensatt av. +Overflødige skiver vil bli gruppert i én omfattende skive. + + + Maximum slices + Maksimale skiver + + + Font to use for the Text Browser + Skrift som skal brukes i tekstleseren + + + Font + Skrift + + + Double-spaced lines + Dobbeltromslinjer + + + Use wide lines + Bruk brede linjer + + + Define the spacing between lines + Definer avstanden mellom linjer + + + Lines spacing + Linjeavstand + + + None + Ingen + + + Color scheme to use for the Text Browser + Fargeskjema som skal brukes for tekstleseren + + + Color scheme + Fargeskjema + + + The appearance of the Text Browser with the current settings + Utseendet til tekstleseren med gjeldende innstillinger + + + Insert the base path only, file name excluded + Sett inn kun grunnstien, filnavn utelukket + + + The given path doen't exists, or doesn't point to a folder + Den gitte stien eksisterer ikke, eller peker ikke på en mappe + + + Path for the database files + Sti til databasefilene + + + Paths + Stier + + + Apply the current path + Bruk den gjeldende banen + + + Select the path through a dialog window + Velg stien gjennom et dialogvindu + + + Path where the logs data collection database is located + Sti der loggdatainnsamlingsdatabasen ligger + + + Logs data + Loggdata + + + Path where the used files hashes database is located + Sti der de brukte filene hashes databasen befinner seg + + + Used files + Brukte filer + + + Backup options for the Logs Data database + Sikkerhetskopieringsalternativer for Loggdatadatabasen + + + Backups + Sikkerhetskopier + + + A new backup is made when closing LogDoctor after having succesfully edited the database + En ny sikkerhetskopi gjøres når du lukker LogDoctor etter at du har redigert databasen vellykket + + + Backup the Logs Data database and keep + Sikkerhetskopier Logs Datadatabasen og behold + + + Whether it is allowed or denied to follow symlinks occuring in a path + Hvorvidt det er tillatt eller nektet å følge symbolske lenker som forekommer i en bane + + + Follow symlinks + Følg symlinks + + + Default WebServer + Standard WebServer + + + Usage control + Brukskontroll + + + Hide already used files + Skjul allerede brukte filer + + + Size warnings + Størrelsesvarsler + + + Warn me when using files with a size exceeding: + Varsle meg når du bruker filer med en størrelse som overstiger: + + + Logs folder + Loggmappe + + + Logs format string + Logger formatstreng + + + Format string + Formater streng + + + Insert the format string you're using + Sett inn formatstrengen du bruker + + + Apply the current string + Bruk gjeldende streng + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Opprette en prøvelogglinje fra den lagrede strengen, for å sjekke om den blir formatert riktig. +Et felt som ikke anses av LogDoctor vil vises som 'DISCARDED' + + + Generate sample + Opprett prøve + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Sjekk riktigheten av denne linjen. +Felter merket som 'DISCARDED' ble tolket riktig, men er ikke vurdert av LogDoctor + + + Open an help window + Åpne et hjelpevindu + + + Help + Hjelp + + + Select a log field + Velg et loggfelt + + + Use warnlist for this field + Bruk advarselsliste for dette feltet + + + Add the current line to the list + Legg til gjeldende linje i listen + + + Remove the selected item from the list + Fjern det valgte elementet fra listen + + + Move the selected item down + Flytt det valgte elementet ned + + + Use blacklist for this field + Bruk svartliste for dette feltet + + + Add line + Legg til linje + + + Remove selection + Fjern utvalg + + + Language + Språk + + + Utilities + Verktøy + + + Tools + Verktøy + + + Games + Spill + + + Perform a version-check + Utfør en versjon-sjekk + + + Show some info about LogDoctor + Vis litt informasjon om LogDoctor + + + Open a block-note like window to write temporary text + Åpne en blokknote som vindu for å skrive midlertidig tekst + + + Play CrissCross + Spill CrissCross + + + Play Snake + Spill Snake + + + Show the changelog + Vis endringsloggen + + + warnlist + advarsliste + + + blacklist + svartliste + + + copy + kopi + + + copies + kopier + + + Check updates + Sjekk oppdateringer + + + Infos + Info + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Slange + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Velg en fil fra listen + + + to inspect its content + å inspisere innholdet + + + Failed to read + Klarte ikke å lese + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klassisk + + + Hunt + Hunt + + + Battle + Slaget + + + Game Over + Spill Over + + + Your adversary fell in the water! + Motstanderen falt i vannet! + + + YOU WON! + Du vet det! + + + You fell in the water! + Du falt i vannet! + + + YOU LOST! + Du har det! + + + Your adversary ate itself! + Din motstandere spiste seg selv! + + + You ate yourself! + Du spiste deg selv! + + + Your adversary ate you! + Din motstandere spiste deg! + + + You ate your adversary! + Du spiste motstanderen din! + + + You ate each other! + Dere spiste hverandre! + + + MATCH IS DRAW! + Matsj er trist! + + + + TR + + Unexpected WebServer + Uventet webserver + + + Logs Size Breakdown + Loggstørrelsesbrudd + + + Ignored + Ignorert + + + Parsed + Tolket + + + Blacklisted + Svartliste + + + Others + Andre + + + from + fra + + + to + til + + + Log Lines Marked as Warning + Logglinjer merket som advarsel + + + Time Taken to Serve Requests + Tid tar å betjene forespørsler + + + Time of Day Count + Tid på dag teller + + + Relational Count + Relasjonell telling + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + Dato + + + Year + År + + + Month + Måned + + + Day + dag + + + Time + Tid + + + Hour + time + + + Minute + Minute + + + Second + Andre + + + Warning + Advarsel + + + Protocol + Protokoll + + + Method + Metode + + + URI + URL + + + Query + Spørring + + + Response code + Svarkode + + + Time taken + Tid tatt + + + Bytes sent + Byte sendt + + + Bytes received + Byte mottatt + + + Referrer + Referanser + + + Cookie + Cookie + + + Client + Kunde + + + User-agent + Brukeragent + + + January + Januar + + + February + Februar + + + March + mars + + + April + April + + + May + Mai + + + June + Juni + + + July + Juli + + + August + August + + + September + september + + + October + Oktober + + + November + november + + + December + Desember + + + Sunday + Søndag + + + Monday + Mandag + + + Tuesday + Tirsdag + + + Wednesday + Onsdag + + + Thursday + Torsdag + + + Friday + Fredag + + + Saturday + lørdag + + + diff --git a/logdoctor/translations/LogDoctor_nl_NL.ts b/logdoctor/translations/LogDoctor_nl_NL.ts new file mode 100644 index 0000000..22954b8 --- /dev/null +++ b/logdoctor/translations/LogDoctor_nl_NL.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versies + + + Version 4 + Versie 4 + + + Version 3 + Versie 3 + + + Version 2 + Versie 2 + + + Version 1 + Versie 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Bouwscripts + + + Cross-platform compatibility: + Compatibiliteit tussen platforms: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistieken: + + + Warnings + Waarschuwingen + + + Speed + Snelheid + + + Counts + Aantal + + + Daytime + Overdag + + + Relational + Relationeel + + + Globals + Wereldwijd + + + Translations: + Vertalingen: + + + Italian + Italiaans + + + Spanish + Spaans + + + French + Frans + + + Tools: + Hulpmiddelen: + + + Block note + Bloknotitie + + + Utilities: + Hulpmiddelen: + + + Infos viewer + Informatieviewer + + + Updates checker + Controleer updates + + + Themes: + Thema's: + + + Dark + Donker + + + Light + Licht + + + Improvements and fixes + Verbeteringen en correcties + + + New themes: + Nieuwe thema's: + + + Ash + As + + + Candy + Snoep + + + Forest + Bos + + + Powder + Poeder + + + Restyled GUI + Gerestylde GUI + + + Restyled dialogs + Gerestylde dialoogvensters + + + Doxygen documentation + Dzuurstofdocumentatie + + + Mini-Games: + Minigames: + + + Criss-cross + Kris-cross + + + Snake + Slang + + + Changed default paths + Standaard paden gewijzigd + + + New game modes for Snake + Nieuwe spelmodi voor Snake + + + Hunt + Hunt + + + Battle + Gevecht + + + New translations: + Nieuwe vertalingen: + + + Japanese + Japans + + + Portuguese + Portugees + + + Code improvements + Codeverbeteringen + + + Performance improvements + Prestatieverbeteringen + + + Added tests suite: + Toegevoegd test suite: + + + white box tests + witte doos testen + + + Customized charts themes + Aangepaste grafieken thema's + + + Fixes + Reparaties + + + Tests improvements + Testverbeteringen + + + Docker support + Docker-ondersteuning + + + Upgrade to C++20 + Upgrade naar C++20 + + + Upgrade to Qt6 + Upgrade naar Qt6 + + + Restyled themes + Gerestyleerde thema's + + + Redesigned configs section + Herontworpen configuratiesectie + + + Stability improvements + Stabiliteitsverbeteringen + + + Generating warnings dinamically + Waarschuwingen dinamisch genereren + + + New tool: + Nieuw gereedschap: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Tweekeerbare parameters voor sommige van de grafieken: + + + Improved project structure + Verbeterde projectstructuur + + + Modernized Cmake usage + Modernisering Cakegebruik + + + + Crapinfo + + Version + Versie + + + Currently installed version of the software + Momenteel geïnstalleerde versie van de software + + + Repository links + Verwijzing naar repository + + + Paths + Paden + + + The path of the executable file + Het pad van het uitvoerbare bestand + + + Executable + Uitvoerbaar bestand + + + The path where the configuration file gets saved and searched in + Het pad waar het configuratiebestand opgeslagen en doorzocht wordt + + + Configuration file + Instellingen + + + The path where the application searches for extra resources + Het pad waar de toepassing naar extra middelen zoekt + + + Application data + Toepassingsgegevens + + + + Crapnote + + Reduce the font size + De lettergrootte verkleinen + + + Font size + Lettergrootte + + + Increase the font size + De lettergrootte vergroten + + + + Crappath + + Choose + Kies + + + Cancel + Annuleren + + + + Crapup + + Checking for updates + Controleren op updates + + + New version available + Nieuwe versie beschikbaar + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Een nieuwe versie is beschikbaar! +Bezoek LogDoctor's git repository en volg de instructies over hoe te updaten + + + No update found + Geen update gevonden + + + LogDoctor is up-to-date + LogDoctor is bijgewerkt + + + :/ + / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Je draait een versie uit de toekomst! +Uw versie is voorbij de huidige upstream versie +Draai je de originele LogDoctor? +Bezoek de repository van de LogDoctor en krijg een nieuwe versie van het + + + Failed to establish a connection + Kon geen verbinding maken + + + Connection error, please try again later + Verbindingsfout, probeer het later opnieuw + + + Connection timed out + Verbinding is verlopen + + + Version check failed + Versiecontrole mislukt + + + An error occured while parsing: +version mark not found + Er is een fout opgetreden bij het ontleden: +versiemarkering niet gevonden + + + An error occured while parsing: +malformed version + Er is een fout opgetreden bij het ontleden: +onjuiste versie + + + An error occured while comparing: +malformed upstream version + Er is een fout opgetreden bij het vergelijken van: +misvormde upstreamversie + + + + CrissCross + + Victory + Overwinning + + + You beated me! + Je hebt me verslagen! + + + This time you lost! + Deze keer heb je verloren! + + + Draw + Tekenen + + + Nice match + Mooie match + + + + DialogBool + + Yes + Ja + + + No + Nee + + + + DialogIda + + Ignore + Negeren + + + Discard + Gooien + + + Abort + Afbreken + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Een van de lijsten heeft een ongeldig item + + + An error occured while reading the configuration file + Er is een fout opgetreden bij het lezen van het configuratiebestand + + + An error occured while parsing configuration file's data + Er is een fout opgetreden bij het verwerken van de gegevens van het configuratiebestand + + + Failed to create the configuration file's directory + Kon de map van het configuratiebestand niet aanmaken + + + Failed to create the configuration file + Kon het configuratiebestand niet aanmaken + + + An error occured while writing the configuration file + Er is een fout opgetreden bij het schrijven van het configuratiebestand + + + An error occured while preparing the configuration file's data + Er is een fout opgetreden bij het voorbereiden van de gegevens van het configuratiebestand + + + The path contains a symlink + Het pad bevat een symbolische verwijzing + + + The file does not exist + Het bestand bestaat niet + + + Failed to create the database backups' directory + Aanmaken van de map voor reservekopieën van de database is mislukt + + + Failed to copy the database file + Kon het databasebestand niet kopiëren + + + Failed to update the backups + Bijwerken van de back-ups is mislukt + + + Failed to create the directory + Kon de map niet aanmaken + + + Unrecognized entry + Onherkenbaar item + + + Size of the file + Grootte van het bestand + + + Warning size parameter + Waarschuwingsgrootte parameter + + + Failed to read gzipped file + Kon gziped bestand niet lezen + + + An error occured while parsing the format string + Er is een fout opgetreden bij het ontleden van de format string + + + Available memory + Beschikbaar geheugen + + + Size of the logs + Grootte van de logs + + + An error occured while reading the gzipped file + Er is een fout opgetreden bij het lezen van het gzipped bestand + + + An error occured while reading the file + Er is een fout opgetreden tijdens het lezen van het bestand + + + Something failed while handling the file + Er is iets mislukt tijdens het afhandelen van het bestand + + + An error occured while working on the database + Er is een fout opgetreden tijdens het werken aan de database + + + Aborting + Afbreken + + + Invalid locale + Ongeldige taalregio + + + Unexpected locale format + Onverwacht taalgebiedformaat + + + If you haven't manually edited the configuration file, +please report this issue + Als je het configuratiebestand niet handmatig hebt bewerkt, +Gelieve deze kwestie te rapporteren + + + The given locale is not an accepted language + De gegeven taal is geen geaccepteerde taal + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Als u deze locale wilt hebben in LogDoctor, +Volg de instructies op de repository pagina + + + Configuration file not found + Configuratiebestand niet gevonden + + + Unable to retrieve the configuration file + Kon het configuratiebestand niet ophalen + + + Skipping + Overslaan + + + An error occured while handling the configuration file + Er is een fout opgetreden tijdens het verwerken van het configuratiebestand + + + Failed to write the configuration file + Kon het configuratiebestand niet schrijven + + + Current configuration not saved + Huidige configuratie niet opgeslagen + + + File not readable + Bestand niet leesbaar + + + The file is not readable + Het bestand is niet leesbaar + + + File not writable + Bestand niet beschrijfbaar + + + The file is not writable + Het bestand is niet beschrijfbaar + + + Directory not writable + Map niet beschrijfbaar + + + The directory is not writable + De map is niet beschrijfbaar + + + Invalid path + Ongeldig pad + + + Failed applying configuration + Kon configuratie niet uitvoeren + + + Invalid configuration lines + Ongeldige configuratieregels + + + Has not been possible to apply some of the configurations + Kan sommige configuraties niet toepassen + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Als u ervoor kiest verder te gaan, zullen alle niet-toegepaste configuraties verloren gaan +Doorgaan? + + + Failed to retrieve the help file + Ophalen van het hulpbestand is mislukt + + + An error occured while getting the help file + Er is een fout opgetreden bij het ophalen van het hulpbestand + + + Additional resources can be downloaded from the git repo + Extra bronnen kunnen worden gedownload van de git repo + + + Unable to retrieve the file + Kon het bestand niet ophalen + + + Invalid string + Ongeldige tekenreeks + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + De gegeven tekenreeks is ongeldig en kan niet aan de lijst worden toegevoegd + +Verbeter het en probeer het opnieuw + + + QSql driver not found + QSql-stuurprogramma niet gevonden + + + Failed to retrieve the driver needed to handle the database + Ophalen van de driver die nodig is om de database te verwerken is mislukt + + + File not found + Bestand niet gevonden + + + Failed to retrieve the database file + Ophalen databasebestand mislukt + + + Create a new database? + Een nieuwe database aanmaken? + + + The database contains an unexpected table + De database bevat een onverwachte tabel + + + Unexpected table + Onverwacht tabel + + + It seems that the database is missing a table + Het lijkt erop dat de database een tabel mist + + + Table not found + Tabel niet gevonden + + + The database contains an unexpected column + De database bevat een onverwachte kolom + + + Unexpected column + Onverwacht kolom + + + It seems that the table is missing a column + Het lijkt erop dat de tabel mist een kolom + + + Column not found + Kolom niet gevonden + + + A column has an unexpected data-type + Een kolom heeft een onverwacht data-type + + + Unexpected data-type + Onverwacht datatype + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Deze database zal hernoemd worden met een trailing '.copy' en er zal een nieuwe gemaakt worden. +Doorgaan? + + + Database created + Database aangemaakt + + + Successfully created a new database + Met succes een nieuwe database aangemaakt + + + Not a file + Geen bestand + + + The path was supposed to point to a file, but it doesn't + Het pad moest naar een bestand wijzen, maar dat doet het niet + + + Please remove the conflict and retry + Verwijder het conflict en probeer het opnieuw + + + The database file is not readable + Het databasebestand is niet leesbaar + + + Please set the proper permissions and retry +If this error persists, please report this issue + Stel de juiste rechten in en probeer het opnieuw +Indien deze fout blijft bestaan, gelieve deze kwestie te melden + + + The database file is not writable + Het databasebestand is niet beschrijfbaar + + + Invalid database path + Ongeldig databasepad + + + Failed creating database + Aanmaken van database mislukt + + + An error occured while creating the database + Er is een fout opgetreden bij het aanmaken van de database + + + Failed opening database + Openen van database mislukt + + + An error occured while opening the database + Er is een fout opgetreden bij het openen van de database + + + Failed executing on database + Uitvoeren van database is mislukt + + + An error occured while executing a statement on the database + Er is een fout opgetreden bij het uitvoeren van een verklaring in de database + + + Failed to backup database + Reservekopie van database mislukt + + + Please report this issue + Gelieve dit punt te rapporteren + + + Invalid log format string + Ongeldige logformaattekst + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Controleer of er geen fout is opgetreden door uw WebServer +Als het wordt geaccepteerd, controleer dan de aanwezigheid van een typefout hier +Als alles goed is, meld dit dan alsjeblieft + + + Log format error + Logformaatfout + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Het logformaat is niet ingesteld of ongeldig +Voeg een geldige toe in de configuraties + + + Misconfigured log format + Verkeerd geconfigureerd logformaat + + + No log field has been set in the current logs format, +making it useless to parse logs + Er is geen logveld ingesteld in het huidige logformaat, +maken het nutteloos om logs te ontleden + + + Please set up a format which contains at least one field + Stel een formaat in dat ten minste één veld bevat + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Tussen één of meer velden ontbreekt een scheidingsteken, +Maakt het moeilijk om netto grenzen vast te stellen, +en mogelijk leidend tot het opslaan van onjuiste gegevens + + + Please set up a format which contains separators between fields + Stel een formaat in dat scheidingstekens tussen velden bevat + + + Missing field in log format + Ontbrekend veld in logformaat + + + An important field is missing from the provided format: + Een belangrijk veld ontbreekt in het opgegeven formaat: + + + The quality of the statistics may be seriously compromized + De kwaliteit van de statistieken kan ernstig worden gecompromitteerd + + + Proceed anyway? + Toch doorgaan? + + + 'Carriage Return' in log format + 'Carriage Return' in logformaat + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Het bijgeleverde formaat bevat de 'Carriage Return'. +Dit kan leiden tot gegevensverlies of crashes indien niet met voorzichtigheid gebruikt + + + An error occured while parsing logs + Er is een fout opgetreden bij het ontleden van logs + + + Failed defining type + Kon type niet definiëren + + + Failed to determine the log type + Kon het logtype niet bepalen + + + File already used + Reeds gebruikt bestand + + + The file has probably been used already + Het bestand is waarschijnlijk al gebruikt + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Negeer de waarschuwing en gebruik het toch, gooi het weg en ga verder, of Breek het hele proces af? + + + Duplicate file + Bestand dupliceren + + + The file appears twice in the list of selections + Het bestand verschijnt tweemaal in de selectielijst + + + Failed updating hashes + Bijwerken van hashes mislukt + + + An error occured while inserting the parsed files hashes into the database + Er is een fout opgetreden tijdens het invoegen van de ontleed bestanden hashes in de database + + + File exceeds warning size + Bestand is groter dan waarschuwingsgrootte + + + The file's size exceeds the warning size + De bestandsgrootte is groter dan de waarschuwingsgrootte + + + Not enough memory + Onvoldoende geheugen + + + The total size of the selected files exceeds the available memory + De totale grootte van de geselecteerde bestanden overschrijdt het beschikbare geheugen + + + Please free some resources, parse the files in different steps or split them into smaller units + Gelieve enkele bronnen vrij te maken, de bestanden in verschillende stappen te verwerken of te splitsen in kleinere eenheden + + + Failed reading + Lezen mislukt + + + File is empty + Bestand is leeg + + + The file is blank + Het bestand is leeg + + + Failed to retrieve the selected file + Ophalen van het geselecteerde bestand is mislukt + + + Discard it and continue, or Abort all and exit? + Gooi het weg en ga verder, of alles afbreken en afsluiten? + + + No file to parse + Geen bestand om te verwerken + + + The list of files to parse is empty + De lijst met te verwerken bestanden is leeg + + + Directory not found + Map niet gevonden + + + The directory does not exists + De map bestaat niet + + + Directory not readable + Map niet leesbaar + + + The directory is not readable + De map is niet leesbaar + + + Please set the proper permissions before to start + Stel de juiste rechten in voordat u begint + + + Failed creating directory + Aanmaken van map mislukt + + + The path does not exists + Het pad bestaat niet + + + Data conversion failed + Gegevensconversie mislukt + + + Failed to convert from '%1' to '%2' + Omzetten van '%1' naar '%2' is mislukt + + + Failed to create statistics + Aanmaken van statistieken mislukt + + + An error occured while processing + Er is een fout opgetreden tijdens het verwerken + + + Cannot create statistics + Kan geen statistieken aanmaken + + + No data has been found that matches with the currently set parameters + Er zijn geen gegevens gevonden die overeenkomen met de huidige parameters + + + Not a folder + Geen map + + + The path was supposed to point to a folder, but it doesn't + Het pad moest naar een map wijzen, maar dat doet het niet + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Het item wordt hernoemd met een trailing '.copy' en er zal een nieuwe worden aangemaakt. +Doorgaan? + + + An error occured + Er is een fout opgetreden + + + Failed renaming + Hernoemen mislukt + + + An error occured while renaming + Er is een fout opgetreden bij het hernoemen + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Logboeken van de Apache2 webserver verwerken + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Logboeken van de Nginx webserver verwerken + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Ontleden logs van de Microsoft IIS webserver + + + IIS + IIS + + + Select/deselect all the files + Alle bestanden selecteren/niet selecteren + + + All + Alles + + + Inspect a log file + Controleer een logbestand + + + Name + Naam + + + Size + Grootte + + + Refresh the list + De lijst vernieuwen + + + Total size of the parsed data + Totale grootte van de ontleedde gegevens + + + Total number of parsed lines + Totaal aantal ontleed lijnen + + + Start parsing the selected files + Beginnen met het verwerken van de geselecteerde bestanden + + + START + START + + + Time elapsed since the start + Tijd verstreken sinds de start + + + Average speed, in parsed data size per second + Gemiddelde snelheid, in ontleed datagrootte per seconde + + + Web Server + Webserver + + + Select a Web Server + Selecteer een webserver + + + Year + Jaar + + + Month + Maand + + + Day + Dag + + + Hour + Uur + + + Draw the chart + Teken de grafiek + + + Log line marked as Warning + Logregel gemarkeerd als waarschuwing + + + Date when the request arrived (YYYY-MM-DD) + Datum van aankomst van het verzoek (JJJJ-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Tijd waarop het verzoek arriveerde (hh:mm:ss) + + + Protocol of the request + Protocol bij het verzoek + + + Method of the request + Methode van het verzoek + + + URI of the requested page + URI van de gevraagde pagina + + + Query carried along with the URI + Zoekopdracht samen met de URI + + + Response code from the server + Antwoordcode van de server + + + User-agent of the client which made the request + Gebruiker van de opdrachtgever die het verzoek heeft ingediend + + + IP address of the Client which made the request + IP-adres van de opdrachtgever die het verzoek heeft ingediend + + + Cookie used for the request + Cookie gebruikt voor de aanvraag + + + The URL which redirected the Client to the requested page + De URL die de Klant naar de gevraagde pagina heeft doorgestuurd + + + Size ib Bytes of the request, usually includes header and data + Grootte ib Bytes van het verzoek, meestal bevat header en gegevens + + + Size in Bytes of the served content, usually includes header and data + Grootte in Bytes van de geserveerde inhoud, meestal bevat header en gegevens + + + Time taken by the server to serve the content, in milliseconds + Tijd genomen door de server om de inhoud te bedienen, in milliseconden + + + Only use lines in which the field is starting with this string + Gebruik alleen regels waarin het veld begint met deze string + + + Protocol: + Protocol: + + + Method: + Methode: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Gebruik alleen regels waarin het veld overeenkomt met deze verklaring. +Gebruik '!', '=', '<' of '>' om aan te geven wat te gebruiken + + + Response: + Respons: + + + Query: + Opvragen: + + + URI: + URI: + + + Filters + Filters + + + Count + Aantal + + + Number of occurrences + Aantal voorvallen + + + Item + Post + + + Value of the field + Waarde van het veld + + + From: + Van: + + + To: + Aan: + + + Select a log field to view + Selecteer een logveld om te bekijken + + + Field: + Veld: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Bij strings worden alleen de regels gebruikt waarin het veld begint met deze string. +Met getallen, gebruik '!', '=', '<' of '>' om aan te geven wat te gebruiken + + + Protocol + Protocol + + + Method + Methode + + + URI + URI + + + User-agent + Gebruiker-agent + + + Most recurrent + Meest terugkerende + + + Most trafficked + Meest verhandeld + + + Date ever + Datum ooit + + + Day of the week + Dag van de week + + + Hour of the day + Uur van de dag + + + Time taken + Duur + + + Bytes sent + Verzonden bytes + + + Bytes received + Ontvangen bytes + + + Mean/Max performances + Gemiddelde/Max prestaties + + + Requests received + Ontvangen verzoeken + + + Total work + Totaal + + + General + Algemeen + + + Window + Venster + + + Dialogs + Dialogen + + + Charts + Grafieken + + + Appearance + Uiterlijk + + + Speed + Snelheid + + + Relational + Relationeel + + + TextBrowser + Tekstbrowser + + + Databases + Databanken + + + Security + Beveiliging + + + Logs + Logs + + + Defaults + Standaardwaarden + + + Control + Controle + + + Path + Pad + + + Format + Formaat + + + Warnlists + Warnalisten + + + Blacklists + Zwarte lijsten + + + Remember the window's position and size + De positie en grootte van het venster onthouden + + + Remember position and size + Positie en grootte onthouden + + + Remember window's position and size + Positie en grootte van venster onthouden + + + Geometry + Geometrie + + + Theme to use for the window + Te gebruiken thema voor het venster + + + Theme + Thema + + + Native + Nationaal + + + Light + Licht + + + Dark + Donker + + + Auto + Automatisch + + + Icons + Pictogrammen + + + Normal quantity of dialog messages shown + Normale hoeveelheid getoonde dialoogberichten + + + Normal + Normaal + + + Dialogs from the main processes + Dialogen van de belangrijkste processen + + + Dialogs emitted when parsing logs + Dialogen die worden uitgezonden bij het ontleden van logs + + + Logs parser + Logs-parser + + + Dialogs emitted when viewing statistics + Dialogen uitgezonden bij het bekijken van statistieken + + + Statistics viewer + Statistiekenviewer + + + Define the quantity of dialog mesages shown + Definieer de hoeveelheid getoonde dialoogberichten + + + Dialogs level + Dialogenniveau + + + Reduced quantity of dialog messages shown + Verminderd aantal getoonde dialoogberichten + + + Essential + Essentieel + + + Augmented quantity of dialog messages shown + Aangepaste hoeveelheid getoonde dialoogberichten + + + Explanatory + Toelichting + + + Theme to use for the Charts + Thema te gebruiken voor de grafieken + + + Preview + Voorbeeld + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Vertegenwoordigt een stap in de tijdas, in seconden. +Alle waarden binnen hetzelfde interval zullen worden samengevoegd en de gemiddelde waarde zal worden gebruikt. + + + Time interval + Tijdsinterval + + + The format to use for the labels of the time axis. + Het formaat voor de etiketten van de tijdas. + + + Time format + Tijdformaat + + + The size of the pie + De grootte van de taart + + + Pie size + Pie size + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Het maximum aantal plakjes waaruit de taart zal bestaan. +Overschrijding van plakjes zal worden gegroepeerd in een uitgebreide schijf. + + + Maximum slices + Maximaal aantal plakjes + + + Font to use for the Text Browser + Te gebruiken lettertype voor de tekstbrowser + + + Font + Lettertype + + + Double-spaced lines + Dubbele spaties + + + Use wide lines + brede lijnen gebruiken + + + Define the spacing between lines + Definieer de afstand tussen lijnen + + + Lines spacing + Lijnenafstand + + + None + Geen + + + Color scheme to use for the Text Browser + Te gebruiken kleurenschema voor de tekstbrowser + + + Color scheme + Kleurschema + + + The appearance of the Text Browser with the current settings + Het uiterlijk van de tekstbrowser met de huidige instellingen + + + Insert the base path only, file name excluded + Alleen het basispad invoegen, bestandsnaam uitgesloten + + + The given path doen't exists, or doesn't point to a folder + Het opgegeven pad bestaat niet, of wijst niet naar een map + + + Path for the database files + Pad naar databasebestanden + + + Paths + Paden + + + Apply the current path + Het huidige pad toepassen + + + Select the path through a dialog window + Het pad selecteren door een dialoogvenster + + + Path where the logs data collection database is located + Pad waar de database voor gegevensverzameling van logs zich bevindt + + + Logs data + Loggegevens + + + Path where the used files hashes database is located + Pad waar de gebruikte hashes-database zich bevindt + + + Used files + Gebruikte bestanden + + + Backup options for the Logs Data database + Reservekopieopties voor de Logs Data database + + + Backups + Reservekopieën + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Een nieuwe back-up wordt gemaakt bij het sluiten van LogDoctor na succesvol bewerkt de database + + + Backup the Logs Data database and keep + Backup maken van de Logs Data database en houden + + + Whether it is allowed or denied to follow symlinks occuring in a path + Of het is toegestaan of geweigerd om symbolische koppelingen te volgen die zich in een pad voordoen + + + Follow symlinks + Symlinks volgen + + + Default WebServer + Standaard webserver + + + Usage control + Gebruikscontrole + + + Hide already used files + Al gebruikte bestanden verbergen + + + Size warnings + Groottewaarschuwingen + + + Warn me when using files with a size exceeding: + Waarschuw me bij het gebruik van bestanden met een grootte groter dan: + + + Logs folder + Logmap + + + Logs format string + Logs formaat tekenreeks + + + Format string + Opmaak tekenreeks + + + Insert the format string you're using + Plaats de format string die u gebruikt + + + Apply the current string + De huidige tekenreeks toepassen + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Genereer een sample log regel van de momenteel opgeslagen string, om te controleren of het correct wordt geformatteerd. +Elk veld dat niet door LogDoctor wordt beschouwd zal verschijnen als 'DISCARDED' + + + Generate sample + Sample genereren + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Controleer de juistheid van deze regel. +Velden gemarkeerd als 'DISCARDED' werden correct ontleed, maar worden niet beschouwd door LogDoctor + + + Open an help window + Een hulpvenster openen + + + Help + Hulp + + + Select a log field + Selecteer een logveld + + + Use warnlist for this field + Waarschuwingslijst voor dit veld gebruiken + + + Add the current line to the list + Huidige regel toevoegen aan de lijst + + + Remove the selected item from the list + Het geselecteerde item uit de lijst verwijderen + + + Move the selected item down + Geselecteerd item naar beneden verplaatsen + + + Use blacklist for this field + Zwarte lijst gebruiken voor dit veld + + + Add line + Regel toevoegen + + + Remove selection + Selectie verwijderen + + + Language + Taal + + + Utilities + Hulpmiddelen + + + Tools + Hulpmiddelen + + + Games + Spellen + + + Perform a version-check + Een versiecontrole uitvoeren + + + Show some info about LogDoctor + Toon wat informatie over LogDoctor + + + Open a block-note like window to write temporary text + Een bloknote openen om tijdelijke tekst te schrijven + + + Play CrissCross + CrissCross spelen + + + Play Snake + Slang afspelen + + + Show the changelog + Wijziglog tonen + + + warnlist + warnlist + + + blacklist + zwarte lijst + + + copy + kopiëren + + + copies + kopieën + + + Check updates + Controleer updates + + + Infos + Informatie + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Slang + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Selecteer een bestand uit de lijst + + + to inspect its content + de inhoud ervan te inspecteren + + + Failed to read + Kon niet lezen + + + + SnakeGame + + PLAY + SPEEL + + + Classic + Klassiek + + + Hunt + Hunt + + + Battle + Gevecht + + + Game Over + Spel voorbij + + + Your adversary fell in the water! + Je tegenstander viel in het water! + + + YOU WON! + Echt waar! + + + You fell in the water! + Je viel in het water! + + + YOU LOST! + Je bent verloren! + + + Your adversary ate itself! + Je tegenstander heeft zichzelf opgegeten! + + + You ate yourself! + Je hebt jezelf opgegeten! + + + Your adversary ate you! + Je tegenstander heeft je opgegeten! + + + You ate your adversary! + Je hebt je tegenstander opgegeten! + + + You ate each other! + Jullie hebben elkaar opgegeten! + + + MATCH IS DRAW! + Match is Draw! + + + + TR + + Unexpected WebServer + Onverwachte WebServer + + + Logs Size Breakdown + Logs Grootteindeling + + + Ignored + Negeren + + + Parsed + Parsed + + + Blacklisted + Zwarte lijst + + + Others + Andere + + + from + van + + + to + tot + + + Log Lines Marked as Warning + Logregels gemarkeerd als waarschuwing + + + Time Taken to Serve Requests + Tijd genomen om verzoeken te serveren + + + Time of Day Count + Aantal dagen + + + Relational Count + Relationele telling + + + FALSE + FALSE + + + TRUE + WAAR + + + Date + Datum + + + Year + Jaar + + + Month + Maand + + + Day + Dag + + + Time + Tijd + + + Hour + Uur + + + Minute + Minuut + + + Second + Tweede + + + Warning + Waarschuwing + + + Protocol + Protocol + + + Method + Methode + + + URI + URI + + + Query + Opvragen + + + Response code + Responscode + + + Time taken + Duur + + + Bytes sent + Verzonden bytes + + + Bytes received + Ontvangen bytes + + + Referrer + Verwijzer + + + Cookie + Cookie + + + Client + Client + + + User-agent + Gebruiker-agent + + + January + Januari + + + February + Februari + + + March + Maart + + + April + april + + + May + Mei + + + June + Juni + + + July + Juli + + + August + Augustus + + + September + September + + + October + oktober + + + November + November + + + December + December + + + Sunday + Zondag + + + Monday + Maandag + + + Tuesday + dinsdag + + + Wednesday + Woensdag + + + Thursday + Donderdag + + + Friday + Vrijdag + + + Saturday + Zaterdag + + + diff --git a/logdoctor/translations/LogDoctor_pl_PL.ts b/logdoctor/translations/LogDoctor_pl_PL.ts new file mode 100644 index 0000000..d580d92 --- /dev/null +++ b/logdoctor/translations/LogDoctor_pl_PL.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Wersje + + + Version 4 + Wersja 4 + + + Version 3 + Wersja 3 + + + Version 2 + Wersja 2 + + + Version 1 + Wersja 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Buduj skrypty + + + Cross-platform compatibility: + Kompatybilność Cross- platform: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statystyki: + + + Warnings + Ostrzeżenia + + + Speed + Prędkość + + + Counts + Liczby + + + Daytime + Daytime + + + Relational + Relacje + + + Globals + Globale + + + Translations: + Tłumaczenie: + + + Italian + Włoski + + + Spanish + Hiszpański + + + French + Francuski + + + Tools: + Narzędzia: + + + Block note + Uwaga blokowa + + + Utilities: + Narzędzia: + + + Infos viewer + Przeglądarka informacji + + + Updates checker + Aktualizacja sprawdzania + + + Themes: + Tematy: + + + Dark + Ciemny + + + Light + Światło + + + Improvements and fixes + Ulepszenia i poprawki + + + New themes: + Nowe motywy: + + + Ash + Popiół + + + Candy + Cukierki + + + Forest + Las + + + Powder + Proszek + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Restaurowane dialogi + + + Doxygen documentation + Dokumentacja Doxygen + + + Mini-Games: + Mini- Gry: + + + Criss-cross + Krzyż + + + Snake + Wąż + + + Changed default paths + Zmieniono ścieżki domyślne + + + New game modes for Snake + Nowe tryby gry dla Snake + + + Hunt + Hunt + + + Battle + Bitwa + + + New translations: + Nowe tłumaczenia: + + + Japanese + Japoński + + + Portuguese + Portugalski + + + Code improvements + Ulepszenia kodeksu + + + Performance improvements + Poprawa wydajności + + + Added tests suite: + Dodano zestaw testów: + + + white box tests + badania na białym pudełku + + + Customized charts themes + Niestandardowe motywy wykresów + + + Fixes + Fixes + + + Tests improvements + Poprawa badań + + + Docker support + Obsługa dokerów + + + Upgrade to C++20 + Aktualizacja do C++20 + + + Upgrade to Qt6 + Aktualizacja do Qt6 + + + Restyled themes + Przywracane motywy + + + Redesigned configs section + Przeredagowana sekcja konfigii + + + Stability improvements + Poprawa stabilności + + + Generating warnings dinamically + Generowanie ostrzeżeń diamicznie + + + New tool: + Nowe narzędzie: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Podświetlane parametry dla niektórych wykresów: + + + Improved project structure + Poprawa struktury projektu + + + Modernized Cmake usage + Modernizacja Użycie cmake + + + + Crapinfo + + Version + Wersja + + + Currently installed version of the software + Aktualnie zainstalowana wersja oprogramowania + + + Repository links + Powiązania z repozytorium + + + Paths + Ścieżki + + + The path of the executable file + Ścieżka pliku wykonywalnego + + + Executable + Wykonalne + + + The path where the configuration file gets saved and searched in + Ścieżka, w której plik konfiguracyjny zostaje zapisany i przeszukany + + + Configuration file + Plik konfiguracyjny + + + The path where the application searches for extra resources + Ścieżka, w której program szuka dodatkowych zasobów + + + Application data + Dane dotyczące zastosowania + + + + Crapnote + + Reduce the font size + Zmniejsz rozmiar czcionki + + + Font size + Rozmiar czcionki + + + Increase the font size + Zwiększ rozmiar czcionki + + + + Crappath + + Choose + Wybierz + + + Cancel + Anuluj + + + + Crapup + + Checking for updates + Sprawdzanie aktualizacji + + + New version available + Nowa wersja dostępna + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Nowa wersja jest dostępna! +Proszę odwiedzić repozytorium Git LogDoctora i postępować zgodnie z instrukcją jak zaktualizować + + + No update found + Nie znaleziono aktualizacji + + + LogDoctor is up-to-date + LogDoctor jest up- to- date + + + :/ + : / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Prowadzisz wersję z przyszłości! +Twoja wersja jest poza aktualną wersją początkową +Sprawdzasz oryginalnego LogDoktora? +Proszę odwiedzić repozytorium LogDoctora i uzyskać jego świeżą wersję + + + Failed to establish a connection + Nie udało się utworzyć połączenia + + + Connection error, please try again later + Błąd połączenia, proszę spróbować ponownie później + + + Connection timed out + Wyłączony czas połączenia + + + Version check failed + Sprawdzanie wersji nie powiodło się + + + An error occured while parsing: +version mark not found + Wystąpił błąd podczas parsowania: +nie znaleziono znaku wersji + + + An error occured while parsing: +malformed version + Wystąpił błąd podczas parsowania: +wersja zniekształcona + + + An error occured while comparing: +malformed upstream version + Wystąpił błąd podczas porównywania: +nieprawidłowa wersja + + + + CrissCross + + Victory + Zwycięstwo + + + You beated me! + Pokonałeś mnie! + + + This time you lost! + Tym razem przegrałeś! + + + Draw + Rysuj + + + Nice match + Niezły mecz + + + + DialogBool + + Yes + Tak + + + No + Nie + + + + DialogIda + + Ignore + Ignoruj + + + Discard + Wyrzucić + + + Abort + Przerwać + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Jedna z list ma niepoprawną pozycję + + + An error occured while reading the configuration file + Błąd podczas odczytu pliku konfiguracyjnego + + + An error occured while parsing configuration file's data + Błąd podczas przetwarzania danych z pliku konfiguracyjnego + + + Failed to create the configuration file's directory + Nie udało się utworzyć katalogu pliku konfiguracyjnego + + + Failed to create the configuration file + Nie udało się utworzyć pliku konfiguracyjnego + + + An error occured while writing the configuration file + Błąd podczas zapisywania pliku konfiguracyjnego + + + An error occured while preparing the configuration file's data + Błąd podczas przygotowywania danych pliku konfiguracyjnego + + + The path contains a symlink + Ścieżka zawiera symlink + + + The file does not exist + Plik nie istnieje + + + Failed to create the database backups' directory + Nie udało się utworzyć katalogu kopii zapasowych bazy danych + + + Failed to copy the database file + Nie udało się skopiować pliku bazy danych + + + Failed to update the backups + Nie udało się zaktualizować kopii zapasowych + + + Failed to create the directory + Nie udało się utworzyć katalogu + + + Unrecognized entry + Nierozpoznany wpis + + + Size of the file + Rozmiar pliku + + + Warning size parameter + Parametr rozmiaru ostrzeżenia + + + Failed to read gzipped file + Nie można odczytać pliku gzipped + + + An error occured while parsing the format string + Wystąpił błąd podczas przetwarzania łańcucha formatu + + + Available memory + Dostępna pamięć + + + Size of the logs + Wielkość dzienników + + + An error occured while reading the gzipped file + Błąd podczas czytania pliku gzipped + + + An error occured while reading the file + Wystąpił błąd podczas czytania pliku + + + Something failed while handling the file + Coś nie powiodło się podczas obsługi pliku + + + An error occured while working on the database + Wystąpił błąd podczas pracy nad bazą danych + + + Aborting + Przerywanie + + + Invalid locale + Niepoprawna lokalizacja + + + Unexpected locale format + Nieoczekiwany format lokalizacji + + + If you haven't manually edited the configuration file, +please report this issue + Jeśli nie edytowałeś ręcznie pliku konfiguracyjnego, +Proszę zgłosić tę kwestię + + + The given locale is not an accepted language + Podana lokalizacja nie jest akceptowanym językiem + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Jeśli chcesz mieć to miejsce w LogDoctor, +Proszę postępować zgodnie z instrukcją na stronie repozytorium + + + Configuration file not found + Nie znaleziono pliku konfiguracyjnego + + + Unable to retrieve the configuration file + Nie można pobrać pliku konfiguracyjnego + + + Skipping + Pominięcie + + + An error occured while handling the configuration file + Błąd podczas obsługi pliku konfiguracyjnego + + + Failed to write the configuration file + Nie udało się zapisać pliku konfiguracyjnego + + + Current configuration not saved + Obecna konfiguracja nie została zapisana + + + File not readable + Plik nieczytelny + + + The file is not readable + Plik nie jest do odczytu + + + File not writable + Plik nie można zapisać + + + The file is not writable + Plik nie jest zapisywalny + + + Directory not writable + Katalog nie można zapisać + + + The directory is not writable + Katalog nie jest zapisywalny + + + Invalid path + Nieprawidłowa ścieżka + + + Failed applying configuration + Konfiguracja nie powiodła się + + + Invalid configuration lines + Nieprawidłowe linie konfiguracyjne + + + Has not been possible to apply some of the configurations + Nie było możliwe zastosowanie niektórych konfiguracji + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Jeśli zdecydujesz się kontynuować, wszystkie nieużywane konfiguracje zostaną utracone +Kontynuować? + + + Failed to retrieve the help file + Nie udało się pobrać pliku pomocy + + + An error occured while getting the help file + Wystąpił błąd podczas pobierania pliku pomocy + + + Additional resources can be downloaded from the git repo + Dodatkowe zasoby można pobrać z git repo + + + Unable to retrieve the file + Nie można pobrać pliku + + + Invalid string + Nieprawidłowy ciąg + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Podany łańcuch jest nieprawidłowy i nie może być dodany do listy + +Proszę poprawić i spróbować ponownie + + + QSql driver not found + Nie znaleziono sterownika QSql + + + Failed to retrieve the driver needed to handle the database + Nie udało się odzyskać sterownika potrzebnego do obsługi bazy danych + + + File not found + Nie znaleziono pliku + + + Failed to retrieve the database file + Nie udało się pobrać pliku bazy danych + + + Create a new database? + Utworzyć nową bazę danych? + + + The database contains an unexpected table + Baza danych zawiera nieoczekiwaną tabelę + + + Unexpected table + Tabela nieoczekiwana + + + It seems that the database is missing a table + Wygląda na to, że w bazie danych brakuje tabeli + + + Table not found + Nie znaleziono tabeli + + + The database contains an unexpected column + Baza danych zawiera nieoczekiwaną kolumnę + + + Unexpected column + Nieoczekiwana kolumna + + + It seems that the table is missing a column + Wydaje się, że tabeli brakuje kolumny + + + Column not found + Kolumna nie znaleziono + + + A column has an unexpected data-type + Kolumna posiada nieoczekiwany typ danych + + + Unexpected data-type + Niespodziewany typ danych + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Ta baza danych zostanie zmieniona na ".copy" i zostanie utworzona nowa. +Kontynuować? + + + Database created + Utworzona baza danych + + + Successfully created a new database + Udane utworzenie nowej bazy danych + + + Not a file + Nie plik + + + The path was supposed to point to a file, but it doesn't + Ścieżka miała wskazywać na plik, ale nie + + + Please remove the conflict and retry + Proszę usunąć konflikt i spróbować ponownie + + + The database file is not readable + Plik bazy danych nie jest do odczytu + + + Please set the proper permissions and retry +If this error persists, please report this issue + Proszę ustawić odpowiednie uprawnienia i spróbować ponownie +Jeśli ten błąd utrzymuje się, proszę zgłosić ten problem + + + The database file is not writable + Plik bazy danych nie jest zapisywalny + + + Invalid database path + Nieprawidłowa ścieżka bazy danych + + + Failed creating database + Nie udało się utworzyć bazy danych + + + An error occured while creating the database + Błąd podczas tworzenia bazy danych + + + Failed opening database + Nie udało się otworzyć bazy danych + + + An error occured while opening the database + Błąd podczas otwierania bazy danych + + + Failed executing on database + Nieudane wykonanie w bazie danych + + + An error occured while executing a statement on the database + Błąd popełniony podczas wykonywania oświadczenia w bazie danych + + + Failed to backup database + Nie udało się utworzyć kopii zapasowej bazy danych + + + Please report this issue + Proszę zgłosić tę kwestię + + + Invalid log format string + Nieprawidłowy ciąg formatu dziennika + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Proszę sprawdzić, czy żaden błąd nie jest rzucany przez serwer WebServer +Jeśli zostanie zaakceptowany, proszę sprawdzić obecność literówki tutaj +Jeśli wszystko jest w porządku, proszę zgłosić ten problem + + + Log format error + Błąd formatu dziennika + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Format dziennika nie został ustawiony lub jest nieprawidłowy +Proszę dodać poprawny w konfiguracjach + + + Misconfigured log format + Nieprawidłowo skonfigurowany format dziennika + + + No log field has been set in the current logs format, +making it useless to parse logs + W bieżącym formacie dziennika nie zostało ustawione żadne pole dziennika, +co czyni to bezużytecznym do analizowania dzienników + + + Please set up a format which contains at least one field + Proszę skonfigurować format zawierający co najmniej jedno pole + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Brakuje separatora pomiędzy jednym lub większą liczbą pól, +utrudniając ustalenie granic sieci, +i może prowadzić do przechowywania nieprawidłowych danych + + + Please set up a format which contains separators between fields + Proszę ustawić format zawierający separatory pomiędzy polami + + + Missing field in log format + Brak pola w formacie dziennika + + + An important field is missing from the provided format: + W dostarczonym formacie brakuje ważnego pola: + + + The quality of the statistics may be seriously compromized + Jakość statystyk może być poważnie skompilowana + + + Proceed anyway? + Kontynuować? + + + 'Carriage Return' in log format + "Powrót przewozu" w formacie dziennika + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Dostarczony format zawiera "Carriage Return". +Może to prowadzić do utraty danych lub awarii, jeśli nie są stosowane z ostrożnością + + + An error occured while parsing logs + Błąd podczas parsowania dzienników + + + Failed defining type + Nie powiodło się zdefiniowanie typu + + + Failed to determine the log type + Nie można określić typu dziennika + + + File already used + Plik już użyty + + + The file has probably been used already + Plik prawdopodobnie został już użyty + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Zignorować ostrzeżenie i używać go mimo wszystko, Wyrzucić go i kontynuować, lub przerwać cały proces? + + + Duplicate file + Plik duplikat + + + The file appears twice in the list of selections + Plik pojawia się dwukrotnie na liście wyboru + + + Failed updating hashes + Nie powiodła się aktualizacja hash + + + An error occured while inserting the parsed files hashes into the database + Wystąpił błąd podczas wstawiania do bazy danych przepuszczonych plików + + + File exceeds warning size + Plik przekracza rozmiar ostrzeżenia + + + The file's size exceeds the warning size + Rozmiar pliku przekracza rozmiar ostrzeżenia + + + Not enough memory + Za mało pamięci + + + The total size of the selected files exceeds the available memory + Całkowita wielkość wybranych plików przekracza dostępną pamięć + + + Please free some resources, parse the files in different steps or split them into smaller units + Proszę uwolnić niektóre zasoby, przetworzyć pliki w różnych etapach lub podzielić je na mniejsze jednostki + + + Failed reading + Brak odczytu + + + File is empty + Plik jest pusty + + + The file is blank + Plik jest pusty + + + Failed to retrieve the selected file + Nie udało się pobrać wybranego pliku + + + Discard it and continue, or Abort all and exit? + Wyrzucić i kontynuować, czy przerwać wszystko i wyjść? + + + No file to parse + Brak pliku do analizy + + + The list of files to parse is empty + Lista plików do przetwarzania jest pusta + + + Directory not found + Nie znaleziono katalogu + + + The directory does not exists + Katalog nie istnieje + + + Directory not readable + Katalog nieczytelny + + + The directory is not readable + Katalog nie jest czytelny + + + Please set the proper permissions before to start + Proszę ustawić odpowiednie uprawnienia przed rozpoczęciem + + + Failed creating directory + Nie udało się utworzyć katalogu + + + The path does not exists + Ścieżka nie istnieje + + + Data conversion failed + Konwersja danych nie powiodła się + + + Failed to convert from '%1' to '%2' + Nie można przekonwertować z '%1' na '%2' + + + Failed to create statistics + Nie udało się utworzyć statystyki + + + An error occured while processing + Błąd podczas przetwarzania + + + Cannot create statistics + Nie można tworzyć statystyk + + + No data has been found that matches with the currently set parameters + Nie znaleziono danych pasujących do aktualnie ustalonych parametrów + + + Not a folder + Nie folder + + + The path was supposed to point to a folder, but it doesn't + Ścieżka miała wskazywać na folder, ale nie + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Wpis zostanie zmieniony na znak '.copy' i zostanie utworzony nowy. +Kontynuować? + + + An error occured + Błąd popełniony + + + Failed renaming + Nie udało się zmienić nazwy + + + An error occured while renaming + Wystąpił błąd podczas zmiany nazwy + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Logi grup z serwera Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Logi grup z serwera Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Logi grup z serwera internetowego Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Wybierz / usuń wszystkie pliki + + + All + Wszystkie + + + Inspect a log file + Sprawdź plik dziennika + + + Name + Nazwa + + + Size + Rozmiar + + + Refresh the list + Odśwież listę + + + Total size of the parsed data + Całkowita wielkość danych przeczących + + + Total number of parsed lines + Łączna liczba przecznic + + + Start parsing the selected files + Zacznij przeglądać wybrane pliki + + + START + START + + + Time elapsed since the start + Czas upłynął od początku + + + Average speed, in parsed data size per second + Średnia prędkość, w paradowanym rozmiarze danych na sekundę + + + Web Server + Web Server + + + Select a Web Server + Wybierz serwer WWW + + + Year + Rok + + + Month + Miesiąc + + + Day + Dzień + + + Hour + Godzina + + + Draw the chart + Narysuj wykres + + + Log line marked as Warning + Wiersz dziennika oznaczony jako Ostrzeżenie + + + Date when the request arrived (YYYY-MM-DD) + Data przybycia wniosku (RRRR- MM- DD) + + + Time when the request arrived (hh:mm:ss) + Czas przybycia wniosku (hh: mm: ss) + + + Protocol of the request + Protokół wniosku + + + Method of the request + Metoda wniosku + + + URI of the requested page + URI żądanej strony + + + Query carried along with the URI + Pytania prowadzone wraz z URI + + + Response code from the server + Kod odpowiedzi z serwera + + + User-agent of the client which made the request + Agent użytkownika klienta, który złożył wniosek + + + IP address of the Client which made the request + Adres IP Klienta, który złożył wniosek + + + Cookie used for the request + Cookie używane na wniosek + + + The URL which redirected the Client to the requested page + URL, który przekierował Klienta na żądaną stronę + + + Size ib Bytes of the request, usually includes header and data + Rozmiar ib bajty żądania, zazwyczaj zawiera nagłówek i dane + + + Size in Bytes of the served content, usually includes header and data + Rozmiar w bajtach zawartości, zazwyczaj zawiera nagłówek i dane + + + Time taken by the server to serve the content, in milliseconds + Czas brany przez serwer do obsługi zawartości, w milisekundach + + + Only use lines in which the field is starting with this string + Użyj tylko wierszy, w których pole zaczyna się tym ciągiem + + + Protocol: + Protokół: + + + Method: + Metoda: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Użyj tylko linii, w których pole pasuje do tego wyrażenia. +Użyj '!', '=', '<' lub '>', aby zadeklarować, czego używać + + + Response: + Odpowiedź: + + + Query: + Pytanie: + + + URI: + URI: + + + Filters + Filtry + + + Count + Licz + + + Number of occurrences + Liczba zdarzeń + + + Item + Pozycja + + + Value of the field + Wartość pola + + + From: + Od: + + + To: + Do: + + + Select a log field to view + Wybierz pole dziennika do wyświetlenia + + + Field: + Pole: + + + Filter: + Filtr: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Z ciągiem łańcuchowym używane będą tylko linie, w których pole zaczyna się tym ciągiem. +Z numerami, użyj '!', '=', '<' lub '>', aby zadeklarować, co używać + + + Protocol + Protokół + + + Method + Metoda + + + URI + URI + + + User-agent + User- agent + + + Most recurrent + Najczęściej nawracające + + + Most trafficked + Większość handlarzy + + + Date ever + Data + + + Day of the week + Dzień tygodnia + + + Hour of the day + Godzina dnia + + + Time taken + Czas + + + Bytes sent + Wysłane bajty + + + Bytes received + Otrzymane bajty + + + Mean/Max performances + Średnie / Maksymalne parametry + + + Requests received + Otrzymane wnioski + + + Total work + Całkowita praca + + + General + Ogólne + + + Window + Okno + + + Dialogs + Dialogi + + + Charts + Wykresy + + + Appearance + Wygląd + + + Speed + Prędkość + + + Relational + Relacje + + + TextBrowser + TextBrowser + + + Databases + Bazy danych + + + Security + Bezpieczeństwo + + + Logs + Logi + + + Defaults + Domyślne + + + Control + Kontrola + + + Path + Ścieżka + + + Format + Format + + + Warnlists + Warnlist + + + Blacklists + Czarne listy + + + Remember the window's position and size + Zapamiętaj pozycję i rozmiar okna + + + Remember position and size + Zapamiętaj pozycję i rozmiar + + + Remember window's position and size + Zapamiętaj pozycję i rozmiar okna + + + Geometry + Geometria + + + Theme to use for the window + Motyw do użycia dla okna + + + Theme + Motyw + + + Native + Tubylcy + + + Light + Światło + + + Dark + Ciemny + + + Auto + Auto + + + Icons + Ikony + + + Normal quantity of dialog messages shown + Normalna ilość wyświetlanych komunikatów dialogowych + + + Normal + Normalny + + + Dialogs from the main processes + Dialogi z głównych procesów + + + Dialogs emitted when parsing logs + Dialogi emitowane podczas parsowania dzienników + + + Logs parser + Parser dziennika + + + Dialogs emitted when viewing statistics + Dialogi emitowane podczas przeglądania statystyk + + + Statistics viewer + Przeglądarka statystyki + + + Define the quantity of dialog mesages shown + Zdefiniuj ilość wyświetlanych oznaczeń dialogowych + + + Dialogs level + Poziom dialogów + + + Reduced quantity of dialog messages shown + Zmniejszona ilość wyświetlanych wiadomości dialogowych + + + Essential + Zasadnicze + + + Augmented quantity of dialog messages shown + Rozszerzona ilość wyświetlanych komunikatów dialogowych + + + Explanatory + Wyjaśnienie + + + Theme to use for the Charts + Motyw do użycia dla wykresów + + + Preview + Podgląd + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Przedstawia krok w osi czasu, w sekundach. +Wszystkie wartości mieszczące się w tym samym przedziale zostaną połączone i użyta zostanie średnia wartość. + + + Time interval + Przedział czasu + + + The format to use for the labels of the time axis. + Format stosowany dla etykiet osi czasu. + + + Time format + Format czasu + + + The size of the pie + Rozmiar ciasta + + + Pie size + Wielkość ciasta + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Maksymalna liczba plastrów, z których będzie składał się placek. +Nadmierne plastry zostaną pogrupowane w jeden kompleksowy plaster. + + + Maximum slices + Maksymalne plastry + + + Font to use for the Text Browser + Czcionka do użycia dla przeglądarki tekstowej + + + Font + Czcionka + + + Double-spaced lines + Linie podwójne + + + Use wide lines + Użyj szerokich linii + + + Define the spacing between lines + Zdefiniuj odstępy między wierszami + + + Lines spacing + Odstęp między wierszami + + + None + Brak + + + Color scheme to use for the Text Browser + Schemat kolorów do użycia dla przeglądarki tekstowej + + + Color scheme + Schemat kolorów + + + The appearance of the Text Browser with the current settings + Wygląd przeglądarki tekstowej z aktualnymi ustawieniami + + + Insert the base path only, file name excluded + Wstaw tylko ścieżkę bazową, bez nazwy pliku + + + The given path doen't exists, or doesn't point to a folder + Podana ścieżka nie istnieje lub nie wskazuje na folder + + + Path for the database files + Ścieżka do plików bazy danych + + + Paths + Ścieżki + + + Apply the current path + Zastosuj bieżącą ścieżkę + + + Select the path through a dialog window + Wybierz ścieżkę przez okno dialogowe + + + Path where the logs data collection database is located + Ścieżka, na której znajduje się baza danych gromadzenia danych dzienników + + + Logs data + Dane dotyczące dziennika + + + Path where the used files hashes database is located + Ścieżka gdzie używane pliki hashes baza danych jest zlokalizowana + + + Used files + Używane pliki + + + Backup options for the Logs Data database + Opcje kopii zapasowych dla bazy danych Logs + + + Backups + Kopie zapasowe + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Nowy backup jest wykonywany podczas zamykania LogDoctor po pomyślnej edycji bazy danych + + + Backup the Logs Data database and keep + Backup bazy danych logów i zachować + + + Whether it is allowed or denied to follow symlinks occuring in a path + Czy dozwolone jest podążanie za dowiązaniami symfonicznymi pojawiającymi się na ścieżce + + + Follow symlinks + Podążaj za linkami + + + Default WebServer + Domyślny serwer WebServer + + + Usage control + Kontrola użycia + + + Hide already used files + Ukryj już używane pliki + + + Size warnings + Ostrzeżenia dotyczące rozmiaru + + + Warn me when using files with a size exceeding: + Ostrzeż mnie przy użyciu plików o rozmiarze przekraczającym: + + + Logs folder + Folder dzienników + + + Logs format string + Łańcuch formatu dziennika + + + Format string + Łańcuch formatowania + + + Insert the format string you're using + Wstaw łańcuch formatu, którego używasz + + + Apply the current string + Zastosuj bieżący ciąg + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generuj linię dziennika próbek z aktualnie zapisanego łańcucha, aby sprawdzić, czy została sformatowana poprawnie. +Każde pole nieuznane przez LogDoctor pojawi się jako 'DISCARDED' + + + Generate sample + Generuj próbkę + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Proszę sprawdzić poprawność tej linii. +Pola oznaczone jako 'DISCARDED' zostały prawidłowo przesortowane, ale nie są uważane przez LogDoctor + + + Open an help window + Otwórz okno pomocy + + + Help + Pomoc + + + Select a log field + Wybierz pole dziennika + + + Use warnlist for this field + Użyj listy ostrzeżeń dla tego pola + + + Add the current line to the list + Dodaj bieżący wiersz do listy + + + Remove the selected item from the list + Usuń zaznaczony element z listy + + + Move the selected item down + Przesuń zaznaczony element w dół + + + Use blacklist for this field + Użyj czarnej listy dla tego pola + + + Add line + Dodaj linię + + + Remove selection + Usuń zaznaczenie + + + Language + Język + + + Utilities + Narzędzia + + + Tools + Narzędzia + + + Games + Gry + + + Perform a version-check + Sprawdź wersję + + + Show some info about LogDoctor + Pokaż pewne informacje o LogDoctor + + + Open a block-note like window to write temporary text + Otwórz block- note jak okno, aby napisać tymczasowy tekst + + + Play CrissCross + Zagraj CrissCross + + + Play Snake + Zagraj wąż + + + Show the changelog + Pokaż zmiennokształtny + + + warnlist + warnlist + + + blacklist + czarna lista + + + copy + kopia + + + copies + kopie + + + Check updates + Sprawdź aktualizacje + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Wąż + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Wybierz plik z listy + + + to inspect its content + do kontroli zawartości + + + Failed to read + Nie można odczytać + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klasyczny + + + Hunt + Hunt + + + Battle + Bitwa + + + Game Over + Koniec gry + + + Your adversary fell in the water! + Twój przeciwnik wpadł do wody! + + + YOU WON! + Wygrałeś! + + + You fell in the water! + Wpadłeś do wody! + + + YOU LOST! + Przegrałeś! + + + Your adversary ate itself! + Twój przeciwnik sam się zjadł! + + + You ate yourself! + Sam się zjadłeś! + + + Your adversary ate you! + Twój przeciwnik cię zjadł! + + + You ate your adversary! + Zjadłeś przeciwnika! + + + You ate each other! + Zjedliście się! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + Nieoczekiwany serwer WebServer + + + Logs Size Breakdown + Podział wielkości dzienników + + + Ignored + Ignored + + + Parsed + Częściowo + + + Blacklisted + Czarna lista + + + Others + Pozostałe + + + from + od + + + to + do + + + Log Lines Marked as Warning + Linie dziennika oznaczone jako ostrzeżenie + + + Time Taken to Serve Requests + Czas potrzebny na podanie żądań + + + Time of Day Count + Czas dnia + + + Relational Count + Liczba względna + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + Data + + + Year + Rok + + + Month + Miesiąc + + + Day + Dzień + + + Time + Czas + + + Hour + Godzina + + + Minute + Minuta + + + Second + Drugi + + + Warning + Ostrzeżenie + + + Protocol + Protokół + + + Method + Metoda + + + URI + URI + + + Query + Pytania + + + Response code + Kod odpowiedzi + + + Time taken + Czas + + + Bytes sent + Wysłane bajty + + + Bytes received + Otrzymane bajty + + + Referrer + Odsyłacz + + + Cookie + Cookie + + + Client + Klient + + + User-agent + User- agent + + + January + Styczeń + + + February + Luty + + + March + marzec + + + April + Kwiecień + + + May + maj + + + June + Czerwiec + + + July + Lipiec + + + August + Sierpień + + + September + Wrzesień + + + October + październik + + + November + listopad + + + December + Grudzień + + + Sunday + Niedziela + + + Monday + Poniedziałek + + + Tuesday + Wtorek + + + Wednesday + Środa + + + Thursday + Czwartek + + + Friday + Piątek + + + Saturday + Sobota + + + diff --git a/logdoctor/translations/LogDoctor_pt_BR.ts b/logdoctor/translations/LogDoctor_pt_BR.ts index 61b0a88..c5bb20e 100644 --- a/logdoctor/translations/LogDoctor_pt_BR.ts +++ b/logdoctor/translations/LogDoctor_pt_BR.ts @@ -1058,6 +1058,30 @@ This may lead to data losses or crashes if not used with caution O formato fornecido contém o 'Carriage Return'. Isso pode levar a perdas de dados ou travamentos se não for usado com cautela + + Failed to create the configuration file + Falhado para criar o arquivo de configuração + + + The path contains a symlink + O caminho contém um symlink + + + The file does not exist + O arquivo não existe + + + Invalid path + Caminho inválido + + + Invalid database path + Caminho de banco de dados inválido + + + The path does not exists + O caminho não existe + GameDialog @@ -1556,18 +1580,10 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'Gere uma linha de log de amostra a partir do texto atualmente salva, para verificar se ela está formatada corretamente. Qualquer campo não considerado pelo LogDoctor aparecerá como 'DISCARDED' - - CrissCross - Cruzado - Play CrissCross Jogar a Cruzada - - Snake - Cobra - Play Snake Jogar a Cobra @@ -1728,22 +1744,10 @@ Campos marcados como 'DISCARDED' analisados ​​corretamente, mas o Games Jogos - - Check updates - Verificar atualizações - Perform a version-check Execute uma verificação de versão - - Infos - Informação - - - BlockNote - Bloco de Notas - Open a block-note like window to write temporary text Abra uma janela semelhante a uma nota de bloco para escrever um texto temporário @@ -1784,10 +1788,6 @@ Campos marcados como 'DISCARDED' analisados ​​corretamente, mas o Show some info about LogDoctor Mostrar algumas informações sobre o LogDoctor - - Changelog - Registro de alterações - Show the changelog Mostrar o registro de alterações @@ -1806,82 +1806,6 @@ Todos os valores dentro do mesmo intervalo serão mesclados e o valor médio ser Time interval Intervalo de tempo - - 1 - 1 - - - 2 - 2 - - - 3 - 3 - - - 4 - 4 - - - 5 - 5 - - - 10 - 10 - - - 15 - 15 - - - 20 - 20 - - - 30 - 30 - - - 60 - 60 - - - 120 - 120 - - - 180 - 180 - - - 240 - 240 - - - 300 - 300 - - - 600 - 600 - - - 900 - 900 - - - 1200 - 1200 - - - 1800 - 1800 - - - 3600 - 3600 - The format to use for the labels of the time axis. O formato a ser usado para os rótulos do eixo do tempo. @@ -1890,14 +1814,6 @@ Todos os valores dentro do mesmo intervalo serão mesclados e o valor médio ser Time format Formato de hora - - hh:mm - hh:mm - - - hh - hh - The size of the pie O tamanho do gráfico de pizza @@ -1924,6 +1840,42 @@ As fatias excedentes serão agrupadas em uma fatia abrangente. Appearance Aparência + + Security + Segurança + + + Whether it is allowed or denied to follow symlinks occuring in a path + Se é permitido ou negado a seguir links que ocorrem em um caminho + + + Follow symlinks + Seguir symlinks + + + Check updates + Verificar atualizações + + + Infos + Info + + + BlockNote + Nota do bloco + + + CrissCross + Críticas + + + Snake + Snake + + + Changelog + Registro de alterações + RichText diff --git a/logdoctor/translations/LogDoctor_pt_PT.ts b/logdoctor/translations/LogDoctor_pt_PT.ts new file mode 100644 index 0000000..0ef5627 --- /dev/null +++ b/logdoctor/translations/LogDoctor_pt_PT.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versões + + + Version 4 + Versão 4 + + + Version 3 + Versão 3 + + + Version 2 + Versão 2 + + + Version 1 + Versão 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Criar scripts + + + Cross-platform compatibility: + Compatibilidade entre plataformas: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Estatística: + + + Warnings + Avisos + + + Speed + Velocidade + + + Counts + Condes + + + Daytime + Hora do dia + + + Relational + Relação + + + Globals + Globals + + + Translations: + Tradução: + + + Italian + Italiano + + + Spanish + Espanhol + + + French + Francês + + + Tools: + Ferramentas: + + + Block note + Nota de bloco + + + Utilities: + Utilities: + + + Infos viewer + Visualizador de informações + + + Updates checker + Verificador de atualizações + + + Themes: + Temas: + + + Dark + Escuto + + + Light + Luz + + + Improvements and fixes + Melhorias e correções + + + New themes: + Novos temas: + + + Ash + Cinza + + + Candy + Doces + + + Forest + Floresta + + + Powder + Pó em pó + + + Restyled GUI + GUI remodelado + + + Restyled dialogs + diálogos remodelados + + + Doxygen documentation + Documentação do Doxygen + + + Mini-Games: + Mini-Games: + + + Criss-cross + Atravessamento + + + Snake + Serpente + + + Changed default paths + Caminhos padrão alterados + + + New game modes for Snake + Novos modos de jogo para Serpente + + + Hunt + Caça + + + Battle + Batalha + + + New translations: + Novas traduções: + + + Japanese + Japonês + + + Portuguese + Português + + + Code improvements + Melhorias de código + + + Performance improvements + Melhorias de desempenho + + + Added tests suite: + Conjunto de testes adicionado: + + + white box tests + testes de caixa branca + + + Customized charts themes + Temas de gráficos personalizados + + + Fixes + Correções + + + Tests improvements + Melhorias de testes + + + Docker support + Suporte do Docker + + + Upgrade to C++20 + Atualizar para C++20 + + + Upgrade to Qt6 + Atualizar para Qt6 + + + Restyled themes + Temas remodelados + + + Redesigned configs section + Seção de configurações redesenhadas + + + Stability improvements + Melhorias de estabilidade + + + Generating warnings dinamically + Gerar avisos dinamicamente + + + New tool: + Nova ferramenta: + + + Changelog + Mudança + + + Tweakable parameters for some of the charts: + Parâmetros Tweakable para alguns dos gráficos: + + + Improved project structure + Melhoria da estrutura do projeto + + + Modernized Cmake usage + Modernização Uso de Cmake + + + + Crapinfo + + Version + Versão + + + Currently installed version of the software + Atualmente versão instalada do software + + + Repository links + Ligações de repositório + + + Paths + Caminhos + + + The path of the executable file + O caminho do arquivo executável + + + Executable + Executável + + + The path where the configuration file gets saved and searched in + O caminho onde o arquivo de configuração é salvo e pesquisado em + + + Configuration file + Arquivo de configuração + + + The path where the application searches for extra resources + O caminho onde a aplicação procura recursos extras + + + Application data + Dados de aplicação + + + + Crapnote + + Reduce the font size + Reduza o tamanho da fonte + + + Font size + Tamanho da fonte + + + Increase the font size + Aumentar o tamanho da fonte + + + + Crappath + + Choose + Escolha + + + Cancel + Cancelar Cancelar Cancelar + + + + Crapup + + Checking for updates + Verificação de atualizações + + + New version available + Nova versão disponível + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Uma nova versão está disponível! +Visite o repositório git da LogDoctor e siga as instruções sobre como atualizar + + + No update found + Nenhuma atualização encontrada + + + LogDoctor is up-to-date + LogDoctor está atualizado + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Você está executando uma versão do futuro! +Sua versão está além da versão atual do upstream +Você está executando o LogDoctor original? +Visite o repositório do LogDoctor e obtenha uma nova versão dele + + + Failed to establish a connection + Falhado para estabelecer uma conexão + + + Connection error, please try again later + Erro de conexão, tente novamente mais tarde + + + Connection timed out + Conexão oportuna + + + Version check failed + Verificação de versão falhou + + + An error occured while parsing: +version mark not found + Um erro ocorreu durante a análise: +versão não encontrada + + + An error occured while parsing: +malformed version + Um erro ocorreu durante a análise: +versão malformada + + + An error occured while comparing: +malformed upstream version + Um erro ocorreu ao comparar: +versão a montante malformada + + + + CrissCross + + Victory + Vitória + + + You beated me! + Deste cabo de mim! + + + This time you lost! + Desta vez perdeste! + + + Draw + Desenho + + + Nice match + Bom jogo + + + + DialogBool + + Yes + Sim + + + No + Não + + + + DialogIda + + Ignore + Ignora + + + Discard + Descarte + + + Abort + Abortar + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Uma das listas tem um item inválido + + + An error occured while reading the configuration file + Um erro ocorreu ao ler o arquivo de configuração + + + An error occured while parsing configuration file's data + Um erro ocorreu ao analisar os dados do arquivo de configuração + + + Failed to create the configuration file's directory + Falhado para criar o diretório do arquivo de configuração + + + Failed to create the configuration file + Falhado para criar o arquivo de configuração + + + An error occured while writing the configuration file + Um erro ocorreu ao escrever o arquivo de configuração + + + An error occured while preparing the configuration file's data + Um erro ocorreu ao preparar os dados do arquivo de configuração + + + The path contains a symlink + O caminho contém um symlink + + + The file does not exist + O arquivo não existe + + + Failed to create the database backups' directory + Falhado para criar o diretório de backups do banco de dados + + + Failed to copy the database file + Falhado em copiar o arquivo do banco de dados + + + Failed to update the backups + Falhado para atualizar os backups + + + Failed to create the directory + Falhado para criar o diretório + + + Unrecognized entry + Entrada não reconhecida + + + Size of the file + Tamanho do arquivo + + + Warning size parameter + Parâmetro de tamanho de aviso + + + Failed to read gzipped file + Falhado em ler arquivo gzipped + + + An error occured while parsing the format string + Um erro ocorreu ao analisar a cadeia de formatação + + + Available memory + Memória disponível + + + Size of the logs + Tamanho dos logs + + + An error occured while reading the gzipped file + Um erro ocorreu ao ler o arquivo gzipped + + + An error occured while reading the file + Um erro ocorreu ao ler o arquivo + + + Something failed while handling the file + Algo falhou ao lidar com o arquivo + + + An error occured while working on the database + Um erro ocorreu ao trabalhar na base de dados + + + Aborting + Abortar + + + Invalid locale + Local inválido + + + Unexpected locale format + Formato local inesperado + + + If you haven't manually edited the configuration file, +please report this issue + Se você não editou manualmente o arquivo de configuração, +por favor informe este problema + + + The given locale is not an accepted language + O local dado não é uma língua aceite + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Se você gostaria de ter esta localidade no LogDoctor, +por favor, siga a instrução na página do repositório + + + Configuration file not found + Arquivo de configuração não encontrado + + + Unable to retrieve the configuration file + Incapaz de recuperar o arquivo de configuração + + + Skipping + Pular + + + An error occured while handling the configuration file + Um erro ocorreu ao lidar com o arquivo de configuração + + + Failed to write the configuration file + Falhado para escrever o arquivo de configuração + + + Current configuration not saved + Configuração atual não salva + + + File not readable + Arquivo não legível + + + The file is not readable + O arquivo não é legível + + + File not writable + Arquivo não writable + + + The file is not writable + O arquivo não é writable + + + Directory not writable + Lista não disponível + + + The directory is not writable + O diretório não é estável + + + Invalid path + Caminho inválido + + + Failed applying configuration + Configuração de aplicação fraca + + + Invalid configuration lines + Linhas de configuração inválidas + + + Has not been possible to apply some of the configurations + Não foi possível aplicar algumas das configurações + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Se você optar por prosseguir, todas as configurações não aplicadas serão perdidas +Continua? + + + Failed to retrieve the help file + Falhado para recuperar o arquivo de ajuda + + + An error occured while getting the help file + Um erro ocorreu ao obter o arquivo de ajuda + + + Additional resources can be downloaded from the git repo + Recursos adicionais podem ser baixados do git repo + + + Unable to retrieve the file + Incapaz de recuperar o arquivo + + + Invalid string + Corda inválida + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + A string dada é inválida e não pode ser adicionada à lista + +Por favor, corrija-o e tente novamente + + + QSql driver not found + Condutor QSql não encontrado + + + Failed to retrieve the driver needed to handle the database + Falhado para recuperar o driver necessário para lidar com o banco de dados + + + File not found + Arquivo não encontrado + + + Failed to retrieve the database file + Falhado para recuperar o arquivo do banco de dados + + + Create a new database? + Criar um novo banco de dados? + + + The database contains an unexpected table + O banco de dados contém uma tabela inesperada + + + Unexpected table + Tabela não esperada + + + It seems that the database is missing a table + Parece que o banco de dados está faltando uma tabela + + + Table not found + Tabela não encontrada + + + The database contains an unexpected column + O banco de dados contém uma coluna inesperada + + + Unexpected column + Coluna inesperada + + + It seems that the table is missing a column + Parece que a tabela está faltando uma coluna + + + Column not found + Coluna não encontrada + + + A column has an unexpected data-type + Uma coluna tem um tipo de dados inesperado + + + Unexpected data-type + Tipo de dados inesperado + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Este banco de dados será renomeado com uma '.copy' de trilha e um novo será criado. +Continua? + + + Database created + Banco de dados criado + + + Successfully created a new database + Criou com sucesso um novo banco de dados + + + Not a file + Não um arquivo + + + The path was supposed to point to a file, but it doesn't + O caminho era para apontar para um arquivo, mas não + + + Please remove the conflict and retry + Por favor, remova o conflito e tente novamente + + + The database file is not readable + O arquivo do banco de dados não é legível + + + Please set the proper permissions and retry +If this error persists, please report this issue + Por favor, defina as permissões e a retificação adequadas +Se este erro persistir, por favor informe este problema + + + The database file is not writable + O arquivo do banco de dados não é writable + + + Invalid database path + Caminho de banco de dados inválido + + + Failed creating database + Falhado criando banco de dados + + + An error occured while creating the database + Um erro ocorreu ao criar o banco de dados + + + Failed opening database + Falhado banco de dados de abertura + + + An error occured while opening the database + Um erro ocorreu ao abrir o banco de dados + + + Failed executing on database + Execução falhada no banco de dados + + + An error occured while executing a statement on the database + Um erro ocorreu ao executar uma declaração no banco de dados + + + Failed to backup database + Falhado no banco de dados de backup + + + Please report this issue + Por favor, informe este problema + + + Invalid log format string + Corda de formato de log inválida + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Por favor verifique se nenhum erro é jogado pelo seu WebServer +Se for aceite, verifique a presença de um tipo aqui. +Se tudo estiver bem, por favor informe este problema + + + Log format error + Erro de formato de log + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + O formato de log não foi definido, ou é inválido +Adicione um válido nas configurações + + + Misconfigured log format + Formato de log misconfigurável + + + No log field has been set in the current logs format, +making it useless to parse logs + Nenhum campo de log foi definido no formato de logs atual, +tornando-o inútil para analisar logs + + + Please set up a format which contains at least one field + Por favor, configure um formato que contenha pelo menos um campo + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Um separador está faltando entre um ou mais campos, +tornar difícil estabelecer limites líquidos, +e possivelmente levando a armazenar dados incorretos + + + Please set up a format which contains separators between fields + Por favor, configure um formato que contenha separadores entre campos + + + Missing field in log format + Campo perdido no formato de log + + + An important field is missing from the provided format: + Um campo importante está faltando no formato fornecido: + + + The quality of the statistics may be seriously compromized + A qualidade das estatísticas pode ser seriamente comprometida + + + Proceed anyway? + Prossiga? + + + 'Carriage Return' in log format + 'Carriage Return' no formato de log + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + O formato fornecido contém o "Retorno de Transporte". +Isso pode levar a perdas de dados ou falhas se não for usado com cautela + + + An error occured while parsing logs + Um erro ocorreu durante a análise de logs + + + Failed defining type + Tipo de definição falhado + + + Failed to determine the log type + Falhado para determinar o tipo de log + + + File already used + Arquivo já usado + + + The file has probably been used already + O arquivo provavelmente já foi usado + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorar o aviso e usá-lo de qualquer maneira, Descartá-lo e continuar, ou Abortar todo o processo? + + + Duplicate file + Arquivo duplicado + + + The file appears twice in the list of selections + O arquivo aparece duas vezes na lista de seleções + + + Failed updating hashes + Atualização falhada hashes + + + An error occured while inserting the parsed files hashes into the database + Um erro ocorreu ao inserir os arquivos analisados hashes no banco de dados + + + File exceeds warning size + Arquivo excede o tamanho de aviso + + + The file's size exceeds the warning size + O tamanho do arquivo excede o tamanho do aviso + + + Not enough memory + Não memória suficiente + + + The total size of the selected files exceeds the available memory + O tamanho total dos arquivos selecionados excede a memória disponível + + + Please free some resources, parse the files in different steps or split them into smaller units + Por favor, libere alguns recursos, analisar os arquivos em diferentes etapas ou dividi-los em unidades menores + + + Failed reading + Leitura fraca + + + File is empty + O arquivo está vazio + + + The file is blank + O arquivo está em branco + + + Failed to retrieve the selected file + Falhado para recuperar o arquivo selecionado + + + Discard it and continue, or Abort all and exit? + Descartá-lo e continuar, ou Abortar tudo e sair? + + + No file to parse + Nenhum arquivo para analisar + + + The list of files to parse is empty + A lista de arquivos para analisar está vazia + + + Directory not found + Página não encontrada + + + The directory does not exists + O diretório não existe + + + Directory not readable + Diretório não legível + + + The directory is not readable + O diretório não é legível + + + Please set the proper permissions before to start + Por favor, defina as permissões adequadas antes de começar + + + Failed creating directory + Falhado criando diretório + + + The path does not exists + O caminho não existe + + + Data conversion failed + A conversão de dados falhou + + + Failed to convert from '%1' to '%2' + Falhado para converter de '%1' para '%2' + + + Failed to create statistics + Falhado para criar estatísticas + + + An error occured while processing + Um erro ocorreu durante o processamento + + + Cannot create statistics + Não é possível criar estatísticas + + + No data has been found that matches with the currently set parameters + Nenhum dado foi encontrado que corresponde aos parâmetros definidos atualmente + + + Not a folder + Não uma pasta + + + The path was supposed to point to a folder, but it doesn't + O caminho era suposto apontar para uma pasta, mas não + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + A entrada será renomeada com uma trilha '.copy' e uma nova será criada. +Continua? + + + An error occured + Um erro ocorreu + + + Failed renaming + Renomeação falhada + + + An error occured while renaming + Um erro ocorreu ao renomear + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Registos de Parse do servidor web Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Registos de Parse do servidor web Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Registos de Parse do servidor web Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Selecione / desmarque todos os arquivos + + + All + Tudo + + + Inspect a log file + Inspecionar um arquivo de log + + + Name + Nome + + + Size + Tamanho + + + Refresh the list + Atualizar a lista + + + Total size of the parsed data + Tamanho total dos dados analisados + + + Total number of parsed lines + Número total de linhas parsed + + + Start parsing the selected files + Comece a analisar os arquivos selecionados + + + START + START + + + Time elapsed since the start + Tempo decorrido desde o início + + + Average speed, in parsed data size per second + Velocidade média, em tamanho de dados analisados por segundo + + + Web Server + Servidor Web + + + Select a Web Server + Selecione um Servidor Web + + + Year + Ano + + + Month + Mês + + + Day + Dia + + + Hour + Hour + + + Draw the chart + Desenhe o gráfico + + + Log line marked as Warning + Linha de registro marcada como Aviso + + + Date when the request arrived (YYYY-MM-DD) + Data quando o pedido chegou (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Tempo quando o pedido chegou (hhh:mm:ss) + + + Protocol of the request + Protocolo do pedido + + + Method of the request + Método do pedido + + + URI of the requested page + Página solicitada + + + Query carried along with the URI + Consulta realizada junto com a URI + + + Response code from the server + Código de resposta do servidor + + + User-agent of the client which made the request + Agente do cliente que fez o pedido + + + IP address of the Client which made the request + Endereço IP do Cliente que fez a solicitação + + + Cookie used for the request + Cookie usado para o pedido + + + The URL which redirected the Client to the requested page + A URL que redireciona o Cliente para a página solicitada + + + Size ib Bytes of the request, usually includes header and data + Tamanho ib Bytes do pedido, geralmente inclui cabeçalho e dados + + + Size in Bytes of the served content, usually includes header and data + Tamanho em Bytes do conteúdo servido, geralmente inclui cabeçalho e dados + + + Time taken by the server to serve the content, in milliseconds + Tempo tomado pelo servidor para servir o conteúdo, em milissegundos + + + Only use lines in which the field is starting with this string + Use apenas linhas em que o campo está começando com esta string + + + Protocol: + Protocolo: + + + Method: + Método: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Use apenas linhas em que o campo está combinando esta declaração. +Use '!', '=', '<' ou '>' para declarar o que usar + + + Response: + Resposta: + + + Query: + Query: + + + URI: + URI: + + + Filters + Filtros + + + Count + Contagem + + + Number of occurrences + Número de ocorrências + + + Item + Item + + + Value of the field + Valor do campo + + + From: + De: + + + To: + Para: + + + Select a log field to view + Selecione um campo de log para ver + + + Field: + Campo: + + + Filter: + Filtro: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Com cordas, somente as linhas em que o campo está começando com esta cadeia serão usadas. +Com números, use '!', '=', '<' ou '>' para declarar o que usar + + + Protocol + Protocolo + + + Method + Método + + + URI + URI + + + User-agent + Agente do usuário + + + Most recurrent + Mais recorrente + + + Most trafficked + A maioria dos traficados + + + Date ever + Data de nascimento + + + Day of the week + Dia da semana + + + Hour of the day + Hora do dia + + + Time taken + Tempo + + + Bytes sent + Bytes enviados + + + Bytes received + Bytes recebidos + + + Mean/Max performances + Desempenhos médio / máximo + + + Requests received + Pedidos recebidos + + + Total work + Total dos trabalhos + + + General + Geral + + + Window + Janela + + + Dialogs + Diálogos + + + Charts + Gráficos + + + Appearance + Aparência + + + Speed + Velocidade + + + Relational + Relação + + + TextBrowser + TextBrowser + + + Databases + Bancos de dados + + + Security + Segurança + + + Logs + Logs + + + Defaults + Defeitos + + + Control + Controlo + + + Path + Caminho + + + Format + Formato + + + Warnlists + Listas de aviso + + + Blacklists + Listas negras + + + Remember the window's position and size + Lembre-se da posição e tamanho da janela + + + Remember position and size + Lembre-se de posição e tamanho + + + Remember window's position and size + Lembre-se da posição e tamanho da janela + + + Geometry + Geometria + + + Theme to use for the window + Tema para usar para a janela + + + Theme + Tema + + + Native + Nativo + + + Light + Luz + + + Dark + Escuto + + + Auto + Automática + + + Icons + Ícones + + + Normal quantity of dialog messages shown + Quantidade normal de mensagens de diálogo mostradas + + + Normal + Normal + + + Dialogs from the main processes + Diálogos dos principais processos + + + Dialogs emitted when parsing logs + Diálogos emitidos ao analisar logs + + + Logs parser + Logs parser + + + Dialogs emitted when viewing statistics + Diálogos emitidos ao visualizar estatísticas + + + Statistics viewer + Estatísticas de visualização + + + Define the quantity of dialog mesages shown + Defina a quantidade de mesas de diálogo mostradas + + + Dialogs level + Nível de diálogo + + + Reduced quantity of dialog messages shown + Quantidade reduzida de mensagens de diálogo mostradas + + + Essential + Essencial + + + Augmented quantity of dialog messages shown + Quantidade aumentada de mensagens de diálogo mostradas + + + Explanatory + Exploração + + + Theme to use for the Charts + Tema para usar para os gráficos + + + Preview + Visualização + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Representa um passo no eixo do tempo, em segundos. +Todos os valores que caem no mesmo intervalo serão mesclados e o valor médio será usado. + + + Time interval + Intervalo de tempo + + + The format to use for the labels of the time axis. + O formato a utilizar para as etiquetas do eixo do tempo. + + + Time format + Formato de hora + + + The size of the pie + O tamanho da torta + + + Pie size + Tamanho da peça + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + O número máximo de fatias que a torta será composta. +Cortes emocionantes serão agrupados em uma fatia abrangente. + + + Maximum slices + Cortes máximos + + + Font to use for the Text Browser + Fonte para usar para o navegador de texto + + + Font + Fonte + + + Double-spaced lines + Linhas de espaço duplo + + + Use wide lines + Use linhas largas + + + Define the spacing between lines + Defina o espaçamento entre linhas + + + Lines spacing + Linhas espaçamento + + + None + Nenhuma + + + Color scheme to use for the Text Browser + esquema de cores para usar para o navegador de texto + + + Color scheme + Esquema de cor + + + The appearance of the Text Browser with the current settings + A aparência do navegador de texto com as configurações atuais + + + Insert the base path only, file name excluded + Insira o caminho base apenas, nome do arquivo excluído + + + The given path doen't exists, or doesn't point to a folder + O caminho dado não existe, ou não aponta para uma pasta + + + Path for the database files + Caminho para os arquivos de banco de dados + + + Paths + Caminhos + + + Apply the current path + Aplicar o caminho atual + + + Select the path through a dialog window + Selecione o caminho através de uma janela de diálogo + + + Path where the logs data collection database is located + Caminho onde o banco de dados de coleta de dados de logs está localizado + + + Logs data + Registra dados + + + Path where the used files hashes database is located + Caminho onde os arquivos usados hashes banco de dados está localizado + + + Used files + Arquivos usados + + + Backup options for the Logs Data database + Opções de backup para o banco de dados Logs Data + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Um novo backup é feito ao fechar o LogDoctor depois de ter editado sucessivamente o banco de dados + + + Backup the Logs Data database and keep + Backup do banco de dados de dados de logs e manter + + + Whether it is allowed or denied to follow symlinks occuring in a path + Se é permitido ou negado a seguir links que ocorrem em um caminho + + + Follow symlinks + Seguir symlinks + + + Default WebServer + Padrão WebServer + + + Usage control + Controle de uso + + + Hide already used files + Ocultar arquivos já usados + + + Size warnings + Avisos de tamanho + + + Warn me when using files with a size exceeding: + Avise-me ao usar arquivos com um tamanho superior: + + + Logs folder + pasta de registros + + + Logs format string + Formato de logs string + + + Format string + Formatar string + + + Insert the format string you're using + Insira a string de formato que você está usando + + + Apply the current string + Aplicar a string atual + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Gerar uma linha de registro de amostra da string atualmente salva, para verificar se ela é formatada corretamente. +Qualquer campo não considerado pelo LogDoctor aparecerá como 'DISCARDED' + + + Generate sample + Gerar amostra + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Por favor, verifique a correção desta linha. +Campos marcados como 'DISCARDED' foram analisados corretamente, mas não são considerados pela LogDoctor + + + Open an help window + Abra uma janela de ajuda + + + Help + Ajuda + + + Select a log field + Selecione um campo de log + + + Use warnlist for this field + Use a lista de avisos para este campo + + + Add the current line to the list + Adicione a linha atual à lista + + + Remove the selected item from the list + Remover o item selecionado da lista + + + Move the selected item down + Mova o item selecionado para baixo + + + Use blacklist for this field + Use a lista negra para este campo + + + Add line + Adicionar linha + + + Remove selection + Remover seleção + + + Language + Língua + + + Utilities + Utilitários + + + Tools + Ferramentas + + + Games + Jogos de Jogos + + + Perform a version-check + Realizar uma verificação de versão + + + Show some info about LogDoctor + Mostrar algumas informações sobre LogDoctor + + + Open a block-note like window to write temporary text + Abra uma nota de bloco como janela para escrever texto temporário + + + Play CrissCross + Jogue CrissCross + + + Play Snake + Jogue Cobra + + + Show the changelog + Mostrar o changelog + + + warnlist + lista de avisos + + + blacklist + lista negra + + + copy + cópia + + + copies + cópias + + + Check updates + Verificar atualizações + + + Infos + Info + + + BlockNote + Nota do bloco + + + CrissCross + Críticas + + + Snake + Serpente + + + Changelog + Mudança + + + + RichText + + Select a file from the list + Selecione um arquivo da lista + + + to inspect its content + para inspecionar seu conteúdo + + + Failed to read + Falhado para ler + + + + SnakeGame + + PLAY + PLANO + + + Classic + Clássico + + + Hunt + Caça + + + Battle + Batalha + + + Game Over + Game Over + + + Your adversary fell in the water! + O seu adversário caiu na água! + + + YOU WON! + Tu vais! + + + You fell in the water! + Caíste na água! + + + YOU LOST! + Tu perdes! + + + Your adversary ate itself! + O seu adversário comeu-se! + + + You ate yourself! + Comeste-te! + + + Your adversary ate you! + O teu adversário comeu-te! + + + You ate your adversary! + Comeste o teu adversário! + + + You ate each other! + Vocês comeram um ao outro! + + + MATCH IS DRAW! + O MATCH está morto! + + + + TR + + Unexpected WebServer + WebServer inesperado + + + Logs Size Breakdown + Diversão de tamanho de logs + + + Ignored + Ignorado + + + Parsed + Par + + + Blacklisted + Lista negra + + + Others + Outros + + + from + a partir de + + + to + para + + + Log Lines Marked as Warning + Linhas de log marcadas como aviso + + + Time Taken to Serve Requests + Tempo necessário para servir pedidos + + + Time of Day Count + Tempo de contagem do dia + + + Relational Count + Contagem de Relação + + + FALSE + FALSO + + + TRUE + TRÊS + + + Date + Data + + + Year + Ano + + + Month + Mês + + + Day + Dia + + + Time + Tempo + + + Hour + Hour + + + Minute + Minuto + + + Second + Segunda + + + Warning + Aviso + + + Protocol + Protocolo + + + Method + Método + + + URI + URI + + + Query + Query + + + Response code + Código de resposta + + + Time taken + Tempo + + + Bytes sent + Bytes enviados + + + Bytes received + Bytes recebidos + + + Referrer + Referente + + + Cookie + Cookie + + + Client + Cliente + + + User-agent + Agente do usuário + + + January + Janeiro + + + February + Fevereiro + + + March + Março + + + April + Abril + + + May + Maio + + + June + Junho + + + July + Julho + + + August + Agosto + + + September + Setembro + + + October + Outubro + + + November + Novembro + + + December + Dezembro + + + Sunday + Domingo + + + Monday + Segunda-feira + + + Tuesday + Terça-feira + + + Wednesday + Quarta-feira + + + Thursday + Quinta-feira + + + Friday + Sexta-feira + + + Saturday + Sábado + + + diff --git a/logdoctor/translations/LogDoctor_ro_RO.ts b/logdoctor/translations/LogDoctor_ro_RO.ts new file mode 100644 index 0000000..bb365d0 --- /dev/null +++ b/logdoctor/translations/LogDoctor_ro_RO.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versiuni + + + Version 4 + Versiunea 4 + + + Version 3 + Versiunea 3 + + + Version 2 + Versiunea 2 + + + Version 1 + Versiunea 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Construiește scripturi + + + Cross-platform compatibility: + Compatibilitatea plăcilor transversale: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistici: + + + Warnings + Avertismente + + + Speed + Viteza + + + Counts + Numără + + + Daytime + Ziua + + + Relational + Relațional + + + Globals + Globale + + + Translations: + Traduceri: + + + Italian + Italiană + + + Spanish + Spaniolă + + + French + Franceză + + + Tools: + Unelte: + + + Block note + Notă bloc + + + Utilities: + Utilități: + + + Infos viewer + Vizualizator informații + + + Updates checker + Verificator actualizări + + + Themes: + Teme: + + + Dark + Întuneric + + + Light + Lumină + + + Improvements and fixes + Îmbunătăţiri şi reparaţii + + + New themes: + Teme noi: + + + Ash + Cenușă + + + Candy + Bomboane + + + Forest + Păduri + + + Powder + Pulbere + + + Restyled GUI + GUI restilat + + + Restyled dialogs + Dialoguri restaurate + + + Doxygen documentation + Documentație Doxigen + + + Mini-Games: + Mini-Jocuri: + + + Criss-cross + Criss-cross + + + Snake + Șarpe + + + Changed default paths + Modificați căile implicite + + + New game modes for Snake + Moduri de joc noi pentru Snake + + + Hunt + Hunt + + + Battle + Bătălie + + + New translations: + Traduceri noi: + + + Japanese + Japoneză + + + Portuguese + Portugheză + + + Code improvements + Îmbunătățiri ale codului + + + Performance improvements + Îmbunătăţiri ale performanţei + + + Added tests suite: + Apartament de teste adăugat: + + + white box tests + teste cu cutie albă + + + Customized charts themes + Teme grafice personalizate + + + Fixes + Reparaţii + + + Tests improvements + Îmbunătăţiri ale testelor + + + Docker support + Suport Docker + + + Upgrade to C++20 + Actualizează la C++20 + + + Upgrade to Qt6 + Actualizează la Qt6 + + + Restyled themes + Teme retiliate + + + Redesigned configs section + Secţiunea configuraţii reproiectate + + + Stability improvements + Îmbunătăţirea stabilităţii + + + Generating warnings dinamically + Generarea dinamică a avertismentelor + + + New tool: + Instrument nou: + + + Changelog + Schimbare jurnal + + + Tweakable parameters for some of the charts: + Parametrii modificabili pentru unele diagrame: + + + Improved project structure + Structura îmbunătăţită a proiectului + + + Modernized Cmake usage + Modernizat Utilizarea cmake + + + + Crapinfo + + Version + Versiune + + + Currently installed version of the software + Versiunea instalată în prezent a software-ului + + + Repository links + Legături de depozit + + + Paths + Căi + + + The path of the executable file + Calea fișierului executabil + + + Executable + Executabil + + + The path where the configuration file gets saved and searched in + Calea în care fișierul de configurare este salvat și căutat în + + + Configuration file + Fișier de configurare + + + The path where the application searches for extra resources + Calea în care cererea caută resurse suplimentare + + + Application data + Date privind aplicarea + + + + Crapnote + + Reduce the font size + Reduce dimensiunea fontului + + + Font size + Mărime font + + + Increase the font size + Mărește dimensiunea fontului + + + + Crappath + + Choose + Alege + + + Cancel + Renunță + + + + Crapup + + Checking for updates + Verificarea actualizărilor + + + New version available + Versiune nouă disponibilă + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + O nouă versiune este disponibilă! +Vă rugăm să vizitați depozitul GIT LogDoctor și urmați instrucțiunile despre cum să actualizați + + + No update found + Nicio actualizare găsită + + + LogDoctor is up-to-date + LogDoctor este la zi + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Rulezi o versiune din viitor! +Versiunea ta este dincolo de versiunea curentă în amonte +Conduci LogDoctorul original? +Vă rugăm să vizitați depozitul LogDoctor și de a obține o versiune nouă a acestuia + + + Failed to establish a connection + Eșec la stabilirea unei conexiuni + + + Connection error, please try again later + Eroare de conectare, încercați din nou mai târziu + + + Connection timed out + Conexiune temporizată + + + Version check failed + Verificarea versiunii a eșuat + + + An error occured while parsing: +version mark not found + O eroare a apărut în timpul analizării: +marca versiunii nu a fost găsită + + + An error occured while parsing: +malformed version + O eroare a apărut în timpul analizării: +versiune malformată + + + An error occured while comparing: +malformed upstream version + O eroare a apărut în timp ce compara: +versiune în amonte malformată + + + + CrissCross + + Victory + Victorie + + + You beated me! + M-ai bătut! + + + This time you lost! + De data asta ai pierdut! + + + Draw + Trage + + + Nice match + Frumos meci + + + + DialogBool + + Yes + Da + + + No + Nu + + + + DialogIda + + Ignore + Ignoră + + + Discard + A se arunca + + + Abort + Anulează + + + + DialogMsg + + Ok + Bine + + + + DialogSec + + One of the lists has an invalid item + Una dintre liste are un element invalid + + + An error occured while reading the configuration file + A apărut o eroare la citirea fișierului de configurare + + + An error occured while parsing configuration file's data + A apărut o eroare în timpul analizării datelor fișierului de configurare + + + Failed to create the configuration file's directory + A eșuat crearea dosarului fișierului de configurare + + + Failed to create the configuration file + A eșuat crearea fișierului de configurare + + + An error occured while writing the configuration file + A apărut o eroare în timpul scrierii fișierului de configurare + + + An error occured while preparing the configuration file's data + A apărut o eroare la pregătirea datelor fișierului de configurare + + + The path contains a symlink + Calea contine un symlink + + + The file does not exist + Fișierul nu există + + + Failed to create the database backups' directory + A eșuat crearea dosarului de rezervă al bazei de date + + + Failed to copy the database file + Copierea fișierului bazei de date a eșuat + + + Failed to update the backups + Nu a reușit să actualizeze copiile de rezervă + + + Failed to create the directory + A eșuat crearea dosarului + + + Unrecognized entry + Intrare nerecunoscută + + + Size of the file + Dimensiunea fișierului + + + Warning size parameter + Parametrul dimensiunii avertismentului + + + Failed to read gzipped file + Eroare la citirea fișierului gzipped + + + An error occured while parsing the format string + O eroare a apărut în timpul analizării șirului formatului + + + Available memory + Memorie disponibilă + + + Size of the logs + Dimensiunea jurnalelor + + + An error occured while reading the gzipped file + A apărut o eroare în timpul citirii fișierului gzipped + + + An error occured while reading the file + A apărut o eroare la citirea fișierului + + + Something failed while handling the file + Ceva nu a reușit în timp ce manipularea fișierului + + + An error occured while working on the database + O eroare a apărut în timp ce lucra la baza de date + + + Aborting + Abandonează + + + Invalid locale + Localizare nevalidă + + + Unexpected locale format + Format local neașteptat + + + If you haven't manually edited the configuration file, +please report this issue + Dacă nu ați editat manual fișierul de configurare, +Vă rugăm să raportați această problemă + + + The given locale is not an accepted language + Localul dat nu este o limbă acceptată + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Dacă doriți să aveți acest loc în LogDoctor, +Vă rugăm să urmați instrucțiunile de pe pagina depozitului + + + Configuration file not found + Fișier de configurare negăsit + + + Unable to retrieve the configuration file + Nu s-a putut recupera fișierul de configurare + + + Skipping + Sari + + + An error occured while handling the configuration file + A apărut o eroare în timpul manipulării fișierului de configurare + + + Failed to write the configuration file + Eroare la scrierea fișierului de configurare + + + Current configuration not saved + Configurația curentă nu este salvată + + + File not readable + Fișier care nu poate fi citit + + + The file is not readable + Fișierul nu este lizibil + + + File not writable + Fișier nescris + + + The file is not writable + Fișierul nu este scris + + + Directory not writable + Director nescris + + + The directory is not writable + Dosarul nu este scris + + + Invalid path + Calea nevalidă + + + Failed applying configuration + Configurație de aplicare eșuată + + + Invalid configuration lines + Linii de configurare nevalide + + + Has not been possible to apply some of the configurations + Nu a fost posibilă aplicarea unora dintre configuraţii + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Dacă alegeţi să continuaţi, toate configuraţiile neaplicate vor fi pierdute. +Să continui? + + + Failed to retrieve the help file + Nu a reușit să recupereze fișierul ajutor + + + An error occured while getting the help file + A apărut o eroare în timpul obținerii fișierului ajutor + + + Additional resources can be downloaded from the git repo + Resurse suplimentare pot fi descărcate de pe git repo + + + Unable to retrieve the file + Nu s-a putut recupera fișierul + + + Invalid string + Sfoara nevalidă + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Sirul dat este invalid și nu poate fi adăugat pe listă + +Te rog să corectezi şi să încerci din nou + + + QSql driver not found + Șofer QSql negăsit + + + Failed to retrieve the driver needed to handle the database + Nu a reușit să recupereze driver-ul necesar pentru a gestiona baza de date + + + File not found + Fișier negăsit + + + Failed to retrieve the database file + Eșec la recuperarea fișierului bazei de date + + + Create a new database? + Să creăm o nouă bază de date? + + + The database contains an unexpected table + Baza de date conține un tabel neașteptat + + + Unexpected table + Tabel neașteptat + + + It seems that the database is missing a table + Se pare că în baza de date lipseşte o masă + + + Table not found + Tabel negăsit + + + The database contains an unexpected column + Baza de date conține o coloană neașteptată + + + Unexpected column + Coloana neașteptată + + + It seems that the table is missing a column + Se pare că tabelul lipseşte o coloană + + + Column not found + Coloana nu a fost găsită + + + A column has an unexpected data-type + O coloană are un tip de date neașteptat + + + Unexpected data-type + Tipul de date neașteptat + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Această bază de date va fi redenumită cu un ".copie" și va fi creat unul nou. +Să continui? + + + Database created + Baza de date creată + + + Successfully created a new database + Crearea cu succes a unei noi baze de date + + + Not a file + Niciun fișier + + + The path was supposed to point to a file, but it doesn't + Calea trebuia să arate spre un fișier, dar nu + + + Please remove the conflict and retry + Vă rugăm să eliminaţi conflictul şi să încercaţi din nou + + + The database file is not readable + Fișierul bazei de date nu este lizibil + + + Please set the proper permissions and retry +If this error persists, please report this issue + Vă rugăm să setați permisiunile adecvate și retry +Dacă această eroare persistă, vă rugăm să raportați această problemă + + + The database file is not writable + Fișierul bazei de date nu este scris + + + Invalid database path + Calea de baze de date nevalidă + + + Failed creating database + Crearea unei baze de date eșuate + + + An error occured while creating the database + A apărut o eroare în crearea bazei de date + + + Failed opening database + Baza de date de deschidere eșuată + + + An error occured while opening the database + O eroare a apărut în momentul deschiderii bazei de date + + + Failed executing on database + Executare eșuată în baza de date + + + An error occured while executing a statement on the database + O eroare a apărut în timpul executării unei declarații în baza de date + + + Failed to backup database + Baza de date de rezervă a eșuat + + + Please report this issue + Vă rugăm să raportați această problemă + + + Invalid log format string + Sir de jurnal nevalidă + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Vă rugăm să verificați că nici o eroare este aruncată de WebServer +În cazul în care este acceptat, vă rugăm să verificați prezența unui typo aici +Dacă totul este bine, vă rugăm să raportați această problemă + + + Log format error + Eroare în format jurnal + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Formatul jurnalului nu a fost setat sau este invalid +Adăugaţi unul valabil în configuraţii + + + Misconfigured log format + Format de jurnal configurat greșit + + + No log field has been set in the current logs format, +making it useless to parse logs + Nu a fost setat niciun câmp jurnal în formatul jurnalului curent; +face inutil să parse jurnale + + + Please set up a format which contains at least one field + Vă rugăm să configurați un format care conține cel puțin un câmp + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Lipseşte un separator între unul sau mai multe câmpuri, +îngreunând stabilirea limitelor nete, +și poate duce la stocarea datelor incorecte + + + Please set up a format which contains separators between fields + Vă rugăm să configurați un format care conține separatoare între câmpuri + + + Missing field in log format + Câmp lipsă în format jurnal + + + An important field is missing from the provided format: + Un câmp important lipsește din formatul furnizat: + + + The quality of the statistics may be seriously compromized + Calitatea statisticilor poate fi compromisă serios + + + Proceed anyway? + Să continui oricum? + + + 'Carriage Return' in log format + "Returnarea căsătoriei" în format jurnal + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Formatul furnizat conține "Returnarea căsătoriei." +Acest lucru poate duce la pierderi sau prăbușiri de date dacă nu este utilizat cu precauție + + + An error occured while parsing logs + O eroare a apărut în timpul analizării jurnalelor + + + Failed defining type + Tip de definire eșuat + + + Failed to determine the log type + Eșec la determinarea tipului de jurnal + + + File already used + Fișier deja utilizat + + + The file has probably been used already + Dosarul a fost probabil folosit deja + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignoraţi avertismentul şi folosiţi-l oricum, aruncaţi-l şi continuaţi, sau anulaţi întregul proces? + + + Duplicate file + Duplică fișierul + + + The file appears twice in the list of selections + Fișierul apare de două ori în lista de selecție + + + Failed updating hashes + Haşe de actualizare eşuate + + + An error occured while inserting the parsed files hashes into the database + O eroare a apărut în momentul inserării fișierelor parsed hashes în baza de date + + + File exceeds warning size + Fișierul depășește dimensiunea de avertizare + + + The file's size exceeds the warning size + Mărimea fișierului depășește dimensiunea de avertizare + + + Not enough memory + Nu e destulă memorie + + + The total size of the selected files exceeds the available memory + Dimensiunea totală a fișierelor selectate depășește memoria disponibilă + + + Please free some resources, parse the files in different steps or split them into smaller units + Vă rugăm să eliberați unele resurse, pars fișierele în pași diferiți sau împărțite în unități mai mici + + + Failed reading + Citire eșuată + + + File is empty + Fișierul este gol + + + The file is blank + Fișierul este gol + + + Failed to retrieve the selected file + Nu a reușit să recupereze fișierul selectat + + + Discard it and continue, or Abort all and exit? + Renunţaţi şi continuaţi, sau abandonaţi totul şi ieşiţi? + + + No file to parse + Niciun fișier de analizat + + + The list of files to parse is empty + Lista de fișiere pentru a parse este goală + + + Directory not found + Dosarul nu a fost găsit + + + The directory does not exists + Dosarul nu există + + + Directory not readable + Dosarul nu poate fi citit + + + The directory is not readable + Dosarul nu poate fi citit + + + Please set the proper permissions before to start + Vă rugăm să setați permisiunile corespunzătoare înainte de a începe + + + Failed creating directory + Eroare la crearea dosarului + + + The path does not exists + Calea nu există + + + Data conversion failed + Conversia datelor a eșuat + + + Failed to convert from '%1' to '%2' + Nu s- a putut converti de la "%1" la "%2" + + + Failed to create statistics + Crearea statisticilor a eșuat + + + An error occured while processing + O eroare a apărut în timpul prelucrării + + + Cannot create statistics + Nu se pot crea statistici + + + No data has been found that matches with the currently set parameters + Nu s-au constatat date care să corespundă parametrilor setați în prezent + + + Not a folder + Niciun dosar + + + The path was supposed to point to a folder, but it doesn't + Calea trebuia să arate spre un dosar, dar nu + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Intrarea va fi redenumită cu un ".copie" și unul nou va fi creat. +Să continui? + + + An error occured + A apărut o eroare + + + Failed renaming + Redenumirea eșuată + + + An error occured while renaming + O eroare a apărut în timpul redenumirii + + + + GameDialog + + Ok + Bine + + + + MainWindow + + Parse logs from the Apache2 web server + Parse jurnale de pe serverul Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse jurnale de pe serverul web Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parse jurnale de pe serverul web Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Selectează/Deselectează toate fișierele + + + All + Toate + + + Inspect a log file + Inspectează un fișier jurnal + + + Name + Nume + + + Size + Dimensiune + + + Refresh the list + Reîmprospătează lista + + + Total size of the parsed data + Dimensiunea totală a datelor parsed + + + Total number of parsed lines + Numărul total de linii parsed + + + Start parsing the selected files + Pornește analiza fișierelor selectate + + + START + Start + + + Time elapsed since the start + Timpul scurs de la început + + + Average speed, in parsed data size per second + Viteza medie, în dimensiunea de date parsed pe secundă + + + Web Server + Server webComment + + + Select a Web Server + Alegeți un server web + + + Year + Anul + + + Month + Luna + + + Day + Zi + + + Hour + Ora + + + Draw the chart + Desenează graficul + + + Log line marked as Warning + Log line marcat ca avertizare + + + Date when the request arrived (YYYY-MM-DD) + Data la care a sosit cererea (AAAA-LL-ZZ) + + + Time when the request arrived (hh:mm:ss) + Ora la care a sosit cererea (hh:mm:ss) + + + Protocol of the request + Protocolul cererii + + + Method of the request + Metoda cererii + + + URI of the requested page + URI a paginii solicitate + + + Query carried along with the URI + Interogare efectuată împreună cu URI + + + Response code from the server + Codul de răspuns de pe server + + + User-agent of the client which made the request + Utilizator-agent al clientului care a făcut cererea + + + IP address of the Client which made the request + Adresa IP a clientului care a făcut cererea + + + Cookie used for the request + Cookie utilizat pentru cerere + + + The URL which redirected the Client to the requested page + URL-ul care a redirecționat clientul către pagina solicitată + + + Size ib Bytes of the request, usually includes header and data + Dimensiune ib Octeți de cerere, include, de obicei antet și date + + + Size in Bytes of the served content, usually includes header and data + Dimensiune în biți de conținut servit, include, de obicei antet și date + + + Time taken by the server to serve the content, in milliseconds + Timp luat de server pentru a servi conținutul, în milisecunde + + + Only use lines in which the field is starting with this string + Utilizaţi doar liniile în care câmpul începe cu acest şir + + + Protocol: + Protocol: + + + Method: + Metoda: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Utilizaţi numai liniile în care câmpul corespunde acestei declaraţii. +Utilizați "!", "=", "<" sau ">" pentru a declara ce să utilizeze + + + Response: + Răspuns: + + + Query: + Întrebare: + + + URI: + URI: + + + Filters + Filtre + + + Count + Numără + + + Number of occurrences + Numărul de evenimente + + + Item + Postul + + + Value of the field + Valoarea câmpului + + + From: + De la: + + + To: + Către: + + + Select a log field to view + Alegeți un câmp jurnal de văzut + + + Field: + Câmp: + + + Filter: + Filtru: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Cu corzi, vor fi folosite doar liniile în care câmpul începe cu acest șir. +Cu numere, utilizați "!", "=", "<" sau ">" pentru a declara ce să utilizeze + + + Protocol + Protocol + + + Method + Metoda + + + URI + URI + + + User-agent + Agent utilizator + + + Most recurrent + Cele mai recurente + + + Most trafficked + Majoritatea traficului + + + Date ever + Data vreodată + + + Day of the week + Ziua săptămânii + + + Hour of the day + Ora zilei + + + Time taken + Timpul necesar + + + Bytes sent + Octeți trimiși + + + Bytes received + Octeți primiți + + + Mean/Max performances + Performanţe medii/axe + + + Requests received + Cereri primite + + + Total work + Total lucrări + + + General + Generale + + + Window + Fereastră + + + Dialogs + Dialoguri + + + Charts + Grafice + + + Appearance + Aspect + + + Speed + Viteza + + + Relational + Relațional + + + TextBrowser + Navigator text + + + Databases + Baze de date + + + Security + Securitatea + + + Logs + Jurnale + + + Defaults + Implicite + + + Control + Control + + + Path + Cale + + + Format + Format + + + Warnlists + Avertizare + + + Blacklists + Lista neagră + + + Remember the window's position and size + Amintiți-vă poziția și dimensiunea ferestrei + + + Remember position and size + Amintiți-vă poziția și dimensiunea + + + Remember window's position and size + Amintiți-vă poziția și dimensiunea ferestrei + + + Geometry + Geometrie + + + Theme to use for the window + Tematică de utilizat pentru fereastră + + + Theme + Tematică + + + Native + Nativ + + + Light + Lumină + + + Dark + Întuneric + + + Auto + Automat + + + Icons + Pictograme + + + Normal quantity of dialog messages shown + Cantitatea normală de mesaje de dialog afișate + + + Normal + Normal + + + Dialogs from the main processes + Dialoguri din procesele principale + + + Dialogs emitted when parsing logs + Dialoguri emise în momentul analizării jurnalelor + + + Logs parser + Logs parser + + + Dialogs emitted when viewing statistics + Dialoguri emise la vizualizarea statisticilor + + + Statistics viewer + Vizualizator statistici + + + Define the quantity of dialog mesages shown + Definește cantitatea de mesaje de dialog afișată + + + Dialogs level + Nivel dialoguri + + + Reduced quantity of dialog messages shown + Cantitatea redusă de mesaje de dialog afișate + + + Essential + Esenţial + + + Augmented quantity of dialog messages shown + Cantitatea sporită de mesaje de dialog afișate + + + Explanatory + Explicație + + + Theme to use for the Charts + Tematică pentru grafice + + + Preview + Previzualizare + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Reprezintă un pas în axa temporală, în câteva secunde. +Toate valorile care se încadrează în același interval vor fi fuzionate și valoarea medie va fi utilizată. + + + Time interval + Intervalul de timp + + + The format to use for the labels of the time axis. + Formatul utilizat pentru etichetele axei temporale. + + + Time format + Format oră + + + The size of the pie + Mărimea plăcintei + + + Pie size + Mărimea plăcii + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Numărul maxim de felii din care va fi compusă plăcinta. +Peste felii vor fi grupate într-o singură felie cuprinzătoare. + + + Maximum slices + Felii maxime + + + Font to use for the Text Browser + Font de utilizat pentru browserul de text + + + Font + Font + + + Double-spaced lines + Linii duble + + + Use wide lines + Folosește linii largi + + + Define the spacing between lines + Definește distanța dintre linii + + + Lines spacing + Spațierea liniilor + + + None + Niciuna + + + Color scheme to use for the Text Browser + Schema de culori de utilizat pentru browserul de text + + + Color scheme + Schema de culori + + + The appearance of the Text Browser with the current settings + Aspectul browser-ului cu setările curente + + + Insert the base path only, file name excluded + Insert the base path only, file name excluded + + + The given path doen't exists, or doesn't point to a folder + Calea dată nu există, sau nu indică un dosar + + + Path for the database files + Cale pentru fișierele bazei de date + + + Paths + Căi + + + Apply the current path + Aplică calea curentă + + + Select the path through a dialog window + Alegeți calea printr-o fereastră de dialog + + + Path where the logs data collection database is located + Calea în care se află baza de date privind colectarea jurnalelor + + + Logs data + Date jurnale + + + Path where the used files hashes database is located + Calea în care se află baza de date a fișierelor utilizate + + + Used files + Fișiere utilizate + + + Backup options for the Logs Data database + Opţiuni de rezervă pentru baza de date jurnale + + + Backups + Întăriri + + + A new backup is made when closing LogDoctor after having succesfully edited the database + O nouă copie de rezervă se face atunci când se închide LogDoctor după ce a editat cu succes baza de date + + + Backup the Logs Data database and keep + Backup baza de date jurnale și păstrați + + + Whether it is allowed or denied to follow symlinks occuring in a path + Fie că este permis sau nu să urmeze simlink-uri care apar pe o cale + + + Follow symlinks + Urmărește simlinkurile + + + Default WebServer + WebServer implicit + + + Usage control + Controlul utilizării + + + Hide already used files + Ascunde fișierele deja utilizate + + + Size warnings + Atenționări privind dimensiunea + + + Warn me when using files with a size exceeding: + Avertizează-mă când foloseşti fişiere cu dimensiuni mai mari: + + + Logs folder + Dosarul jurnalelor + + + Logs format string + Sir format jurnal + + + Format string + Format + + + Insert the format string you're using + Introduceți șirul de format pe care îl utilizați + + + Apply the current string + Aplică șirul curent + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generați o linie de jurnal de eșantion din șir salvat în prezent, pentru a verifica dacă acesta devine formatat corect. +Orice câmp care nu este considerat de către LogDoctor va apărea ca 'DISCARDED' + + + Generate sample + Generează eșantionul + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Vă rugăm să verificați corectitudinea acestei linii. +Câmpurile marcate cu 'DISCARDED' au fost parsed corect, dar nu sunt luate în considerare de LogDoctor + + + Open an help window + Deschide o fereastră de ajutor + + + Help + Ajutor + + + Select a log field + Alegeți un câmp jurnal + + + Use warnlist for this field + Utilizați lista de avertizare pentru acest domeniu + + + Add the current line to the list + Adaugă linia curentă la listă + + + Remove the selected item from the list + Elimină elementul selectat din listă + + + Move the selected item down + Mută elementul selectat în jos + + + Use blacklist for this field + Utilizați lista neagră pentru acest domeniu + + + Add line + Adaugă linie + + + Remove selection + Elimină selecția + + + Language + Limba + + + Utilities + Utilități + + + Tools + Unelte + + + Games + Jocuri + + + Perform a version-check + Efectuează o verificare a versiunii + + + Show some info about LogDoctor + Arată câteva informații despre LogDoctor + + + Open a block-note like window to write temporary text + Deschide un bloc-note ca fereastra pentru a scrie text temporar + + + Play CrissCross + Joacă CrissCross + + + Play Snake + Joacă Şarpe + + + Show the changelog + Arată registrul de modificări + + + warnlist + Description + + + blacklist + Lista neagră + + + copy + Copiază + + + copies + copii + + + Check updates + Verifică actualizările + + + Infos + Informaţii + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Șarpe + + + Changelog + Schimbare jurnal + + + + RichText + + Select a file from the list + Alegeți un fișier din listă + + + to inspect its content + să-şi verifice conţinutul + + + Failed to read + Eșec la citire + + + + SnakeGame + + PLAY + PLAY + + + Classic + Clasic + + + Hunt + Hunt + + + Battle + Bătălie + + + Game Over + Jocul s-a terminat + + + Your adversary fell in the water! + Adversarul tău a căzut în apă! + + + YOU WON! + Ai câştigat! + + + You fell in the water! + Ai căzut în apă! + + + YOU LOST! + Ai pierdut! + + + Your adversary ate itself! + Adversarul tău a mâncat singur! + + + You ate yourself! + Te-ai mâncat singur! + + + Your adversary ate you! + Adversarul tău te-a mâncat! + + + You ate your adversary! + Ţi-ai mâncat adversarul! + + + You ate each other! + V-aţi mâncat! + + + MATCH IS DRAW! + Match este desenat! + + + + TR + + Unexpected WebServer + WebServer neașteptat + + + Logs Size Breakdown + Dimensiune jurnale + + + Ignored + Ignorat + + + Parsed + Pășuni + + + Blacklisted + Lista neagră + + + Others + Altele + + + from + de la + + + to + la + + + Log Lines Marked as Warning + Linii jurnal marcate ca avertisment + + + Time Taken to Serve Requests + Timpul necesar pentru a servi cererilor + + + Time of Day Count + Ora contelui zilei + + + Relational Count + Număr relativ + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + Dată + + + Year + Anul + + + Month + Luna + + + Day + Zi + + + Time + Timp + + + Hour + Ora + + + Minute + Minute + + + Second + Al doilea + + + Warning + Avertisment + + + Protocol + Protocol + + + Method + Metoda + + + URI + URI + + + Query + Interogare + + + Response code + Codul de răspuns + + + Time taken + Timpul necesar + + + Bytes sent + Octeți trimiși + + + Bytes received + Octeți primiți + + + Referrer + Referitor + + + Cookie + Cookie + + + Client + Client + + + User-agent + Agent utilizator + + + January + ianuarie + + + February + februarie + + + March + Martie + + + April + Aprilie + + + May + May + + + June + Iunie + + + July + Iulie + + + August + August + + + September + Septembrie + + + October + Octombrie + + + November + Noiembrie + + + December + decembrie + + + Sunday + Duminică + + + Monday + Luni + + + Tuesday + Marţi + + + Wednesday + Miercuri + + + Thursday + Joi + + + Friday + Vineri + + + Saturday + Sâmbătă + + + diff --git a/logdoctor/translations/LogDoctor_ru_RU.ts b/logdoctor/translations/LogDoctor_ru_RU.ts new file mode 100644 index 0000000..d06a2ac --- /dev/null +++ b/logdoctor/translations/LogDoctor_ru_RU.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Версии + + + Version 4 + Версия 4 + + + Version 3 + Версия 3 + + + Version 2 + Версия 2 + + + Version 1 + Версия 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Построить скрипты + + + Cross-platform compatibility: + Кроссплатформенная совместимость: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Статистика: + + + Warnings + Предупреждения + + + Speed + Скорость + + + Counts + Графиня + + + Daytime + дневное время + + + Relational + относительный + + + Globals + Глобал + + + Translations: + Переводы: + + + Italian + итальянский + + + Spanish + испанский + + + French + французский + + + Tools: + Инструменты: + + + Block note + Блокнот + + + Utilities: + Коммунальные услуги: + + + Infos viewer + Инфо-зритель + + + Updates checker + Проверка обновлений + + + Themes: + Темы: + + + Dark + темный + + + Light + Свет + + + Improvements and fixes + Улучшения и исправления + + + New themes: + Новые темы: + + + Ash + Эш + + + Candy + конфетка + + + Forest + лес + + + Powder + Порошок + + + Restyled GUI + Рестайлинговый GUI + + + Restyled dialogs + Рестайлинговые диалоги + + + Doxygen documentation + Доксигенная документация + + + Mini-Games: + Мини-игры: + + + Criss-cross + крест-накрест + + + Snake + Змея + + + Changed default paths + Измененные пути по умолчанию + + + New game modes for Snake + Новые игровые режимы для Snake + + + Hunt + охота + + + Battle + Битва + + + New translations: + Новые переводы: + + + Japanese + японский + + + Portuguese + португальский + + + Code improvements + Улучшение кода + + + Performance improvements + Повышение эффективности + + + Added tests suite: + Добавлен набор тестов: + + + white box tests + Белая коробка + + + Customized charts themes + Настраиваемые темы диаграмм + + + Fixes + исправления + + + Tests improvements + Улучшения тестов + + + Docker support + Поддержка Docker + + + Upgrade to C++20 + Обновление до C++20 + + + Upgrade to Qt6 + Обновление до Qt6 + + + Restyled themes + Рестайлинговые темы + + + Redesigned configs section + Переделанный раздел конфигураций + + + Stability improvements + Повышение стабильности + + + Generating warnings dinamically + Предупреждения динамически + + + New tool: + Новый инструмент: + + + Changelog + Изменить + + + Tweakable parameters for some of the charts: + Настраиваемые параметры для некоторых графиков: + + + Improved project structure + Улучшенная структура проекта + + + Modernized Cmake usage + модернизированный Использование крема + + + + Crapinfo + + Version + Версия + + + Currently installed version of the software + В настоящее время установлена версия программного обеспечения + + + Repository links + Ссылки на хранилища + + + Paths + Пути + + + The path of the executable file + Путь исполняемого файла + + + Executable + исполняемый + + + The path where the configuration file gets saved and searched in + Путь, по которому файл конфигурации сохраняется и ищется в + + + Configuration file + Файл конфигурации + + + The path where the application searches for extra resources + Путь, по которому приложение ищет дополнительные ресурсы + + + Application data + Данные приложения + + + + Crapnote + + Reduce the font size + Уменьшить размер шрифта + + + Font size + Размер шрифта + + + Increase the font size + Увеличить размер шрифта + + + + Crappath + + Choose + Выбрать + + + Cancel + отменить + + + + Crapup + + Checking for updates + Проверка обновлений + + + New version available + Новая версия доступна + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Доступна новая версия! +Пожалуйста, посетите Git-хранилище LogDoctor и следуйте инструкциям о том, как обновить + + + No update found + Обновлений не найдено + + + LogDoctor is up-to-date + LogDoctor обновляется + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Ты запускаешь версию из будущего! +Ваша версия выходит за рамки текущей версии +Вы используете оригинальный LogDoctor? +Пожалуйста, посетите репозиторий LogDoctor и получите его новую версию + + + Failed to establish a connection + Не удалось установить связь + + + Connection error, please try again later + Ошибка подключения, пожалуйста, попробуйте позже + + + Connection timed out + Связь отключена + + + Version check failed + Проверка версий провалилась + + + An error occured while parsing: +version mark not found + Во время разбора произошла ошибка: +Знак версии не найден + + + An error occured while parsing: +malformed version + Во время разбора произошла ошибка: +искаженная версия + + + An error occured while comparing: +malformed upstream version + Произошла ошибка при сравнении: +Неправильная версия Upstream + + + + CrissCross + + Victory + Победа + + + You beated me! + Ты меня избил! + + + This time you lost! + На этот раз вы проиграли! + + + Draw + рисовать + + + Nice match + Отличный матч + + + + DialogBool + + Yes + Да + + + No + Нет + + + + DialogIda + + Ignore + Игнорировать + + + Discard + выбрасывать + + + Abort + отменять + + + + DialogMsg + + Ok + Хорошо + + + + DialogSec + + One of the lists has an invalid item + Один из списков имеет недействительный элемент + + + An error occured while reading the configuration file + Произошла ошибка при чтении файла конфигурации + + + An error occured while parsing configuration file's data + Произошла ошибка при анализе данных файла конфигурации + + + Failed to create the configuration file's directory + Не удалось создать каталог конфигурационного файла + + + Failed to create the configuration file + Не удалось создать конфигурационный файл + + + An error occured while writing the configuration file + При написании файла конфигурации произошла ошибка + + + An error occured while preparing the configuration file's data + Ошибка произошла при подготовке данных файла конфигурации + + + The path contains a symlink + Путь содержит симлинк + + + The file does not exist + Файл не существует + + + Failed to create the database backups' directory + Не удалось создать каталог резервных копий базы данных + + + Failed to copy the database file + Не удалось скопировать файл базы данных + + + Failed to update the backups + Не удалось обновить резервные копии + + + Failed to create the directory + Не удалось создать каталог + + + Unrecognized entry + Непризнанный въезд + + + Size of the file + Размер файла + + + Warning size parameter + Параметр размера предупреждения + + + Failed to read gzipped file + Не удалось прочитать gzipped файл + + + An error occured while parsing the format string + Произошла ошибка при анализе строки формата + + + Available memory + Доступная память + + + Size of the logs + Размер бревен + + + An error occured while reading the gzipped file + Произошла ошибка при чтении gzipped файла + + + An error occured while reading the file + Во время чтения файла произошла ошибка + + + Something failed while handling the file + Что-то не получилось при обработке файла + + + An error occured while working on the database + Во время работы над базой данных произошла ошибка + + + Aborting + аборт + + + Invalid locale + Недействительная локализация + + + Unexpected locale format + Неожиданный локальный формат + + + If you haven't manually edited the configuration file, +please report this issue + Если вы не отредактировали файл конфигурации вручную, +Пожалуйста, сообщите об этом вопросе + + + The given locale is not an accepted language + Данная местность не является общепринятым языком + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Если вы хотите, чтобы это место в LogDoctor, +Пожалуйста, следуйте инструкции на странице репозитория + + + Configuration file not found + Файл конфигурации не найден + + + Unable to retrieve the configuration file + Невозможность восстановления файла конфигурации + + + Skipping + пропуск + + + An error occured while handling the configuration file + При обработке файла конфигурации произошла ошибка + + + Failed to write the configuration file + Не удалось записать файл конфигурации + + + Current configuration not saved + Текущая конфигурация не сохранена + + + File not readable + Файл не читается + + + The file is not readable + Файл не читается + + + File not writable + Файл не пишется + + + The file is not writable + Файл не является письменным + + + Directory not writable + Справочник Not Writable + + + The directory is not writable + Каталог не является письменным + + + Invalid path + Неверный путь + + + Failed applying configuration + Неудачная настройка + + + Invalid configuration lines + Недействительные линии конфигурации + + + Has not been possible to apply some of the configurations + Не удалось применить некоторые конфигурации + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Если вы решите продолжить, все непримененные конфигурации будут потеряны. +Продолжай? + + + Failed to retrieve the help file + Не удалось восстановить файл помощи + + + An error occured while getting the help file + Произошла ошибка при получении файла справки + + + Additional resources can be downloaded from the git repo + Дополнительные ресурсы можно скачать из git repo + + + Unable to retrieve the file + Невозможность восстановить файл + + + Invalid string + Недействительная струна + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Данная строка недействительна и не может быть добавлена в список. + +Пожалуйста, исправьте это и повторите + + + QSql driver not found + Водитель QSql не найден + + + Failed to retrieve the driver needed to handle the database + Не удалось найти водителя, необходимого для работы с базой данных + + + File not found + Файл не найден + + + Failed to retrieve the database file + Не удалось восстановить файл базы данных + + + Create a new database? + Создать новую базу данных? + + + The database contains an unexpected table + База данных содержит неожиданную таблицу + + + Unexpected table + Неожиданный стол + + + It seems that the database is missing a table + В базе данных отсутствует таблица + + + Table not found + Таблица не найдена + + + The database contains an unexpected column + База данных содержит неожиданный столбец + + + Unexpected column + Неожиданная колонка + + + It seems that the table is missing a column + Кажется, что в столе отсутствует колонка + + + Column not found + Колонна не найдена + + + A column has an unexpected data-type + Колонка имеет неожиданный тип данных + + + Unexpected data-type + Неожиданный тип данных + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Эта база данных будет переименована в .copy и будет создана новая. +Продолжай? + + + Database created + Создана база данных + + + Successfully created a new database + Успешно создана новая база данных + + + Not a file + Не файл + + + The path was supposed to point to a file, but it doesn't + Путь должен был указывать на файл, но это не так + + + Please remove the conflict and retry + Пожалуйста, удалите конфликт и повторите + + + The database file is not readable + Файл базы данных не читается + + + Please set the proper permissions and retry +If this error persists, please report this issue + Пожалуйста, установите правильные разрешения и повторите +Если эта ошибка сохраняется, пожалуйста, сообщите об этой проблеме + + + The database file is not writable + Файл базы данных не пишется + + + Invalid database path + Недействительный путь базы данных + + + Failed creating database + Не удалось создать базу данных + + + An error occured while creating the database + При создании базы данных произошла ошибка + + + Failed opening database + Не удалось открыть базу данных + + + An error occured while opening the database + Во время открытия базы данных произошла ошибка + + + Failed executing on database + Неудачная работа в базе данных + + + An error occured while executing a statement on the database + Ошибка произошла при выполнении заявления в базе данных + + + Failed to backup database + Не удалось создать резервную базу данных + + + Please report this issue + Пожалуйста, сообщите об этом вопросе + + + Invalid log format string + Недействительная строка формата log + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Пожалуйста, проверьте, что Ваш веб-сервер не ошибается. +Если он будет принят, пожалуйста, проверьте наличие опечатки здесь +Если все в порядке, пожалуйста, сообщите об этом + + + Log format error + Ошибка формата + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Формат журнала не был установлен или является недействительным +Пожалуйста, добавьте действительный в конфигурациях + + + Misconfigured log format + Неправильный формат журнала + + + No log field has been set in the current logs format, +making it useless to parse logs + В текущем формате журналов не установлено поле журнала, +сделать бесполезным разбор бревен + + + Please set up a format which contains at least one field + Настройте формат, который содержит хотя бы одно поле + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Отсутствует разделитель между одним или несколькими полями. +Чтобы затруднить установление границ сети, +и, возможно, приводит к хранению неправильных данных + + + Please set up a format which contains separators between fields + Настройте формат, который содержит разделители между полями + + + Missing field in log format + Пропавшее поле в формате журнала + + + An important field is missing from the provided format: + В представленном формате отсутствует важное поле: + + + The quality of the statistics may be seriously compromized + Качество статистики может быть серьезно поставлено под угрозу + + + Proceed anyway? + В любом случае? + + + 'Carriage Return' in log format + «Возвращение груза» в формате log + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Предоставляемый формат содержит «Возвращение перевозки». +Это может привести к потере данных или сбоям, если не использовать с осторожностью + + + An error occured while parsing logs + Произошла ошибка при разборе журналов + + + Failed defining type + Неудачный тип определения + + + Failed to determine the log type + Не удалось определить тип журнала + + + File already used + Файл уже используется + + + The file has probably been used already + Файл, вероятно, уже использовался + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Игнорировать предупреждение и использовать его в любом случае, отбросить его и продолжить, или прервать весь процесс? + + + Duplicate file + Дублированный файл + + + The file appears twice in the list of selections + Файл появляется дважды в списке выбора + + + Failed updating hashes + Неудачные обновления хешей + + + An error occured while inserting the parsed files hashes into the database + Произошла ошибка при вставке хешей парсированных файлов в базу данных + + + File exceeds warning size + Файл превышает размер предупреждения + + + The file's size exceeds the warning size + Размер файла превышает размер предупреждения + + + Not enough memory + Недостаточно памяти + + + The total size of the selected files exceeds the available memory + Общий размер выбранных файлов превышает доступную память + + + Please free some resources, parse the files in different steps or split them into smaller units + Пожалуйста, освободите некоторые ресурсы, разберите файлы в разных шагах или разделите их на более мелкие блоки + + + Failed reading + Неудачное чтение + + + File is empty + Файл пустой + + + The file is blank + Файл пустой + + + Failed to retrieve the selected file + Не удалось восстановить выбранный файл + + + Discard it and continue, or Abort all and exit? + Откажитесь от него и продолжайте, или прекратите все и уходите? + + + No file to parse + Нет файла для анализа + + + The list of files to parse is empty + Список файлов для разбора пуст + + + Directory not found + Директория не найдена + + + The directory does not exists + Каталог не существует + + + Directory not readable + Директория нечитаемая + + + The directory is not readable + Каталог не читается + + + Please set the proper permissions before to start + Пожалуйста, установите соответствующие разрешения перед началом + + + Failed creating directory + Не удалось создать каталог + + + The path does not exists + Путь не существует + + + Data conversion failed + Конверсия данных провалилась + + + Failed to convert from '%1' to '%2' + Не удалось конвертировать из «%1» в «%2» + + + Failed to create statistics + Не удалось создать статистику + + + An error occured while processing + Ошибка, возникшая при обработке + + + Cannot create statistics + Невозможно создать статистику + + + No data has been found that matches with the currently set parameters + Не найдено данных, которые соответствовали бы установленным в настоящее время параметрам + + + Not a folder + Не папка + + + The path was supposed to point to a folder, but it doesn't + Путь должен был указывать на папку, но это не так + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Запись будет переименована в «.copy» и будет создана новая. +Продолжай? + + + An error occured + Произошла ошибка + + + Failed renaming + Неудавшееся переименование + + + An error occured while renaming + Произошла ошибка при переименовании + + + + GameDialog + + Ok + Хорошо + + + + MainWindow + + Parse logs from the Apache2 web server + Парсовые журналы с веб-сервера Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Парсовые журналы с веб-сервера Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Парсовые журналы с веб-сервера Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Выберите / выберите все файлы + + + All + Все + + + Inspect a log file + Проверьте файл log + + + Name + Имя + + + Size + Размер + + + Refresh the list + Обновить список + + + Total size of the parsed data + Общий размер парсированных данных + + + Total number of parsed lines + Общее количество парированных линий + + + Start parsing the selected files + Начните анализ выбранных файлов + + + START + Начать + + + Time elapsed since the start + Время истекло с самого начала + + + Average speed, in parsed data size per second + Средняя скорость, в разреженном размере данных в секунду + + + Web Server + Веб-сервер + + + Select a Web Server + Выберите веб-сервер + + + Year + Год + + + Month + месяц + + + Day + День + + + Hour + Час + + + Draw the chart + Нарисуйте график + + + Log line marked as Warning + Логическая линия, обозначенная как предупреждение + + + Date when the request arrived (YYYY-MM-DD) + Дата прибытия запроса (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Время, когда поступил запрос (hh:mm:ss) + + + Protocol of the request + Протокол просьбы + + + Method of the request + Способ подачи просьбы + + + URI of the requested page + URI запрашиваемой страницы + + + Query carried along with the URI + Запрос, выполненный вместе с URI + + + Response code from the server + Код ответа с сервера + + + User-agent of the client which made the request + Пользователь-агент клиента, который сделал запрос + + + IP address of the Client which made the request + IP-адрес Клиента, который сделал запрос + + + Cookie used for the request + Cookies, используемые для запроса + + + The URL which redirected the Client to the requested page + URL, который перенаправил клиента на запрашиваемую страницу + + + Size ib Bytes of the request, usually includes header and data + Размер ib байтов запроса, обычно включает в себя заголовок и данные + + + Size in Bytes of the served content, usually includes header and data + Размер в байтах обслуживаемого контента, обычно включает заголовок и данные + + + Time taken by the server to serve the content, in milliseconds + Время, затрачиваемое сервером на обслуживание контента, в миллисекундах + + + Only use lines in which the field is starting with this string + Используйте только линии, в которых поле начинается с этой строки + + + Protocol: + Протокол: + + + Method: + Метод: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Используйте только линии, в которых поле соответствует этому утверждению. +Используйте «!», «=», «<» или «>», чтобы указать, что использовать + + + Response: + Ответ: + + + Query: + Вопрос: + + + URI: + УРИ: + + + Filters + Фильтры + + + Count + граф + + + Number of occurrences + Количество происшествий + + + Item + Пункт + + + Value of the field + Значение поля + + + From: + Из: + + + To: + Для: + + + Select a log field to view + Выберите поле log для просмотра + + + Field: + Поле: + + + Filter: + Фильтр: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + При струнах будут использоваться только линии, в которых поле начинается с этой струны. +С цифрами используйте «!», «=», «<» или «>», чтобы объявить, что использовать + + + Protocol + Протокол + + + Method + метод + + + URI + Ури + + + User-agent + Агент-пользователь + + + Most recurrent + Самый повторяющийся + + + Most trafficked + Большинство из них + + + Date ever + Свидание всегда + + + Day of the week + День недели + + + Hour of the day + Час дня + + + Time taken + Время + + + Bytes sent + отправленные байты + + + Bytes received + Полученные байты + + + Mean/Max performances + Средние/макс-выступления + + + Requests received + Полученные просьбы + + + Total work + Общая работа + + + General + Генерал + + + Window + окно + + + Dialogs + Диалоги + + + Charts + диаграммы + + + Appearance + внешний вид + + + Speed + Скорость + + + Relational + относительный + + + TextBrowser + TextBrowser + + + Databases + Базы данных + + + Security + Безопасность + + + Logs + Лог + + + Defaults + недостатки + + + Control + Контроль + + + Path + Путь + + + Format + Формат + + + Warnlists + Списки предупреждений + + + Blacklists + Черные списки + + + Remember the window's position and size + Запомните положение и размер окна + + + Remember position and size + Запомните положение и размер + + + Remember window's position and size + Запомните положение и размер окна + + + Geometry + Геометрия + + + Theme to use for the window + Тема для использования в окне + + + Theme + Тема + + + Native + коренной + + + Light + Свет + + + Dark + темный + + + Auto + Автомат + + + Icons + Иконы + + + Normal quantity of dialog messages shown + Нормальное количество диалоговых сообщений + + + Normal + нормальный + + + Dialogs from the main processes + Диалоги основных процессов + + + Dialogs emitted when parsing logs + Диалоги, излучаемые при разборе журналов + + + Logs parser + Парсер журналов + + + Dialogs emitted when viewing statistics + Диалоги, излучаемые при просмотре статистики + + + Statistics viewer + Зритель статистики + + + Define the quantity of dialog mesages shown + Определите количество показанных диалоговых сообщений + + + Dialogs level + Диалог уровня + + + Reduced quantity of dialog messages shown + Уменьшение количества диалоговых сообщений + + + Essential + необходимый + + + Augmented quantity of dialog messages shown + Увеличенное количество диалоговых сообщений + + + Explanatory + пояснения + + + Theme to use for the Charts + Тема для использования в картах + + + Preview + Предварительный просмотр + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Представляет собой шаг в оси времени, в секундах. +Все значения, попадающие в один и тот же интервал, будут объединены, и будет использоваться среднее значение. + + + Time interval + интервал времени + + + The format to use for the labels of the time axis. + Формат для использования для меток оси времени. + + + Time format + Формат времени + + + The size of the pie + Размеры пирога + + + Pie size + Размер пирога + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Максимальное количество ломтиков, из которых будет состоять пирог. +Превышение ломтиков будет сгруппировано в один полный ломтик. + + + Maximum slices + Максимальные ломтики + + + Font to use for the Text Browser + Шрифт для использования в текстовом браузере + + + Font + шрифт + + + Double-spaced lines + Двухместные линии + + + Use wide lines + Используйте широкие линии + + + Define the spacing between lines + Определите расстояние между линиями + + + Lines spacing + Расстояние между линиями + + + None + Никто + + + Color scheme to use for the Text Browser + Цветовая схема для использования в текстовом браузере + + + Color scheme + Цветовая схема + + + The appearance of the Text Browser with the current settings + Появление текстового браузера с текущими настройками + + + Insert the base path only, file name excluded + Вставьте только базовый путь, имя файла исключено + + + The given path doen't exists, or doesn't point to a folder + Данный путь не существует или не указывает на папку + + + Path for the database files + Путь к файлам базы данных + + + Paths + Пути + + + Apply the current path + Используйте текущий путь + + + Select the path through a dialog window + Выберите путь через диалоговое окно + + + Path where the logs data collection database is located + Путь, по которому находится база данных сбора логов + + + Logs data + Логи данных + + + Path where the used files hashes database is located + Путь, по которому расположена используемая база данных хешей файлов + + + Used files + Используемые файлы + + + Backup options for the Logs Data database + Варианты резервного копирования для базы данных Logs Data + + + Backups + Резервные копии + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Новая резервная копия создается при закрытии LogDoctor после успешного редактирования базы данных + + + Backup the Logs Data database and keep + Резервное копирование базы данных Logs Data и сохранение + + + Whether it is allowed or denied to follow symlinks occuring in a path + Разрешено или запрещено следовать по симлинкам, возникающим на пути + + + Follow symlinks + Следуйте за симлинками + + + Default WebServer + По умолчанию WebServer + + + Usage control + Контроль использования + + + Hide already used files + Скрыть уже использованные файлы + + + Size warnings + Предупреждения о размере + + + Warn me when using files with a size exceeding: + Предупредите меня при использовании файлов с размером, превышающим: + + + Logs folder + Складка журналов + + + Logs format string + Формат строки Logs + + + Format string + Формат строки + + + Insert the format string you're using + Вставьте строку формата, которую вы используете + + + Apply the current string + Применять текущую строку + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Создайте строку журнала образца из сохраненной строки, чтобы проверить, правильно ли она отформатирована. +Любое поле, не рассматриваемое LogDoctor, будет отображаться как 'DISCARDED' + + + Generate sample + Сгенерировать образец + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Пожалуйста, проверьте правильность этой строки. +Поля, помеченные как 'DISCARDED', были правильно разобраны, но не рассматриваются LogDoctor + + + Open an help window + Откройте окно помощи + + + Help + Помощь + + + Select a log field + Выберите поле log + + + Use warnlist for this field + Используйте предупредительный список для этой области + + + Add the current line to the list + Добавить текущую строку в список + + + Remove the selected item from the list + Удалить выбранный пункт из списка + + + Move the selected item down + Переместите выбранный пункт вниз + + + Use blacklist for this field + Используйте черный список для этой области + + + Add line + Добавить строку + + + Remove selection + Удалить выбор + + + Language + Язык языка + + + Utilities + коммунальные услуги + + + Tools + Инструменты + + + Games + Игры + + + Perform a version-check + Проверить версию + + + Show some info about LogDoctor + Показать информацию о LogDoctor + + + Open a block-note like window to write temporary text + Откройте блок-ноту как окно для написания временного текста + + + Play CrissCross + Играть в CrissCross + + + Play Snake + Играть в Snake + + + Show the changelog + Показать changelog + + + warnlist + предупреждающий + + + blacklist + черный список + + + copy + копия + + + copies + копии + + + Check updates + Проверьте обновления + + + Infos + Информация + + + BlockNote + Блокнот + + + CrissCross + Перекресток + + + Snake + Змея + + + Changelog + Изменить + + + + RichText + + Select a file from the list + Выберите файл из списка + + + to inspect its content + проверить его содержание + + + Failed to read + Не удалось прочитать + + + + SnakeGame + + PLAY + играть + + + Classic + Классика + + + Hunt + охота + + + Battle + Битва + + + Game Over + Обсуждение Game Over + + + Your adversary fell in the water! + Твой противник упал в воду! + + + YOU WON! + Ты победил! + + + You fell in the water! + Ты упал в воду! + + + YOU LOST! + Ты проиграл! + + + Your adversary ate itself! + Твой противник съел сам себя! + + + You ate yourself! + Ты съел себя! + + + Your adversary ate you! + Твой противник съел тебя! + + + You ate your adversary! + Ты съел своего противника! + + + You ate each other! + Вы съели друг друга! + + + MATCH IS DRAW! + Матч - это драка! + + + + TR + + Unexpected WebServer + Неожиданный веб-сервер + + + Logs Size Breakdown + Разбивка по размеру + + + Ignored + игнорируемый + + + Parsed + Парсед + + + Blacklisted + Черный список + + + Others + Другие + + + from + из + + + to + то + + + Log Lines Marked as Warning + Логические линии отмечены как предупреждение + + + Time Taken to Serve Requests + Время, необходимое для выполнения запросов + + + Time of Day Count + Счет времени суток + + + Relational Count + Относительный счет + + + FALSE + ложный + + + TRUE + Правда + + + Date + Дата + + + Year + Год + + + Month + месяц + + + Day + День + + + Time + Время + + + Hour + Час + + + Minute + Минута + + + Second + Второй + + + Warning + Предупреждение + + + Protocol + Протокол + + + Method + метод + + + URI + Ури + + + Query + Запрос + + + Response code + Код ответа + + + Time taken + Время + + + Bytes sent + отправленные байты + + + Bytes received + Полученные байты + + + Referrer + Реферер + + + Cookie + печенье + + + Client + клиент + + + User-agent + Агент-пользователь + + + January + Январь + + + February + февраль + + + March + март + + + April + апрель + + + May + май + + + June + июнь + + + July + июль + + + August + август + + + September + сентябрь + + + October + октября + + + November + ноябрь + + + December + декабрь + + + Sunday + воскресенье + + + Monday + понедельник + + + Tuesday + вторник + + + Wednesday + среда + + + Thursday + четверг + + + Friday + Пятница + + + Saturday + суббота + + + diff --git a/logdoctor/translations/LogDoctor_sk_SK.ts b/logdoctor/translations/LogDoctor_sk_SK.ts new file mode 100644 index 0000000..40cb5e5 --- /dev/null +++ b/logdoctor/translations/LogDoctor_sk_SK.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Verzia + + + Version 4 + Verzia 4 + + + Version 3 + Verzia 3 + + + Version 2 + Verzia 2 + + + Version 1 + Verzia 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Stavať skripty + + + Cross-platform compatibility: + Cezhraničná kompatibilita: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Štatistiky: + + + Warnings + Varovanie + + + Speed + Rýchlosť + + + Counts + Počet + + + Daytime + Deň + + + Relational + Relácia + + + Globals + Slovenčina + + + Translations: + Preklady: + + + Italian + Slovenčina + + + Spanish + Slovenčina + + + French + Slovenčina + + + Tools: + Nástroje: + + + Block note + Blok poznámka + + + Utilities: + Využitie: + + + Infos viewer + Zobraziť zaujímavé miesta + + + Updates checker + Aktualizácie checker + + + Themes: + Témy: + + + Dark + Tmavo + + + Light + Svetlo + + + Improvements and fixes + Zlepšenie a opravy + + + New themes: + Nové témy: + + + Ash + Slovenčina + + + Candy + Slovenčina + + + Forest + Všeobecný + + + Powder + Prášok + + + Restyled GUI + Restyleed GUI + + + Restyled dialogs + Opracované dialógy + + + Doxygen documentation + Doxygen dokumentácia + + + Mini-Games: + Mini-hra: + + + Criss-cross + Crisss-cross + + + Snake + Hadice + + + Changed default paths + Zmenil predvolené trasy + + + New game modes for Snake + Nové herné režimy pre had + + + Hunt + Slovenčina + + + Battle + Bitka + + + New translations: + Nové preklady: + + + Japanese + Slovenčina + + + Portuguese + Slovenčina + + + Code improvements + Zlepšenie kódu + + + Performance improvements + Zlepšenie výkonu + + + Added tests suite: + Pridaná skúšobná suita: + + + white box tests + biely box testy + + + Customized charts themes + Prispôsobené grafy témy + + + Fixes + Fixy + + + Tests improvements + Zlepšenie testov + + + Docker support + Docker podpora + + + Upgrade to C++20 + Aktualizácia C++20 + + + Upgrade to Qt6 + Upgrade na Qt6 + + + Restyled themes + Opracované témy + + + Redesigned configs section + Redizajnovaná časťconfigs + + + Stability improvements + Zlepšenie stability + + + Generating warnings dinamically + Generácia varovania dinamicky + + + New tool: + Nový nástroj: + + + Changelog + changelog + + + Tweakable parameters for some of the charts: + Tweakovateľné parametre pre niektoré z grafov: + + + Improved project structure + Vylepšená štruktúra projektu + + + Modernized Cmake usage + Modernizácia Využitie Cmake + + + + Crapinfo + + Version + Verzia + + + Currently installed version of the software + V súčasnosti nainštalovaná verzia softvéru + + + Repository links + Repository odkazy + + + Paths + Cesta + + + The path of the executable file + Cesta spustiteľný súbor + + + Executable + Prenosné + + + The path where the configuration file gets saved and searched in + Cesta, kde sa súbor konfigurácie uloží a hľadal v + + + Configuration file + Konfiguračný súbor + + + The path where the application searches for extra resources + Cesta, kde vyhľadávanie aplikácie pre ďalšie zdroje + + + Application data + Údaje o aplikácii + + + + Crapnote + + Reduce the font size + Znížte veľkosť písma + + + Font size + Veľkosť písma + + + Increase the font size + Zvýšiť veľkosť písma + + + + Crappath + + Choose + Vyberte si + + + Cancel + Zrušiť + + + + Crapup + + Checking for updates + Kontrola aktualizácie + + + New version available + Nová verzia k dispozícii + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Nová verzia je k dispozícii! +Prosím, navštívte LogDoctor git úložisko a postupujte podľa pokynov o tom, ako aktualizovať + + + No update found + Neboli nájdené žiadne aktualizácie + + + LogDoctor is up-to-date + LogDoctor je aktuálny + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Spustíte verziu z budúcnosti! +Vaša verzia je mimo aktuálnej verzie horestream +Spustíte originál LogDoctor? +Prosím, navštívte úložisko LogDoctora a získajte čerstvú verziu + + + Failed to establish a connection + Zlyhanie na vytvorenie pripojenia + + + Connection error, please try again later + Chyba pripojenia, prosím skúste znova neskôr + + + Connection timed out + Čas pripojenia + + + Version check failed + Kontrola verzií zlyhal + + + An error occured while parsing: +version mark not found + Nastala chyba pri parsingu: +Signatúra verzie nebol nájdený + + + An error occured while parsing: +malformed version + Nastala chyba pri parsingu: +sladená verzia + + + An error occured while comparing: +malformed upstream version + Pri porovnávaní došlo k chybe: +sladená verzia + + + + CrissCross + + Victory + Víťazstvo + + + You beated me! + Bol si ma! + + + This time you lost! + Tentokrát ste stratili! + + + Draw + Nakreslite + + + Nice match + Pekný zápas + + + + DialogBool + + Yes + Áno + + + No + Nie + + + + DialogIda + + Ignore + Ignore + + + Discard + Diskutujte + + + Abort + Všeobecný + + + + DialogMsg + + Ok + Okno + + + + DialogSec + + One of the lists has an invalid item + Jeden z zoznamov má neplatnú položku + + + An error occured while reading the configuration file + Pri prečítaní konfiguračného súboru došlo k chybe + + + An error occured while parsing configuration file's data + Nastala chyba pri vykonávaní údajov o konfigurácii súborov + + + Failed to create the configuration file's directory + Failed na vytvorenie adresára konfiguračného súboru + + + Failed to create the configuration file + Failed vytvoriť konfiguračný súbor + + + An error occured while writing the configuration file + Pri písaní konfiguračného súboru došlo k chybe + + + An error occured while preparing the configuration file's data + Nastala chyba pri príprave dát konfiguračného súboru + + + The path contains a symlink + Cesta obsahuje symlink + + + The file does not exist + Súbor neexistuje + + + Failed to create the database backups' directory + Failed na vytvorenie adresára zálohovanie databázy + + + Failed to copy the database file + Failed na kopírovanie súboru databázy + + + Failed to update the backups + Podarilo sa aktualizovať zálohovanie + + + Failed to create the directory + Obdarené vytvoriť adresár + + + Unrecognized entry + Nezaradené vstup + + + Size of the file + Veľkosť súboru + + + Warning size parameter + Parametre pozornosti + + + Failed to read gzipped file + Failed čítať gzipped súbor + + + An error occured while parsing the format string + Nastala chyba, keď sa vyvaruje formátový reťazec + + + Available memory + K dispozícii pamäť + + + Size of the logs + Veľkosť logov + + + An error occured while reading the gzipped file + Nastala chyba pri prečítaní súboru gzipped + + + An error occured while reading the file + Pri prečítaní súboru došlo k chybe + + + Something failed while handling the file + Niečo zlyhalo pri manipulácii so súborom + + + An error occured while working on the database + Pri práci sa vyskytla chyba + + + Aborting + Skladovanie + + + Invalid locale + Neplatné locale + + + Unexpected locale format + Neočakávaný locale formát + + + If you haven't manually edited the configuration file, +please report this issue + Ak ste ručne upravili konfiguračný súbor, +prosím nahlásiť túto otázku + + + The given locale is not an accepted language + Uvedené locale nie je akceptovaný jazyk + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Ak by ste chceli mať túto locale v LogDoctor, +postupujte podľa pokynov na stránke úložisko + + + Configuration file not found + Konfiguračný súbor nebol nájdený + + + Unable to retrieve the configuration file + Nemožno získať konfiguračný súbor + + + Skipping + Lyžovanie + + + An error occured while handling the configuration file + Pri manipulácii s konfiguračným súborom došlo k chybe + + + Failed to write the configuration file + Failed písať konfiguračný súbor + + + Current configuration not saved + Aktuálna konfigurácia nie je uložená + + + File not readable + Súbor nie je čitateľný + + + The file is not readable + Súbor nie je čitateľný + + + File not writable + Súbor nie je schopný + + + The file is not writable + Súbor nie je ritable + + + Directory not writable + Adresár nie je podráždený + + + The directory is not writable + Súbor nie je ritable + + + Invalid path + Neplatná cesta + + + Failed applying configuration + Failed inštalácia + + + Invalid configuration lines + Neplatné konfiguračné linky + + + Has not been possible to apply some of the configurations + Nie je možné použiť niektoré z konfigurácií + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Ak sa rozhodnete pokračovať, všetky nealeké konfigurácie budú stratené +Pokračovať? + + + Failed to retrieve the help file + Failed načítať súbor pomoci + + + An error occured while getting the help file + Nastala chyba pri získavaní pomocného súboru + + + Additional resources can be downloaded from the git repo + Ďalšie zdroje možno stiahnuť z git repo + + + Unable to retrieve the file + Nemožno obnoviť súbor + + + Invalid string + Neplatný reťazec + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Uvedený reťazec je neplatný a nemôže byť pridaný do zoznamu + +Prosím, opravte ho a preneste + + + QSql driver not found + QSql vodič nebol nájdený + + + Failed to retrieve the driver needed to handle the database + Obdarilo sa získať ovládač potrebný na zvládnutie databázy + + + File not found + Súbor nebol nájdený + + + Failed to retrieve the database file + Zlyhanie na obnovenie súboru databázy + + + Create a new database? + Vytvorenie novej databázy? + + + The database contains an unexpected table + Databáza obsahuje nečakaný stôl + + + Unexpected table + Neočakávaný stôl + + + It seems that the database is missing a table + Zdá sa, že databáza chýba stôl + + + Table not found + Tabuľka nebol nájdený + + + The database contains an unexpected column + Databáza obsahuje nečakaný stĺpec + + + Unexpected column + Neočakávaný stĺpec + + + It seems that the table is missing a column + Zdá sa, že tabuľka chýba stĺpec + + + Column not found + Stĺpec nebol nájdený + + + A column has an unexpected data-type + Stĺpec má neočakávané údaje typu + + + Unexpected data-type + Neočakávané údaje typu + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Táto databáza bude premenovaná s chodníkom ".kopírovať" a nový bude vytvorený. +Pokračovať? + + + Database created + Databáza vytvorená + + + Successfully created a new database + Úspešne vytvorila novú databázu + + + Not a file + Nie je súbor + + + The path was supposed to point to a file, but it doesn't + Cesta mala poukázať na súbor, ale to nie je + + + Please remove the conflict and retry + Prosím, odstráňte konflikt a retry + + + The database file is not readable + Súbor databázy nie je čitateľný + + + Please set the proper permissions and retry +If this error persists, please report this issue + Uveďte správne povolenia a retry +Ak táto chyba pretrváva, obráťte sa na túto otázku + + + The database file is not writable + Súbor databázy nie je ritable + + + Invalid database path + Neplatná databáza cesta + + + Failed creating database + Porucha vytvárania databázy + + + An error occured while creating the database + Nastala chyba pri vytváraní databázy + + + Failed opening database + Porucha otváracej databázy + + + An error occured while opening the database + Nastala chyba pri otvorení databázy + + + Failed executing on database + Failed vykonávanie databázy + + + An error occured while executing a statement on the database + Nastala chyba pri vykonávaní vyhlásenia o databáze + + + Failed to backup database + Zlyhanie do záložnej databázy + + + Please report this issue + Oznámte túto otázku + + + Invalid log format string + Neplatný formát protokolu reťazec + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Skontrolujte, či nie je chyba hodená na WebServer +Ak to bude akceptované, pozrite sa na prítomnosť typo tu +Ak je všetko v poriadku, obráťte sa na túto otázku + + + Log format error + Chyba formátu + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Formát denníka nebol nastavený, alebo je neplatný +Pridajte platný jeden v konfiguráciách + + + Misconfigured log format + Chyba formátu loga + + + No log field has been set in the current logs format, +making it useless to parse logs + Žiadne pole sa nenastavil v aktuálnom formáte denníkov, +robiť to zbytočné parse protokoly + + + Please set up a format which contains at least one field + Zadajte formát, ktorý obsahuje aspoň jedno pole + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Separátor chýba medzi jedným alebo viacerými poliami, +aby bolo ťažké vytvoriť net hranice, +a možno vedie k uloženie nesprávnych údajov + + + Please set up a format which contains separators between fields + Nastavte formát, ktorý obsahuje oddeľovače medzi políciou + + + Missing field in log format + Chýbajúce pole vo formáte log + + + An important field is missing from the provided format: + Dôležité pole chýba z poskytnutého formátu: + + + The quality of the statistics may be seriously compromized + Kvalita štatistík môže byť vážne kompromized + + + Proceed anyway? + Proceed tak? + + + 'Carriage Return' in log format + 'Carriage Návrat' vo formáte log + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Za predpokladu, že formát obsahuje "Carriage Návrat". +To môže viesť k strate dát alebo pádom, ak sa nepoužíva s opatrnosťou + + + An error occured while parsing logs + Nastala chyba pri parsing logoch + + + Failed defining type + Dekorácia typu + + + Failed to determine the log type + Obdarené určiť typ loga + + + File already used + Súbor už použitý + + + The file has probably been used already + Súbor bol pravdepodobne použitý už + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorovať varovanie a používať ho tak, Diskutujte ho a pokračujte, alebo zorientujte celý proces? + + + Duplicate file + Duplicitný súbor + + + The file appears twice in the list of selections + Súbor sa objaví dvakrát v zozname výberov + + + Failed updating hashes + Porucha aktualizácie hashes + + + An error occured while inserting the parsed files hashes into the database + Nastala chyba pri vložením parsed súbory hashes do databázy + + + File exceeds warning size + Súbor prevyšuje veľkosť varovania + + + The file's size exceeds the warning size + Veľkosť súboru presahuje veľkosť varovania + + + Not enough memory + Nie je dosť pamäte + + + The total size of the selected files exceeds the available memory + Celková veľkosť vybraných súborov presahuje k dispozícii pamäť + + + Please free some resources, parse the files in different steps or split them into smaller units + Prosím, zadarmo niektoré zdroje, vymazať súbory v rôznych krokoch alebo rozdeliť ich do menších jednotiek + + + Failed reading + Neobmedzené čítanie + + + File is empty + Súbor je prázdny + + + The file is blank + Súbor je prázdny + + + Failed to retrieve the selected file + Obdarilo sa získať vybraný súbor + + + Discard it and continue, or Abort all and exit? + Diskutujte ho a pokračujte, alebo zlikvidujte všetky a odchádzate? + + + No file to parse + Žiadny súbor na parse + + + The list of files to parse is empty + Zoznam súborov na parse je prázdny + + + Directory not found + Adresár nebol nájdený + + + The directory does not exists + Súbor neexistuje + + + Directory not readable + Adresár nie je čitateľný + + + The directory is not readable + Súbor nie je čitateľný + + + Please set the proper permissions before to start + Prosím, nastaviť správne povolenia pred začiatkom + + + Failed creating directory + Failed vytvorenie adresára + + + The path does not exists + Cesta neexistuje + + + Data conversion failed + Konverzia dát zlyhala + + + Failed to convert from '%1' to '%2' + Zlyhanie previesť z "%1" na "%2" + + + Failed to create statistics + Zlyhanie vytvoriť štatistiky + + + An error occured while processing + Pri spracovaní sa vyskytla chyba + + + Cannot create statistics + Nemožno vytvárať štatistiky + + + No data has been found that matches with the currently set parameters + Neboli nájdené žiadne údaje, ktoré sa zhodujú s aktuálnymi parametrami + + + Not a folder + Nie je priečinok + + + The path was supposed to point to a folder, but it doesn't + Cesta mala poukázať na zložku, ale to nie je + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Vstup bude premenovaný chodníkom ".kopírovať" a nový bude vytvorený. +Pokračovať? + + + An error occured + Nastala chyba + + + Failed renaming + Failed premenovanie + + + An error occured while renaming + Pri premenovaní došlo k chybe + + + + GameDialog + + Ok + Okno + + + + MainWindow + + Parse logs from the Apache2 web server + Parse záznamy z webového servera Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse záznamy z webového servera Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parse záznamy z webového servera Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Vyberte/vybrať všetky súbory + + + All + Všetko + + + Inspect a log file + Skontrolujte súbor denníka + + + Name + Meno + + + Size + Veľkosť + + + Refresh the list + Obnoviť zoznam + + + Total size of the parsed data + Celková veľkosť parsed dát + + + Total number of parsed lines + Celkový počet parsed riadkov + + + Start parsing the selected files + Začnite využívať vybrané súbory + + + START + ŠTART + + + Time elapsed since the start + Čas vypadol od začiatku + + + Average speed, in parsed data size per second + Priemerná rýchlosť, v parsed veľkosť dát za sekundu + + + Web Server + Webová stránka + + + Select a Web Server + Vyberte Web Server + + + Year + Rok + + + Month + Mesiac + + + Day + Deň + + + Hour + Hodina + + + Draw the chart + Nakreslite graf + + + Log line marked as Warning + Log riadok označené ako varovanie + + + Date when the request arrived (YYYY-MM-DD) + Dátum, keď prišla žiadosť (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Čas, keď prišla žiadosť (hh:mm:s) + + + Protocol of the request + Protokol žiadosti + + + Method of the request + Spôsob žiadosti + + + URI of the requested page + URI požadovanej stránky + + + Query carried along with the URI + Požiadavky vykonávané spolu s URI + + + Response code from the server + Kód odpovede zo servera + + + User-agent of the client which made the request + Užívateľ-agent klienta, ktorý urobil žiadosť + + + IP address of the Client which made the request + IP adresa klienta, ktorý urobil žiadosť + + + Cookie used for the request + Cookies používané na žiadosť + + + The URL which redirected the Client to the requested page + URL, ktorá presmerovala klienta na požadovanú stránku + + + Size ib Bytes of the request, usually includes header and data + Veľkosť ib Bytes žiadosti, zvyčajne zahŕňa hlavičku a údaje + + + Size in Bytes of the served content, usually includes header and data + Veľkosť v Bytes obsahu, zvyčajne zahŕňa hlavičku a dáta + + + Time taken by the server to serve the content, in milliseconds + Čas užívaný serverom, aby slúžil obsah, v milisekundách + + + Only use lines in which the field is starting with this string + Používajte iba riadky, v ktorých sa pole začína týmto reťazcom + + + Protocol: + Protokol: + + + Method: + Metóda: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Používajte iba riadky, v ktorých je pole zodpovedajúce tomuto vyhlásení. +Použite '!', '=', '<' alebo '>' vyhlásiť, čo používať + + + Response: + Odpoveď: + + + Query: + Otázka: + + + URI: + URI: + + + Filters + Filtre + + + Count + Aktuality + + + Number of occurrences + Počet výskytov + + + Item + Položka + + + Value of the field + Hodnota poľa + + + From: + Z: + + + To: + Na: + + + Select a log field to view + Vyberte pole pre zobrazenie + + + Field: + Oblasť: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + S reťazcami, iba riadky, v ktorých sa pole začína týmto reťazcom. +S číslami použite '!', '=', '<' alebo '>' vyhlásiť, čo používať + + + Protocol + Aktuality + + + Method + Metóda + + + URI + URI + + + User-agent + Užívateľ-agent + + + Most recurrent + Najviac opakujúce + + + Most trafficked + Väčšina návštev + + + Date ever + Dátum stále + + + Day of the week + Deň týždňa + + + Hour of the day + Hodina dňa + + + Time taken + Čas prevzaté + + + Bytes sent + Bytes zaslaný + + + Bytes received + Bytes dostal + + + Mean/Max performances + Prostriedky/Max + + + Requests received + Prijaté žiadosti + + + Total work + Celková práca + + + General + Všeobecný + + + Window + Okno + + + Dialogs + Dialogs + + + Charts + Grafy + + + Appearance + Vzhľad + + + Speed + Rýchlosť + + + Relational + Relácia + + + TextBrowser + TextBrowser + + + Databases + Databáza + + + Security + Bezpečnosť + + + Logs + Prihlásiť + + + Defaults + Defaults + + + Control + Ovládanie + + + Path + Cesta + + + Format + Formát + + + Warnlists + Warnlists + + + Blacklists + Blacklists + + + Remember the window's position and size + Nezabudnite na pozíciu okna a veľkosť + + + Remember position and size + Pamätajte si, že pozície a veľkosť + + + Remember window's position and size + Pamätajte si, že poloha okna a veľkosť + + + Geometry + Geometria + + + Theme to use for the window + Téma na použitie pre okno + + + Theme + Téma + + + Native + Natívny + + + Light + Svetlo + + + Dark + Tmavo + + + Auto + Auto + + + Icons + Ikony + + + Normal quantity of dialog messages shown + Normálne množstvo dialógových správ + + + Normal + Normálne + + + Dialogs from the main processes + Dialogy z hlavných procesov + + + Dialogs emitted when parsing logs + Dialogs emitované pri parsing logoch + + + Logs parser + Logs parser + + + Dialogs emitted when viewing statistics + Dialogs emitované pri prezeraní štatistiky + + + Statistics viewer + Štatistiky divákov + + + Define the quantity of dialog mesages shown + Definovať množstvo dialógových mesages + + + Dialogs level + Dialogs úroveň + + + Reduced quantity of dialog messages shown + Znížené množstvo dialógových správ + + + Essential + Aktuality + + + Augmented quantity of dialog messages shown + Rozšírené množstvo dialógových správ + + + Explanatory + Aktuality + + + Theme to use for the Charts + Téma na použitie pre grafy + + + Preview + Ukážka + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Zastupuje krok v časovej osi, v sekundách. +Všetky hodnoty spadajúce do rovnakého intervalu budú zlúčené a bude použitá hodnota. + + + Time interval + Časový interval + + + The format to use for the labels of the time axis. + Formát použiť pre štítky časovej osi. + + + Time format + Časový formát + + + The size of the pie + Veľkosť koláča + + + Pie size + Veľkosť Piesok + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Maximálny počet rezov, z ktorých sa bude piesňať. +Prekročenie rezov bude zoskupené do jedného komplexného plátna. + + + Maximum slices + Maximálne plátky + + + Font to use for the Text Browser + Font na použitie pre prehliadač textu + + + Font + Fontána + + + Double-spaced lines + Dvojité linky + + + Use wide lines + Použite široké linky + + + Define the spacing between lines + Definovať vzdialenosť medzi líniami + + + Lines spacing + Roztok riadkov + + + None + Nie + + + Color scheme to use for the Text Browser + Farebná schéma na použitie pre prehliadač Text + + + Color scheme + Farebná schéma + + + The appearance of the Text Browser with the current settings + Vzhľad prehliadača textu s aktuálnymi nastaveniami + + + Insert the base path only, file name excluded + Vložte iba základnú cestu, názov súboru + + + The given path doen't exists, or doesn't point to a folder + Pridaná cesta doen neexistuje, alebo nemá bod na zložku + + + Path for the database files + Cesta k súborom databázy + + + Paths + Cesta + + + Apply the current path + Použiť aktuálnu cestu + + + Select the path through a dialog window + Vyberte cestu cez okno dialóg + + + Path where the logs data collection database is located + Cesta, kde sa nachádza databáza zberu údajov + + + Logs data + Údaje + + + Path where the used files hashes database is located + Cesta, kde sa nachádzajú použité súbory hashes databázy + + + Used files + Použité súbory + + + Backup options for the Logs Data database + Možnosti zálohovania pre databázu Logs Data + + + Backups + Zálohovanie + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Nová záloha je vyrobená pri zatvorení LogDoctora po úspešnom editácii databázy + + + Backup the Logs Data database and keep + zálohovanie databázy Logs Data a udržať + + + Whether it is allowed or denied to follow symlinks occuring in a path + Či je povolené alebo odmietnutý sledovať symlinky sa vyskytujú v ceste + + + Follow symlinks + Sledujte symlinky + + + Default WebServer + Default WebServer + + + Usage control + Ovládanie použitia + + + Hide already used files + Skryť už použité súbory + + + Size warnings + Veľké upozornenia + + + Warn me when using files with a size exceeding: + Warn ma pri používaní súborov s veľkosťou presahuje: + + + Logs folder + Logs priečinka + + + Logs format string + Logs formát reťazec + + + Format string + Formát reťazec + + + Insert the format string you're using + Vložte formátový reťazec, ktorý používate + + + Apply the current string + Použiť aktuálny reťazec + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Generovať vzorovú logovú linku z aktuálneho uloženého reťazca, skontrolovať, či sa správne formátuje. +Akékoľvek pole nie je považované LogDoctor sa objaví ako 'DISCARDED' + + + Generate sample + Generovať vzorku + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Skontrolujte správnosť tejto linky. +Polia označené ako 'DISCARDED' dostal správne parsed, ale nie sú považované LogDoctor + + + Open an help window + Otvorte okno pomoci + + + Help + Pomoc + + + Select a log field + Vyberte pole loga + + + Use warnlist for this field + Použite varný zoznam pre túto oblasť + + + Add the current line to the list + Pridajte aktuálny riadok do zoznamu + + + Remove the selected item from the list + Odstráňte vybranú položku zo zoznamu + + + Move the selected item down + Presuňte vybranú položku nadol + + + Use blacklist for this field + Použite čierny zoznam pre túto oblasť + + + Add line + Pridať riadok + + + Remove selection + Odstrániť výber + + + Language + Slovenčina + + + Utilities + Aktuality + + + Tools + Nástroje + + + Games + Hry + + + Perform a version-check + Vykonať verziu-check + + + Show some info about LogDoctor + Zobraziť niektoré informácie o LogDoctor + + + Open a block-note like window to write temporary text + Otvorte blok-note ako okno písať dočasný text + + + Play CrissCross + Hrať CrisssCross + + + Play Snake + Hrať Had + + + Show the changelog + Zobraziť changelog + + + warnlist + varný zoznam + + + blacklist + blacklist + + + copy + skopírovať + + + copies + Slovenčina + + + Check updates + Skontrolujte aktualizácie + + + Infos + Info + + + BlockNote + BlockNote + + + CrissCross + CrisssCross + + + Snake + Hadice + + + Changelog + changelog + + + + RichText + + Select a file from the list + Vyberte súbor zo zoznamu + + + to inspect its content + kontrolovať obsah + + + Failed to read + Neobmedzené čítať + + + + SnakeGame + + PLAY + PREHĽAD + + + Classic + Klasické + + + Hunt + Slovenčina + + + Battle + Bitka + + + Game Over + Hra cez + + + Your adversary fell in the water! + Váš adversary spadol do vody! + + + YOU WON! + ZÍSKAJTE! + + + You fell in the water! + Ste padli do vody! + + + YOU LOST! + Zľavy! + + + Your adversary ate itself! + Váš adversary osloviť sám! + + + You ate yourself! + Si jedli! + + + Your adversary ate you! + Váš e-mail! + + + You ate your adversary! + Zjedli ste svoj adversary! + + + You ate each other! + Ste si navzájom zjedli! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + Neočakávané WebServer + + + Logs Size Breakdown + Logs Size Breakdown + + + Ignored + Ignorované + + + Parsed + Rezorty + + + Blacklisted + Blacklisted + + + Others + Ostatné + + + from + od + + + to + na + + + Log Lines Marked as Warning + Log Lines označené ako varovanie + + + Time Taken to Serve Requests + Čas na podanie žiadosti + + + Time of Day Count + Čas počítanie dní + + + Relational Count + Relácia + + + FALSE + Aktuality + + + TRUE + TRUE + + + Date + Dátum + + + Year + Rok + + + Month + Mesiac + + + Day + Deň + + + Time + Čas + + + Hour + Hodina + + + Minute + Aktuality + + + Second + Druhá + + + Warning + Upozornenie + + + Protocol + Aktuality + + + Method + Metóda + + + URI + URI + + + Query + Aktuality + + + Response code + Kód odpovede + + + Time taken + Čas prevzaté + + + Bytes sent + Bytes zaslaný + + + Bytes received + Bytes dostal + + + Referrer + Aktuality + + + Cookie + Cookies + + + Client + Klient + + + User-agent + Užívateľ-agent + + + January + Aktuality + + + February + február + + + March + marec + + + April + apríl + + + May + máj + + + June + jún + + + July + júl + + + August + Aktuality + + + September + Septembra + + + October + október + + + November + Novembra + + + December + Decembra + + + Sunday + Nedeľa + + + Monday + Pondelok + + + Tuesday + utorok + + + Wednesday + Aktuality + + + Thursday + Štvrtok + + + Friday + Piatok + + + Saturday + Sobota + + + diff --git a/logdoctor/translations/LogDoctor_sl_SL.ts b/logdoctor/translations/LogDoctor_sl_SL.ts new file mode 100644 index 0000000..6dd0adc --- /dev/null +++ b/logdoctor/translations/LogDoctor_sl_SL.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Različica + + + Version 4 + Različica 4 + + + Version 3 + Različica 3 + + + Version 2 + Različica 2 + + + Version 1 + Različica 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Zgradi skripte + + + Cross-platform compatibility: + Navzkrižna združljivost: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistika: + + + Warnings + Opozorila + + + Speed + Hitrost + + + Counts + Število + + + Daytime + Dnevno + + + Relational + Razmerje + + + Globals + Globalni + + + Translations: + Prevodi: + + + Italian + Italijanska + + + Spanish + španščina + + + French + francoski + + + Tools: + Orodje: + + + Block note + Bločna opomba + + + Utilities: + Koristi: + + + Infos viewer + Pregledovalnik podatkov + + + Updates checker + Pregledovalnik posodobitev + + + Themes: + Teme: + + + Dark + Temno + + + Light + Svetloba + + + Improvements and fixes + Izboljšave in popravki + + + New themes: + Nove teme: + + + Ash + Pepel + + + Candy + Sladkarije + + + Forest + Gozd + + + Powder + Prašek + + + Restyled GUI + Preoblikovan grafični vmesnik + + + Restyled dialogs + Preoblikovana pogovorna okna + + + Doxygen documentation + Dokumentacija o doksigenu + + + Mini-Games: + Mini-game: + + + Criss-cross + Križ + + + Snake + Kača + + + Changed default paths + Spremenjene privzete poti + + + New game modes for Snake + Novi načini igre za Snake + + + Hunt + Lov + + + Battle + Boj + + + New translations: + Novi prevodi: + + + Japanese + Japonka + + + Portuguese + Portugalščina + + + Code improvements + Izboljšave kode + + + Performance improvements + Izboljšanje učinkovitosti + + + Added tests suite: + Dodana zbirka testov: + + + white box tests + Preskusi bele škatle + + + Customized charts themes + Prilagojene teme kart + + + Fixes + Popravki + + + Tests improvements + Izboljšave preskusov + + + Docker support + Podpora za doker + + + Upgrade to C++20 + Nadgradnja na C++20 + + + Upgrade to Qt6 + Nadgradnja na Qt6 + + + Restyled themes + Preoblikovane teme + + + Redesigned configs section + Preoblikovan oddelek konfigov + + + Stability improvements + Izboljšanje stabilnosti + + + Generating warnings dinamically + Dinamsko ustvarjanje opozoril + + + New tool: + Novo orodje: + + + Changelog + Dnevnik sprememb + + + Tweakable parameters for some of the charts: + Slabi parametri za nekatere grafikone: + + + Improved project structure + Izboljšana struktura projekta + + + Modernized Cmake usage + Posodobitev Uporaba makea + + + + Crapinfo + + Version + Različica + + + Currently installed version of the software + Trenutno nameščena različica programske opreme + + + Repository links + Povezave skladišča + + + Paths + Poti + + + The path of the executable file + Pot izvedljive datoteke + + + Executable + Izvedljiva + + + The path where the configuration file gets saved and searched in + Pot, kjer se nastavitvena datoteka shrani in poišče + + + Configuration file + Nastavitvena datoteka + + + The path where the application searches for extra resources + Pot, kjer program išče dodatne vire + + + Application data + Podatki o uporabi + + + + Crapnote + + Reduce the font size + Zmanjšaj velikost pisave + + + Font size + Velikost pisave + + + Increase the font size + Povečaj velikost pisave + + + + Crappath + + Choose + Izberite + + + Cancel + Prekliči + + + + Crapup + + Checking for updates + Preverjanje posodobitev + + + New version available + Na voljo je nova različica + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Nova različica je na voljo! +Obiščite logDoctorjevo skladišče git in sledite navodilom o tem, kako posodobiti + + + No update found + Ni najdene posodobitve + + + LogDoctor is up-to-date + LogDoctor je posodobljen + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Ti vodiš verzijo iz prihodnosti! +Vaša različica je nad trenutno gornjo različico +Preverjate izvirnega logdoktorja? +Obiščite skladišče LogDoctor in si oglejte novo različico + + + Failed to establish a connection + Ni moč vzpostaviti povezave + + + Connection error, please try again later + Napaka povezave, prosim poskusite znova kasneje + + + Connection timed out + Čas povezave je potekel + + + Version check failed + Preverjanje različice ni uspelo + + + An error occured while parsing: +version mark not found + Med razčlenjevanjem je prišlo do napake: +ni moč najti oznake različice + + + An error occured while parsing: +malformed version + Med razčlenjevanjem je prišlo do napake: +zlonamerna različica + + + An error occured while comparing: +malformed upstream version + Prišlo je do napake med primerjavo: +nepravilna različica zgoraj + + + + CrissCross + + Victory + Zmaga + + + You beated me! + Opekel si me! + + + This time you lost! + Tokrat si izgubil! + + + Draw + Prikaži + + + Nice match + Lepa tekma + + + + DialogBool + + Yes + Ja + + + No + Št + + + + DialogIda + + Ignore + Prezri + + + Discard + Zavrzi + + + Abort + Prekini + + + + DialogMsg + + Ok + Prav + + + + DialogSec + + One of the lists has an invalid item + Eden od seznamov ima neveljaven predmet + + + An error occured while reading the configuration file + Prišlo je do napake med branjem nastavitvene datoteke + + + An error occured while parsing configuration file's data + Prišlo je do napake pri razčlenjevanju podatkov nastavitvene datoteke + + + Failed to create the configuration file's directory + Ni uspelo ustvariti imenika nastavitvene datoteke + + + Failed to create the configuration file + Ni uspelo ustvariti nastavitvene datoteke + + + An error occured while writing the configuration file + Prišlo je do napake med pisanjem nastavitvene datoteke + + + An error occured while preparing the configuration file's data + Prišlo je do napake pri pripravi podatkov nastavitvene datoteke + + + The path contains a symlink + Pot vsebuje symlink + + + The file does not exist + Datoteka ne obstaja + + + Failed to create the database backups' directory + Ni moč ustvariti imenika za varnostne kopije zbirke podatkov + + + Failed to copy the database file + Kopiranje datoteke z zbirko podatkov ni uspelo + + + Failed to update the backups + Ni moč posodobiti varnostnih kopij + + + Failed to create the directory + Ni moč ustvariti mape + + + Unrecognized entry + Nepoznan vnos + + + Size of the file + Velikost datoteke + + + Warning size parameter + Parameter opozorilne velikosti + + + Failed to read gzipped file + Ni moč prebrati datoteke gzipped + + + An error occured while parsing the format string + Prišlo je do napake pri razčlenjevanju formatnega niza + + + Available memory + Razpoložljivi pomnilnik + + + Size of the logs + Velikost dnevnikov + + + An error occured while reading the gzipped file + Prišlo je do napake med branjem datoteke gzipped + + + An error occured while reading the file + Prišlo je do napake med branjem datoteke + + + Something failed while handling the file + Med ravnanjem z datoteko nekaj ni uspelo + + + An error occured while working on the database + Prišlo je do napake med delom na bazi podatkov + + + Aborting + Prekinitev + + + Invalid locale + Neveljaven kraj + + + Unexpected locale format + Nepričakovana oblika krajev + + + If you haven't manually edited the configuration file, +please report this issue + Če niste ročno uredili nastavitvene datoteke, +Prosimo, poročajte o tem vprašanju + + + The given locale is not an accepted language + Dana lokacija ni sprejet jezik + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Če želite imeti ta lokal v LogDoctorju, +sledite navodilom na strani skladišča + + + Configuration file not found + Nastavitvena datoteka ni najdena + + + Unable to retrieve the configuration file + Ni moč pridobiti nastavitvene datoteke + + + Skipping + Preskoči + + + An error occured while handling the configuration file + Prišlo je do napake pri ravnanju z nastavitveno datoteko + + + Failed to write the configuration file + Ni moč zapisati nastavitvene datoteke + + + Current configuration not saved + Trenutna nastavitev ni shranjena + + + File not readable + Datoteka ni berljiva + + + The file is not readable + Datoteka ni berljiva + + + File not writable + Datoteka ni zapisljiva + + + The file is not writable + Datoteka ni pisna + + + Directory not writable + Imenik ni zapisljiv + + + The directory is not writable + Imenik ni zapisljiv + + + Invalid path + Neveljavna pot + + + Failed applying configuration + Uporaba nastavitev ni uspela + + + Invalid configuration lines + Neveljavne nastavitvene vrstice + + + Has not been possible to apply some of the configurations + Ni bilo mogoče uporabiti nekaterih konfiguracij + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Če želite nadaljevati, bodo vse neuveljavljene nastavitve izgubljene +Nadaljuj? + + + Failed to retrieve the help file + Ni moč pridobiti datoteke s pomočjo + + + An error occured while getting the help file + Prišlo je do napake med pridobivanjem datoteke s pomočjo + + + Additional resources can be downloaded from the git repo + Dodatna sredstva se lahko prenesejo iz repo posla + + + Unable to retrieve the file + Ni moč pridobiti datoteke + + + Invalid string + Neveljaven niz + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Dani niz ni veljaven in ga ni mogoče dodati na seznam + +Prosim popravite in poskusite znova + + + QSql driver not found + Ni moč najti gonilnika QSql + + + Failed to retrieve the driver needed to handle the database + Ni uspelo pridobiti gonilnika, ki je potreben za upravljanje zbirke podatkov + + + File not found + Datoteka ni najdena + + + Failed to retrieve the database file + Ni moč pridobiti datoteke z zbirko podatkov + + + Create a new database? + Ustvariti novo zbirko podatkov? + + + The database contains an unexpected table + Podatkovna zbirka vsebuje nepričakovano tabelo + + + Unexpected table + Nepričakovana tabela + + + It seems that the database is missing a table + Zdi se, da baza podatkov manjka tabela + + + Table not found + Tabela ni najdena + + + The database contains an unexpected column + Podatkovna zbirka vsebuje nepričakovan stolpec + + + Unexpected column + Nepričakovan stolpec + + + It seems that the table is missing a column + Zdi se, da tabela manjka stolpec + + + Column not found + Stolpec ni najden + + + A column has an unexpected data-type + Stolpec ima nepričakovano podatkovno vrsto + + + Unexpected data-type + Nepričakovana vrsta podatkov + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Ta baza podatkov se bo preimenovala s sledečo '.copy' in nastala bo nova. +Nadaljuj? + + + Database created + Ustvarjena zbirka podatkov + + + Successfully created a new database + Uspešno ustvarjena nova zbirka podatkov + + + Not a file + Ni datoteka + + + The path was supposed to point to a file, but it doesn't + Pot naj bi kazala na datoteko + + + Please remove the conflict and retry + Prosim odstranite spor in poskusite znova + + + The database file is not readable + Datoteka zbirke podatkov ni berljiva + + + Please set the proper permissions and retry +If this error persists, please report this issue + Prosim nastavite ustrezna dovoljenja in poskusite znova +Če se ta napaka nadaljuje, prosimo, poročajte o tem vprašanju + + + The database file is not writable + Datoteka zbirke podatkov ni zapisljiva + + + Invalid database path + Neveljavna pot do zbirke podatkov + + + Failed creating database + Ustvarjanje zbirke podatkov ni uspelo + + + An error occured while creating the database + Prišlo je do napake pri ustvarjanju zbirke podatkov + + + Failed opening database + Odpiranje zbirke podatkov ni uspelo + + + An error occured while opening the database + Prišlo je do napake pri odpiranju zbirke podatkov + + + Failed executing on database + Izvajanje v zbirki podatkov ni uspelo + + + An error occured while executing a statement on the database + Prišlo je do napake med izvajanjem izjave v zbirki podatkov + + + Failed to backup database + Ni uspelo shraniti podatkovne zbirke + + + Please report this issue + Prosim, poročajte o tem vprašanju + + + Invalid log format string + Neveljaven niz za obliko dnevnika + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Preverite, da vaš spletni strežnik ni vrgel nobene napake +Če ga sprejmete, preverite prisotnost tipke. +Če je vse v redu, prosimo, poročajte o tem vprašanju + + + Log format error + Napaka v obliki dnevnika + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Oblika dnevnika ni bila nastavljena ali je neveljavna +V nastavitvah dodajte veljavno + + + Misconfigured log format + Zgrešena oblika dnevnika + + + No log field has been set in the current logs format, +making it useless to parse logs + V trenutni obliki dnevnikov ni bilo nastavljeno nobeno polje dnevnika, +zaradi česar je neuporabno razčleniti hlode + + + Please set up a format which contains at least one field + Nastavite obliko, ki vsebuje vsaj eno polje + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Med enim ali več polji manjka ločevalnik, +otežujejo vzpostavitev mrežnih meja, +in po možnosti shranjeval napačne podatke + + + Please set up a format which contains separators between fields + Prosim nastavite obliko, ki vsebuje ločevalnike med polji + + + Missing field in log format + Manjkajoče polje v obliki dnevnika + + + An important field is missing from the provided format: + V predloženi obliki manjka pomembno polje: + + + The quality of the statistics may be seriously compromized + Kakovost statistike je lahko resno kompromitirana + + + Proceed anyway? + Naj nadaljujem? + + + 'Carriage Return' in log format + ‚Vrnitev prevoza‘ v dnevni obliki + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Predložena oblika vsebuje „Carriage Return“. +To lahko povzroči izgubo podatkov ali sesutje, če se ne uporabi previdno + + + An error occured while parsing logs + Prišlo je do napake pri razčlenjevanju dnevnikov + + + Failed defining type + Vrsta definicije ni uspela + + + Failed to determine the log type + Ni moč določiti vrste dnevnika + + + File already used + Datoteka je že uporabljena + + + The file has probably been used already + Datoteka je bila verjetno že uporabljena + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Prezrete opozorilo in ga vseeno uporabite, Zavrzite ga in nadaljujte, ali prekinete celoten proces? + + + Duplicate file + Podvoji datoteko + + + The file appears twice in the list of selections + Datoteka se pojavi dvakrat na seznamu izbir + + + Failed updating hashes + Posodabljanje hashes ni uspelo + + + An error occured while inserting the parsed files hashes into the database + Prišlo je do napake med vstavljanjem razčlenjenih datotek hashes v bazo podatkov + + + File exceeds warning size + Datoteka presega velikost opozorila + + + The file's size exceeds the warning size + Velikost datoteke presega velikost opozorila + + + Not enough memory + Premalo spomina + + + The total size of the selected files exceeds the available memory + Skupna velikost izbranih datotek presega razpoložljiv pomnilnik + + + Please free some resources, parse the files in different steps or split them into smaller units + Prosimo brezplačno nekaj virov, razčlenite datoteke v različnih korakih ali jih razdelite na manjše enote + + + Failed reading + Branje ni uspelo + + + File is empty + Datoteka je prazna + + + The file is blank + Datoteka je prazna + + + Failed to retrieve the selected file + Ni moč pridobiti izbrane datoteke + + + Discard it and continue, or Abort all and exit? + Zavrzite in nadaljujte, ali prekinite vse in izstopite? + + + No file to parse + Ni datoteke za razčlenjevanje + + + The list of files to parse is empty + Seznam datotek za razčlenjevanje je prazen + + + Directory not found + Imenik ni bil najden + + + The directory does not exists + Imenik ne obstaja + + + Directory not readable + Imenik ni berljiv + + + The directory is not readable + Imenik ni berljiv + + + Please set the proper permissions before to start + Prosimo, nastavite ustrezna dovoljenja pred začetkom + + + Failed creating directory + Ustvarjanje mape je spodletelo + + + The path does not exists + Pot ne obstaja + + + Data conversion failed + Pretvorba podatkov ni uspela + + + Failed to convert from '%1' to '%2' + Ni moč pretvoriti iz »%1« v »%2« + + + Failed to create statistics + Ni uspelo ustvariti statistike + + + An error occured while processing + Prišlo je do napake med obdelavo + + + Cannot create statistics + Ni moč ustvariti statistike + + + No data has been found that matches with the currently set parameters + Ni podatkov, ki bi se ujemali s trenutno določenimi parametri + + + Not a folder + Ni mapa + + + The path was supposed to point to a folder, but it doesn't + Pot naj bi kazala na mapo, vendar ne + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Vnos bo preimenovan s sledečo '.copy' in ustvarjen bo nov. +Nadaljuj? + + + An error occured + Prišlo je do napake + + + Failed renaming + Preimenovanje ni uspelo + + + An error occured while renaming + Prišlo je do napake med preimenovanjem + + + + GameDialog + + Ok + Prav + + + + MainWindow + + Parse logs from the Apache2 web server + Razčleni dnevnike spletnega strežnika Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Razčleni dnevnike s spletnega strežnika Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Razčleni dnevnike spletnega strežnika Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Izberite/izberite vse datoteke + + + All + Vse + + + Inspect a log file + Preglejte dnevniško datoteko + + + Name + Ime + + + Size + Velikost + + + Refresh the list + Osveži seznam + + + Total size of the parsed data + Skupna velikost razčlenjenih podatkov + + + Total number of parsed lines + Skupno število razčlenjenih linij + + + Start parsing the selected files + Začni razčlenjevati izbrane datoteke + + + START + ZAČETEK + + + Time elapsed since the start + Čas je potekel od začetka + + + Average speed, in parsed data size per second + Povprečna hitrost v razčlenjeni velikosti podatkov na sekundo + + + Web Server + Spletni strežnik + + + Select a Web Server + Izberite spletni strežnik + + + Year + Leto + + + Month + Mesec + + + Day + Dan + + + Hour + Ura + + + Draw the chart + Nariši karto + + + Log line marked as Warning + Dnevna vrstica označena kot opozorilo + + + Date when the request arrived (YYYY-MM-DD) + Datum prejema zahtevka (LLLL-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Čas, ko je prispela zahteva (hh:mm:ss) + + + Protocol of the request + Protokol k zahtevi + + + Method of the request + Način zaprosila + + + URI of the requested page + URI zahtevane strani + + + Query carried along with the URI + Poizvedba je bila prenesena skupaj z URI + + + Response code from the server + Odzivna koda s strežnika + + + User-agent of the client which made the request + Uporabnik-agent stranke, ki je podala zahtevo + + + IP address of the Client which made the request + IP naslov naročnika, ki je podal zahtevo + + + Cookie used for the request + Piškotek, uporabljen za zahtevo + + + The URL which redirected the Client to the requested page + URL, ki je preusmeril odjemalca na zahtevano stran + + + Size ib Bytes of the request, usually includes header and data + Velikost ib Bytes zahteve, običajno vključuje glavo in podatke + + + Size in Bytes of the served content, usually includes header and data + Velikost v Bytesu odslužene vsebine, običajno vključuje glavo in podatke + + + Time taken by the server to serve the content, in milliseconds + Čas, ki ga strežnik vzame za serviranje vsebine, v milisekundah + + + Only use lines in which the field is starting with this string + Uporabi samo vrstice, v katerih se polje začne s tem nizom + + + Protocol: + Protokol: + + + Method: + Metoda: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Uporabljajte samo vrstice, v katerih se polje ujema s to izjavo. +Uporabite "!", "=", "<" ali ">" za prijavo, kaj uporabiti + + + Response: + Odziv: + + + Query: + poizvedba: + + + URI: + URI: + + + Filters + Filtri + + + Count + Število + + + Number of occurrences + Število dogodkov + + + Item + Postavka + + + Value of the field + Vrednost polja + + + From: + Iz: + + + To: + Za: + + + Select a log field to view + Izberite polje dnevnika za ogled + + + Field: + Polje: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Pri strunah se bodo uporabljale samo vrstice, v katerih se polje začenja s to struno. +S številkami uporabite '!', '=', '<' ali '>' za prijavo, kaj naj se uporabi + + + Protocol + Protokol + + + Method + Metoda + + + URI + URI + + + User-agent + Uporabniški agent + + + Most recurrent + Najbolj ponavljajoča + + + Most trafficked + Največ prometa + + + Date ever + Datum + + + Day of the week + Dan v tednu + + + Hour of the day + Ura dneva + + + Time taken + Čas + + + Bytes sent + Poslani bajti + + + Bytes received + Prejeti bajti + + + Mean/Max performances + Povprečne/maksimalne zmogljivosti + + + Requests received + Prejete prošnje + + + Total work + Skupno delo + + + General + Splošno + + + Window + Okno + + + Dialogs + Pogovorna okna + + + Charts + Grafi + + + Appearance + Izgled + + + Speed + Hitrost + + + Relational + Razmerje + + + TextBrowser + TextBrowser + + + Databases + Zbirke podatkov + + + Security + Varnost + + + Logs + Dnevniki + + + Defaults + Privzeto + + + Control + Nadzor + + + Path + Pot + + + Format + Oblika + + + Warnlists + Seznami opozoril + + + Blacklists + Črni listi + + + Remember the window's position and size + Zapomnite si položaj in velikost okna + + + Remember position and size + Zapomnite si položaj in velikost + + + Remember window's position and size + Zapomnite si položaj in velikost okna + + + Geometry + Geometrija + + + Theme to use for the window + Tema za okno + + + Theme + Tema + + + Native + Native + + + Light + Svetloba + + + Dark + Temno + + + Auto + Samodejno + + + Icons + Ikone + + + Normal quantity of dialog messages shown + Običajna količina prikazanih sporočil + + + Normal + Običajno + + + Dialogs from the main processes + Pogovorna okna iz glavnih procesov + + + Dialogs emitted when parsing logs + Pogovorna okna, ki se oddajajo pri razčlenjevanju dnevnikov + + + Logs parser + Razčlenjevalnik dnevnikov + + + Dialogs emitted when viewing statistics + Pogovorna okna ob prikazu statistike + + + Statistics viewer + Pregledovalnik statistike + + + Define the quantity of dialog mesages shown + Določi količino prikazanih pogovornih sporočil + + + Dialogs level + Raven pogovornega okna + + + Reduced quantity of dialog messages shown + Zmanjšana količina prikazanih pogovornih sporočil + + + Essential + Bistveno + + + Augmented quantity of dialog messages shown + Povečana količina prikazanih pogovornih sporočil + + + Explanatory + Pojasnilo + + + Theme to use for the Charts + Tema za grafe + + + Preview + Ogled + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Predstavlja korak v časovni osi, v sekundah. +Vse vrednosti znotraj istega intervala se združijo in uporabi se srednja vrednost. + + + Time interval + Časovni interval + + + The format to use for the labels of the time axis. + Oblika, ki se uporablja za oznake časovne osi. + + + Time format + Oblika časa + + + The size of the pie + Velikost pite + + + Pie size + Velikost pite + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Največje število rezin, iz katerih bo sestavljena pita. +Večje rezine bodo združene v eno obsežno rezino. + + + Maximum slices + Največje število rezin + + + Font to use for the Text Browser + Pisava za brskalnik besedil + + + Font + Pisava + + + Double-spaced lines + Dvodimenzionalne črte + + + Use wide lines + Uporabi široke črte + + + Define the spacing between lines + Določitev razmika med vrsticami + + + Lines spacing + Razmik med vrsticami + + + None + Brez + + + Color scheme to use for the Text Browser + Barvna shema za brskalnik besedil + + + Color scheme + Barvna shema + + + The appearance of the Text Browser with the current settings + Prikaz brskalnika besedila s trenutnimi nastavitvami + + + Insert the base path only, file name excluded + Vstavi samo osnovno pot, izvzeto ime datoteke + + + The given path doen't exists, or doesn't point to a folder + Dana pot ne obstaja ali pa ne kaže na mapo + + + Path for the database files + Pot do datotek z zbirko podatkov + + + Paths + Poti + + + Apply the current path + Uveljavi trenutno pot + + + Select the path through a dialog window + Izberite pot skozi okno + + + Path where the logs data collection database is located + Pot, kjer se nahaja zbirka podatkov iz dnevnikov + + + Logs data + Podatki o dnevnikih + + + Path where the used files hashes database is located + Pot, kjer se nahaja baza podatkov o uporabljenih datotekah hashes + + + Used files + Uporabljene datoteke + + + Backup options for the Logs Data database + Rezervne možnosti za podatkovno zbirko dnevnikov + + + Backups + Varnostne kopije + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Pri zaprtju logDoctorja se naredi nova rezerva po uspešnem urejanju baze podatkov + + + Backup the Logs Data database and keep + Hrbtenje podatkovne zbirke dnevnikov in vodenje + + + Whether it is allowed or denied to follow symlinks occuring in a path + Ali je dovoljeno ali zavrnjeno slediti simbolnim povezavam, ki se pojavljajo na poti + + + Follow symlinks + Sledi simbolnim povezavam + + + Default WebServer + Privzeti spletni strežnik + + + Usage control + Nadzor uporabe + + + Hide already used files + Skrij že uporabljene datoteke + + + Size warnings + Opozorila glede velikosti + + + Warn me when using files with a size exceeding: + Opozorite me pri uporabi datotek velikosti, ki presega: + + + Logs folder + Mapa dnevnikov + + + Logs format string + Niz za obliko dnevnikov + + + Format string + Oblika niza + + + Insert the format string you're using + Vstavi formatni niz, ki ga uporabljate + + + Apply the current string + Uveljavi trenutni niz + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Ustvarite vrstico dnevnika vzorcev iz trenutno shranjenega niza, da preverite, ali je pravilno oblikovan. +Vsako polje, ki ga logDoctor ne obravnava, bo prikazano kot 'DISCARDED' + + + Generate sample + Ustvari vzorec + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Preverite pravilnost te vrstice. +Polja označena z 'DISCARDED' so bila pravilno razčlenjena, vendar jih LogDoctor ne upošteva + + + Open an help window + Odpri okno za pomoč + + + Help + Pomoč + + + Select a log field + Izberite polje dnevnika + + + Use warnlist for this field + Uporabi seznam opozoril za to polje + + + Add the current line to the list + Dodaj trenutno vrstico na seznam + + + Remove the selected item from the list + Odstrani izbrano postavko s seznama + + + Move the selected item down + Premakni izbrani predmet navzdol + + + Use blacklist for this field + Uporabi črni seznam za to polje + + + Add line + Dodaj vrstico + + + Remove selection + Odstrani izbiro + + + Language + Jezik + + + Utilities + Koristi + + + Tools + Orodja + + + Games + Igre + + + Perform a version-check + Opravi preverjanje različice + + + Show some info about LogDoctor + Prikaži nekaj informacij o LogDoctor + + + Open a block-note like window to write temporary text + Odpri blok- noto kot okno za pisanje začasnega besedila + + + Play CrissCross + Predvajaj KrissCross + + + Play Snake + Igraj kačo + + + Show the changelog + Prikaži dnevnik sprememb + + + warnlist + seznam opozoril + + + blacklist + črni seznam + + + copy + izvod + + + copies + izvodi + + + Check updates + Preveri posodobitve + + + Infos + Podatki + + + BlockNote + BlokNote + + + CrissCross + CrissCross + + + Snake + Kača + + + Changelog + Dnevnik sprememb + + + + RichText + + Select a file from the list + Izberite datoteko s seznama + + + to inspect its content + za pregled vsebine + + + Failed to read + Branje ni uspelo + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klasika + + + Hunt + Lov + + + Battle + Boj + + + Game Over + Igra je končana + + + Your adversary fell in the water! + Vaš nasprotnik je padel v vodo! + + + YOU WON! + Ti še! + + + You fell in the water! + Padla si v vodo! + + + YOU LOST! + Izgubil si! + + + Your adversary ate itself! + Vaš nasprotnik se je sam požrl! + + + You ate yourself! + Pojedel si se! + + + Your adversary ate you! + Tvoj nasprotnik te je požrl! + + + You ate your adversary! + Pojedel si nasprotnika! + + + You ate each other! + Pojedla sta se! + + + MATCH IS DRAW! + Match je potegnjen! + + + + TR + + Unexpected WebServer + Nepričakovan spletni strežnik + + + Logs Size Breakdown + Beleži razčlenitev velikosti + + + Ignored + Prezrto + + + Parsed + Razčlenjeno + + + Blacklisted + Črni list + + + Others + Drugo + + + from + od + + + to + do + + + Log Lines Marked as Warning + Vrstice dnevnika, označene kot opozorilo + + + Time Taken to Serve Requests + Čas je potreben, da služimo prošnjam + + + Time of Day Count + Čas štetja dni + + + Relational Count + Odnosno število + + + FALSE + FALSE + + + TRUE + PRAVILNIK + + + Date + Datum + + + Year + Leto + + + Month + Mesec + + + Day + Dan + + + Time + Čas + + + Hour + Ura + + + Minute + Minuta + + + Second + Druga + + + Warning + Opozorilo + + + Protocol + Protokol + + + Method + Metoda + + + URI + URI + + + Query + Poizvedba + + + Response code + Koda odgovora + + + Time taken + Čas + + + Bytes sent + Poslani bajti + + + Bytes received + Prejeti bajti + + + Referrer + Napotnik + + + Cookie + Piškotek + + + Client + Odjemalec + + + User-agent + Uporabniški agent + + + January + Januar + + + February + Februar + + + March + Marec + + + April + April + + + May + maj + + + June + Junij + + + July + Julij + + + August + Avgust + + + September + September + + + October + Oktober + + + November + November + + + December + december + + + Sunday + nedelja + + + Monday + Ponedeljek + + + Tuesday + torek + + + Wednesday + Sreda + + + Thursday + Četrtek + + + Friday + Petek + + + Saturday + sobota + + + diff --git a/logdoctor/translations/LogDoctor_sq_AL.ts b/logdoctor/translations/LogDoctor_sq_AL.ts new file mode 100644 index 0000000..8402eed --- /dev/null +++ b/logdoctor/translations/LogDoctor_sq_AL.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versioni + + + Version 4 + Versioni 4 + + + Version 3 + Versioni 3 + + + Version 2 + Versioni 2 + + + Version 1 + Versioni 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Gjenero script-e + + + Cross-platform compatibility: + Kompatibiliteti: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistikat: + + + Warnings + Paralajmërime + + + Speed + Shpejtësia + + + Counts + Numërimet + + + Daytime + Dita + + + Relational + Përkthimi + + + Globals + Globalë + + + Translations: + Përkthimi: + + + Italian + Italisht + + + Spanish + Spanjisht + + + French + Frengjisht + + + Tools: + Instrumentë: + + + Block note + Blloku + + + Utilities: + Integritete: + + + Infos viewer + Shfaqës i Infos + + + Updates checker + Rifresko kontrolluesin + + + Themes: + Temat: + + + Dark + E errët + + + Light + Drita + + + Improvements and fixes + Përmirësime dhe rregullime + + + New themes: + Tema të reja: + + + Ash + Ash + + + Candy + Candy + + + Forest + Pylli + + + Powder + Powder + + + Restyled GUI + GUI e rizgjedhur + + + Restyled dialogs + dialog + + + Doxygen documentation + Doxygen + + + Mini-Games: + Mini-Loja: + + + Criss-cross + Criss-cross + + + Snake + Gjarpër + + + Changed default paths + Ndryshuar + + + New game modes for Snake + Mënyra të reja loje për Gjarpërin + + + Hunt + Hant + + + Battle + Beteja + + + New translations: + Përkthime të reja: + + + Japanese + Japonisht + + + Portuguese + portugalisht + + + Code improvements + Komenti + + + Performance improvements + Përmirësime + + + Added tests suite: + Suita e shtuar e testeve: + + + white box tests + Teste kutish të bardha + + + Customized charts themes + Tema të personalizuara të diagrameve + + + Fixes + Fiksimet + + + Tests improvements + Përmirësimet e provave + + + Docker support + Suporti Docker + + + Upgrade to C++20 + Përditësimi në C++20 + + + Upgrade to Qt6 + Përditësimi në Qt6 + + + Restyled themes + Rishkruaj temat + + + Redesigned configs section + seksioni i konfigurimit të ripërcaktuar + + + Stability improvements + Përmirësimet e stabilitetit + + + Generating warnings dinamically + Duke krijuar paralajmërimet në mënyrë logjike + + + New tool: + Instrument i re: + + + Changelog + Ndrysho + + + Tweakable parameters for some of the charts: + Parametrat e dobët për disa nga diagramet: + + + Improved project structure + Përmirësizo strukturën e projektit + + + Modernized Cmake usage + Modernizuar Përdorimi + + + + Crapinfo + + Version + Versioni + + + Currently installed version of the software + Aktualisht instaluar versioni nga programi + + + Repository links + Lidhje repository + + + Paths + Pozicioni + + + The path of the executable file + nga e ekzekutueshme file + + + Executable + E ekzekutueshm + + + The path where the configuration file gets saved and searched in + Shtegu ku file i konfigurimit ruhet dhe kontrollohet + + + Configuration file + File i konfigurimit + + + The path where the application searches for extra resources + Shtegu ku programi kërkon për burime shtesë + + + Application data + Aplikativi + + + + Crapnote + + Reduce the font size + Zvogëlo madhësinë e gërmave + + + Font size + Madhësia e gërmave + + + Increase the font size + Rrit madhësinë e gërmave + + + + Crappath + + Choose + Zgjidh + + + Cancel + Anullo + + + + Crapup + + Checking for updates + Kontroll për rifreskime + + + New version available + Versioni i ri në dispozicion + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Një version i ri është në dispozicion! +Ju lutem vizitoni magazinën e git të LogDoctor dhe ndiqni udhëzimet se si të përditësohet + + + No update found + Nuk u gjet asnjë rifreskim + + + LogDoctor is up-to-date + LogDoctor është i përditësuar + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Po drejton një version nga e ardhmja! +Versioni juaj është përtej versionit aktual +A jeni duke drejtuar logDoctor origjinal? +Ju lutem vizitoni magazinën e LogDoctor dhe merrni një version të ri të saj + + + Failed to establish a connection + Vendosja e një lidhje dështoi + + + Connection error, please try again later + Gabim në lidhje me lidhjen, provo edhe njëherë më vonë + + + Connection timed out + Koha për lidhjen skadoi + + + Version check failed + Kontrolli i Versionit dështoi + + + An error occured while parsing: +version mark not found + gabim: +nuk + + + An error occured while parsing: +malformed version + gabim: +Versioni i keqformuar + + + An error occured while comparing: +malformed upstream version + gabim: +versioni + + + + CrissCross + + Victory + Fitorja + + + You beated me! + Ju beted mua! + + + This time you lost! + Këtë herë humbe! + + + Draw + Vizato + + + Nice match + Ndeshje e bukur + + + + DialogBool + + Yes + Po + + + No + Jo + + + + DialogIda + + Ignore + Shpërfill + + + Discard + Anullo + + + Abort + Anullo + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Një nga listat ka një element të pavlefshëm + + + An error occured while reading the configuration file + U ndesh një gabim gjatë leximit të file të konfigurimit + + + An error occured while parsing configuration file's data + U ndesh një gabim gjatë analizimit të të dhënave të file të konfigurimit + + + Failed to create the configuration file's directory + Krijimi i directory të file të konfigurimit dështoi + + + Failed to create the configuration file + Krijimi i file të konfigurimit dështoi + + + An error occured while writing the configuration file + U ndesh një gabim gjatë shkrimit të file të konfigurimit + + + An error occured while preparing the configuration file's data + U ndesh një gabim gjatë përgatitjes së të dhënave të file të konfigurimit + + + The path contains a symlink + Pozicioni përmban një simlink + + + The file does not exist + File nuk ekziston + + + Failed to create the database backups' directory + Krijimi i directory të bazës së të dhënave dështoi + + + Failed to copy the database file + Autentifikimi dështoi + + + Failed to update the backups + Rifreskimi i backup dështoi + + + Failed to create the directory + I pamundur krijimi i directory + + + Unrecognized entry + Hyrje e panjohur + + + Size of the file + Madhësia e file + + + Warning size parameter + Parametër i madhësisë së paralajmërimit + + + Failed to read gzipped file + Dështoi nga j + + + An error occured while parsing the format string + U ndesh një gabim gjatë analizimit të stringës së formatit + + + Available memory + Kujtesë në dispozicion + + + Size of the logs + Madhësia e libërshënuesve + + + An error occured while reading the gzipped file + gabim + + + An error occured while reading the file + Gabim gjatë leximit të file + + + Something failed while handling the file + Diçka dështoi gjatë trajtimit të file + + + An error occured while working on the database + U ndesh një gabim gjatë punës në databazë + + + Aborting + Duke mbyllur + + + Invalid locale + Vend i pavlefshëm + + + Unexpected locale format + Format i papritur lokal + + + If you haven't manually edited the configuration file, +please report this issue + Nëse nuk e keni ndryshuar manualisht file e konfigurimit, +Ju lutem raportoni këtë numër + + + The given locale is not an accepted language + Gjuha e dhënë nuk është një gjuhë e pranuar + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Nëse dëshironi ta keni këtë lokale në LogDoctor, +Ju lutem ndiqni udhëzimet në faqen e magazinës + + + Configuration file not found + File i konfigurimit nuk u gjet + + + Unable to retrieve the configuration file + I pamundur rikuperimi i file të konfigurimit + + + Skipping + j + + + An error occured while handling the configuration file + U ndesh një gabim gjatë trajtimit të file të konfigurimit + + + Failed to write the configuration file + Shkrimi i file të konfigurimit dështoi + + + Current configuration not saved + Konfigurimi aktual nuk ruhet + + + File not readable + File nuk është i lexueshëm + + + The file is not readable + file nuk është + + + File not writable + File nuk është i ndryshueshëm + + + The file is not writable + File nuk është i shkruajtshëm + + + Directory not writable + Directory nuk është e shkruajtshme + + + The directory is not writable + Directory nuk është e shkruajtshme + + + Invalid path + Pozicioni i pavlefshëm + + + Failed applying configuration + Konfigurimi i Mail + + + Invalid configuration lines + Rreshta të pavlefshme konfigurimi + + + Has not been possible to apply some of the configurations + Nuk ka qenë e mundur zbatimi i disa prej konfigurimeve + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Nëse vendosni të vazhdoni, të gjithë konfigurimin e pazbatuar do të humbasin +Vazhdo? + + + Failed to retrieve the help file + Dështoi nga ndihmë file + + + An error occured while getting the help file + gabim j + + + Additional resources can be downloaded from the git repo + Mund të shkarkohen burime shtesë nga repo + + + Unable to retrieve the file + I pamundur rikuperimi i file + + + Invalid string + Argument i pavlefshëm + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Stringa e dhënë është e pavlefshme dhe nuk mund të shtohet në listë + +Ju lutem korrigjojeni dhe riprovoni + + + QSql driver not found + Shofer QSql nuk u gjet + + + Failed to retrieve the driver needed to handle the database + Gabim gjatë marrjes së makinës së nevojshme për të trajtuar databazën + + + File not found + URl nuk u gjet + + + Failed to retrieve the database file + Dështoi nga databazë + + + Create a new database? + Krijon një bazë të re të dhënash? + + + The database contains an unexpected table + Databaza përmban një tabelë të papritur + + + Unexpected table + Tabela e papritur + + + It seems that the database is missing a table + Duket se databaza mungon në tavolinë + + + Table not found + Tabela nuk u gjet + + + The database contains an unexpected column + Databaza përmban një kollonë të papritur + + + Unexpected column + Kollona e papritur + + + It seems that the table is missing a column + Duket se tavolina mungon në një kollonë + + + Column not found + Kollona nuk u gjet + + + A column has an unexpected data-type + Një kollonë ka një lloj të papritur të dhënash + + + Unexpected data-type + Lloj i papritur të dhënash + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Kjo bazë e dhënash do të riemërtohet me një kopje '.kopje' dhe do të krijohet një e re. +Vazhdo? + + + Database created + Krijohet databaza + + + Successfully created a new database + Krijoi me sukses një bazë të re të dhënash + + + Not a file + Nuk është një file + + + The path was supposed to point to a file, but it doesn't + Rruga duhej të tregonte një file, por nuk tregon + + + Please remove the conflict and retry + Ju lutem hiqni konfliktin dhe riprovoni + + + The database file is not readable + File i databazës nuk është i lexueshëm + + + Please set the proper permissions and retry +If this error persists, please report this issue + Ju lutem vendosni të drejtat dhe riprovo +Nëse ky gabim vazhdon, ju lutem raportoni këtë numër + + + The database file is not writable + Databaza nuk është e shkruajtshme + + + Invalid database path + Pozicioni i të dhënave të pavlefshme + + + Failed creating database + Krijimi i databazës dështoi + + + An error occured while creating the database + U ndesh një gabim gjatë krijimit të të dhënave + + + Failed opening database + Hapja e të dhënave dështoi + + + An error occured while opening the database + U ndesh një gabim gjatë hapjes së të dhënave + + + Failed executing on database + Ekzekutimi i të dhënave dështoi + + + An error occured while executing a statement on the database + U ndesh një gabim gjatë ekzekutimit të një deklarate në databazë + + + Failed to backup database + E pamundur ruajtja e file të databazës + + + Please report this issue + Ju lutem raportoni këtë numër + + + Invalid log format string + Stringë e pavlefshme log + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Ju lutem kontrolloni që asnjë gabim nuk është hedhur nga WebServeri juaj +Nëse pranohet, ju lutem kontrolloni praninë e një tipoje këtu +Nëse gjithçka është në rregull, ju lutem raportoni këtë çështje + + + Log format error + Gabim në formatin log + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Formati i log nuk është caktuar, ose është i pavlefshëm +Ju lutem shtoni një tek konfigurimin + + + Misconfigured log format + Format log i konfiguruar keq + + + No log field has been set in the current logs format, +making it useless to parse logs + Jo në +për + + + Please set up a format which contains at least one field + a përmban të paktën një fushë + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Një ndarës mungon midis një apo më shumë fushave, +e cila i ulë (të këqinjtë), i lartëson (të mirët), +dhe duke ruajtur të dhëna të gabuara + + + Please set up a format which contains separators between fields + Ju lutem zgjidhni një format që përmban ndarës midis fushave + + + Missing field in log format + Mungon fusha në formatin log + + + An important field is missing from the provided format: + Një fushë e rëndësishme mungon nga formati i dhënë: + + + The quality of the statistics may be seriously compromized + Cilësia e statistikave mund të bashkëpropozohet seriozisht + + + Proceed anyway? + Vazhdo gjithsesi? + + + 'Carriage Return' in log format + 'Kriage Kthimi' në formatin log + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Formati i dhënë përmban 'Rikthimin e Makinave'. +Kjo mund të çojë në humbje ose përplasje të dhënash nëse nuk përdoret me kujdes + + + An error occured while parsing logs + U ndesh një gabim gjatë printimit + + + Failed defining type + Përcaktimi i llojit dështoi + + + Failed to determine the log type + Dështoi lloji + + + File already used + File është përdorur + + + The file has probably been used already + File ka mundësi të jetë përdorur rregullisht + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Shpërfille paralajmërimin dhe përdore sidoqoftë, anulloje dhe vazhdo, apo anulloje gjithë procesin? + + + Duplicate file + Dyfisho + + + The file appears twice in the list of selections + file në lista nga + + + Failed updating hashes + Autentifikimi dështoi + + + An error occured while inserting the parsed files hashes into the database + U ndesh një gabim gjatë futjes së hads së skedarëve të analizuar në databazë + + + File exceeds warning size + File tejkalon madhësinë e paralajmërimit + + + The file's size exceeds the warning size + Madhësia e file tejkalon madhësinë e paralajmërimit + + + Not enough memory + Kujtesë e pamjaftueshme + + + The total size of the selected files exceeds the available memory + Madhësia e përgjithshme e file të zgjedhur tejkaloi kujtesën në dispozicion + + + Please free some resources, parse the files in different steps or split them into smaller units + Ju lutem lironi disa burime, duke i analizuar skedarët në shkallë të ndryshme ose duke i ndarë në njësi më të vogla + + + Failed reading + Leximi dështoi + + + File is empty + File është bosh + + + The file is blank + është + + + Failed to retrieve the selected file + Dështoi nga file i zgjedhur + + + Discard it and continue, or Abort all and exit? + Hiqe atë dhe vazhdo, ose anullo të gjitha dhe dil? + + + No file to parse + Jo nga + + + The list of files to parse is empty + Lista e files që duhet analizuar është bosh + + + Directory not found + Directory nuk u gjet + + + The directory does not exists + Directory nuk ekziston + + + Directory not readable + Directory nuk është e lexueshme + + + The directory is not readable + Directory nuk është e lexueshme + + + Please set the proper permissions before to start + Të lutem cakto të drejtat e duhura para se të nisë + + + Failed creating directory + Krijimi i directory dështoi + + + The path does not exists + Pozicioni nuk + + + Data conversion failed + Kthimi i të dhënave dështoi + + + Failed to convert from '%1' to '%2' + konvertimi nga '%1' në '%2' + + + Failed to create statistics + Krijimi i statistikave dështoi + + + An error occured while processing + U ndesh një gabim gjatë printimit + + + Cannot create statistics + I pamundur krijimi i statistikave + + + No data has been found that matches with the currently set parameters + Nuk u gjet asnjë e dhënë që përputhet me parametrat e caktuar aktualisht + + + Not a folder + Kartela nuk ekziston + + + The path was supposed to point to a folder, but it doesn't + Rruga duhej të tregonte një kartelë, por nuk tregon + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Hyrja do të riemërohet me një pasim '.kopje' dhe do të krijohet një i ri. +Vazhdo? + + + An error occured + U ndesh një gabim + + + Failed renaming + Riemërtimi dështoi + + + An error occured while renaming + U ndesh një gabim gjatë ndryshimit të emrit + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parse + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Lista e shënimeve nga serveri web Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Zgjidh + + + All + Gjithçka + + + Inspect a log file + Inspekto + + + Name + Emri + + + Size + Madhësia + + + Refresh the list + Rifreskon listën + + + Total size of the parsed data + madhësia nga + + + Total number of parsed lines + Numri nga rreshta + + + Start parsing the selected files + Fillo shfaqjen e file të zgjedhur + + + START + STARTA + + + Time elapsed since the start + Koha kaloi që nga fillimi + + + Average speed, in parsed data size per second + Mesatarja e shpejtësisë, duke analizuar madhësinë e të dhënave në sekondë + + + Web Server + Serveri web + + + Select a Web Server + Zgjidh një server + + + Year + Viti + + + Month + Muaji + + + Day + Dita + + + Hour + Ora + + + Draw the chart + Vizato tabelën + + + Log line marked as Warning + Linja e log e shënuar si paralajmërim + + + Date when the request arrived (YYYY-MM-DD) + Data kur erdhi kërkesa + + + Time when the request arrived (hh:mm:ss) + Koha kur erdhi kërkesa (hh:mm:s) + + + Protocol of the request + Protokolli i kërkesës + + + Method of the request + Metoda e kërkesës + + + URI of the requested page + URI e faqes së kërkuar + + + Query carried along with the URI + Kërkesë e kryer bashkë me URI + + + Response code from the server + Përgjigje kodi nga serveri + + + User-agent of the client which made the request + Përdoruesi nga email + + + IP address of the Client which made the request + Adresa IP e klientit që bëri kërkesën + + + Cookie used for the request + Cookie përdorur për kërkesën + + + The URL which redirected the Client to the requested page + URL që ridrejtoi klientin në faqen e kërkuar + + + Size ib Bytes of the request, usually includes header and data + Madhësia Ib Bytes e kërkesës, zakonisht përfshin header dhe të dhëna + + + Size in Bytes of the served content, usually includes header and data + Madhësia në Bytes e përmbajtjes së shërbyer, zakonisht përfshin header dhe të dhëna + + + Time taken by the server to serve the content, in milliseconds + Koha e kryer nga serveri për të shërbyer përmbajtjen, në milisekonda + + + Only use lines in which the field is starting with this string + Përdor vetëm rreshtat në të cilat fusha po fillon me këtë stringë + + + Protocol: + Protokolli: + + + Method: + Metoda: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Përdor vetëm vija në të cilat fusha përputhet me këtë deklaratë. +Përdor '!', '=', '<' ose '>' për të deklaruar se çfarë duhet përdorur + + + Response: + Përgjigjja: + + + Query: + Kërkesë: + + + URI: + URI: + + + Filters + Filtra + + + Count + Numërimi + + + Number of occurrences + Numri i ndodhive + + + Item + Elementi + + + Value of the field + Vlera e fushës + + + From: + Nga: + + + To: + Për: + + + Select a log field to view + Zgjidh a + + + Field: + Fusha: + + + Filter: + Filtri: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Me tela, vetëm vijat në të cilat fusha është duke filluar me këtë varg do të përdoren. +Me numra, përdor '!', '=', '<' ose '>' për të deklaruar se çfarë duhet përdorur + + + Protocol + Protokolli + + + Method + Metoda + + + URI + URI + + + User-agent + Përdoruesi + + + Most recurrent + Ripërsëritëse + + + Most trafficked + Shumica e trafikuar + + + Date ever + Data + + + Day of the week + Dita e javës + + + Hour of the day + Momenti i ditës + + + Time taken + Koha u krye + + + Bytes sent + Bytes u dërgua + + + Bytes received + Bytes marrë + + + Mean/Max performances + Të përbashkët + + + Requests received + Kërkesë + + + Total work + Punë e plotë + + + General + Të përgjithshme + + + Window + Dritarja + + + Dialogs + Dialogu + + + Charts + Tabela + + + Appearance + Paraqitja + + + Speed + Shpejtësia + + + Relational + Përkthimi + + + TextBrowser + Teksti + + + Databases + Databaza + + + Security + Siguria + + + Logs + Logs + + + Defaults + E prezgjedhur + + + Control + Kontrollo + + + Path + Pozicioni + + + Format + Formati + + + Warnlists + Kujdes + + + Blacklists + Të zeza + + + Remember the window's position and size + Kujto pozicionin dhe madhësinë e dritares + + + Remember position and size + Kujto pozicionin dhe madhësinë + + + Remember window's position and size + Kujto pozicionin dhe madhësinë e dritares + + + Geometry + Gjeometria + + + Theme to use for the window + Tema për tu përdorur për dritaren + + + Theme + Tema + + + Native + Indiane + + + Light + Drita + + + Dark + E errët + + + Auto + Auto + + + Icons + Ikona + + + Normal quantity of dialog messages shown + Shfaqet një sasi normale e mesazheve dialog + + + Normal + Normal + + + Dialogs from the main processes + Dialogu nga + + + Dialogs emitted when parsing logs + Dialogu + + + Logs parser + Shfaqës i Logs + + + Dialogs emitted when viewing statistics + Dialogs emitted when viewing statistics + + + Statistics viewer + Shfaqës i statistikave + + + Define the quantity of dialog mesages shown + Përcakto sasinë e mesazheve të dialogut të shfaqur + + + Dialogs level + Niveli i Dialogut + + + Reduced quantity of dialog messages shown + Zvogëlon sasinë e mesazheve në dialog + + + Essential + Vertikalisht + + + Augmented quantity of dialog messages shown + Shfaqet sasia e shtuar e mesazheve dialog + + + Explanatory + Shpjegues + + + Theme to use for the Charts + Tema për të përdorur tabelat + + + Preview + Pamja e parë + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Përfaqëson një hap në aksin e kohës, në sekonda. +Të gjitha vlerat që bien brenda të njëjtit interval do të bashkohen dhe vlera do të përdoret. + + + Time interval + Koha + + + The format to use for the labels of the time axis. + Formati për nga. + + + Time format + Formati i orës + + + The size of the pie + Madhësia e byrekut + + + Pie size + Madhësia e pie + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Numri maksimal i fetave nga të cilat do të përbëhet torta. +Pllakat e tejmbushura do të grupohen në një pjesë tërësore. + + + Maximum slices + Pjesë maksimume + + + Font to use for the Text Browser + Lloji i gërmave që duhen përdorur për shfletuesin e tekstit + + + Font + Gërmat + + + Double-spaced lines + rreshta shumëfishë + + + Use wide lines + Përdor rreshta të gjerë + + + Define the spacing between lines + Përcakto hapësirën midis rreshtave + + + Lines spacing + Rreshta + + + None + Asnjë + + + Color scheme to use for the Text Browser + Skema e ngjyrave për tu përdorur për shfletuesin e tekstit + + + Color scheme + Skema e ngjyrave + + + The appearance of the Text Browser with the current settings + Shfaqja e shfletuesit të tekstit me rregullimet aktuale + + + Insert the base path only, file name excluded + Fut shtegu emri + + + The given path doen't exists, or doesn't point to a folder + Shtegu i dhënë nuk ekziston, ose nuk tregon një kartelë + + + Path for the database files + Pozicioni për databazë + + + Paths + Pozicioni + + + Apply the current path + Apliko shtegu + + + Select the path through a dialog window + Zgjidh shtegu a dialog dritare + + + Path where the logs data collection database is located + Pozicioni ku është vendosur databaza e mbledhjes së të dhënave + + + Logs data + Log + + + Path where the used files hashes database is located + Pozicioni ku ndodhet databaza e përdorur e skedarëve hashes + + + Used files + File e përdorur + + + Backup options for the Logs Data database + Opsione backup për databazën e të dhënave Logs + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Një backup e re bëhet kur mbyllet LogDoctor pasi ka ndryshuar me kujdes databazën + + + Backup the Logs Data database and keep + Ruaj të dhënat e të dhënave logs dhe mbaj + + + Whether it is allowed or denied to follow symlinks occuring in a path + Nëse lejohet apo refuzohet ndjekja e symlins që bëhet në një pozicion + + + Follow symlinks + Vazhdo + + + Default WebServer + E prezgjedhur + + + Usage control + kontrolli + + + Hide already used files + Fshih + + + Size warnings + Kujdes + + + Warn me when using files with a size exceeding: + Më lajmëro kur të përdorësh files me një madhësi të tepruar: + + + Logs folder + Kartela e kartelës + + + Logs format string + Stringa e formatit logs + + + Format string + Formati + + + Insert the format string you're using + Fut + + + Apply the current string + Apliko + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Gjeneron një rresht tregues log nga stringa e ruajtur aktualisht, për të kontrolluar nëse është formatuar si duhet. +Çdo fushë e konsideruar nga LogDoctor do të paraqitet si 'DISCARDED' + + + Generate sample + Krijo + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Ju lutem kontrolloni saktësinë e kësaj vije. +Fushat e shënuara si 'DISCARDED' janë analizuar si duhet, por nuk konsiderohen nga LogDoctor + + + Open an help window + Hap një dritare ndihme + + + Help + Ndihmë + + + Select a log field + Zgjidh një fushë log + + + Use warnlist for this field + Përdor listën e paralajmërimeve për këtë fushë + + + Add the current line to the list + Shto nga lista + + + Remove the selected item from the list + Heq elementin e zgjedhur nga lista + + + Move the selected item down + Lëviz elementin e zgjedhur poshtë + + + Use blacklist for this field + Përdor listën e zezë për këtë fushë + + + Add line + Shto + + + Remove selection + Hiq + + + Language + Gjuha + + + Utilities + Integritete + + + Tools + Instrumentë + + + Games + Lojrat + + + Perform a version-check + a versioni + + + Show some info about LogDoctor + Shfaq informacione në lidhje me LogDoctor + + + Open a block-note like window to write temporary text + Hap një dritare blloku për të shkruar tekst të përkohshëm + + + Play CrissCross + Luaj KrisCross + + + Play Snake + Luaj Gjarpërin + + + Show the changelog + Shfaq + + + warnlist + Lista e paralajmërimeve + + + blacklist + Listë e zezë + + + copy + Kopjo + + + copies + kopjo + + + Check updates + Gjëndja zgjedhur + + + Infos + Informacione + + + BlockNote + Blloqe + + + CrissCross + KrisCros + + + Snake + Gjarpër + + + Changelog + Ndrysho + + + + RichText + + Select a file from the list + Zgjidh një file nga lista + + + to inspect its content + për të kontrolluar përmbajtjen e saj + + + Failed to read + I pamundur leximi + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klasike + + + Hunt + Hant + + + Battle + Beteja + + + Game Over + Loja Mbaroi + + + Your adversary fell in the water! + Kundërshtari juaj ra në ujë! + + + YOU WON! + Ti! + + + You fell in the water! + Ti re në ujë! + + + YOU LOST! + LLOJ! + + + Your adversary ate itself! + Kundërshtari juaj hëngri vetë! + + + You ate yourself! + Ti e hëngre veten! + + + Your adversary ate you! + Kundërshtari yt të hëngri! + + + You ate your adversary! + Ti e hëngre kundërshtarin tënd! + + + You ate each other! + Keni ngrënë njëri-tjetrin! + + + MATCH IS DRAW! + MATCH është AFR! + + + + TR + + Unexpected WebServer + Serveri web i papritur + + + Logs Size Breakdown + Madhësia e logs po prishet + + + Ignored + Shpërf_ill + + + Parsed + Parsed + + + Blacklisted + E zezë + + + Others + Të tjerë + + + from + nga + + + to + për + + + Log Lines Marked as Warning + Log si paralajmërim + + + Time Taken to Serve Requests + Koha e marrë për të shërbyer + + + Time of Day Count + Numërimi i kohës së ditës + + + Relational Count + Numërim ngushëllimi + + + FALSE + FALSE + + + TRUE + VËRTETË + + + Date + Data + + + Year + Viti + + + Month + Muaji + + + Day + Dita + + + Time + Ora + + + Hour + Ora + + + Minute + minuta + + + Second + E dyta + + + Warning + Kujdes + + + Protocol + Protokolli + + + Method + Metoda + + + URI + URI + + + Query + Kërkesë + + + Response code + Kodi i reagimit + + + Time taken + Koha u krye + + + Bytes sent + Bytes u dërgua + + + Bytes received + Bytes marrë + + + Referrer + Përfolës + + + Cookie + cookie + + + Client + Klienti + + + User-agent + Përdoruesi + + + January + Janar + + + February + Shkurt + + + March + Mars + + + April + Prill + + + May + Maj + + + June + Qershor + + + July + Korrik + + + August + Gusht + + + September + Shtator + + + October + Tetor + + + November + Nëntor + + + December + Dhjetor + + + Sunday + E djelë + + + Monday + E hënë + + + Tuesday + E martë + + + Wednesday + E mërkurë + + + Thursday + E enjte + + + Friday + E premte + + + Saturday + E shtunë + + + diff --git a/logdoctor/translations/LogDoctor_sv_SV.ts b/logdoctor/translations/LogDoctor_sv_SV.ts new file mode 100644 index 0000000..2462243 --- /dev/null +++ b/logdoctor/translations/LogDoctor_sv_SV.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versioner + + + Version 4 + Version 4 + + + Version 3 + Version 3 + + + Version 2 + Version 2 + + + Version 1 + Version 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Bygg skript + + + Cross-platform compatibility: + Korsplattformskompatibilitet: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Statistik: + + + Warnings + Varningar + + + Speed + Hastighet + + + Counts + Räknar + + + Daytime + Dagtid + + + Relational + Förhållande + + + Globals + Globala + + + Translations: + Översättningar: + + + Italian + Italienska Italien + + + Spanish + Spanska spanska + + + French + Franska franska + + + Tools: + Verktyg: + + + Block note + Block Note + + + Utilities: + Utilities: + + + Infos viewer + Infos Viewer + + + Updates checker + Uppdatera checker + + + Themes: + Teman: + + + Dark + Mörk + + + Light + Ljus ljus + + + Improvements and fixes + Förbättringar och fixar + + + New themes: + Nya teman: + + + Ash + Ash + + + Candy + Candy + + + Forest + Skog + + + Powder + Pulver + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Restyled dialog + + + Doxygen documentation + Doxygen dokumentation + + + Mini-Games: + Mini-spel: + + + Criss-cross + Criss-cross + + + Snake + Snake + + + Changed default paths + Ändrade standardvägar + + + New game modes for Snake + Nya spellägen för Snake + + + Hunt + Jakt + + + Battle + Slaget + + + New translations: + Nya översättningar: + + + Japanese + Japansk japansk + + + Portuguese + Portugisiska + + + Code improvements + Kodförbättringar + + + Performance improvements + Prestandaförbättringar + + + Added tests suite: + Tillagd testsvit: + + + white box tests + Vita lådprov + + + Customized charts themes + Anpassade diagram teman + + + Fixes + Fixes + + + Tests improvements + Tester förbättringar + + + Docker support + Docker stöd + + + Upgrade to C++20 + Uppgradera till C++20 + + + Upgrade to Qt6 + Uppgradera till Qt6 + + + Restyled themes + Restyled teman + + + Redesigned configs section + Redesigned configs sektion + + + Stability improvements + Stabilitetsförbättringar + + + Generating warnings dinamically + Generera varningar dinmiskt + + + New tool: + Nytt verktyg: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Tweakable parametrar för några av diagrammen: + + + Improved project structure + Förbättrad projektstruktur + + + Modernized Cmake usage + Moderniserad Cmake användning + + + + Crapinfo + + Version + Version + + + Currently installed version of the software + För närvarande installerad version av programvaran + + + Repository links + Repository länkar + + + Paths + Vägarna + + + The path of the executable file + Vägen till den körbara filen + + + Executable + Exekutabel + + + The path where the configuration file gets saved and searched in + Vägen där konfigurationsfilen sparas och söks in + + + Configuration file + Konfigurationsfil + + + The path where the application searches for extra resources + Vägen där programmet söker efter extra resurser + + + Application data + Applikationsdata + + + + Crapnote + + Reduce the font size + Minska teckenstorleken + + + Font size + Font size + + + Increase the font size + Öka teckenstorleken + + + + Crappath + + Choose + Välj Välj Välj Välj + + + Cancel + Avbokning + + + + Crapup + + Checking for updates + Kontrollera för uppdateringar + + + New version available + Ny version tillgänglig + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + En ny version är tillgänglig! +Vänligen besök LogDoctor's git repository och följ instruktionerna om hur du uppdaterar + + + No update found + Ingen uppdatering hittades + + + LogDoctor is up-to-date + LogDoctor är uppdaterad + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Du kör en version från framtiden! +Din version är bortom den aktuella uppströmsversionen +Kör du den ursprungliga LogDoctor? +Vänligen besök LogDoctors förvar och få en ny version av den + + + Failed to establish a connection + Underlåtenhet att upprätta en anslutning + + + Connection error, please try again later + Anslutningsfel, försök igen senare + + + Connection timed out + Anslutning timed out + + + Version check failed + Version check misslyckades + + + An error occured while parsing: +version mark not found + Ett fel inträffade medan parsing: +versionsmärke som inte hittats + + + An error occured while parsing: +malformed version + Ett fel inträffade medan parsing: +Malformed version + + + An error occured while comparing: +malformed upstream version + Ett fel inträffade när du jämför: +Malformed Upstream version + + + + CrissCross + + Victory + Segern + + + You beated me! + Du slog mig! + + + This time you lost! + Den här gången förlorade du! + + + Draw + Draw + + + Nice match + Trevlig match + + + + DialogBool + + Yes + Ja ja ja ja ja + + + No + Inget nej + + + + DialogIda + + Ignore + Ignorera + + + Discard + Discard + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + En av listorna har ett ogiltigt objekt + + + An error occured while reading the configuration file + Ett fel inträffade när du läser konfigurationsfilen + + + An error occured while parsing configuration file's data + Ett fel inträffade medan parsing konfigurationsfilens data + + + Failed to create the configuration file's directory + Misslyckades med att skapa konfigurationsfilens katalog + + + Failed to create the configuration file + Misslyckades med att skapa konfigurationsfilen + + + An error occured while writing the configuration file + Ett fel inträffade när du skriver konfigurationsfilen + + + An error occured while preparing the configuration file's data + Ett fel inträffade när du förbereder konfigurationsfilens data + + + The path contains a symlink + Vägen innehåller en symlink + + + The file does not exist + Filen existerar inte + + + Failed to create the database backups' directory + Misslyckades med att skapa databasbackups katalog + + + Failed to copy the database file + Underlåten att kopiera databasfilen + + + Failed to update the backups + Misslyckades med att uppdatera säkerhetskopiorna + + + Failed to create the directory + Misslyckades med att skapa katalogen + + + Unrecognized entry + Unrecognized inträde + + + Size of the file + Storlek på filen + + + Warning size parameter + Varning storlek parameter + + + Failed to read gzipped file + Misslyckades med att läsa gzipped fil + + + An error occured while parsing the format string + Ett fel inträffade när du parsar formatsträngen + + + Available memory + Tillgängligt minne + + + Size of the logs + Storlek på stockarna + + + An error occured while reading the gzipped file + Ett fel inträffade när du läste den gzippade filen + + + An error occured while reading the file + Ett fel inträffade när du läste filen + + + Something failed while handling the file + Något misslyckades när du hanterar filen + + + An error occured while working on the database + Ett fel inträffade när du arbetar i databasen + + + Aborting + Aborting + + + Invalid locale + Ogiltig lokal + + + Unexpected locale format + Oväntat lokalt format + + + If you haven't manually edited the configuration file, +please report this issue + Om du inte manuellt har redigerat konfigurationsfilen, +Vänligen rapportera denna fråga + + + The given locale is not an accepted language + Den givna orten är inte ett accepterat språk + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Om du vill ha denna lokal i LogDoctor, +Vänligen följ instruktionerna på förvaringssidan + + + Configuration file not found + Konfigurationsfil som inte hittats + + + Unable to retrieve the configuration file + Kan inte hämta konfigurationsfilen + + + Skipping + Skipping + + + An error occured while handling the configuration file + Ett fel inträffade när du hanterar konfigurationsfilen + + + Failed to write the configuration file + Misslyckades med att skriva konfigurationsfilen + + + Current configuration not saved + Nuvarande konfiguration inte sparad + + + File not readable + File inte läsbar + + + The file is not readable + Filen är inte läsbar + + + File not writable + File inte skrivbar + + + The file is not writable + Filen är inte skrivbar + + + Directory not writable + Directory inte skrivbar + + + The directory is not writable + Katalogen är inte skrivbar + + + Invalid path + Invalid väg + + + Failed applying configuration + Misslyckad tillämpning av konfiguration + + + Invalid configuration lines + Ogiltiga konfigurationslinjer + + + Has not been possible to apply some of the configurations + Har inte varit möjligt att tillämpa några av konfigurationerna + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Om du väljer att fortsätta kommer alla olämpliga konfigurationer att gå förlorade +Fortsätt? + + + Failed to retrieve the help file + Misslyckades med att hämta hjälpfilen + + + An error occured while getting the help file + Ett fel inträffade när du får hjälpfilen + + + Additional resources can be downloaded from the git repo + Ytterligare resurser kan laddas ner från git repo + + + Unable to retrieve the file + Kan inte hämta filen + + + Invalid string + Invalid sträng + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Den givna strängen är ogiltig och kan inte läggas till i listan + +Vänligen korrigera den och retry + + + QSql driver not found + QSql förare hittades inte + + + Failed to retrieve the driver needed to handle the database + Underlåtenhet att hämta den förare som behövs för att hantera databasen + + + File not found + File hittades inte + + + Failed to retrieve the database file + Misslyckades med att hämta databasfilen + + + Create a new database? + Skapa en ny databas? + + + The database contains an unexpected table + Databasen innehåller en oväntad tabell + + + Unexpected table + Oväntat bord + + + It seems that the database is missing a table + Det verkar som om databasen saknas en tabell + + + Table not found + Bord som inte hittats + + + The database contains an unexpected column + Databasen innehåller en oväntad kolumn + + + Unexpected column + Oväntad kolumn + + + It seems that the table is missing a column + Det verkar som att bordet saknas en kolumn + + + Column not found + Kolumn hittade inte + + + A column has an unexpected data-type + En kolumn har en oväntad datatyp + + + Unexpected data-type + Oväntad datatyp + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Denna databas kommer att byta namn med en spårning ".copy" och en ny kommer att skapas. +Fortsätt? + + + Database created + Databas skapad + + + Successfully created a new database + Framgångsrikt skapat en ny databas + + + Not a file + Inte en fil + + + The path was supposed to point to a file, but it doesn't + Vägen var tänkt att peka på en fil, men det gör inte + + + Please remove the conflict and retry + Ta bort konflikten och försöken + + + The database file is not readable + Databasfilen är inte läsbar + + + Please set the proper permissions and retry +If this error persists, please report this issue + Vänligen ange rätt behörigheter och retry +Om detta fel kvarstår, rapportera detta problem + + + The database file is not writable + Databasfilen är inte skrivbar + + + Invalid database path + Invalid databasväg + + + Failed creating database + Underlåten att skapa databas + + + An error occured while creating the database + Ett fel inträffade när du skapade databasen + + + Failed opening database + Misslyckad öppningsdatabas + + + An error occured while opening the database + Ett fel inträffade när du öppnade databasen + + + Failed executing on database + Misslyckad körning i databasen + + + An error occured while executing a statement on the database + Ett fel inträffade när du utför ett uttalande i databasen + + + Failed to backup database + Misslyckades med backup databas + + + Please report this issue + Vänligen rapportera denna fråga + + + Invalid log format string + Ogiltigt loggformat sträng + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Kontrollera att inget fel kastas av din WebServer +Om det blir accepterat, kontrollera närvaron av en typo här +Om allt är bra, rapportera det här problemet + + + Log format error + Log format fel + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Logformatet har inte ställts in eller är ogiltigt +Lägg till en giltig i konfigurationerna + + + Misconfigured log format + Miskonfigurerat loggformat + + + No log field has been set in the current logs format, +making it useless to parse logs + Inget loggfält har satts i det aktuella loggformatet, +Gör det meningslöst att parasera stockar + + + Please set up a format which contains at least one field + Ange ett format som innehåller minst ett fält + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + En separator saknas mellan ett eller flera fält, +göra det svårt att etablera netto gränser, +och eventuellt leder till att lagra felaktiga data + + + Please set up a format which contains separators between fields + Ange ett format som innehåller separatorer mellan fält + + + Missing field in log format + Saknar fält i loggformat + + + An important field is missing from the provided format: + Ett viktigt fält saknas i det angivna formatet: + + + The quality of the statistics may be seriously compromized + Statistikens kvalitet kan äventyras allvarligt + + + Proceed anyway? + Fortsätt ändå? + + + 'Carriage Return' in log format + Carriage Return i loggformat + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Det tillhandahållna formatet innehåller "Carriage Return". +Detta kan leda till dataförluster eller kraschar om det inte används med försiktighet + + + An error occured while parsing logs + Ett fel inträffade medan parsing stocks + + + Failed defining type + Misslyckad definierande typ + + + Failed to determine the log type + Misslyckades med att bestämma logtypen + + + File already used + Fil som redan används + + + The file has probably been used already + Filen har förmodligen använts redan + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ignorera varningen och använd den ändå, Kassera den och fortsätta, eller Abort hela processen? + + + Duplicate file + Duplicera filen + + + The file appears twice in the list of selections + Filen visas två gånger i listan över val + + + Failed updating hashes + Misslyckad uppdatering av hashes + + + An error occured while inserting the parsed files hashes into the database + Ett fel inträffade när du infogar de parsed filerna hashes i databasen + + + File exceeds warning size + Fil överstiger varningsstorlek + + + The file's size exceeds the warning size + Filens storlek överstiger varningsstorleken + + + Not enough memory + Inte tillräckligt med minne + + + The total size of the selected files exceeds the available memory + Den totala storleken på de valda filerna överstiger det tillgängliga minnet + + + Please free some resources, parse the files in different steps or split them into smaller units + Vänligen frigöra vissa resurser, analysera filerna i olika steg eller dela dem i mindre enheter + + + Failed reading + Misslyckad läsning + + + File is empty + Filen är tom + + + The file is blank + Filen är tom + + + Failed to retrieve the selected file + Misslyckades med att hämta den valda filen + + + Discard it and continue, or Abort all and exit? + Kassera det och fortsätt, eller Abort allt och avsluta? + + + No file to parse + Ingen fil att parse + + + The list of files to parse is empty + Listan över filer för parse är tom + + + Directory not found + Directory hittades inte + + + The directory does not exists + Katalogen finns inte + + + Directory not readable + Directory inte läsbar + + + The directory is not readable + Katalogen är inte läsbar + + + Please set the proper permissions before to start + Ange rätt behörighet innan du börjar + + + Failed creating directory + Misslyckades med att skapa katalog + + + The path does not exists + Vägen existerar inte + + + Data conversion failed + Datakonvertering misslyckades + + + Failed to convert from '%1' to '%2' + Misslyckades med att konvertera från "%1" till "%2" + + + Failed to create statistics + Underlåtenhet att skapa statistik + + + An error occured while processing + Ett fel inträffade vid bearbetning + + + Cannot create statistics + Kan inte skapa statistik + + + No data has been found that matches with the currently set parameters + Inga data har hittats som matchar med de för närvarande inställda parametrarna + + + Not a folder + Inte en mapp + + + The path was supposed to point to a folder, but it doesn't + Vägen var tänkt att peka på en mapp, men det gör inte + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Inträdet kommer att bytas om med en spårning ".copy" och en ny kommer att skapas. +Fortsätt? + + + An error occured + Ett fel inträffade + + + Failed renaming + Misslyckad reaming + + + An error occured while renaming + Ett fel inträffade när du döpte + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Parse loggar från Apache2 webbserver + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse loggar från Nginx webbserver + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Parse loggar från Microsoft IIS webbserver + + + IIS + IIS + + + Select/deselect all the files + Välj / avmarkera alla filer + + + All + Allt allt + + + Inspect a log file + Inspektera en loggfil + + + Name + Namnnamn + + + Size + storlek + + + Refresh the list + Uppdatera listan + + + Total size of the parsed data + Total storlek på den analyserade data + + + Total number of parsed lines + Totalt antal parsed linjer + + + Start parsing the selected files + Börja analysera de valda filerna + + + START + Start + + + Time elapsed since the start + Tiden förflutit sedan starten + + + Average speed, in parsed data size per second + Genomsnittlig hastighet, i persed datastorlek per sekund + + + Web Server + Web Server + + + Select a Web Server + Välj en webbserver + + + Year + År + + + Month + Månad + + + Day + Dagens dag + + + Hour + Hour + + + Draw the chart + Rita diagrammet + + + Log line marked as Warning + Log line markerad som varning + + + Date when the request arrived (YYYY-MM-DD) + Datum när begäran anlände (YYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Tid när begäran anlände (hh:mm:ss) + + + Protocol of the request + Protokoll för begäran + + + Method of the request + Metod för begäran + + + URI of the requested page + URI av den begärda sidan + + + Query carried along with the URI + Query bar tillsammans med URI + + + Response code from the server + Svarskod från servern + + + User-agent of the client which made the request + Användaragent för kunden som gjorde begäran + + + IP address of the Client which made the request + IP-adress för kunden som gjorde begäran + + + Cookie used for the request + Cookie som används för begäran + + + The URL which redirected the Client to the requested page + Den URL som omdirigerade Kunden till den begärda sidan + + + Size ib Bytes of the request, usually includes header and data + Storlek ib Bytes på begäran, innehåller vanligtvis rubrik och data + + + Size in Bytes of the served content, usually includes header and data + Storlek i Bytes av det serverade innehållet, innehåller vanligtvis rubrik och data + + + Time taken by the server to serve the content, in milliseconds + Tid som tas av servern för att tjäna innehållet, i millisekunder + + + Only use lines in which the field is starting with this string + Använd endast linjer där fältet börjar med denna sträng + + + Protocol: + Protokollet: + + + Method: + Metod: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Använd endast linjer där fältet matchar detta uttalande. +Använd "!', '=', '<' eller '>' för att förklara vad du ska använda + + + Response: + Svar: + + + Query: + Query: + + + URI: + URI: + + + Filters + Filter + + + Count + Räkna + + + Number of occurrences + Antal händelser + + + Item + Föremål + + + Value of the field + Värdet av fältet + + + From: + Från: + + + To: + Till: + + + Select a log field to view + Välj ett loggfält för att visa + + + Field: + Fält: + + + Filter: + Filter: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Med strängar kommer endast de linjer där fältet börjar med denna sträng att användas. +Med siffror, använd "!", "=", "<" eller ">" för att förklara vad du ska använda + + + Protocol + Protokoll + + + Method + Metod + + + URI + URI + + + User-agent + Användaragent + + + Most recurrent + De flesta återkommande + + + Most trafficked + De flesta trafficked + + + Date ever + Datum någonsin + + + Day of the week + Dag för veckan + + + Hour of the day + Dagens timme + + + Time taken + Tid tagen + + + Bytes sent + Bytes skickade + + + Bytes received + Bytes fick + + + Mean/Max performances + Mean/Max föreställningar + + + Requests received + Förfrågningar mottagna + + + Total work + Totalt arbete + + + General + General general + + + Window + fönster + + + Dialogs + Dialoger + + + Charts + Diagram + + + Appearance + Utseende + + + Speed + Hastighet + + + Relational + Förhållande + + + TextBrowser + TextBrowser + + + Databases + Databaser + + + Security + Säkerhet + + + Logs + Loggar + + + Defaults + Standarder + + + Control + Kontrollkontroll + + + Path + Vägen + + + Format + Format + + + Warnlists + Varnlistor + + + Blacklists + Blacklists + + + Remember the window's position and size + Kom ihåg fönstrets position och storlek + + + Remember position and size + Kom ihåg position och storlek + + + Remember window's position and size + Kom ihåg fönster position och storlek + + + Geometry + Geometri + + + Theme to use for the window + Tema att använda för fönstret + + + Theme + Tema + + + Native + Native + + + Light + Ljus ljus + + + Dark + Mörk + + + Auto + Auto Auto Auto Auto + + + Icons + Ikoner + + + Normal quantity of dialog messages shown + Normal mängd dialogmeddelanden som visas + + + Normal + Normal + + + Dialogs from the main processes + Dialoger från huvudprocesserna + + + Dialogs emitted when parsing logs + Dialoger avges när parsing stocks + + + Logs parser + Logs Parser + + + Dialogs emitted when viewing statistics + Dialoger som avges när du tittar på statistik + + + Statistics viewer + Statistik betraktare + + + Define the quantity of dialog mesages shown + Definiera mängden dialogmeddelanden som visas + + + Dialogs level + Dialoger nivå + + + Reduced quantity of dialog messages shown + Minskad mängd dialogmeddelanden som visas + + + Essential + Essential + + + Augmented quantity of dialog messages shown + Ökad mängd dialogmeddelanden som visas + + + Explanatory + Förklaring + + + Theme to use for the Charts + Tema att använda för diagrammen + + + Preview + Förhandsgranskning + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Representerar ett steg i tidsaxeln, på några sekunder. +Alla värden som faller inom samma intervall kommer att slås samman och medelvärdet kommer att användas. + + + Time interval + Tidsintervall + + + The format to use for the labels of the time axis. + Formatet att använda för etiketter av tidsaxeln. + + + Time format + Time format + + + The size of the pie + Storleken på pajen + + + Pie size + Pie storlek + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Det maximala antalet skivor som kakan kommer att bestå av. +Överskridande skivor kommer att grupperas till en omfattande skiva. + + + Maximum slices + Maximala skivor + + + Font to use for the Text Browser + Font att använda för Text Browser + + + Font + Font + + + Double-spaced lines + Dubbelspaced linjer + + + Use wide lines + Använd breda linjer + + + Define the spacing between lines + Definiera avståndet mellan linjer + + + Lines spacing + Lines avstånd + + + None + Ingen + + + Color scheme to use for the Text Browser + Färgschema för att använda för Text Browser + + + Color scheme + Färgsystem + + + The appearance of the Text Browser with the current settings + Utseendet på textwebbläsaren med aktuella inställningar + + + Insert the base path only, file name excluded + Infoga basvägen endast, filnamn exkluderat + + + The given path doen't exists, or doesn't point to a folder + Den givna vägen finns inte, eller pekar inte på en mapp + + + Path for the database files + Vägen för databasfilerna + + + Paths + Vägarna + + + Apply the current path + Applicera den nuvarande vägen + + + Select the path through a dialog window + Välj vägen genom ett dialogfönster + + + Path where the logs data collection database is located + Vägen där databasen loggar datainsamling finns + + + Logs data + Logs Data + + + Path where the used files hashes database is located + Vägen där den använda filen hashes databasen finns + + + Used files + Använda filer + + + Backup options for the Logs Data database + Backup-alternativ för Logs Data-databasen + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + En ny säkerhetskopia görs när du stänger LogDoctor efter att ha framgångsrikt redigerat databasen + + + Backup the Logs Data database and keep + Säkerhetskopiera Logs Data-databasen och hålla + + + Whether it is allowed or denied to follow symlinks occuring in a path + Oavsett om det är tillåtet eller nekas att följa symlänkar som förekommer på en väg + + + Follow symlinks + Följ symlinks + + + Default WebServer + Standard WebServer + + + Usage control + Användningskontroll + + + Hide already used files + Dölj redan använda filer + + + Size warnings + Storlek varningar + + + Warn me when using files with a size exceeding: + Varna mig när du använder filer med en storlek som överstiger: + + + Logs folder + Logs mapp + + + Logs format string + Logs Format String + + + Format string + Format String + + + Insert the format string you're using + Sätt in formatsträngen du använder + + + Apply the current string + Applicera den nuvarande strängen + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Skapa ett prov logglinje från den för närvarande sparade strängen, för att kontrollera om den blir formaterad korrekt. +Alla fält som inte anses av LogDoctor kommer att visas som 'DISCARDED' + + + Generate sample + Generera prov + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Kontrollera rättheten av denna linje. +Fält markerade som 'DISCARDED' fick parsed korrekt, men anses inte av LogDoctor + + + Open an help window + Öppna hjälpfönstret + + + Help + Hjälp Hjälp + + + Select a log field + Välj ett loggfält + + + Use warnlist for this field + Använd varningslista för detta fält + + + Add the current line to the list + Lägg till den aktuella raden till listan + + + Remove the selected item from the list + Ta bort det valda objektet från listan + + + Move the selected item down + Flytta det valda objektet ner + + + Use blacklist for this field + Använd svartlista för detta fält + + + Add line + Add line + + + Remove selection + Ta bort urval + + + Language + Språkspråk + + + Utilities + Verktyg + + + Tools + Verktyg + + + Games + Spel + + + Perform a version-check + Utför en version-check + + + Show some info about LogDoctor + Visa lite info om LogDoctor + + + Open a block-note like window to write temporary text + Öppna ett block-not som fönster för att skriva tillfällig text + + + Play CrissCross + Spela CrissCross + + + Play Snake + Spela Snake + + + Show the changelog + Visa changelog + + + warnlist + Varnlista + + + blacklist + svartlista + + + copy + kopiera + + + copies + Kopior + + + Check updates + Kolla uppdateringar + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + CrissCross + + + Snake + Snake + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Välj en fil från listan + + + to inspect its content + inspektera dess innehåll + + + Failed to read + Misslyckades med att läsa + + + + SnakeGame + + PLAY + Spela + + + Classic + Klassisk + + + Hunt + Jakt + + + Battle + Slaget + + + Game Over + Spel över + + + Your adversary fell in the water! + Din motståndare föll i vattnet! + + + YOU WON! + Du kommer! + + + You fell in the water! + Du föll i vattnet! + + + YOU LOST! + Du förlorade! + + + Your adversary ate itself! + Din motståndare åt sig själv! + + + You ate yourself! + Du åt dig själv! + + + Your adversary ate you! + Din motståndare åt dig! + + + You ate your adversary! + Du åt din motståndare! + + + You ate each other! + Du åt varandra! + + + MATCH IS DRAW! + MATCH ÄR DRAW! + + + + TR + + Unexpected WebServer + Oväntad WebServer + + + Logs Size Breakdown + Logs Size Breakdown + + + Ignored + Okunnig + + + Parsed + Parsed + + + Blacklisted + Blacklisted + + + Others + Andra + + + from + Från + + + to + för att + + + Log Lines Marked as Warning + Log Lines markerade som varning + + + Time Taken to Serve Requests + Dags att tjäna förfrågningar + + + Time of Day Count + Dagens tid räknat + + + Relational Count + Relationsräkning + + + FALSE + FALSKT + + + TRUE + SANT + + + Date + Datum + + + Year + År + + + Month + Månad + + + Day + Dagens dag + + + Time + Tid + + + Hour + Hour + + + Minute + Minut + + + Second + Andra sekunden + + + Warning + Varning + + + Protocol + Protokoll + + + Method + Metod + + + URI + URI + + + Query + Query + + + Response code + Svarskod + + + Time taken + Tid tagen + + + Bytes sent + Bytes skickade + + + Bytes received + Bytes fick + + + Referrer + Referrer + + + Cookie + Cookie Cookie Cookie + + + Client + Kund + + + User-agent + Användaragent + + + January + januari januari + + + February + februari februari februari + + + March + mars mars mars + + + April + april + + + May + maj maj + + + June + juni juni + + + July + juli juli juli + + + August + augusti augusti + + + September + September september + + + October + oktober oktober + + + November + November november + + + December + december + + + Sunday + Söndag söndag + + + Monday + Måndag måndag + + + Tuesday + Tisdag tisdag + + + Wednesday + Onsdag onsdag onsdag + + + Thursday + Torsdag torsdag + + + Friday + fredag fredag + + + Saturday + lördag + + + diff --git a/logdoctor/translations/LogDoctor_th_TH.ts b/logdoctor/translations/LogDoctor_th_TH.ts new file mode 100644 index 0000000..7a22b0c --- /dev/null +++ b/logdoctor/translations/LogDoctor_th_TH.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + รุ่น + + + Version 4 + รุ่น 4 + + + Version 3 + รุ่น 3 + + + Version 2 + รุ่น 2 + + + Version 1 + รุ่น 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + สร้างสคริปต์ + + + Cross-platform compatibility: + การเข้ากันได้แบบตัดขวาง: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + สถิติ: + + + Warnings + คําเตือน + + + Speed + ความเร็ว + + + Counts + จํานวน + + + Daytime + เวลา + + + Relational + ส่วนขยาย + + + Globals + ทั่วไป + + + Translations: + การแปล: + + + Italian + อิตาลี + + + Spanish + สเปน + + + French + ฝรั่งเศส + + + Tools: + เครื่องมือ: + + + Block note + บันทึกช่วยจําแบบบล็อค + + + Utilities: + ความจุ: + + + Infos viewer + ตัวแสดงข้อมูล + + + Updates checker + โปรแกรมตรวจสอบการปรับปรุง + + + Themes: + ชุดตกแต่ง: + + + Dark + เข้ม + + + Light + แสง + + + Improvements and fixes + การ ปรับ ปรุง และ แก้ไข + + + New themes: + ชุดตกแต่งใหม่: + + + Ash + แอช + + + Candy + ลูกอม + + + Forest + ป่า + + + Powder + ผง + + + Restyled GUI + ปรับแต่งส่วนติดต่อผู้ใช้แบบกราฟิก + + + Restyled dialogs + สร้างกล่องโต้ตอบใหม่ + + + Doxygen documentation + เอกสารของ Doxygen + + + Mini-Games: + ขนาดมินิGames: + + + Criss-cross + ค ริ สต จักร + + + Snake + งู + + + Changed default paths + เปลี่ยนพาธปริยาย + + + New game modes for Snake + โหมดเกมใหม่สําหรับงู + + + Hunt + ล่า + + + Battle + สงคราม + + + New translations: + แปลภาษาใหม่: + + + Japanese + ญี่ปุ่น + + + Portuguese + โปรตุเกส + + + Code improvements + ปรับปรุงรหัส + + + Performance improvements + ปรับปรุงประสิทธิภาพ + + + Added tests suite: + เพิ่มชุดทดสอบ: + + + white box tests + ทดสอบกล่องสีขาว + + + Customized charts themes + ชุดตกแต่งแผนภูมิที่กําหนดเอง + + + Fixes + แก้ไข + + + Tests improvements + การปรับปรุงการทดสอบ + + + Docker support + รองรับตัวแปลงเสียง + + + Upgrade to C++20 + เพิ่มเติมเป็น C++20 + + + Upgrade to Qt6 + เพิ่มเติมเป็น Qt6 + + + Restyled themes + ปรับชุดตกแต่งใหม่ + + + Redesigned configs section + ออกแบบส่วนปรับแต่งใหม่ + + + Stability improvements + แก้ไขความจุ + + + Generating warnings dinamically + กําลังสร้างคําเตือนแบบย่อ + + + New tool: + เครื่องมือใหม่: + + + Changelog + เปลี่ยนบล็อก + + + Tweakable parameters for some of the charts: + พารามิเตอร์ต่าง ๆ สําหรับแผนภูมิบางส่วน: + + + Improved project structure + ปรับปรุงโครงสร้างโครงการ + + + Modernized Cmake usage + ทันสมัยแล้ว การใช้งาน cfish + + + + Crapinfo + + Version + รุ่น + + + Currently installed version of the software + โปรแกรมที่ติดตั้งอยู่ในปัจจุบัน + + + Repository links + แก้ไขที่อยู่เชื่อมโยง + + + Paths + พาธ + + + The path of the executable file + ตําแหน่งของแฟ้มประมวลผล + + + Executable + ประมวลผลได้ + + + The path where the configuration file gets saved and searched in + ตําแหน่งที่แฟ้มปรับแต่งจะถูกบันทึกและค้นหา + + + Configuration file + แฟ้มการปรับแต่ง + + + The path where the application searches for extra resources + ตําแหน่งที่โปรแกรมค้นหาทรัพยากรเพิ่มเติม + + + Application data + ข้อมูลโปรแกรม + + + + Crapnote + + Reduce the font size + ลดขนาดตัวอักษร + + + Font size + ขนาดตัวอักษร + + + Increase the font size + เพิ่มขนาดตัวอักษร + + + + Crappath + + Choose + เลือก + + + Cancel + ยกเลิก + + + + Crapup + + Checking for updates + กําลังตรวจสอบความคืบหน้า + + + New version available + มีรุ่นใหม่ ๆ อยู่ + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + มีเวอร์ชันใหม่แล้ว! +โปรดไปเยี่ยมห้องเก็บอาหารของผู้กํากับ และปฏิบัติตามคําแนะนําเกี่ยวกับวิธีการปรับปรุง + + + No update found + ไม่พบการปรับปรุง + + + LogDoctor is up-to-date + โปรแกรมติดตามการทํางานพร้อมใช้งาน + + + :/ + / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + คุณกําลังดําเนินการรุ่นจากอนาคต! +รุ่นของคุณอยู่นอกเหนือรุ่นของระดับบนสุด +คุณดําเนินการเดิม Doctor? +กรุณาไปเยี่ยมห้องเก็บของหมอและได้รับรุ่นใหม่ + + + Failed to establish a connection + ล้มเหลวในการสร้างการเชื่อมต่อ + + + Connection error, please try again later + การเชื่อมต่อผิดพลาด โปรดลองใหม่อีกครั้งในภายหลัง + + + Connection timed out + หมดเวลาการเชื่อมต่อ + + + Version check failed + การตรวจสอบรุ่นล้มเหลว + + + An error occured while parsing: +version mark not found + เกิดข้อผิดพลาดขึ้น ขณะแปลส่วน: +ไม่พบเครื่องหมายรุ่น + + + An error occured while parsing: +malformed version + เกิดข้อผิดพลาดขึ้น ขณะแปลส่วน: +รูปแบบรุ่นไม่ถูกต้อง + + + An error occured while comparing: +malformed upstream version + เกิดข้อผิดพลาดระหว่างทําการเปรียบเทียบ: +เกิดข้อผิดพลาดขณะเรียกข้อมูลโฟลเดอร์ + + + + CrissCross + + Victory + ชัย ชนะ + + + You beated me! + คุณด่าฉัน! + + + This time you lost! + ครั้งนี้คุณแพ้! + + + Draw + วาด + + + Nice match + ตรงกัน + + + + DialogBool + + Yes + ใช่ + + + No + ไม่ + + + + DialogIda + + Ignore + ไม่สนใจ + + + Discard + ดิสก์ + + + Abort + ยกเลิก + + + + DialogMsg + + Ok + โอเค + + + + DialogSec + + One of the lists has an invalid item + รายการใดรายการหนึ่งมีรายการที่ไม่ถูกต้อง + + + An error occured while reading the configuration file + เกิดข้อผิดพลาดขณะอ่านแฟ้มปรับแต่ง + + + An error occured while parsing configuration file's data + เกิดข้อผิดพลาดขึ้น ขณะกําลังวิเคราะห์ข้อมูลของแฟ้มปรับแต่ง + + + Failed to create the configuration file's directory + ล้มเหลวในการสร้างไดเรกทอรีการปรับแต่งของแฟ้ม + + + Failed to create the configuration file + ล้มเหลวในการสร้างแฟ้มปรับแต่ง + + + An error occured while writing the configuration file + เกิดข้อผิดพลาดขึ้น ขณะกําลังเขียนแฟ้มปรับแต่ง + + + An error occured while preparing the configuration file's data + เกิดข้อผิดพลาดขึ้นระหว่างการเตรียมข้อมูลของแฟ้มปรับแต่ง + + + The path contains a symlink + พาธที่มี symlink + + + The file does not exist + ยังไม่มีแฟ้มอยู่ + + + Failed to create the database backups' directory + ล้มเหลวในการสร้างไดเรกทอรีสํารองข้อมูลฐานข้อมูล + + + Failed to copy the database file + ล้มเหลวในการคัดลอกแฟ้มฐานข้อมูล + + + Failed to update the backups + ล้มเหลวในการอัปเดตแฟ้มสํารองข้อมูล + + + Failed to create the directory + ล้มเหลวในการสร้างไดเรกทอรี + + + Unrecognized entry + รายการที่ไม่สามารถจัดการได้ + + + Size of the file + ขนาดของแฟ้ม + + + Warning size parameter + พารามิเตอร์การแจ้งเตือน + + + Failed to read gzipped file + ล้มเหลวในการอ่านแฟ้ม gzippped + + + An error occured while parsing the format string + เกิดข้อผิดพลาดขึ้นระหว่างการไล่สีข้อความรูปแบบ + + + Available memory + หน่วยความจําที่มีอยู่ + + + Size of the logs + ขนาดของปูมบันทึก + + + An error occured while reading the gzipped file + เกิดข้อผิดพลาดระหว่างอ่านแฟ้ม gzippped + + + An error occured while reading the file + เกิดข้อผิดพลาดขณะอ่านแฟ้ม + + + Something failed while handling the file + บางสิ่งบางอย่างล้มเหลวขณะจัดการแฟ้ม + + + An error occured while working on the database + เกิดข้อผิดพลาดขึ้นขณะกําลังทําฐานข้อมูล + + + Aborting + กําลังยุติ + + + Invalid locale + ท้องถิ่นไม่ถูกต้อง + + + Unexpected locale format + รูปแบบท้องถิ่นที่ไม่คาดคิด + + + If you haven't manually edited the configuration file, +please report this issue + หากคุณยังไม่ได้แก้ไขแฟ้มปรับแต่งด้วยตนเอง +โปรดรายงานปัญหานี้ + + + The given locale is not an accepted language + ภาษาท้องถิ่นที่ให้ไม่ใช่ภาษาที่ยอมรับได้ + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + ถ้าคุณอยากได้คนท้องที่ในล็อกโดคเตอร์ +โปรดทําตามคําสั่งในหน้าคลังแพกเกจ + + + Configuration file not found + ไม่พบแฟ้มปรับแต่ง + + + Unable to retrieve the configuration file + ไม่สามารถรับค่าแฟ้มปรับแต่งได้ + + + Skipping + ข้าม + + + An error occured while handling the configuration file + เกิดข้อผิดพลาดขึ้นระหว่างจัดการแฟ้มปรับแต่ง + + + Failed to write the configuration file + ล้มเหลวในการเขียนแฟ้มปรับแต่ง + + + Current configuration not saved + ไม่บันทึกการปรับแต่งปัจจุบัน + + + File not readable + ไม่สามารถอ่านแฟ้มได้ + + + The file is not readable + ไม่สามารถอ่านแฟ้มได้ + + + File not writable + แฟ้มเขียนไม่ได้ + + + The file is not writable + แฟ้มเขียนไม่ได้ + + + Directory not writable + ไดเรกทอรีเขียนไม่ได้ + + + The directory is not writable + ไดเรกทอรีเขียนไม่ได้ + + + Invalid path + พาธไม่ถูกต้อง + + + Failed applying configuration + ล้มเหลวในการปรับใช้การปรับแต่ง + + + Invalid configuration lines + บรรทัดการปรับแต่งไม่ถูกต้อง + + + Has not been possible to apply some of the configurations + ไม่สามารถปรับใช้ค่าบางค่าได้ + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + หากคุณเลือกทําต่อไป การจัดเรียงแฟ้มที่ยังไม่ได้ปรับใช้ทั้งหมดจะสูญหาย +ต่อ? + + + Failed to retrieve the help file + ล้มเหลวในการรับแฟ้มช่วยเหลือ + + + An error occured while getting the help file + เกิดข้อผิดพลาดขึ้นระหว่างรับแฟ้มช่วยเหลือ + + + Additional resources can be downloaded from the git repo + ทรัพยากรเพิ่มเติมสามารถดาวน์โหลดได้จาก Git Repo + + + Unable to retrieve the file + ไม่สามารถรับแฟ้มได้ + + + Invalid string + ข้อความไม่ถูกต้อง + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + ข้อความที่ให้ไม่ถูกต้อง และไม่สามารถเพิ่มเข้าไปในรายการได้ + +โปรดแก้ไขและลองใหม่ + + + QSql driver not found + ไม่พบไดรเวอร์ QSql + + + Failed to retrieve the driver needed to handle the database + ล้มเหลวในการรับตัวไดรเวอร์มา เพื่อจัดการฐานข้อมูล + + + File not found + ไม่พบแฟ้ม + + + Failed to retrieve the database file + ล้มเหลวในการรับแฟ้มฐานข้อมูล + + + Create a new database? + สร้างฐานข้อมูลใหม่หรือไม่? + + + The database contains an unexpected table + ฐานข้อมูลมีตารางที่ไม่คาดคิด + + + Unexpected table + ตารางที่ไม่คาดคิด + + + It seems that the database is missing a table + ดูเหมือนว่าฐานข้อมูลจะหายไปโต๊ะ + + + Table not found + ไม่พบตาราง + + + The database contains an unexpected column + ฐานข้อมูลมีคอลัมน์ที่ไม่คาดคิด + + + Unexpected column + คอลัมน์ที่ไม่คาดคิด + + + It seems that the table is missing a column + ดูเหมือนว่าตารางจะขาดคอลัมน์ + + + Column not found + ไม่พบคอลัมน์ + + + A column has an unexpected data-type + คอลัมน์มีชนิดของข้อมูลที่ไม่คาดคิด + + + Unexpected data-type + ชนิดข้อมูลที่ไม่คาดหมาย + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + ฐานข้อมูลนี้จะเปลี่ยนชื่อเป็น '. copy' และจะมีการสร้างใหม่ +ต่อ? + + + Database created + สร้างฐานข้อมูลขึ้นมา + + + Successfully created a new database + สร้างฐานข้อมูลใหม่สําเร็จแล้ว + + + Not a file + ไม่ใช่แฟ้ม + + + The path was supposed to point to a file, but it doesn't + เส้นทางควรจะชี้ไปยังไฟล์ แต่มันไม่มี + + + Please remove the conflict and retry + กรุณาลบการขัดแย้งแล้วลองใหม่อีกครั้ง + + + The database file is not readable + ไม่สามารถอ่านแฟ้มฐานข้อมูลได้ + + + Please set the proper permissions and retry +If this error persists, please report this issue + โปรดตั้งค่าสิทธิ์ที่อนุญาตและลองใหม่อีกครั้ง +หากมีข้อผิดพลาดนี้ยังคงอยู่ โปรดรายงานปัญหานี้ + + + The database file is not writable + แฟ้มฐานข้อมูลเขียนไม่ได้ + + + Invalid database path + ตําแหน่งฐานข้อมูลไม่ถูกต้อง + + + Failed creating database + ล้มเหลวในการสร้างฐานข้อมูล + + + An error occured while creating the database + เกิดข้อผิดพลาดขึ้นระหว่างทําการสร้างฐานข้อมูล + + + Failed opening database + ล้มเหลวในการเปิดฐานข้อมูล + + + An error occured while opening the database + เกิดข้อผิดพลาดขึ้น ขณะกําลังเปิดฐานข้อมูล + + + Failed executing on database + ล้มเหลวในการประมวลผลบนฐานข้อมูล + + + An error occured while executing a statement on the database + เกิดข้อผิดพลาดขึ้นระหว่างทําการประมวลผลข้อความบนฐานข้อมูล + + + Failed to backup database + ล้มเหลวในการสํารองข้อมูลฐานข้อมูล + + + Please report this issue + โปรดรายงานเรื่องนี้ + + + Invalid log format string + ข้อความรูปแบบปูมบันทึกไม่ถูกต้อง + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + กรุณาตรวจสอบว่าไม่มีข้อผิดพลาดใด ๆ ถูกโยนโดยเซิร์ฟเวอร์เว็บของคุณ +ถ้ามันได้รับการตอบรับ กรุณาตรวจสอบการปรากฏของตัวแก้ไขที่นี่ +หาก ทุก สิ่ง เรียบร้อย โปรด รายงาน ประเด็น นี้ + + + Log format error + รูปแบบปูมบันทึกผิดพลาด + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + ยังไม่มีการตั้งค่ารูปแบบปูมบันทึก หรือไม่ถูกต้อง +โปรดเพิ่มค่าที่ถูกต้องในการปรับแต่ง + + + Misconfigured log format + รูปแบบปูมบันทึกแบบปรับแต่งผิดรูปแบบ + + + No log field has been set in the current logs format, +making it useless to parse logs + ยังไม่มีการตั้งค่าช่องข้อมูลปูมบันทึกในรูปแบบปูมบันทึกปัจจุบัน +ทําให้การวิเคราะห์ปูมบันทึกไร้ประโยชน์ + + + Please set up a format which contains at least one field + โปรดตั้งค่ารูปแบบที่มีอย่างน้อยหนึ่งสนาม + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + ตัวแบ่งเขตหายไป ระหว่างหนึ่งหรือมากกว่า +มันเป็นเรื่องยากที่จะจํากัดขอบเขต +และอาจนําไปสู่การเก็บข้อมูลไม่ถูกต้อง + + + Please set up a format which contains separators between fields + โปรดตั้งค่ารูปแบบที่มีตัวแบ่งระหว่างช่อง + + + Missing field in log format + ช่องข้อมูลสูญหายในรูปแบบปูมบันทึก + + + An important field is missing from the provided format: + ช่องข้อมูลที่สําคัญหายไปจากรูปแบบที่จัดให้: + + + The quality of the statistics may be seriously compromized + คุณภาพ ของ สถิติ อาจ ได้ รับ การ ยกย่อง อย่าง สูง + + + Proceed anyway? + ดําเนินการยังไง? + + + 'Carriage Return' in log format + 'การคืนค่า' ในรูปแบบปูมบันทึก + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + ฟอร์แมตต่าง ๆ ที่จัดหามาบรรจุ 'การกลับมาของสินค้า' +นี่ อาจ นํา ไป สู่ การ สูญ เสีย ข้อมูล หรือ เกิด อุบัติเหตุ หาก ไม่ ใช้ ด้วย ความ ระมัดระวัง + + + An error occured while parsing logs + เกิดข้อผิดพลาดขึ้นระหว่างการไล่เก็บปูมบันทึก + + + Failed defining type + การกําหนดประเภทล้มเหลว + + + Failed to determine the log type + ล้มเหลวในการพิจารณาชนิดปูมบันทึก + + + File already used + แฟ้มที่ใช้ไปแล้ว + + + The file has probably been used already + แฟ้มอาจจะถูกใช้ไปแล้วก็ได้ + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + ไม่ ใส่ ใจ คํา เตือน และ ใช้ คํา เตือน นั้น อย่าง ไร ก็ ตาม จง ถอน คํา เตือน แล้ว ทํา ต่อ ไป หรือ ทํา ให้ กระบวนการ ทั้ง หมด ยุติ ลง? + + + Duplicate file + แฟ้มซ้ํากัน + + + The file appears twice in the list of selections + แฟ้มปรากฏสองครั้งในรายการการเลือก + + + Failed updating hashes + ล้มเหลวในการอัปเดต + + + An error occured while inserting the parsed files hashes into the database + เกิดข้อผิดพลาดขึ้น ขณะใส่ข้อมูล schemes ในฐานข้อมูล + + + File exceeds warning size + แฟ้มเกินขนาดคําเตือน + + + The file's size exceeds the warning size + ขนาดของแฟ้มเกินขนาดคําเตือน + + + Not enough memory + หน่วยความจําไม่เพียงพอ + + + The total size of the selected files exceeds the available memory + ขนาดรวมของแฟ้มที่เลือกมากกว่าหน่วยความจําที่มี + + + Please free some resources, parse the files in different steps or split them into smaller units + โปรดเพิ่มทรัพยากรบางส่วน ให้วิเคราะห์แฟ้มในแต่ละขั้น หรือแยกเป็นหน่วยย่อย + + + Failed reading + ล้มเหลวในการอ่าน + + + File is empty + แฟ้มว่าง + + + The file is blank + แฟ้มว่างเปล่า + + + Failed to retrieve the selected file + ล้มเหลวในการรับแฟ้มที่เลือกไว้ + + + Discard it and continue, or Abort all and exit? + กําจัด แล้ว ทํา ต่อ ไป หรือ ทํา ให้ หมด แล้ว ออก ไป? + + + No file to parse + ไม่มีแฟ้มที่จะวิเคราะห์ + + + The list of files to parse is empty + รายการของแฟ้มที่จะวิเคราะห์ว่าง + + + Directory not found + ไม่พบไดเรกทอรี + + + The directory does not exists + ยังไม่มีไดเรกทอรีอยู่ + + + Directory not readable + ไม่สามารถอ่านไดเรกทอรีได้ + + + The directory is not readable + ไม่สามารถอ่านไดเรกทอรีได้ + + + Please set the proper permissions before to start + โปรดตั้งค่าสิทธิ์ที่อนุญาตให้ถูกต้องก่อนที่จะเริ่มการทํางาน + + + Failed creating directory + ล้มเหลวในการสร้างไดเรกทอรี + + + The path does not exists + ไม่มีพาธอยู่ + + + Data conversion failed + การแปลงข้อมูลล้มเหลว + + + Failed to convert from '%1' to '%2' + ล้มเหลวในการแปลงจาก '%1' ไปเป็น '%2' + + + Failed to create statistics + ล้มเหลวในการสร้างสถิติ + + + An error occured while processing + เกิดข้อผิดพลาดขึ้นระหว่างประมวลผล + + + Cannot create statistics + ไม่สามารถสร้างสถิติ + + + No data has been found that matches with the currently set parameters + ไม่พบข้อมูลใดที่ตรงกับพารามิเตอร์ที่ตั้งไว้ในปัจจุบัน + + + Not a folder + ไม่ใช่โฟลเดอร์ + + + The path was supposed to point to a folder, but it doesn't + เส้นทางควรจะชี้ไปยังโฟลเดอร์ แต่มันไม่ใช่ + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + รายการจะถูกเปลี่ยนชื่อเป็น '. copy' และรายการใหม่จะถูกสร้าง +ต่อ? + + + An error occured + เกิดข้อผิดพลาดขึ้น + + + Failed renaming + การเปลี่ยนชื่อล้มเหลว + + + An error occured while renaming + เกิดข้อผิดพลาดขึ้นระหว่างทําการเปลี่ยนชื่อ + + + + GameDialog + + Ok + โอเค + + + + MainWindow + + Parse logs from the Apache2 web server + การวิเคราะห์ปูมบันทึกจากเซิร์ฟเวอร์ Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + การวิเคราะห์ปูมบันทึกจากเซิร์ฟเวอร์ Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + การวิเคราะห์ปูมบันทึกจากแม่ข่ายเว็บไมโครซอฟต์ IIS + + + IIS + IIS + + + Select/deselect all the files + เลือก/ ยกเลิก เลือกแฟ้มทั้งหมด + + + All + ทั้งหมด + + + Inspect a log file + แสดงเฉพาะแฟ้มปูมบันทึก + + + Name + ชื่อ + + + Size + ขนาด + + + Refresh the list + ปรับปรุงรายการใหม่ + + + Total size of the parsed data + ขนาดรวมของข้อมูลที่ถูกวิเคราะห์ + + + Total number of parsed lines + จํานวนบรรทัดที่วิเคราะห์แล้ว + + + Start parsing the selected files + เริ่มวิเคราะห์แฟ้มที่เลือก + + + START + เริ่ม + + + Time elapsed since the start + เวลาผ่านไปตั้งแต่เริ่ม + + + Average speed, in parsed data size per second + ความเร็วเฉลี่ย ในวิเคราะห์ขนาดข้อมูลต่อวินาที + + + Web Server + เซิร์ฟเวอร์เว็บ + + + Select a Web Server + เลือกเซิร์ฟเวอร์เว็บ + + + Year + ปี + + + Month + เดือน + + + Day + วัน + + + Hour + ชั่วโมง + + + Draw the chart + วาดแผนภูมิ + + + Log line marked as Warning + บรรทัดปูมบันทึกที่ทําเครื่องหมายเป็นคําเตือน + + + Date when the request arrived (YYYY-MM-DD) + วันที่เมื่อคําร้องขอมาถึง (YYYY-M-DD) + + + Time when the request arrived (hh:mm:ss) + เวลาเมื่อการร้องขอมาถึง (hh:mm: s) + + + Protocol of the request + โพรโทคอลสําหรับการร้องขอ + + + Method of the request + วิธีการของการร้องขอ + + + URI of the requested page + URI ของหน้าที่ร้องขอ + + + Query carried along with the URI + สืบค้นพร้อมกับ URI + + + Response code from the server + โค้ดการตอบกลับจากเซิร์ฟเวอร์ + + + User-agent of the client which made the request + ตัวแทนของผู้ใช้ของไคลเอนต์ที่ทําการร้องขอ + + + IP address of the Client which made the request + ที่อยู่ IP ของไคลเอนต์ที่ทําการร้องขอ + + + Cookie used for the request + คุกกี้ที่ใช้สําหรับร้องขอ + + + The URL which redirected the Client to the requested page + ที่อยู่ URL ที่เปลี่ยนเส้นทางไปยังหน้าที่ร้องขอ + + + Size ib Bytes of the request, usually includes header and data + ขนาด + + + Size in Bytes of the served content, usually includes header and data + ขนาดของเนื้อหาที่ให้บริการ โดยปกติจะเป็นส่วนหัวและข้อมูล + + + Time taken by the server to serve the content, in milliseconds + เวลาของเซิร์ฟเวอร์ที่จะให้บริการเนื้อหา ในหน่วยมิลลิวินาที + + + Only use lines in which the field is starting with this string + ใช้บรรทัดที่ช่องข้อมูลเริ่มต้นด้วยข้อความนี้เท่านั้น + + + Protocol: + โพรโทคอล: + + + Method: + วิธีการ: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + ใช้บรรทัดที่สนามตรงกับประโยคนี้เท่านั้น +ใช้ '!', '=',' '<' หรือ '>' เพื่อประกาศสิ่งที่ใช้ + + + Response: + การตอบรับ: + + + Query: + สืบค้น: + + + URI: + URI: + + + Filters + ตัวกรอง + + + Count + นับ + + + Number of occurrences + จํานวนตัวอักษรที่จะแทนที่ + + + Item + รายการ + + + Value of the field + ค่าของสนาม + + + From: + จาก: + + + To: + ถึง: + + + Select a log field to view + เลือกช่องข้อมูลปูมบันทึกที่จะแสดง + + + Field: + ช่องข้อมูล: + + + Filter: + ตัวกรอง: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + ใช้สตริงเฉพาะบรรทัดที่ สนามที่จะเริ่มต้นด้วยสตริงนี้ +ด้วยตัวเลข, ใช้ '!', '=', '<" หรือ '>' เพื่อประกาศสิ่งที่ต้องใช้ + + + Protocol + โพรโทคอล + + + Method + วิธีการ + + + URI + URI + + + User-agent + ชื่อผู้ใช้ + + + Most recurrent + กลับค่ามากที่สุด + + + Most trafficked + การจราจรส่วนใหญ่ + + + Date ever + วันที่ + + + Day of the week + วันของสัปดาห์ + + + Hour of the day + ชั่วโมง ของ วัน + + + Time taken + ใช้เวลา + + + Bytes sent + ไบต์ที่ส่ง + + + Bytes received + ไบต์ที่ได้รับ + + + Mean/Max performances + การแสดง/ max + + + Requests received + ร้องขอ + + + Total work + จํานวนงานรวม + + + General + ค่าทั่วไป + + + Window + หน้าต่าง + + + Dialogs + กล่อง + + + Charts + แผนภูมิ + + + Appearance + รูปลักษณ์ + + + Speed + ความเร็ว + + + Relational + ส่วนขยาย + + + TextBrowser + ตัวเรียกข้อความ + + + Databases + ฐานข้อมูล + + + Security + ความปลอดภัย + + + Logs + ปูมบันทึก + + + Defaults + ค่าปริยาย + + + Control + ควบคุม + + + Path + ตําแหน่ง + + + Format + รูปแบบ + + + Warnlists + แจ้งเตือน + + + Blacklists + แบล็คลิสต์ + + + Remember the window's position and size + จดจําตําแหน่งและขนาดของหน้าต่าง + + + Remember position and size + จดจําตําแหน่งและขนาด + + + Remember window's position and size + จดจําตําแหน่งของหน้าต่างและขนาดของหน้าต่าง + + + Geometry + เรขาคณิต + + + Theme to use for the window + ชุดตกแต่งที่จะใช้กับหน้าต่าง + + + Theme + ชุดตกแต่ง + + + Native + พื้นบ้าน + + + Light + แสง + + + Dark + เข้ม + + + Auto + อัตโนมัติ + + + Icons + ภาพไอคอน + + + Normal quantity of dialog messages shown + แสดงข้อความปกติ + + + Normal + ปกติ + + + Dialogs from the main processes + กล่องจากโพรเซสหลัก + + + Dialogs emitted when parsing logs + กล่องโต้ตอบที่ปล่อยออกมาเมื่อแสดงปูมบันทึก + + + Logs parser + ตัววิเคราะห์ปูมบันทึก + + + Dialogs emitted when viewing statistics + กล่องที่ปล่อยออกมาเมื่อดูสถิติ + + + Statistics viewer + เครื่องมือดูสถิติ + + + Define the quantity of dialog mesages shown + กําหนดปริมาณของกล่องที่จะให้แสดง + + + Dialogs level + ระดับกล่องโต้ตอบ + + + Reduced quantity of dialog messages shown + ลดจํานวนข้อความในกล่องโต้ตอบที่แสดง + + + Essential + สําคัญ + + + Augmented quantity of dialog messages shown + Comment=รายการจดหมายName + + + Explanatory + การ วาง แผน + + + Theme to use for the Charts + ชุดตกแต่งที่จะใช้กับแผนภูมิ + + + Preview + แสดงตัวอย่าง + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + แสดงขั้นตอนในแกนเวลาในวินาที. +ค่าทั้งหมดที่ลดลงภายในช่วงเดียวกัน จะถูกรวมเข้าด้วยกัน และค่ากลางจะถูกใช้. + + + Time interval + ช่วงเวลา + + + The format to use for the labels of the time axis. + รูปแบบที่จะใช้สําหรับป้ายบนแกนเวลา. + + + Time format + รูปแบบเวลา + + + The size of the pie + ขนาดพาย + + + Pie size + ขนาดวงกลม + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + จํานวนชิ้นที่มากที่สุด ที่ถาดจะประกอบด้วย. +การแยกชิ้นส่วนจะถูกแบ่งออกเป็นหนึ่งชิ้น. + + + Maximum slices + เสี้ยวสูงสุด + + + Font to use for the Text Browser + แบบอักษรที่จะใช้สําหรับเรียกดูข้อความ + + + Font + แบบอักษร + + + Double-spaced lines + บรรทัดที่สองช่องว่าง + + + Use wide lines + ใช้บรรทัดกว้าง + + + Define the spacing between lines + กําหนดช่องว่างระหว่างบรรทัด + + + Lines spacing + ช่องว่างเส้น + + + None + ไม่มี + + + Color scheme to use for the Text Browser + ชุดสีที่จะใช้สําหรับเรียกดูข้อความ + + + Color scheme + ชุดสี + + + The appearance of the Text Browser with the current settings + รูปลักษณ์ของเบราว์เซอร์โดยใช้การตั้งค่าปัจจุบัน + + + Insert the base path only, file name excluded + แทรกพาธพื้นฐานเท่านั้น ไม่ใช้ชื่อแฟ้ม + + + The given path doen't exists, or doesn't point to a folder + พาธที่กําหนดให้ไม่มีอยู่ หรือไม่ได้ชี้ไปยังโฟลเดอร์ + + + Path for the database files + พาธของแฟ้มฐานข้อมูล + + + Paths + พาธ + + + Apply the current path + ปรับใช้พาธปัจจุบัน + + + Select the path through a dialog window + เลือกพาธผ่านทางหน้าต่างกล่องโต้ตอบ + + + Path where the logs data collection database is located + พาธที่ฐานข้อมูลคลังข้อมูลของปูมบันทึก + + + Logs data + ข้อมูลปูมบันทึก + + + Path where the used files hashes database is located + พาธที่ฐานข้อมูลของ Haches ที่ใช้ + + + Used files + แฟ้มที่ถูกใช้ + + + Backup options for the Logs Data database + ตัวเลือกการสํารองข้อมูลของฐานข้อมูลปูมบันทึก + + + Backups + สํารองข้อมูล + + + A new backup is made when closing LogDoctor after having succesfully edited the database + สํารองข้อมูลใหม่จะทําเมื่อปิด doctor หลังจากที่มีการปรับปรุงฐานข้อมูลอย่างสมบูรณ์แล้ว + + + Backup the Logs Data database and keep + สํารองข้อมูลฐานข้อมูลปูมบันทึกแล้วเก็บไว้ + + + Whether it is allowed or denied to follow symlinks occuring in a path + อนุญาตให้ทําหรือปฏิเสธในการติดตามการเชื่อมโยงที่เกิดขึ้นในพาธ + + + Follow symlinks + ติดตามการเชื่อมโยง + + + Default WebServer + แม่ข่ายเว็บปริยาย + + + Usage control + ควบคุมการใช้ + + + Hide already used files + ซ่อนแฟ้มที่ถูกใช้ไปแล้ว + + + Size warnings + แจ้งเตือนขนาด + + + Warn me when using files with a size exceeding: + แจ้งเตือนฉันเมื่อใช้แฟ้มที่มีขนาดมาก: + + + Logs folder + โฟลเดอร์ปูมบันทึก + + + Logs format string + ข้อความรูปแบบของปูมบันทึก + + + Format string + ข้อความรูปแบบ + + + Insert the format string you're using + แทรกข้อความฟอร์แมตที่คุณใช้อยู่ + + + Apply the current string + ปรับใช้ข้อความปัจจุบัน + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + สร้างบรรทัดปูมบันทึกตัวอย่างจากข้อความที่ถูกบันทึกในปัจจุบัน เพื่อตรวจสอบว่า ได้มีการฟอร์แมตอย่างถูกต้องหรือไม่ +ช่องข้อมูลใด ๆ ที่ไม่ได้พิจารณาโดย Doctor จะปรากฏเป็น 'DISCARDED' + + + Generate sample + สร้างตัวอย่าง + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + กรุณาตรวจสอบความถูกต้องของสายนี้ +ช่องข้อมูลที่ถูกตั้งสถานะเป็น 'DISCARDED' ถูกวิเคราะห์มาอย่างถูกต้อง แต่ไม่ได้พิจารณาโดยผู้กํากับปูมบันทึก + + + Open an help window + เปิดหน้าต่างช่วยเหลือ + + + Help + ช่วยเหลือ + + + Select a log field + เลือกช่องข้อมูลปูมบันทึก + + + Use warnlist for this field + ใช้รายการคําเตือนสําหรับช่องนี้ + + + Add the current line to the list + เพิ่มบรรทัดปัจจุบันไปยังรายการ + + + Remove the selected item from the list + ลบรายการที่เลือกออกจากรายการ + + + Move the selected item down + เลื่อนรายการที่เลือกลง + + + Use blacklist for this field + ใช้รายการดําสําหรับช่องนี้ + + + Add line + เพิ่มบรรทัด + + + Remove selection + ลบส่วนที่เลือก + + + Language + ภาษา + + + Utilities + ความจุ + + + Tools + เครื่องมือ + + + Games + เกม + + + Perform a version-check + ทําการตรวจสอบรุ่น + + + Show some info about LogDoctor + แสดงข้อมูลเกี่ยวกับตัวจัดการปูมบันทึก + + + Open a block-note like window to write temporary text + เปิดบล็อกโน้ตเช่น หน้าต่างเพื่อเขียนข้อความชั่วคราว + + + Play CrissCross + เล่น ChristCost + + + Play Snake + เล่นงู + + + Show the changelog + แสดงส่วนเปลี่ยนแปลง + + + warnlist + แจ้งเตือน + + + blacklist + แบล็คลิสต์ + + + copy + คัดลอก + + + copies + คัดลอก + + + Check updates + ตรวจสอบการปรับปรุง + + + Infos + ข้อมูล + + + BlockNote + บันทึกย่อของบล็อค + + + CrissCross + ค ริ สต จักร + + + Snake + งู + + + Changelog + เปลี่ยนบล็อก + + + + RichText + + Select a file from the list + เลือกแฟ้มจากรายการ + + + to inspect its content + เพื่อตรวจสอบเนื้อหา + + + Failed to read + ล้มเหลวในการอ่าน + + + + SnakeGame + + PLAY + เล่น + + + Classic + คลาสสิค + + + Hunt + ล่า + + + Battle + สงคราม + + + Game Over + จบเกม + + + Your adversary fell in the water! + ศัตรูของคุณลดลงในน้ํา! + + + YOU WON! + คุณล่ะ! + + + You fell in the water! + คุณตกลงไปในน้ํา! + + + YOU LOST! + คุณแพ้! + + + Your adversary ate itself! + ศัตรูของคุณกินตัวเอง! + + + You ate yourself! + คุณกินตัวเอง! + + + Your adversary ate you! + ศัตรูของเจ้ากินเจ้า! + + + You ate your adversary! + คุณกินศัตรูของคุณ! + + + You ate each other! + คุณกินกันเอง! + + + MATCH IS DRAW! + มัธชเป็น DRAW! + + + + TR + + Unexpected WebServer + แม่ข่ายเว็บที่ไม่คาดคิด + + + Logs Size Breakdown + ขนาดปูมบันทึกของปูมบันทึก + + + Ignored + ไม่สนใจ + + + Parsed + แปรงทาสี + + + Blacklisted + แบล็คลิสต์ + + + Others + อื่น ๆ + + + from + จาก + + + to + ถึง + + + Log Lines Marked as Warning + Log Lines Marked as Warning + + + Time Taken to Serve Requests + ใช้ เวลา เพื่อ รับ ใช้ ตาม ที่ ขอ + + + Time of Day Count + เวลาของวัน + + + Relational Count + จํานวนการรวม + + + FALSE + ประชากร + + + TRUE + จริง + + + Date + วันที่ + + + Year + ปี + + + Month + เดือน + + + Day + วัน + + + Time + เวลา + + + Hour + ชั่วโมง + + + Minute + นาที + + + Second + วินาที + + + Warning + คําเตือน + + + Protocol + โพรโทคอล + + + Method + วิธีการ + + + URI + URI + + + Query + สืบค้น + + + Response code + รหัสการตอบโต้ + + + Time taken + ใช้เวลา + + + Bytes sent + ไบต์ที่ส่ง + + + Bytes received + ไบต์ที่ได้รับ + + + Referrer + ตัวอ้างอิง + + + Cookie + คุกกี้ + + + Client + ลูกข่าย + + + User-agent + ชื่อผู้ใช้ + + + January + มกราคม + + + February + กุมภาพันธ์ + + + March + มีนาคม + + + April + เมษายน + + + May + พฤษภาคม + + + June + มิถุนายน + + + July + กรกฎาคม + + + August + สิงหาคม + + + September + กันยายน + + + October + ตุลาคม + + + November + พฤศจิกายน + + + December + ธันวาคม + + + Sunday + อาทิตย์ + + + Monday + จันทร์ + + + Tuesday + อังคาร + + + Wednesday + วันพุธ + + + Thursday + พฤหัสบดี + + + Friday + ศุกร์ + + + Saturday + เสาร์ + + + diff --git a/logdoctor/translations/LogDoctor_tl_PH.ts b/logdoctor/translations/LogDoctor_tl_PH.ts new file mode 100644 index 0000000..9944039 --- /dev/null +++ b/logdoctor/translations/LogDoctor_tl_PH.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Mga Bersiyon + + + Version 4 + Bersiyon 4 + + + Version 3 + Bersiyon 3 + + + Version 2 + Bersiyon 2 + + + Version 1 + Bersiyon 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Gumawa ng mga iskrip + + + Cross-platform compatibility: + Pagtutugma ng cross-platform: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Estadistika: + + + Warnings + Mga Babala + + + Speed + Bilis + + + Counts + Mga Konde + + + Daytime + Panahon ng Araw + + + Relational + Pagpapalitan + + + Globals + Pangglobong mga Sistema + + + Translations: + Salin: + + + Italian + Italyano + + + Spanish + Kastila + + + French + Pranses + + + Tools: + Mga kagamitan: + + + Block note + Block note + + + Utilities: + Mga kagamitan: + + + Infos viewer + Tagatingin ng Infos + + + Updates checker + Updated checker + + + Themes: + Themes: + + + Dark + Madilim + + + Light + Liwanag + + + Improvements and fixes + Mga Pagpapabuti at Pag - aayos + + + New themes: + Mga bagong tema: + + + Ash + Abo + + + Candy + Candy + + + Forest + Kagubatan + + + Powder + Powder + + + Restyled GUI + Binagong GUI + + + Restyled dialogs + Pinalitang mga dialogo + + + Doxygen documentation + Doxygen dokumentasyon + + + Mini-Games: + Mini-Games: + + + Criss-cross + Criss-cross + + + Snake + Ahas + + + Changed default paths + Binago ang default na mga landas + + + New game modes for Snake + Mga bagong game mode para sa Ahas + + + Hunt + Paghahanap + + + Battle + Labanan + + + New translations: + Mga bagong salin: + + + Japanese + Hapones + + + Portuguese + Portuges + + + Code improvements + Mga pagpapabuti sa Kodigo + + + Performance improvements + Gumawa ng mga pagsulong + + + Added tests suite: + Karagdagang mga pagsubok: + + + white box tests + mga pagsubok sa puting kahon + + + Customized charts themes + Ang kinaugaliang mga tema ng tsart + + + Fixes + Mga Fix + + + Tests improvements + Mga Pagsubok sa Pagsulong + + + Docker support + Suporta ng Docker + + + Upgrade to C++20 + Upgrade to C++20 + + + Upgrade to Qt6 + Hanggang Qt6 + + + Restyled themes + Mga natitirang tema + + + Redesigned configs section + Pinalitang bahagi + + + Stability improvements + Mga pagpapabuti sa Matatag + + + Generating warnings dinamically + Kahanga - hangang pagbibigay ng babala + + + New tool: + Bagong kagamitan: + + + Changelog + Palitan + + + Tweakable parameters for some of the charts: + Mahihinang parameter para sa ilan sa mga tsart: + + + Improved project structure + Pinahusay na kayarian ng proyekto + + + Modernized Cmake usage + Ginawang Makabago Gamitin + + + + Crapinfo + + Version + Bersiyon + + + Currently installed version of the software + Kasalukuyang naka-install na bersyon ng software + + + Repository links + Mga kawing ng repositoryo + + + Paths + Landas + + + The path of the executable file + Ang landas ng talaksang maaaring alisin + + + Executable + Maaalis + + + The path where the configuration file gets saved and searched in + Ang landas kung saan natitipid ang talaksan ng pagsasaayos at naghahanap + + + Configuration file + Configuration file + + + The path where the application searches for extra resources + Ang landas kung saan hinahanap ng aplikasyon ang karagdagang mga yaman + + + Application data + Pagkakapit ng datos + + + + Crapnote + + Reduce the font size + Bawasan ang katamtamang laki + + + Font size + Maliit na sukat + + + Increase the font size + Palakihin ang katamtamang laki + + + + Crappath + + Choose + Pumili + + + Cancel + Huwag ituloy + + + + Crapup + + Checking for updates + Pagsusuri sa mga update + + + New version available + Bagong bersyon na magagamit + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + May makukuhang bagong bersiyon! +Pakisuyong dalawin ang imbakan ni LogDoctor at sundin ang tagubilin kung paano mag - update + + + No update found + Walang nahanap na update + + + LogDoctor is up-to-date + Si LogDoctor ay up-to-date + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Ikaw ay nagpapatakbo ng isang bersyon mula sa hinaharap! +Ang inyong bersiyon ay higit pa sa kasalukuyang bersiyon sa pasalungat sa agos +Ikaw ba ang nagpapatakbo ng orihinal na LogDoctor? +Pakisuyong dalawin ang talaan ng LogDoctor at kumuha ng bagong bersiyon nito + + + Failed to establish a connection + Sawi sa pagtatatag ng koneksyon + + + Connection error, please try again later + error sa koneksyon, subukan muli mamaya + + + Connection timed out + Nagkaroon ng koneksyon + + + Version check failed + Bigo ang tseke ng Version + + + An error occured while parsing: +version mark not found + Nagkaroon ng error habang naka-parsing: +Hindi mahanap ang markang bersyon + + + An error occured while parsing: +malformed version + Nagkaroon ng error habang naka-parsing: +di-pormal na bersyon + + + An error occured while comparing: +malformed upstream version + Nagkakaroon ng pagkakamali habang naghahambing: +Di - maayos na bersiyon sa itaas ng ilog + + + + CrissCross + + Victory + Tagumpay + + + You beated me! + Natuwa ako! + + + This time you lost! + Sa pagkakataong ito ay nawala ka! + + + Draw + Drowing + + + Nice match + Magandang posporo + + + + DialogBool + + Yes + Mayroon + + + No + Hindi + + + + DialogIda + + Ignore + Pagwawalang - bahala + + + Discard + Itapon + + + Abort + Abort + + + + DialogMsg + + Ok + Ok + + + + DialogSec + + One of the lists has an invalid item + Ang isa sa mga talaan ay may hindi tanggap na bagay + + + An error occured while reading the configuration file + Nagkaroon ng error habang binabasa ang tipunang pagsasaayos + + + An error occured while parsing configuration file's data + May error sa pag-redirect ng datos + + + Failed to create the configuration file's directory + Sawi sa paglikha ng directory ng tipunang pagsasaayos + + + Failed to create the configuration file + Sawi sa paglikha ng tipunang pagsasaayos + + + An error occured while writing the configuration file + Nagkaroon ng pagkakamali habang isinusulat ang tipunang pagsasaayos + + + An error occured while preparing the configuration file's data + Nagkaroon ng error habang inihahanda ang data ng configuration file + + + The path contains a symlink + Naglalaman ang landas ng pag - aalsa + + + The file does not exist + Ang talaksan ay hindi umiiral + + + Failed to create the database backups' directory + Sawi sa paglikha ng database backups' directory + + + Failed to copy the database file + Sawi sa paggaya ng talaksang database + + + Failed to update the backups + Sawi sa pag-update ng mga backup + + + Failed to create the directory + Sawi ang paglikha ng directory + + + Unrecognized entry + Hindi makilalang ipinasok + + + Size of the file + Laki ng talaksan + + + Warning size parameter + Babalang sukat ng parameter + + + Failed to read gzipped file + Sawi sa pagbasa ng talaksang gzipped + + + An error occured while parsing the format string + Nagkaroon ng error habang naka-track ang format string + + + Available memory + Makukuhang memorya + + + Size of the logs + Laki ng mga troso + + + An error occured while reading the gzipped file + Nagkaroon ng error habang binabasa ang talaksang gzipped + + + An error occured while reading the file + Nagkaroon ng error habang binabasa ang talaksan + + + Something failed while handling the file + May nabigo habang hawak ang talaksan + + + An error occured while working on the database + Nagkaroon ng pagkakamali habang gumagawa sa database + + + Aborting + Pag - aalsa + + + Invalid locale + Hindi tanggap na lugar + + + Unexpected locale format + Di - inaasahang format ng lugar + + + If you haven't manually edited the configuration file, +please report this issue + Kung hindi mo manu-manong inayos ang talaksang pagsasaayos, +Pakisuyong iulat ang labas na ito + + + The given locale is not an accepted language + Ang ibinigay na lokale ay hindi isang tinatanggap na wika + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Kung nais mong magkaroon nitong lokale sa LogDoctor, +Pakisuyong sundin ang tagubilin sa kalakip na pahina + + + Configuration file not found + Hindi nahanap ang talaksang configuration + + + Unable to retrieve the configuration file + Hindi makuha ang talaksan ng pagsasaayos + + + Skipping + Pag - iiski + + + An error occured while handling the configuration file + Nagkaroon ng pagkakamali habang hawak ang talaksang pagsasaayos + + + Failed to write the configuration file + Bigo sa pagsusulat ng talaksang pagsasaayos + + + Current configuration not saved + Hindi nailigtas ang kasalukuyang kaayusan + + + File not readable + Hindi mabasa ang talaksan + + + The file is not readable + Hindi mabasa ang talaksan + + + File not writable + Hindi mabasa ang talaksan + + + The file is not writable + Hindi mabasa ang talaksan + + + Directory not writable + Di - angkop na Maging Direktor + + + The directory is not writable + Ang directory ay hindi maaaring gamitin + + + Invalid path + Hindi tanggap na landas + + + Failed applying configuration + Sawi sa pagkakapit ng pagsasaayos + + + Invalid configuration lines + Hindi tanggap na mga linya ng pagsasaayos + + + Has not been possible to apply some of the configurations + Hindi naging posible na ikapit ang ilan sa mga kaayusan + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Kung pipiliin mong magpatuloy, lahat ng hindi naiayos na mga kaayusan ay mawawala +Magpatuloy? + + + Failed to retrieve the help file + Sawi sa pagkuha ng talaksang pantulong + + + An error occured while getting the help file + Nagkaroon ng error habang nakukuha ang talaksan ng tulong + + + Additional resources can be downloaded from the git repo + Makakakuha pa ng karagdagang yaman mula sa repo ng git + + + Unable to retrieve the file + Hindi makuha ang talaksan + + + Invalid string + Hindi tanggap na string + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Ang ibinigay na string ay hindi tanggap at hindi maaaring idagdag sa talaan + +Pakisuyong ituwid ito at muling ituwid + + + QSql driver not found + Hindi nahanap ang drayber ng QSql + + + Failed to retrieve the driver needed to handle the database + Sawi sa pagkuha ng sasakyan na kailangan upang pangasiwaan ang database + + + File not found + Hindi nakita ang talaksan + + + Failed to retrieve the database file + Sawi sa pagkuha ng talaksang database + + + Create a new database? + Gumawa ng bagong database? + + + The database contains an unexpected table + Naglalaman ang database ng di - inaasahang mesa + + + Unexpected table + Hindi inaasahang mesa + + + It seems that the database is missing a table + Waring kulang sa mesa ang database + + + Table not found + Hindi nahanap ang Talaan + + + The database contains an unexpected column + Naglalaman ang database ng di - inaasahang kolum + + + Unexpected column + Hindi inaasahang kolum + + + It seems that the table is missing a column + Waring ang mesa ay wala sa isang kolum + + + Column not found + Hindi natagpuan si Column + + + A column has an unexpected data-type + Ang isang kolum ay may hindi inaasahang data-type + + + Unexpected data-type + Hindi inaasahang datos-type + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Ang database na ito ay muling tatawagin gamit ang bakas na '.copy' at ang isang bago ay lilikhain. +Magpatuloy? + + + Database created + Nilikha ang Database + + + Successfully created a new database + Matagumpay na nakagawa ng bagong database + + + Not a file + Hindi talaksan + + + The path was supposed to point to a file, but it doesn't + Ang landas ay dapat na nakaturo sa isang file, subalit hindi ito nakatutok + + + Please remove the conflict and retry + Pakisuyong alisin ang alitan at muling pag - isipan + + + The database file is not readable + Hindi mabasa ang talaksang database + + + Please set the proper permissions and retry +If this error persists, please report this issue + Pakisuyong magtakda ng angkop na mga pahintulot at muling pagtatayo +Kung magpapatuloy ang pagkakamaling ito, pakisuyong iulat ang isyung ito + + + The database file is not writable + Hindi mabasa ang talaksang database + + + Invalid database path + Hindi tanggap na landas ng database + + + Failed creating database + Sawi sa paglikha ng database + + + An error occured while creating the database + Nagkaroon ng error habang nililikha ang database + + + Failed opening database + Sawi sa pagbukas ng database + + + An error occured while opening the database + Nagkaroon ng pagkakamali habang binubuksan ang database + + + Failed executing on database + Sawi ang pagpatakbo sa database + + + An error occured while executing a statement on the database + Nagkaroon ng pagkakamali habang isinasagawa ang isang pangungusap sa database + + + Failed to backup database + Sawi sa pag-upload ng database + + + Please report this issue + Pakisuyong iulat ang labas na ito + + + Invalid log format string + Hindi tanggap na string ng log format + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Pakisuyong tingnan na walang error ang inyong Web Assumer +Kung ito'y tanggapin, pakisuyong suriin ang pagkanaroroon ng isang typo rito +Kung ang lahat ay mabuti, pakisuyong iulat ang isyung ito + + + Log format error + Maling format + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Hindi pa naitatakda ang log format, o walang bisa +Pakisuyong magdagdag ng isa na may bisa sa mga kaayusan + + + Misconfigured log format + Hindi nakaayos na log format + + + No log field has been set in the current logs format, +making it useless to parse logs + Walang ipinasok na troso sa kasalukuyang format, +ginagawang walang silbi ang pag-parse ng mga troso + + + Please set up a format which contains at least one field + Maglagay ng format na naglalaman ng kahit isang field + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Ang isang separator ay nawawala sa pagitan ng isa o higit pang mga larangan, +Na mahirap magtatag ng mga hangganan ng lambat, +at posibleng mag - imbak ng maling impormasyon + + + Please set up a format which contains separators between fields + Pakisuyong maglagay ng isang format na naglalaman ng mga separator sa pagitan ng mga larangan + + + Missing field in log format + Nawawalang field sa anyong log + + + An important field is missing from the provided format: + Isang mahalagang larangan ang wala sa inilaang format: + + + The quality of the statistics may be seriously compromized + Ang kalidad ng mga estadistika ay maaaring seryosong pagsamahin + + + Proceed anyway? + Napigilan ba? + + + 'Carriage Return' in log format + 'Carriage Return' sa log format + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Ang inilaang format ay naglalaman ng 'Carriage Return'. +Ito'y maaaring humantong sa pagkawala ng impormasyon o pagbagsak kung hindi gagamitin nang maingat + + + An error occured while parsing logs + Nagkaroon ng pagkakamali habang nagrarasyon ng mga troso + + + Failed defining type + Sawi sa pagtukoy ng uri + + + Failed to determine the log type + Sawi sa pagtiyak ng uri ng log + + + File already used + Ginamit na ang talaksan + + + The file has probably been used already + Ang talaksan ay malamang na ginamit na + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Ipagwalang - bahala ang babala at gamitin ito, alisin ito at ipagpatuloy ito, o itigil ang buong proseso? + + + Duplicate file + Ilagay ang talaksang Diplicate + + + The file appears twice in the list of selections + Ang file ay lumilitaw ng dalawang beses sa listahan ng mga pagpipilian + + + Failed updating hashes + Sawi ang pag-upding ng haches + + + An error occured while inserting the parsed files hashes into the database + Isang error ang nangyayari habang ipinapasok ang mga talaksang may parsed sa database + + + File exceeds warning size + Ang talaksan ay nakahihigit sa nagbababalang laki + + + The file's size exceeds the warning size + Ang laki ng talaksan ay nakahihigit sa babalang laki + + + Not enough memory + Hindi sapat ang memorya + + + The total size of the selected files exceeds the available memory + Ang kabuuang laki ng napiling mga file ay nakahihigit sa magagamit na memory + + + Please free some resources, parse the files in different steps or split them into smaller units + Pakisuyong alisin ang ilang yaman, i-parse ang mga file sa iba't ibang baitang o hatiin ang mga ito sa mas maliliit na yunit + + + Failed reading + Sawi ang pagbabasa + + + File is empty + Walang laman ang talaksan + + + The file is blank + Ang talaksan ay blangko + + + Failed to retrieve the selected file + Sawi sa pagkuha ng napiling talaksan + + + Discard it and continue, or Abort all and exit? + Itapon ito at magpatuloy, o itigil ang lahat at lumabas? + + + No file to parse + Walang talaksang i-parse + + + The list of files to parse is empty + Walang laman ang listahan ng mga talaksan na i-parse + + + Directory not found + Hindi nahanap ang Directory + + + The directory does not exists + Ang directory ay hindi umiiral + + + Directory not readable + Hindi mabasa ang direktoryo + + + The directory is not readable + Ang directory ay hindi mabasa + + + Please set the proper permissions before to start + Pakisuyong magtakda ng tamang pahintulot bago magsimula + + + Failed creating directory + Sawi ang paglikha ng directory + + + The path does not exists + Hindi umiiral ang landas + + + Data conversion failed + Bigo ang pagkumberte ng mga Data + + + Failed to convert from '%1' to '%2' + Sawi ang pagkumberte mula '%1' tungong '%2' + + + Failed to create statistics + Sawi ang paglikha ng mga estadistika + + + An error occured while processing + Nagkaroon ng pagkakamali habang nagpoproseso + + + Cannot create statistics + Hindi malikha ang mga estadistika + + + No data has been found that matches with the currently set parameters + Walang natagpuang datos na tumutugma sa kasalukuyang itinakdang mga parameter + + + Not a folder + Hindi isang folder + + + The path was supposed to point to a folder, but it doesn't + Ang landas ay dapat sanang nakaturo sa isang folder, subalit hindi nito itinuturo + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Ang entry ay muling tatawagin sa pamamagitan ng isang bakas '.copy' at ang isang bago ay lilikhain. +Magpatuloy? + + + An error occured + Nagkaroon ng pagkakamali + + + Failed renaming + Bigo ang papalit ng pangalan + + + An error occured while renaming + Nagkaroon ng pagkakamali habang nagpapalit ng pangalan + + + + GameDialog + + Ok + Ok + + + + MainWindow + + Parse logs from the Apache2 web server + Mga troso ng Apache2 web server + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Mga troso ng Nginx web server + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Mga trosong Parse mula sa web server ng Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Pumili/deselect ang lahat ng files + + + All + Lahat + + + Inspect a log file + Suriin ang log file + + + Name + Pangalan + + + Size + Laki + + + Refresh the list + Baguhin ang listahan + + + Total size of the parsed data + Kabuuang sukat ng pardong datos + + + Total number of parsed lines + Kabuuang bilang ng mga pardong linya + + + Start parsing the selected files + Paandarin ang talaksang pinili + + + START + ANG PANGMALAS NG BIBLIYA + + + Time elapsed since the start + Lumipas ang panahon mula nang magsimula + + + Average speed, in parsed data size per second + Katamtamang bilis, sa parsed data na sukat sa bawat segundo + + + Web Server + Web Server + + + Select a Web Server + Pumili ng Web Server + + + Year + Taon + + + Month + Buwan + + + Day + Araw + + + Hour + Oras + + + Draw the chart + Idrowing ang tsart + + + Log line marked as Warning + Log line na minarkahan bilang Babala + + + Date when the request arrived (YYYY-MM-DD) + Petsa nang dumating ang kahilingan (YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + Panahon nang dumating ang kahilingan (h:mm:ss) + + + Protocol of the request + Protocol ng kahilingan + + + Method of the request + Pamamaraan ng kahilingan + + + URI of the requested page + URI ng hiniling na pahina + + + Query carried along with the URI + Ang Query ay may dalang URI + + + Response code from the server + Pagtugon mula sa server + + + User-agent of the client which made the request + User-agent ng kliyente na gumawa ng kahilingan + + + IP address of the Client which made the request + IP adres ng Client na humiling + + + Cookie used for the request + Ginamit ni Cookie ang kahilingan + + + The URL which redirected the Client to the requested page + Ang URL na nagreredirect sa Client sa hiniling na pahina + + + Size ib Bytes of the request, usually includes header and data + Size ib Bytes ng kahilingan, karaniwang kasama ang header at data + + + Size in Bytes of the served content, usually includes header and data + Tignan sa Bytes ng naihaing nilalaman, karaniwang kasama ang header at datos + + + Time taken by the server to serve the content, in milliseconds + Panahon na kinukuha ng server upang ihain ang nilalaman, sa mga millisecond + + + Only use lines in which the field is starting with this string + Gumamit lamang ng mga linya kung saan nagsisimula ang field sa string na ito + + + Protocol: + Protocol: + + + Method: + Pamamaraan: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Gumamit lamang ng mga linya kung saan ang larangan ay tumutugma sa pangungusap na ito. +Gamitin ang '!', '=', '<' o '>' upang ipahayag kung ano ang gagamitin + + + Response: + Sagot: + + + Query: + Tanong: + + + URI: + URI: + + + Filters + Mga Pansala + + + Count + Isalang + + + Number of occurrences + Bilang ng mga pangyayari + + + Item + Bagay + + + Value of the field + Kahalagahan ng larangan + + + From: + Mula sa: + + + To: + Sa: + + + Select a log field to view + Pumili ng log field na titingnan + + + Field: + Larangan: + + + Filter: + Tala: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + Sa mga kuwerdas, tanging ang mga linya lamang kung saan nagsisimula ang field sa strandong ito ang gagamitin. +Sa pamamagitan ng mga numero, gamitin '!', '=', '<' o '>' upang ipahayag kung ano ang gagamitin + + + Protocol + Protocol + + + Method + Pamamaraan + + + URI + URI + + + User-agent + User-agent + + + Most recurrent + Pinakaulit - ulit + + + Most trafficked + Karamihan ay ilegal + + + Date ever + Makipag - date + + + Day of the week + Araw ng sanlinggo + + + Hour of the day + Oras ng maghapon + + + Time taken + Gumugol ng panahon + + + Bytes sent + Ipinadala si Bytes + + + Bytes received + Nakatanggap si Bytes + + + Mean/Max performances + Kahulugan/Mga pagtatanghal ng max + + + Requests received + Tumanggap ng mga kahilingan + + + Total work + Kabuuang gawain + + + General + Heneral + + + Window + Window + + + Dialogs + Mga Dialogo + + + Charts + Mga Chart + + + Appearance + Hitsura + + + Speed + Bilis + + + Relational + Pagpapalitan + + + TextBrowser + TextBrowser + + + Databases + Mga Databas + + + Security + Katiwasayan + + + Logs + Mga Log + + + Defaults + Mga Pagbagsak + + + Control + Pagkontrol + + + Path + Landas + + + Format + Kamag - anak + + + Warnlists + Mga Punalista + + + Blacklists + Mga Blacklist + + + Remember the window's position and size + Tandaan ang posisyon at laki ng bintana + + + Remember position and size + Tandaan ang posisyon at laki + + + Remember window's position and size + Tandaan ang posisyon at laki ng bintana + + + Geometry + Kabihasnan + + + Theme to use for the window + Tema na gagamitin sa bintana + + + Theme + Tema + + + Native + Katutubo + + + Light + Liwanag + + + Dark + Madilim + + + Auto + Awto + + + Icons + Mga Imahen + + + Normal quantity of dialog messages shown + Ang normal na dami ng mga mensahe sa dialog na ipinakita + + + Normal + Normal + + + Dialogs from the main processes + Mga dialogo mula sa pangunahing mga proseso + + + Dialogs emitted when parsing logs + Ang mga dialog ay naglalabas kapag naglalagay ng mga troso + + + Logs parser + Logs parser + + + Dialogs emitted when viewing statistics + Naglalabas ang mga dialog kapag nanonood ng estadistika + + + Statistics viewer + Tagapanood ng estadistika + + + Define the quantity of dialog mesages shown + Ipaliwanag ang dami ng dialog mesage na ipinakikita + + + Dialogs level + antas ng dialogs + + + Reduced quantity of dialog messages shown + Binabawasan ang dami ng mga mensahe sa dialog na ipinakikita + + + Essential + Mahalaga + + + Augmented quantity of dialog messages shown + Maraming ipinakitang dialog na mensahe + + + Explanatory + Labasan + + + Theme to use for the Charts + Tema na gagamitin sa mga Tsar + + + Preview + Patiunang Pag - isipan + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Kumakatawan sa isang hakbang sa panahong axis, sa loob lamang ng ilang segundo. +Ang lahat ng mga halaga na nahuhulog sa loob ng parehong pagitan ay pagsasamahin at ang kahulugang halaga ay gagamitin. + + + Time interval + pagitan ng panahon + + + The format to use for the labels of the time axis. + Ang format na gagamitin sa mga etiketa ng time axis. + + + Time format + format ng Oras + + + The size of the pie + Ang laki ng pie + + + Pie size + sukat ng damo + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Ang pinakamaraming hiwa na mabubuo sa pie. +Ang mas maraming hiwa ay igugrupo sa isang komprehensibong hiwa. + + + Maximum slices + Mga hiwa ng Maximum + + + Font to use for the Text Browser + Font upang gamitin para sa Text Browser + + + Font + Suot + + + Double-spaced lines + Dalawang-spaced na linya + + + Use wide lines + Gumamit ng malalapad na linya + + + Define the spacing between lines + Alamin ang pagkakaiba ng mga linya + + + Lines spacing + Pagkakaiba ng mga linya + + + None + Wala + + + Color scheme to use for the Text Browser + " Color scheme " na gagamitin para sa Text Browser + + + Color scheme + Planong kulay + + + The appearance of the Text Browser with the current settings + Ang paglitaw ng Tekstong Browser na may kasalukuyang mga setting + + + Insert the base path only, file name excluded + Ipasok sa base path lamang, hindi kasali ang pangalan ng talaksan + + + The given path doen't exists, or doesn't point to a folder + Ang ibinigay na landas ay hindi umiiral, o hindi nakaturo sa isang folder + + + Path for the database files + Landasin ang mga file ng database + + + Paths + Landas + + + Apply the current path + Ikapit ang kasalukuyang landas + + + Select the path through a dialog window + Pumili ng landas sa pamamagitan ng dialog window + + + Path where the logs data collection database is located + Landas kung saan matatagpuan ang logo data collection database + + + Logs data + Sinasagap ang datos + + + Path where the used files hashes database is located + Landas kung saan matatagpuan ang ginagamit na files hashes database + + + Used files + Ginamit na mga file + + + Backup options for the Logs Data database + Mga opsyon sa likod para sa database ng Logs Data + + + Backups + Mga Pagbabalik + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Isang bagong backup ang ginagawa kapag nagsasara ng LogDoctor pagkatapos na mai - edit ang database + + + Backup the Logs Data database and keep + Backup ang Logs Data database at itago + + + Whether it is allowed or denied to follow symlinks occuring in a path + Pinahihintulutan man o hindi na sumunod sa mga sneakers na nangyayari sa isang landas + + + Follow symlinks + Sundan ang mga DUNGKOt + + + Default WebServer + Default Web Prosista + + + Usage control + Pagkontrol sa paggamit + + + Hide already used files + Itago ang nagamit nang mga files + + + Size warnings + Suriin ang mga babala + + + Warn me when using files with a size exceeding: + Ako'y binabalaan kapag gumagamit ng mga file na may sukat na higit pa: + + + Logs folder + Logs folder + + + Logs format string + Mga Logs formating string + + + Format string + Pamagat na string + + + Insert the format string you're using + Ilagay ang format string na ginagamit mo + + + Apply the current string + Pahiran ang kasalukuyang kuwerdas + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Prituhin ang isang sampol na log line mula sa kasalukuyang natitipid na strando, upang tingnan kung ito'y nakokodigo nang wasto. +Ang anumang larangan na hindi itinuturing ng LogDoctor ay lilitaw bilang 'DISCARDED' + + + Generate sample + Mga sampol ng Generate + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Pakisuyong tingnan ang kawastuan ng linyang ito. +Ang mga bukid na minarkahan bilang 'DISCARDED' ay tama ang pagkakapars, ngunit hindi ito itinuturing ng LogDoctor + + + Open an help window + Buksan ang bintana ng tulong + + + Help + Tulong + + + Select a log field + Pumili ng log field + + + Use warnlist for this field + Gumamit ng babala para sa larangang ito + + + Add the current line to the list + Ilagay ang kasalukuyang linya sa listahan + + + Remove the selected item from the list + Alisin sa listahan ang napiling bagay + + + Move the selected item down + Ilipat ang napiling bagay pababa + + + Use blacklist for this field + Gumamit ng blacklist para sa larangang ito + + + Add line + Magdagdag ng linya + + + Remove selection + Alisin ang select + + + Language + Wika + + + Utilities + Mga kagamitan + + + Tools + Mga Kasangkapan + + + Games + Mga Laro + + + Perform a version-check + Magsagawa ng bersyon-check + + + Show some info about LogDoctor + Ipakita ang ilang info tungkol sa LogDoctor + + + Open a block-note like window to write temporary text + Buksan ang block-note tulad ng window upang isulat ang temporary text + + + Play CrissCross + Maglaro ng CrissCross + + + Play Snake + Maglaro ng Ahas + + + Show the changelog + Ipakita ang changelog + + + warnlist + tagapagbabala + + + blacklist + " blacklist " + + + copy + kopya + + + copies + mga kopya + + + Check updates + Tingnan ang mga update + + + Infos + Mga Info + + + BlockNote + BlockNote + + + CrissCross + Mga CrissCros + + + Snake + Ahas + + + Changelog + Palitan + + + + RichText + + Select a file from the list + Pumili ng talaksan mula sa listahan + + + to inspect its content + upang suriin ang nilalaman nito + + + Failed to read + Sawi ang pagbabasa + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klasiko + + + Hunt + Paghahanap + + + Battle + Labanan + + + Game Over + Tapos Na ang Laro + + + Your adversary fell in the water! + Ang inyong kalaban ay nahulog sa tubig! + + + YOU WON! + IKAW AY NAGLALAKAD! + + + You fell in the water! + Ikaw ay nahulog sa tubig! + + + YOU LOST! + MAKINIG KA! + + + Your adversary ate itself! + Ang inyong kalaban ay kumain! + + + You ate yourself! + Ikaw mismo ay kumain! + + + Your adversary ate you! + Kinain ka ng kalaban mo! + + + You ate your adversary! + Kumain ka ng kalaban mo! + + + You ate each other! + Kumain kayo! + + + MATCH IS DRAW! + ANG METCH AY NATUTUWID! + + + + TR + + Unexpected WebServer + Di - inaasahang Web Provider + + + Logs Size Breakdown + Pinatitindi ng mga Log ang Pagkawasak + + + Ignored + Ipinagwalang - bahala + + + Parsed + Pinayagan + + + Blacklisted + Inilisang Itim + + + Others + Iba Pa + + + from + mula sa + + + to + hanggang sa + + + Log Lines Marked as Warning + Mga Log Lines na Tinukoyng Babala + + + Time Taken to Serve Requests + Panahon Upang Maglingkod sa mga Kahilingan + + + Time of Day Count + Mahalaga ang Panahon ng Araw + + + Relational Count + Mahalagang Reylyon + + + FALSE + LANGIS + + + TRUE + TUNAY + + + Date + Petsa + + + Year + Taon + + + Month + Buwan + + + Day + Araw + + + Time + Panahon + + + Hour + Oras + + + Minute + Buwan + + + Second + Ikalawa + + + Warning + Babala + + + Protocol + Protocol + + + Method + Pamamaraan + + + URI + URI + + + Query + Tanong + + + Response code + Response code + + + Time taken + Gumugol ng panahon + + + Bytes sent + Ipinadala si Bytes + + + Bytes received + Nakatanggap si Bytes + + + Referrer + tagatukoy + + + Cookie + Lutuin + + + Client + Kliente + + + User-agent + User-agent + + + January + Enero + + + February + Pebrero + + + March + Marso + + + April + Abril + + + May + Mayo + + + June + Hunyo + + + July + Hulyo + + + August + Agosto + + + September + Setyembre + + + October + Oktubre + + + November + Nobyembre + + + December + Disyembre + + + Sunday + Linggo + + + Monday + Lunes + + + Tuesday + Martes + + + Wednesday + Miyerkules + + + Thursday + Huwebes + + + Friday + Biyernes + + + Saturday + Sabado + + + diff --git a/logdoctor/translations/LogDoctor_tr_TR.ts b/logdoctor/translations/LogDoctor_tr_TR.ts new file mode 100644 index 0000000..1e67325 --- /dev/null +++ b/logdoctor/translations/LogDoctor_tr_TR.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Versions + + + Version 4 + Version 4 + + + Version 3 + Version 3 + + + Version 2 + Version 2 + + + Version 1 + Version 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + Build scripts + + + Cross-platform compatibility: + Cross-platform uyumluluğu: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + İstatistikler: + + + Warnings + Uyarılar + + + Speed + Speed + + + Counts + Sayılar + + + Daytime + Daytime + + + Relational + Relational + + + Globals + Globals Global + + + Translations: + Çeviriler: + + + Italian + İtalyan İtalyanca + + + Spanish + İspanyolca İspanyolca İspanyolca + + + French + Fransızca Fransızca Fransızca Fransızca Fransızca + + + Tools: + Araçlar: + + + Block note + Block not + + + Utilities: + Utilities: + + + Infos viewer + Infos viewer + + + Updates checker + Updates checker + + + Themes: + Temalar: + + + Dark + Dark Dark + + + Light + Işık Işığı + + + Improvements and fixes + İyileştirmeler ve düzeltmeler + + + New themes: + Yeni temalar: + + + Ash + Ash Ash + + + Candy + Candy Candy Candy + + + Forest + Orman + + + Powder + Toz Toz + + + Restyled GUI + Restyled GUI + + + Restyled dialogs + Restyled dialogs + + + Doxygen documentation + Doxygen Belgeleri + + + Mini-Games: + Mini-Games: + + + Criss-cross + Criss-cross + + + Snake + Yılan + + + Changed default paths + Değişen varsayılan yollar + + + New game modes for Snake + Yılan için Yeni Oyun modları + + + Hunt + Hunt Hunt + + + Battle + Savaş Savaşı + + + New translations: + Yeni çeviriler: + + + Japanese + Japon Japonca + + + Portuguese + Portekiz Portekiz Portekiz Portekiz + + + Code improvements + Kod geliştirmeleri + + + Performance improvements + Performans iyileştirmeleri + + + Added tests suite: + Eklenen testler paketi: + + + white box tests + beyaz kutu testleri + + + Customized charts themes + Özel grafikler tema temaları + + + Fixes + Fixes + + + Tests improvements + Testler iyileştirmeler + + + Docker support + Docker desteği + + + Upgrade to C++20 + C++20'ye Yükseltin + + + Upgrade to Qt6 + Qt6'ya Yükseltin + + + Restyled themes + Restyled temaları + + + Redesigned configs section + Yeniden tasarlanmış imarlar bölümü + + + Stability improvements + Stability gelişmeler + + + Generating warnings dinamically + Uyarılar Dinamally + + + New tool: + Yeni araç: + + + Changelog + Changelog + + + Tweakable parameters for some of the charts: + Bazı grafikler için Tweakable parametreler: + + + Improved project structure + Geliştirilmiş proje yapısı + + + Modernized Cmake usage + Modernize C Making use use + + + + Crapinfo + + Version + Version Version Version + + + Currently installed version of the software + Şu anda yazılımların sürümlerini kurdu + + + Repository links + Repository bağlantıları + + + Paths + Yollar + + + The path of the executable file + Eski dosyanın yolu + + + Executable + Executableable + + + The path where the configuration file gets saved and searched in + yapılandırma dosyasının kurtarıldığı ve aradığı yol + + + Configuration file + Kurulum dosyası + + + The path where the application searches for extra resources + Uygulamanın ekstra kaynaklar için aradığı yol + + + Application data + Uygulama verileri + + + + Crapnote + + Reduce the font size + font boyutunu azaltın + + + Font size + Font boyutu + + + Increase the font size + font boyutunu artırmak + + + + Crappath + + Choose + seçin + + + Cancel + Cancel Cancel Cancel Cancel + + + + Crapup + + Checking for updates + Güncellemeler için kontrol etmek + + + New version available + Mevcut yeni sürüm mevcut + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Yeni bir versiyon mevcuttur! +Please visit LogDoctor's Qui repository and follow the talimat about how to update + + + No update found + Güncelleme bulunamadı + + + LogDoctor is up-to-date + LogDoctor güncelleniyor + + + :/ + : / + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Gelecekten bir versiyon çalıştırıyorsunuz! +Versiyonunuz şu anki upstream sürümünün ötesindedir +Orijinal LogDoctor mu çalışıyorsun? +Please visit the LogDoctor's repository and get a fresh version of it + + + Failed to establish a connection + Bir bağlantı kurmak için başarısız oldu + + + Connection error, please try again later + Bağlantı hatası, lütfen daha sonra deneyin + + + Connection timed out + Bağlantı zamanı çıktı + + + Version check failed + Version check başarısız oldu + + + An error occured while parsing: +version mark not found + Bir hata parsing sırasında ortaya çıktı: +Versiyon işareti bulunamadı + + + An error occured while parsing: +malformed version + Bir hata parsing sırasında ortaya çıktı: +Kötüleştirilmiş versiyon + + + An error occured while comparing: +malformed upstream version + karşılaştırırken bir hata ortaya çıktı: +malform upstream version + + + + CrissCross + + Victory + Zafer Zafer Zaferi + + + You beated me! + Beni yedin! + + + This time you lost! + Bu sefer kaybettin! + + + Draw + Çizim + + + Nice match + Nice maç + + + + DialogBool + + Yes + Evet Evet Evet + + + No + Hayır hayır hayır + + + + DialogIda + + Ignore + Ignore + + + Discard + Discard + + + Abort + Abort + + + + DialogMsg + + Ok + Tamam + + + + DialogSec + + One of the lists has an invalid item + Listelerden biri geçersiz bir öğeye sahiptir + + + An error occured while reading the configuration file + yapılandırma dosyasını okurken bir hata meydana geldi + + + An error occured while parsing configuration file's data + Bir hata, yapılandırma dosyasının verilerini parlarken ortaya çıktı + + + Failed to create the configuration file's directory + yapılandırma dosyasının dizinini oluşturmak için başarısız oldu + + + Failed to create the configuration file + yapılandırma dosyasını oluşturmak için başarısız oldu + + + An error occured while writing the configuration file + yapılandırma dosyasını yazarken bir hata ortaya çıktı + + + An error occured while preparing the configuration file's data + yapılandırma dosyasının verilerini hazırlarken bir hata ortaya çıktı + + + The path contains a symlink + Yol bir symlink içeriyor + + + The file does not exist + Dosya mevcut değildir + + + Failed to create the database backups' directory + Veritabanı yedeklemelerini oluşturmak için başarısız oldu + + + Failed to copy the database file + Veritabanı dosyasını kopyalamaya başarısız oldu + + + Failed to update the backups + Yedekleri güncellemek için başarısız oldu + + + Failed to create the directory + Kılavuz oluşturmak için başarısız oldu + + + Unrecognized entry + tanınmaz giriş + + + Size of the file + Dosyanın boyutu + + + Warning size parameter + Uyarı boyutu parametresi + + + Failed to read gzipped file + gzipped dosyasını okumak için başarısız oldu + + + An error occured while parsing the format string + Bir hata, format dizesini parlarken ortaya çıktı + + + Available memory + Mevcut bellek + + + Size of the logs + Girişlerin boyutu + + + An error occured while reading the gzipped file + Parlak dosyayı okurken bir hata meydana geldi + + + An error occured while reading the file + Dosyayı okurken bir hata meydana geldi + + + Something failed while handling the file + Dosyayı yaparken bir şey başarısız oldu + + + An error occured while working on the database + Veritabanı üzerinde çalışırken bir hata meydana geldi + + + Aborting + Aborting + + + Invalid locale + Invalid locale + + + Unexpected locale format + Beklenmeyen yerel format + + + If you haven't manually edited the configuration file, +please report this issue + yapılandırma dosyasını manuel olarak düzenlemediyseniz, +Lütfen bu konuyu rapor edin + + + The given locale is not an accepted language + Verilen yerel kabul edilen bir dil değildir + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + LogDoctor'da bu yerele sahip olmak istiyorsanız, +Lütfen repository sayfasındaki talimatları takip edin + + + Configuration file not found + Kurulum dosyası bulunamadı + + + Unable to retrieve the configuration file + yapılandırma dosyasını almak için kullanılamaz + + + Skipping + Skipping + + + An error occured while handling the configuration file + Bir hata yapılandırma dosyasını kullanırken ortaya çıktı + + + Failed to write the configuration file + yapılandırma dosyasını yazmak için başarısız oldu + + + Current configuration not saved + Mevcut yapılandırma kurtarılmadı + + + File not readable + Not readableable + + + The file is not readable + Dosya okunabilir değil + + + File not writable + Dosya tarif edilemez + + + The file is not writable + Dosya tarif edilemez + + + Directory not writable + Rehberlik edilemez + + + The directory is not writable + Rehber değerli değildir + + + Invalid path + Invalid yolu + + + Failed applying configuration + Başarısız uygulama yapılandırma + + + Invalid configuration lines + Invalid yapılandırma hatları + + + Has not been possible to apply some of the configurations + Bazı yapılandırmaları uygulamak mümkün olmamıştır + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Eğer devam etmeyi seçerseniz, uygulamasız konfigürasyonların hepsi kaybedilecek +Devam et? + + + Failed to retrieve the help file + Yardım dosyasını almak için başarısız oldu + + + An error occured while getting the help file + Yardım dosyasını alırken bir hata meydana geldi + + + Additional resources can be downloaded from the git repo + Ek kaynaklar, en geri repo'dan indirilebilir + + + Unable to retrieve the file + Dosyayı almak için kullanılamaz + + + Invalid string + Invalid string + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Verilen dize geçersizdir ve listeye eklenemez. + +Lütfen doğrulayın ve yeniden deneme + + + QSql driver not found + QSql sürücüsü bulunamadı + + + Failed to retrieve the driver needed to handle the database + Veritabanı işlemek için gerekli olan sürücüyi almak için başarısız oldu + + + File not found + File bulunamadı + + + Failed to retrieve the database file + Veritabanı dosyasını almak için başarısız oldu + + + Create a new database? + Yeni bir veritabanı mı oluşturun? + + + The database contains an unexpected table + Veritabanı beklenmedik bir tablo içeriyor + + + Unexpected table + Beklenmeyen tablo + + + It seems that the database is missing a table + Görünüşe göre veritabanı bir tablo eksik + + + Table not found + Tablo bulunamadı + + + The database contains an unexpected column + Veritabanı beklenmedik bir sütun içeriyor + + + Unexpected column + Beklenmeyen sütun + + + It seems that the table is missing a column + Görünüşe göre masa bir sütun eksik + + + Column not found + Köşe bulunamadı + + + A column has an unexpected data-type + Bir sütun beklenmedik bir veri tipine sahiptir + + + Unexpected data-type + Beklenmeyen veri tipi + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Bu veritabanı bir iz '.copy' ile yeniden adlandırılacak ve yeni bir tane oluşturulacak. +Devam et? + + + Database created + Veritabanı yaratılan Veritabanı + + + Successfully created a new database + Başarılı bir şekilde yeni bir veritabanı yarattı + + + Not a file + Bir dosya değil + + + The path was supposed to point to a file, but it doesn't + Yol bir dosyaya işaret etmesi gerekiyordu, ama değil + + + Please remove the conflict and retry + Lütfen çatışmayı kaldır ve yeniden deneme + + + The database file is not readable + Veritabanı dosyası okunabilir değildir + + + Please set the proper permissions and retry +If this error persists, please report this issue + Lütfen uygun izinleri ayarlayın ve yeniden deneme +Bu hata devam ederse, lütfen bu konuyu rapor edin + + + The database file is not writable + Veritabanı dosyası anlaşılabilir değildir + + + Invalid database path + Invalid veritabanı yolu + + + Failed creating database + Başarısızlık veritabanı oluşturma + + + An error occured while creating the database + Veritabanı oluşturmak için bir hata ortaya çıktı + + + Failed opening database + Başarısız açılış veritabanı + + + An error occured while opening the database + Veritabanı açmak sırasında bir hata meydana geldi + + + Failed executing on database + Veritabanında Başarısızlık + + + An error occured while executing a statement on the database + Veritabanında bir açıklama yaparken bir hata ortaya çıktı + + + Failed to backup database + Yedekleme veritabanına başarısız oldu + + + Please report this issue + Lütfen bu konuyu rapor edin + + + Invalid log format string + Invalid log format string + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Please check that no error is thrown by your WebServer +Kabul edilirse, lütfen burada bir tipo varlığını kontrol edin +Her şey iyiyse, lütfen bu konuyu rapor edin + + + Log format error + Log format hatası + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Giriş formatı belirlenmedi veya geçersizdir. +Lütfen konfigürasyonlarda geçerli bir tane ekleyin + + + Misconfigured log format + Mis configureured log format + + + No log field has been set in the current logs format, +making it useless to parse logs + Mevcut log alanında hiçbir kayıt alanı mevcut log formatta ayarlanmamıştır, +Diril loglar için işe yaramaz hale getirmek + + + Please set up a format which contains at least one field + Lütfen en az bir alan içeren bir format oluşturun + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Bir veya daha fazla alan arasında bir ayırıcı eksik, +Net sınırları kurmak için zor yapmak, +Ve muhtemelen yanlış veri depolamaya yol açıyor + + + Please set up a format which contains separators between fields + Lütfen alanlar arasında ayırıcıları içeren bir format oluşturun + + + Missing field in log format + Eksik alan log formatında + + + An important field is missing from the provided format: + Verilen formattan önemli bir alan eksik: + + + The quality of the statistics may be seriously compromized + İstatistiklerin kalitesi ciddi şekilde zorlanabilir + + + Proceed anyway? + Yine de Proceed? + + + 'Carriage Return' in log format + 'Carriage Return' in log format + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Sağlanan format "Carriage Return" içerir. +Bu, uyarı ile kullanılmamışsa veri kayıplarına veya kazalara yol açabilir + + + An error occured while parsing logs + Bir hata, günlükleri parlarken ortaya çıktı + + + Failed defining type + Başarısız tanımlama türü + + + Failed to determine the log type + Log tipini belirlemek için başarısız oldu + + + File already used + Dosya zaten kullanılmış + + + The file has probably been used already + Dosya muhtemelen zaten kullanılmış + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Uyarıyı görmezden gelir ve her neyse,kartlayın ve devam et, ya da tüm süreci Abort? + + + Duplicate file + Duplicate file + + + The file appears twice in the list of selections + Dosya seçim listesinde iki kez görünür + + + Failed updating hashes + Güncelleme başarısız oldu + + + An error occured while inserting the parsed files hashes into the database + Parsed dosyaları eklerken bir hata ortaya çıktı veritabanına + + + File exceeds warning size + Dosya uyarı boyutunu aşıyor + + + The file's size exceeds the warning size + Dosyanın büyüklüğü uyarı boyutunu aşıyor + + + Not enough memory + Yeterli bellek + + + The total size of the selected files exceeds the available memory + Seçilen dosyaların toplam büyüklüğü mevcut hafızayı aşıyor + + + Please free some resources, parse the files in different steps or split them into smaller units + Lütfen bazı kaynaklar ücretsiz olun, dosyaları farklı adımlarda parlayın veya onları daha küçük birimlere ayırın + + + Failed reading + Başarısız okuma + + + File is empty + Dosya boş + + + The file is blank + Dosya boş + + + Failed to retrieve the selected file + Seçilen dosyayı almak için başarısız oldu + + + Discard it and continue, or Abort all and exit? + Onu ve devam et, ya da tüm ve çıkışları? + + + No file to parse + No file to parse + + + The list of files to parse is empty + Parse için dosyaların listesi boş + + + Directory not found + Rehber bulunamadı + + + The directory does not exists + Kılavuz mevcut değildir + + + Directory not readable + Rehber okumaz + + + The directory is not readable + Kılavuz okunabilir + + + Please set the proper permissions before to start + Lütfen başlamadan önce doğru izinleri belirleyin + + + Failed creating directory + Başarısız yaratma rehberi + + + The path does not exists + Yol mevcut değildir + + + Data conversion failed + Veri dönüştürme başarısız oldu + + + Failed to convert from '%1' to '%2' + '%1' den '%2' ye dönüştürülemezdi%2 + + + Failed to create statistics + İstatistikler oluşturmak için başarısız oldu + + + An error occured while processing + Bir hata işlem yaparken ortaya çıktı + + + Cannot create statistics + İstatistikler oluşturamaz + + + No data has been found that matches with the currently set parameters + Şu anda ayarlanan parametrelerle eşleşmelerin bulundu + + + Not a folder + Bir klasör değil + + + The path was supposed to point to a folder, but it doesn't + Yol bir klasöre işaret etmesi gerekiyordu, ama değil + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Giriş bir iz ile yeniden adlandırılacaktır '.copy' ve yeni bir tane oluşturulacaktır. +Devam et? + + + An error occured + Bir hata ortaya çıktı + + + Failed renaming + Başarısız Renaming + + + An error occured while renaming + Bir hata yeniden ortaya çıktığında ortaya çıktı + + + + GameDialog + + Ok + Tamam + + + + MainWindow + + Parse logs from the Apache2 web server + Parse, Apache2 web sunucusundan oturumlar + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Parse, Nginx web sunucusundan oturumlar + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Microsoft IIS web sunucusundan oturumlar + + + IIS + IIS + + + Select/deselect all the files + Tüm dosyaları seçin /deselect all the files + + + All + Bütün Bütün Hepsi + + + Inspect a log file + Inspect a log file + + + Name + Name Name Name Name Name Name Name Name Name Name Name + + + Size + Boyut Boyutu + + + Refresh the list + Listeyi yenileyin + + + Total size of the parsed data + Parsed verilerin toplam büyüklüğü + + + Total number of parsed lines + Toplam parsed hatları + + + Start parsing the selected files + Seçilen dosyaları parsing the selected files + + + START + YouTube + + + Time elapsed since the start + Başından beri zaman geçti + + + Average speed, in parsed data size per second + Ortalama hız, ikinci veri büyüklüğü için parsed veri büyüklüğü + + + Web Server + Web Server + + + Select a Web Server + Bir Web Server seçin + + + Year + Yıl Yılı Yıl Yılı Yıl Yılı + + + Month + Ay Ay + + + Day + Gün Günü + + + Hour + Saat Saat Saat + + + Draw the chart + grafiği çizin + + + Log line marked as Warning + Log çizgisi Uyarı olarak işaretlendi + + + Date when the request arrived (YYYY-MM-DD) + İstek geldiğinde (YY-MM-D) + + + Time when the request arrived (hh:mm:ss) + İstek geldiğinde (hh:mm:s) + + + Protocol of the request + İstek Protokolü + + + Method of the request + İstek Yöntemi + + + URI of the requested page + URI of the requested page + + + Query carried along with the URI + URI ile birlikte yapılan Sorgu + + + Response code from the server + Sunucu kodu sunucudan + + + User-agent of the client which made the request + İstek-agent of the client which made the request + + + IP address of the Client which made the request + İstenen müşterinin IP adresi + + + Cookie used for the request + Talep için kullanılan Cookie + + + The URL which redirected the Client to the requested page + Müşteriyi istenen sayfaya yönlendiren URL + + + Size ib Bytes of the request, usually includes header and data + Taleplerin Boyutları genellikle başlık ve veriler içerir + + + Size in Bytes of the served content, usually includes header and data + Servis içeriğine bağlı olarak, genellikle başlık ve veriler içerir + + + Time taken by the server to serve the content, in milliseconds + Sunucu tarafından alınan zaman içeriği hizmet etmek için, milisaniyelerde + + + Only use lines in which the field is starting with this string + Sadece alanın bu dize ile başladığı hatları kullanın + + + Protocol: + Protokol: + + + Method: + Yöntem: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Sadece alanın bu ifadeyi eşleştirdiği hatları kullanın. +"", "=", "<" veya ">" kullanmak için ne kullanmak gerektiğini ifade etmek için + + + Response: + Cevap: + + + Query: + Sorgu: + + + URI: + URI: + + + Filters + Filtreler + + + Count + Kont + + + Number of occurrences + Olay Sayısı + + + Item + Item + + + Value of the field + Alanın Değeri + + + From: + From: + + + To: + To: + + + Select a log field to view + Görmek için bir log alanı seçin + + + Field: + Alan: + + + Filter: + Filtre: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + dizelerle, sadece alanın bu dize ile başladığı hatlar kullanılacaktır. +Sayılarla, '!', '=', '<' veya '>' kullanmak için ne kullanmak gerektiğini ifade etmek için + + + Protocol + Protokol Protokolü + + + Method + Yöntem Yöntemi + + + URI + URI + + + User-agent + Kullanıcı-agent + + + Most recurrent + Çoğu recurrent + + + Most trafficked + Çoğu kaçakçı + + + Date ever + Tarih Hiç Tarih + + + Day of the week + Haftanın günü + + + Hour of the day + Günün saati + + + Time taken + Zaman alındı + + + Bytes sent + Bytes sent + + + Bytes received + Bytes aldı + + + Mean/Max performances + Ortalama /Max performans performansları + + + Requests received + İstekler alındı + + + Total work + Toplam çalışma + + + General + General General General General General General General General General General General General General + + + Window + Pencere Pencere Pencere + + + Dialogs + Dialogs + + + Charts + Grafikler + + + Appearance + Görünüm görünümü + + + Speed + Hız Hız Hız Hız + + + Relational + Relational + + + TextBrowser + TextBrowser + + + Databases + Veritabanı + + + Security + Güvenlik Güvenliği + + + Logs + Logs Logs + + + Defaults + Temsiller + + + Control + Kontrol Kontrolü + + + Path + Yol Yolu + + + Format + Format Format + + + Warnlists + Warnlists + + + Blacklists + Blacklists + + + Remember the window's position and size + Pencerenin konumunu ve boyutunu hatırlayın + + + Remember position and size + pozisyonu ve boyutunu hatırlayın + + + Remember window's position and size + Pencerenin konumunu ve boyutunu hatırlayın + + + Geometry + Geometri + + + Theme to use for the window + Pencere için kullanmak için + + + Theme + Tema + + + Native + Yerli Yerli Yerli + + + Light + Işık Işığı + + + Dark + Dark Dark + + + Auto + Auto Auto Auto Auto + + + Icons + Icons + + + Normal quantity of dialog messages shown + Normal miktar diyalog mesajları göstermiştir + + + Normal + Normal Normal Normal Normal + + + Dialogs from the main processes + Ana süreçlerden gelen diloglar + + + Dialogs emitted when parsing logs + Dialogs, günlükleri parlarken + + + Logs parser + Girişler + + + Dialogs emitted when viewing statistics + Dialogs, istatistiklere baktığımızda + + + Statistics viewer + İstatistikler viewer + + + Define the quantity of dialog mesages shown + Gösterilen diyaloğun miktarını tanımlar + + + Dialogs level + Dialogs seviyesi + + + Reduced quantity of dialog messages shown + Gösterilen miktar diyalog mesajları azaltıldı + + + Essential + Temel Temel Temel Temel + + + Augmented quantity of dialog messages shown + Gösterilmiş miktar diyalog mesajları + + + Explanatory + Explanatory + + + Theme to use for the Charts + Grafikler için kullanmak için tema + + + Preview + Öfke + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Zaman ekseninde bir adım, saniyede. +Aynı aralığın içinde düşen tüm değerler bir araya getirilecek ve kelime değeri kullanılacaktır. + + + Time interval + Zaman aralığı + + + The format to use for the labels of the time axis. + Zaman eksenlerinin etiketleri için kullanmak için format. + + + Time format + Zaman formatı + + + The size of the pie + pastanın büyüklüğü + + + Pie size + Pie büyüklüğü + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + pastanın oluşturulacağı en fazla dilim. +Exceeding dilimleri bir kapsamlı dilime gruplandırılacaktır. + + + Maximum slices + Maksimum dilimler + + + Font to use for the Text Browser + Font to use for the Text Browser + + + Font + Font Font Font + + + Double-spaced lines + Double-spaced hatları + + + Use wide lines + Geniş hatları kullanın + + + Define the spacing between lines + Hatlar arasındaki spatları Tanımlayın + + + Lines spacing + Hatlar spacing + + + None + Hiçbir şey yok + + + Color scheme to use for the Text Browser + Text Browser için kullanmak için renkli program + + + Color scheme + Renk şeması + + + The appearance of the Text Browser with the current settings + Text Browser'ın mevcut ayarları ile görünümü + + + Insert the base path only, file name excluded + Temel yolu sadece, dosya adı dışlanmış + + + The given path doen't exists, or doesn't point to a folder + Verilen yol mevcut değildir veya bir klasöre işaret etmez + + + Path for the database files + Veritabanı dosyaları için yol + + + Paths + Yollar + + + Apply the current path + Mevcut yolu uygulayın + + + Select the path through a dialog window + Bir dialog penceresi aracılığıyla yolu seçin + + + Path where the logs data collection database is located + Logs veri toplama veritabanının nerede bulunduğu yol, bulunan yer + + + Logs data + Logs data + + + Path where the used files hashes database is located + Kullanılan dosyaların veritabanına sahip olduğu yol, yerdeki yerdir + + + Used files + Kullanılan dosyalar + + + Backup options for the Logs Data database + Logs Data database seçenekleri + + + Backups + Backups + + + A new backup is made when closing LogDoctor after having succesfully edited the database + LogDoctor'u kapattıktan sonra yeni bir yedekleme yapılır + + + Backup the Logs Data database and keep + Logs Data veritabanını yedeklemek ve tutmak + + + Whether it is allowed or denied to follow symlinks occuring in a path + Bir yolda meydana gelen bağlantıları takip etmek veya inkar etmek izin verilirse + + + Follow symlinks + Takip et + + + Default WebServer + Varsayılan WebServer + + + Usage control + Kullanım kontrolü + + + Hide already used files + Hide zaten dosyaları kullandı + + + Size warnings + Boyut uyarıları + + + Warn me when using files with a size exceeding: + Bir boyutla dosyaları kullanırken Warn beni: + + + Logs folder + Logs klasörü + + + Logs format string + Logs format + + + Format string + Format string + + + Insert the format string you're using + Kullandığınız format dizesini çizin + + + Apply the current string + Mevcut dizeyi uygulayın + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Şu anda kaydedilen dizeden örnek bir günlük çizgi, doğru formatlandığında kontrol etmek. +LogDoctor tarafından düşünülmeyen herhangi bir alan 'DISCARDED' olarak görünecektir + + + Generate sample + Genrate örnek + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Lütfen bu çizginin doğruluğu kontrol edin. +'DISCARDED' olarak işaret edilen alanlar doğru bir şekilde parladı, ancak LogDoctor tarafından kabul edilmedi + + + Open an help window + Bir yardım penceresi açın + + + Help + Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım Yardım + + + Select a log field + Bir log alanı seçin + + + Use warnlist for this field + Bu alan için uyarı listesi kullanın + + + Add the current line to the list + Listeye mevcut çizgiyi ekleyin + + + Remove the selected item from the list + Seçilen öğeyi listeden çıkarın + + + Move the selected item down + Seçilen öğeyi aşağı taşıyın + + + Use blacklist for this field + Bu alan için kara liste kullanın + + + Add line + Add line + + + Remove selection + Makyaj seçimi + + + Language + Dil Dili + + + Utilities + Utilities + + + Tools + Araçlar + + + Games + Oyunlar + + + Perform a version-check + Bir sürüm kontrol et + + + Show some info about LogDoctor + LogDoctor hakkında biraz bilgi gösterin + + + Open a block-note like window to write temporary text + Geçici metin yazmak için pencere gibi bir blok-note açın + + + Play CrissCross + Play CrisCross + + + Play Snake + Play Snake + + + Show the changelog + Değişimlogunu Gösterin + + + warnlist + Uyarılist + + + blacklist + Blacklist + + + copy + kopya kopya kopya kopya kopya + + + copies + kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya kopya + + + Check updates + Check Update + + + Infos + Infos + + + BlockNote + BlockNote + + + CrissCross + CrisCross + + + Snake + Yılan + + + Changelog + Changelog + + + + RichText + + Select a file from the list + Listeden bir dosya seçin + + + to inspect its content + içeriğini incelemek + + + Failed to read + Okumaya Başarısız + + + + SnakeGame + + PLAY + PLAY + + + Classic + Klasik Klasik Klasik + + + Hunt + Hunt Hunt + + + Battle + Savaş Savaşı + + + Game Over + Game Over Game Over + + + Your adversary fell in the water! + Reklamlarınız suya düştü! + + + YOU WON! + WON! + + + You fell in the water! + Suda düştün! + + + YOU LOST! + SİZİN! + + + Your adversary ate itself! + Kendi kendini kınayan! + + + You ate yourself! + Kendinizi yedin! + + + Your adversary ate you! + Reklamlarınız sizi! + + + You ate your adversary! + Sen senin düşmanların! + + + You ate each other! + birbirinizi yedin! + + + MATCH IS DRAW! + MATCH IS DRAW! + + + + TR + + Unexpected WebServer + Beklenmeyen WebServer + + + Logs Size Breakdown + Logs Dimension Breakdown + + + Ignored + Ignored + + + Parsed + Parsed + + + Blacklisted + Blacklisted + + + Others + Diğerleri + + + from + From from from from from from from from from from from from from from from from from from from from from from from from from from from from from from from from from from from + + + to + toklanmak için + + + Log Lines Marked as Warning + Log Lines Uyarı Olarak Marked + + + Time Taken to Serve Requests + Time Taken to serve Requests + + + Time of Day Count + Zaman Günü Kont + + + Relational Count + Relational Count + + + FALSE + FALSE + + + TRUE + TR + + + Date + Tarih Tarihi + + + Year + Yıl Yılı Yıl Yılı Yıl Yılı + + + Month + Ay Ay + + + Day + Gün Günü + + + Time + Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman Zaman + + + Hour + Saat Saat Saat + + + Minute + Minute Minute + + + Second + İkincisi + + + Warning + Uyarı Uyarı Uyarı Uyarı + + + Protocol + Protokol Protokolü + + + Method + Yöntem Yöntemi + + + URI + URI + + + Query + Sorgu Sorgulama + + + Response code + Yanıt kodu + + + Time taken + Zaman alındı + + + Bytes sent + Bytes sent + + + Bytes received + Bytes aldı + + + Referrer + Referr + + + Cookie + Kurabiye + + + Client + Müşteri + + + User-agent + Kullanıcı-agent + + + January + Ocak Ocak Ocak Ocak + + + February + Şubat Şubat Şubat Şubat + + + March + Mart Mart Mart Mart Mart + + + April + Nisan Nisan Nisan Nisan + + + May + Mayıs + + + June + Haziran Haziran Haziran Haziran + + + July + Temmuz Temmuz Temmuz Temmuz + + + August + Ağustos Ağustos Ağustos Ağustos Ağustos Ağustos + + + September + Eylül Eylül Eylül + + + October + Ekim Ekim Ekim Ekim + + + November + Kasım Kasım Kasım Kasım + + + December + Aralık Aralık Aralık Aralık + + + Sunday + Pazar Pazar Pazar Pazar Pazar + + + Monday + Pazartesi Pazartesi Pazartesi Pazartesi + + + Tuesday + Salı Salı Salı Salı Salı + + + Wednesday + Çarşamba Çarşamba Çarşamba Çarşamba + + + Thursday + Perşembe Perşembe Perşembe Perşembe Perşembe + + + Friday + Cuma Cuma Cuma Cuma + + + Saturday + Cumartesi Cumartesi Cumartesi Cumartesi + + + diff --git a/logdoctor/translations/LogDoctor_uk_UK.ts b/logdoctor/translations/LogDoctor_uk_UK.ts new file mode 100644 index 0000000..11e3c6b --- /dev/null +++ b/logdoctor/translations/LogDoctor_uk_UK.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + Версія + + + Version 4 + Версія 4 + + + Version 3 + Версія 3 + + + Version 2 + Версія 2 + + + Version 1 + Версія 1 + + + C++17 + С++17 + + + Qt5 + Qt5 + + + Build scripts + Створення сценаріїв + + + Cross-platform compatibility: + Крос-платформна сумісність: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + Статистика: + + + Warnings + Попередження + + + Speed + швидкість + + + Counts + Кількість + + + Daytime + День + + + Relational + Реляційний + + + Globals + Глобальні + + + Translations: + Переклади: + + + Italian + Італійська + + + Spanish + Іспанська + + + French + Французька + + + Tools: + Інструменти: + + + Block note + Блок замітки + + + Utilities: + Послуги: + + + Infos viewer + Перегляд інформації + + + Updates checker + Перевірка оновлень + + + Themes: + Теми: + + + Dark + Темний + + + Light + Світло + + + Improvements and fixes + Удосконалення та виправлення + + + New themes: + Нові теми: + + + Ash + Афіша + + + Candy + Цукерки + + + Forest + Ліс + + + Powder + Порошок + + + Restyled GUI + Стильний інтерфейс + + + Restyled dialogs + Restyled діалоги + + + Doxygen documentation + Doxygen документація + + + Mini-Games: + Міні-Games: + + + Criss-cross + Крис-хрест + + + Snake + Змія + + + Changed default paths + Змінені шляхи за замовчуванням + + + New game modes for Snake + Нові режими ігор для Snake + + + Hunt + Тітка + + + Battle + Битва + + + New translations: + Новий переклад: + + + Japanese + Японська + + + Portuguese + Португальська + + + Code improvements + Поліпшення коду + + + Performance improvements + Підвищення продуктивності + + + Added tests suite: + Додано набір тестів: + + + white box tests + Тести білого ящика + + + Customized charts themes + Індивідуальні діаграми теми + + + Fixes + Фіксатори + + + Tests improvements + Тести підвищення + + + Docker support + Підтримка Docker + + + Upgrade to C++20 + Оновлення до C++20 + + + Upgrade to Qt6 + Оновлення до Qt6 + + + Restyled themes + За замовчуванням теми + + + Redesigned configs section + Редизайнований розділ налаштувань + + + Stability improvements + Покращення стабільності + + + Generating warnings dinamically + Генераційні попередження динамічно + + + New tool: + Новий інструмент: + + + Changelog + Логін + + + Tweakable parameters for some of the charts: + Вимочні параметри для деяких діаграм: + + + Improved project structure + Покращена структура проекту + + + Modernized Cmake usage + Модернізація Використання Cmake + + + + Crapinfo + + Version + Редагування + + + Currently installed version of the software + В даний час встановлена версія програмного забезпечення + + + Repository links + Репозитори + + + Paths + Шляхи + + + The path of the executable file + Шлях виконуючого файлу + + + Executable + Виконується + + + The path where the configuration file gets saved and searched in + Шлях, де файл конфігурації зберігається і шукається в + + + Configuration file + Файл конфігурації + + + The path where the application searches for extra resources + Шлях, де пошук заявок на додаткові ресурси + + + Application data + Дані програми + + + + Crapnote + + Reduce the font size + Зменшити розмір шрифту + + + Font size + Розмір шрифту + + + Increase the font size + Збільшення розміру шрифту + + + + Crappath + + Choose + Обрати + + + Cancel + Зареєструватися + + + + Crapup + + Checking for updates + Перевірка оновлень + + + New version available + Нова версія доступна + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + Нова версія доступна! +Будь ласка, відвідайте репозиторію LogDoctor і дотримуйтесь інструкцій про те, як оновити + + + No update found + Не знайдено оновлення + + + LogDoctor is up-to-date + LogDoctor - до дати + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + Ви працюєте з майбутнього! +Ваша версія за межі поточного версії +Ви працюєте з оригінальним LogDoctor? +Будь ласка, відвідайте репозиторію LogDoctor і отримуйте свіжу версію + + + Failed to establish a connection + Не вдалося встановити підключення + + + Connection error, please try again later + Зв'язатися з нами + + + Connection timed out + Час підключення + + + Version check failed + Перевірити не вдалося + + + An error occured while parsing: +version mark not found + Помилки, що виникають при парсингу: +не знайдено + + + An error occured while parsing: +malformed version + Помилки, що виникають при парсингу: +мальформована версія + + + An error occured while comparing: +malformed upstream version + У порівнянні з: +malformed upstream версія + + + + CrissCross + + Victory + Вікторія + + + You beated me! + Ви мене! + + + This time you lost! + Ви втратили! + + + Draw + Мапа + + + Nice match + Хороший матч + + + + DialogBool + + Yes + Я + + + No + Ні + + + + DialogIda + + Ignore + Ігнор + + + Discard + Протидія + + + Abort + Аборти + + + + DialogMsg + + Ok + Навігація + + + + DialogSec + + One of the lists has an invalid item + Один із списків має недійсний елемент + + + An error occured while reading the configuration file + Помилки, які відбуваються під час читання файлу конфігурації + + + An error occured while parsing configuration file's data + Помилки, що виникають при обробці даних файлів + + + Failed to create the configuration file's directory + Не вдалося створити каталог файлів конфігурації + + + Failed to create the configuration file + Не вдалося створити файл конфігурації + + + An error occured while writing the configuration file + Помилки, що виникають при написанні файлу конфігурації + + + An error occured while preparing the configuration file's data + Похибка виникає при підготовці даних конфігураційного файлу + + + The path contains a symlink + Шлях містить symlink + + + The file does not exist + Файл не існує + + + Failed to create the database backups' directory + Не вдалося створити каталог резервних копій бази даних + + + Failed to copy the database file + Заборонено копіювати файл бази даних + + + Failed to update the backups + Заборонено оновити резервні копії + + + Failed to create the directory + Не вдалося створити каталог + + + Unrecognized entry + Невизнаний запис + + + Size of the file + Розмір файлу + + + Warning size parameter + Параметри розміру повідомлення + + + Failed to read gzipped file + Переміщений для читання зміщеного файлу + + + An error occured while parsing the format string + Помилки, що відбуваються під час оформлення рядка формату + + + Available memory + Доступна пам'ять + + + Size of the logs + Розмір колод + + + An error occured while reading the gzipped file + Похибка виникає при прочитуванні збитого файлу + + + An error occured while reading the file + Похибка виникає при прочитуванні файлу + + + Something failed while handling the file + Хтось не вдалося під час обробки файлу + + + An error occured while working on the database + Помилки, що виникають при роботі на базі даних + + + Aborting + Абортинг + + + Invalid locale + Інвалідне місто + + + Unexpected locale format + Невибагливий формат локалізації + + + If you haven't manually edited the configuration file, +please report this issue + Якщо ви не вручну редагувати файл конфігурації, +Будь ласка, вкажіть це питання + + + The given locale is not an accepted language + Надана мова не прийнята мова + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + Якщо ви хочете мати цю місцевість в LogDoctor, +будь ласка, дотримуйтесь інструкцій на репозиторій сторінці + + + Configuration file not found + Файл конфігурації не знайдено + + + Unable to retrieve the configuration file + Не вдалося отримати файл конфігурації + + + Skipping + Скіппінг + + + An error occured while handling the configuration file + Помилки, що виникають при обробці файлів конфігурації + + + Failed to write the configuration file + Не вдалося написати файл конфігурації + + + Current configuration not saved + Поточна конфігурація не збережена + + + File not readable + Файл нечитабельний + + + The file is not readable + Файл не прочитаний + + + File not writable + Файл не дратівливий + + + The file is not writable + Файл не вдається + + + Directory not writable + Каталог не дратівливий + + + The directory is not writable + Довідник не вдається + + + Invalid path + Інвалідний шлях + + + Failed applying configuration + Конфігурація застави + + + Invalid configuration lines + Лінії налаштування інвалідів + + + Has not been possible to apply some of the configurations + Не вдалося застосувати деякі конфігурації + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + Якщо ви вирішили продовжити, всі непристойні конфігурації будуть втрачені +Продовжити? + + + Failed to retrieve the help file + Не вдалося отримати файл допомоги + + + An error occured while getting the help file + Помилки, що виникають при отриманні файлу допомоги + + + Additional resources can be downloaded from the git repo + Додаткові ресурси можна завантажити з git repo + + + Unable to retrieve the file + Не вдалося отримати файл + + + Invalid string + Неточний рядок + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + Заданий рядок недійсний і не можна додавати до списку + +Будь ласка, виправте його і птиця + + + QSql driver not found + QSql драйвер не знайдено + + + Failed to retrieve the driver needed to handle the database + Заборонено отримати драйвер, необхідний для обробки бази даних + + + File not found + Файл не знайдено + + + Failed to retrieve the database file + Не вдалося отримати файл бази даних + + + Create a new database? + Створення нової бази даних? + + + The database contains an unexpected table + База даних містить несподіваний стіл + + + Unexpected table + Невибагливий стіл + + + It seems that the database is missing a table + Здається, що база даних відсутній таблиці + + + Table not found + Не знайдено + + + The database contains an unexpected column + База даних містить несподіваний стовпчик + + + Unexpected column + Невибагливий стовпчик + + + It seems that the table is missing a column + Здається, що таблиця відсутній стовпець + + + Column not found + Не знайдено + + + A column has an unexpected data-type + Колонка має несподіваний тип даних + + + Unexpected data-type + Невибагливий тип даних + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Ця база даних буде перейменована з причіпом '.copy' і новий буде створений. +Продовжити? + + + Database created + Створення бази даних + + + Successfully created a new database + Успішно створити нову базу даних + + + Not a file + Не файл + + + The path was supposed to point to a file, but it doesn't + Шлях повинен вказувати на файл, але він не + + + Please remove the conflict and retry + Будь ласка, видаліть конфлікт і птиця + + + The database file is not readable + Файл бази даних не прочитаний + + + Please set the proper permissions and retry +If this error persists, please report this issue + Будь ласка, вкажіть правильні дозволи та ретри +Будь ласка, зв'яжіться з нами + + + The database file is not writable + Файл бази даних не є жорстким + + + Invalid database path + Інвалідний шлях бази даних + + + Failed creating database + Заборонено створення бази даних + + + An error occured while creating the database + При створенні бази даних відбувається помилка + + + Failed opening database + База даних відкриття + + + An error occured while opening the database + Помилки, що виникли при відкритті бази даних + + + Failed executing on database + Виконується виконання бази даних + + + An error occured while executing a statement on the database + Помилки, що виникли при виконанні заяви на базу даних + + + Failed to backup database + Заборонено для резервної бази даних + + + Please report this issue + Будь ласка, зв'яжіться з нами + + + Invalid log format string + Неточний рядок формату журналу + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + Будь ласка, перевірте, що жодна помилка не кидається на веб-сервері +Якщо він приймається, будь ласка, перевірте наявність на сайті +Якщо все дрібно, будь ласка, вкажіть це питання + + + Log format error + Помилки форматів + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + Формат журналу не був встановлений, або не є недійсним +Будь ласка, додайте дійсний в налаштуваннях + + + Misconfigured log format + Утилізація формату журналу + + + No log field has been set in the current logs format, +making it useless to parse logs + Немає поля входу в формат поточного журналу, +робить його непотрібними для пазових колод + + + Please set up a format which contains at least one field + Будь ласка, встановіть формат, який містить принаймні одне поле + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + Сепаратор відсутній між одним або декількома полями, +виготовляючи його важко встановити чисті межі, +і, можливо, призводить до зберігання некоректних даних + + + Please set up a format which contains separators between fields + Будь ласка, встановіть формат, який містить роздільники між полями + + + Missing field in log format + Місячне поле в форматі журналу + + + An important field is missing from the provided format: + Важливе поле відсутній з заданого формату: + + + The quality of the statistics may be seriously compromized + Якість статистики може бути серйозно + + + Proceed anyway? + Проводиться будь-яким чином? + + + 'Carriage Return' in log format + 'Перевага повернення' в форматі журналу + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + Надані формати містять 'Передача'. +Це може призвести до втрати даних або аварійних ситуацій, якщо не використовується з обережністю + + + An error occured while parsing logs + Помилки, що виникають при пароплавах + + + Failed defining type + Тип розм'якшення + + + Failed to determine the log type + Не вдалося визначити тип журналу + + + File already used + Файл вже використовується + + + The file has probably been used already + Файл, ймовірно, був використаний вже + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + Прогностувати попередження та використовувати його будь-яким чином, відхилити його і продовжити, або вводити весь процес? + + + Duplicate file + Дублікатний файл + + + The file appears twice in the list of selections + Файл з'являється двічі в списку вибірок + + + Failed updating hashes + Неприємний оновлення хеш + + + An error occured while inserting the parsed files hashes into the database + Похибка, що виникла при вставці файлів, що містяться в базу даних + + + File exceeds warning size + Файл перевищує розмір попередження + + + The file's size exceeds the warning size + Розмір файлу перевищує розмір попередження + + + Not enough memory + Не достатньо пам'яті + + + The total size of the selected files exceeds the available memory + Загальний розмір вибраних файлів перевищує наявну пам'ять + + + Please free some resources, parse the files in different steps or split them into smaller units + Будь ласка, оберіть файли в різних кроках або розділіть їх на менші одиниці + + + Failed reading + В’язане читання + + + File is empty + Файл порожній + + + The file is blank + Файл порожній + + + Failed to retrieve the selected file + Не вдалося отримати вибраний файл + + + Discard it and continue, or Abort all and exit? + Зніміть його і продовжуйте, або отримайте всі та вихідні? + + + No file to parse + Немає файлу до папзи + + + The list of files to parse is empty + Список файлів до папзи порожній + + + Directory not found + Каталог не знайдено + + + The directory does not exists + Каталог не існує + + + Directory not readable + Не прочитаний каталог + + + The directory is not readable + Не прочитаний каталог + + + Please set the proper permissions before to start + Будь ласка, встановіть правильні дозволи до початку + + + Failed creating directory + Вимкнено створення каталогу + + + The path does not exists + Шлях не існує + + + Data conversion failed + Перетворення даних не вдалося + + + Failed to convert from '%1' to '%2' + Переміщений для перетворення з '%1' в '%2' + + + Failed to create statistics + Не вдалося створити статистику + + + An error occured while processing + Помилки, що виникають при обробці + + + Cannot create statistics + Не створювати статистику + + + No data has been found that matches with the currently set parameters + Не знайдено дані, які відповідають встановленим параметрам + + + Not a folder + Не папка + + + The path was supposed to point to a folder, but it doesn't + Шлях повинен вказувати на папку, але це не + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + Вступ буде перейменований з причіпом '.copy' і буде створений новий. +Продовжити? + + + An error occured + Помилки + + + Failed renaming + Перенаправлення + + + An error occured while renaming + Помилки, що виникли при перейменуванні + + + + GameDialog + + Ok + Навігація + + + + MainWindow + + Parse logs from the Apache2 web server + Парсерні колоди з веб-сервера Apache2 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + Парсерні колоди з веб-сервера Nginx + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + Парсерні колоди з веб-сервера Microsoft IIS + + + IIS + IIS + + + Select/deselect all the files + Виберіть/Виберіть всі файли + + + All + Всі + + + Inspect a log file + Перевірка файлу журналу + + + Name + Ім'я + + + Size + Розмір + + + Refresh the list + Відновити список + + + Total size of the parsed data + Загальний розмір даних парсованих + + + Total number of parsed lines + Загальна кількість парованих ліній + + + Start parsing the selected files + Почати підпис вибраних файлів + + + START + СТАРТ + + + Time elapsed since the start + Час клаптиться з початку + + + Average speed, in parsed data size per second + Середня швидкість, в номінальних розмірах даних за секунду + + + Web Server + Веб-сервер + + + Select a Web Server + Виберіть веб-сервер + + + Year + Рік + + + Month + Місяць + + + Day + День народження + + + Hour + Час + + + Draw the chart + Намалюйте діаграму + + + Log line marked as Warning + Лінія входу позначена як Попередження + + + Date when the request arrived (YYYY-MM-DD) + Дата коли запит прибув (YYYY-MM-DDDD) + + + Time when the request arrived (hh:mm:ss) + час, коли запит прибув (h:mm:sss) + + + Protocol of the request + Протокол запиту + + + Method of the request + Метод запиту + + + URI of the requested page + УРТ запитуваної сторінки + + + Query carried along with the URI + Перевізник, що здійснюється разом з URI + + + Response code from the server + Код відгуку від сервера + + + User-agent of the client which made the request + Користувач-агент клієнта, який зробив запит + + + IP address of the Client which made the request + IP-адреса Клієнта, який зробив запит + + + Cookie used for the request + Cookie використовується для запиту + + + The URL which redirected the Client to the requested page + URL-адреса, яка перенаправила Клієнта на запитану сторінку + + + Size ib Bytes of the request, usually includes header and data + Розмір ib Bytes запиту, як правило, включає в себе заголовок і дані + + + Size in Bytes of the served content, usually includes header and data + Розмір в Bytes подається контенту, як правило, включає в себе заголовок і дані + + + Time taken by the server to serve the content, in milliseconds + Час, що приймається сервером для обслуговування вмісту, в мілісекундах + + + Only use lines in which the field is starting with this string + Тільки використовувати лінії, в яких поле починається з цього рядка + + + Protocol: + Протокол: + + + Method: + Метод: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + Тільки використовувати лінії, в яких поле відповідає цій заяві. +Використовуйте '!', '=', '<' або '>', щоб вказати, що використовувати + + + Response: + Відповідь: + + + Query: + Запит: + + + URI: + УРТ: + + + Filters + Фільтри + + + Count + Кількість + + + Number of occurrences + Кількість випадків + + + Item + Пункт + + + Value of the field + Значення поля + + + From: + З: + + + To: + До: + + + Select a log field to view + Виберіть поле для перегляду + + + Field: + Поле: + + + Filter: + Фільтр: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + З рядками, тільки лінії, в яких буде використовуватися поле, починаючи з цього рядка. +З номерами використовуйте '!', '=', '<' або '>', щоб вказати, що використовувати + + + Protocol + Протоколи + + + Method + Мета + + + URI + УРИ + + + User-agent + Користувач-агент + + + Most recurrent + Більшість рецидивів + + + Most trafficked + Більшість трафіку + + + Date ever + Дата коли + + + Day of the week + День тижня + + + Hour of the day + Година дня + + + Time taken + Прийшов час + + + Bytes sent + Відправити + + + Bytes received + Надійшла + + + Mean/Max performances + Mean/Max виступи + + + Requests received + Заяви, отримані + + + Total work + Загальна робота + + + General + Головна + + + Window + Вікно + + + Dialogs + Діалоги + + + Charts + Графіки + + + Appearance + Закупівля + + + Speed + швидкість + + + Relational + Реляційний + + + TextBrowser + Текстовий + + + Databases + База даних + + + Security + Безпека + + + Logs + Логін + + + Defaults + Контакти + + + Control + Контроль + + + Path + Доля + + + Format + Видання + + + Warnlists + Війни + + + Blacklists + Чорний + + + Remember the window's position and size + Пам'ятайте позицію вікна і розмір + + + Remember position and size + Познайомтесь з положеннями та розмірами + + + Remember window's position and size + Пам'ятайте позицію вікна і розмір + + + Geometry + Геометрія + + + Theme to use for the window + Тема для використання для вікна + + + Theme + Головна + + + Native + Навігація + + + Light + Світло + + + Dark + Темний + + + Auto + Автоматика + + + Icons + Ікона + + + Normal quantity of dialog messages shown + Нормальна кількість діалогових повідомлень + + + Normal + Нормативно + + + Dialogs from the main processes + Діалоги з основних процесів + + + Dialogs emitted when parsing logs + Діалоги, які випромінюються при паропроводах + + + Logs parser + Журнали parser + + + Dialogs emitted when viewing statistics + Діалоги, які випромінюються при статистичних даних + + + Statistics viewer + Статистика + + + Define the quantity of dialog mesages shown + Визначення кількості діалогових повідомлень + + + Dialogs level + Рівень ділогів + + + Reduced quantity of dialog messages shown + Зменшена кількість діалогових повідомлень + + + Essential + Головна + + + Augmented quantity of dialog messages shown + Наведена кількість діалогових повідомлень + + + Explanatory + Розгортання + + + Theme to use for the Charts + Тема для використання діаграм + + + Preview + Огляд + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Представляємо крок в осі часу, за секундами. +Всі значення, що падають всередині того ж інтервалу, будуть об'єднані і будуть використані значення. + + + Time interval + Часовий інтервал + + + The format to use for the labels of the time axis. + Формат для використання етикеток осі часу. + + + Time format + Формат + + + The size of the pie + Розмір пирога + + + Pie size + Пиріг розмір + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + Максимальна кількість скибочок, що складається з пирога. +Виготовлені скибочки будуть угруповані на один комплексний зріз. + + + Maximum slices + Максимальні скибочки + + + Font to use for the Text Browser + Шрифт для використання для текстового браузера + + + Font + Фокачча + + + Double-spaced lines + Двомісні лінії + + + Use wide lines + Використовуйте широкі лінії + + + Define the spacing between lines + Визначте інтервал між лініями + + + Lines spacing + Лінії спати + + + None + Ні + + + Color scheme to use for the Text Browser + Колірна гамма для використання для текстового браузера + + + Color scheme + Колірна гамма + + + The appearance of the Text Browser with the current settings + Поява браузера Текст з поточними налаштуваннями + + + Insert the base path only, file name excluded + Вставте базовий шлях тільки, назву файлу виключено + + + The given path doen't exists, or doesn't point to a folder + Наведений шлях не існує, або не вказується на папку + + + Path for the database files + Шлях для файлів бази даних + + + Paths + Шляхи + + + Apply the current path + Застосувати поточний шлях + + + Select the path through a dialog window + Виберіть шлях через діалогове вікно + + + Path where the logs data collection database is located + Шлях де розташована база даних логів + + + Logs data + Дані журналів + + + Path where the used files hashes database is located + Шлях, де розташована база даних використаних файлів + + + Used files + Використовується файли + + + Backup options for the Logs Data database + Параметри резервного копіювання для бази даних логів + + + Backups + Резервуари + + + A new backup is made when closing LogDoctor after having succesfully edited the database + Нова резервна копія виконана при закриванні LogDoctor після того, як вона відхилена бази даних + + + Backup the Logs Data database and keep + Резервне копіювання бази даних Логів та збереження + + + Whether it is allowed or denied to follow symlinks occuring in a path + Якщо це дозволено або відмовлено слідувати симлінкам, що відбуваються в шляху + + + Follow symlinks + Дотримуйтесь symlinks + + + Default WebServer + Статус на сервери + + + Usage control + Контроль використання + + + Hide already used files + Приховати вже використовувані файли + + + Size warnings + Попередження розміру + + + Warn me when using files with a size exceeding: + Війна мене при використанні файлів з розміром, що перевищує: + + + Logs folder + папка журналів + + + Logs format string + Логотип ВТС + + + Format string + Формат рядок + + + Insert the format string you're using + Вставте рядок формату, який ви використовуєте + + + Apply the current string + Застосувати поточний рядок + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + Визначте рядок журналу зразка з вказаного збереженого рядка, щоб перевірити, чи він автоматично відформатований. +Будь-яке поле не вважається LogDoctor з'явиться як 'DISCARDED' + + + Generate sample + Генерувати зразок + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + Будь ласка, перевірте правильність цього рядка. +Поле, позначені як 'DISCARDED' правильно парують, але не вважаються LogDoctor + + + Open an help window + Відкрийте вікно допомоги + + + Help + Про нас + + + Select a log field + Виберіть поле входу + + + Use warnlist for this field + Використовуйте попередній список для цього поля + + + Add the current line to the list + Додати поточний рядок до списку + + + Remove the selected item from the list + Видалити вибраний пункт зі списку + + + Move the selected item down + Перемістити вибраний пункт вниз + + + Use blacklist for this field + Використовуйте чорний список для цього поля + + + Add line + Додати рядок + + + Remove selection + Видалити вибір + + + Language + Українська + + + Utilities + Контакти + + + Tools + Інструменти + + + Games + Ігри + + + Perform a version-check + Виконувати версію-check + + + Show some info about LogDoctor + Показати інформацію про LogDoctor + + + Open a block-note like window to write temporary text + Відкрийте блок-нот як вікно, щоб написати тимчасовий текст + + + Play CrissCross + Грати CrissCross + + + Play Snake + Грати Snake + + + Show the changelog + Показати зміни + + + warnlist + Помічник + + + blacklist + чорний список + + + copy + Копіювати + + + copies + копії + + + Check updates + Перевірити оновлення + + + Infos + Новини + + + BlockNote + БлокПримітка + + + CrissCross + КрисКрос + + + Snake + Змія + + + Changelog + Логін + + + + RichText + + Select a file from the list + Виберіть файл зі списку + + + to inspect its content + перевірити його зміст + + + Failed to read + Прочитати + + + + SnakeGame + + PLAY + ПЛАТА + + + Classic + Класика + + + Hunt + Тітка + + + Battle + Битва + + + Game Over + Гра над + + + Your adversary fell in the water! + У воду знизилася ваша домішка! + + + YOU WON! + ЗАМОВИТИ! + + + You fell in the water! + Ви впав в воду! + + + YOU LOST! + Отримуй! + + + Your adversary ate itself! + Ваш рекламний портал! + + + You ate yourself! + Ви самі! + + + Your adversary ate you! + Ваше оголошення! + + + You ate your adversary! + Ви даєте перевагу! + + + You ate each other! + Зроби один одного! + + + MATCH IS DRAW! + MATCH IS ДРАВ! + + + + TR + + Unexpected WebServer + Недосвідчена WebServer + + + Logs Size Breakdown + Журнали розмір відключення + + + Ignored + Ігнольд + + + Parsed + Батьки + + + Blacklisted + Чорний + + + Others + Інші + + + from + з + + + to + до + + + Log Lines Marked as Warning + Логічні лінії позначені як попередження + + + Time Taken to Serve Requests + Час, який приймав запити + + + Time of Day Count + Час денного рахунку + + + Relational Count + Реляційний розрахунок + + + FALSE + ФАЛСЕ + + + TRUE + Твитнуть + + + Date + Дата + + + Year + Рік + + + Month + Місяць + + + Day + День народження + + + Time + час + + + Hour + Час + + + Minute + Мінуси + + + Second + Другий + + + Warning + Зареєструватися + + + Protocol + Протоколи + + + Method + Мета + + + URI + УРИ + + + Query + Книжка + + + Response code + Код відгуку + + + Time taken + Прийшов час + + + Bytes sent + Відправити + + + Bytes received + Надійшла + + + Referrer + Реферер + + + Cookie + Проксимус + + + Client + Клієнт + + + User-agent + Користувач-агент + + + January + Січень + + + February + Лютий + + + March + Березень + + + April + Квітень + + + May + Травень + + + June + Червень + + + July + Липень + + + August + Серпень + + + September + Вересень + + + October + Жовтень + + + November + Листопад + + + December + Грудень + + + Sunday + Неділя + + + Monday + Понеділок + + + Tuesday + П'ятниця + + + Wednesday + Середа + + + Thursday + Четвер + + + Friday + П'ятниця + + + Saturday + Субота + + + diff --git a/logdoctor/translations/LogDoctor_ur_PA.ts b/logdoctor/translations/LogDoctor_ur_PA.ts new file mode 100644 index 0000000..3ac714a --- /dev/null +++ b/logdoctor/translations/LogDoctor_ur_PA.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + ورژنز + + + Version 4 + نسخہ 4 + + + Version 3 + نسخہ 3 + + + Version 2 + ورژن 2 + + + Version 1 + نسخہ 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + حروف بنائیں + + + Cross-platform compatibility: + کراس پلیٹ فارم (انگریزی: + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + اعداد: + + + Warnings + تنبیہ + + + Speed + رفتار + + + Counts + گن + + + Daytime + دن کا وقت + + + Relational + بحالی + + + Globals + گلوبل + + + Translations: + ترجمہ: + + + Italian + اطالوی + + + Spanish + اندلس + + + French + فر انس + + + Tools: + آلات: + + + Block note + نظر انداز کریں + + + Utilities: + حدیث: + + + Infos viewer + معلومات کنندہ + + + Updates checker + طےشدہ + + + Themes: + انس: + + + Dark + اندھیرا + + + Light + روشنی + + + Improvements and fixes + صفائی‌ستھرائی + + + New themes: + نئے موضوعات: + + + Ash + اشیاء + + + Candy + کینڈی + + + Forest + جنگل + + + Powder + پالتو + + + Restyled GUI + طےشدہ + + + Restyled dialogs + طےشدہ + + + Doxygen documentation + ڈی‌جی‌جی‌جی‌جی‌جی‌ڈیسسس + + + Mini-Games: + منی-گامس: + + + Criss-cross + کرسس-سر- + + + Snake + انڈیا + + + Changed default paths + طے شدہ راستے + + + New game modes for Snake + بھول بھلياں کے ليے نئے کھيل کا موڈ + + + Hunt + ہنٹ + + + Battle + جنگ + + + New translations: + نئے ترجمے: + + + Japanese + جاپاني + + + Portuguese + فر انس + + + Code improvements + کوڈ بہتر + + + Performance improvements + بہتری لانا + + + Added tests suite: + اس میں شامل ٹیسٹ سوٹ: + + + white box tests + سفید باکس ٹیسٹ + + + Customized charts themes + نقش‌ونگار + + + Fixes + فِس + + + Tests improvements + آزمائشوں میں بہتری + + + Docker support + کارڈ کی مدد + + + Upgrade to C++20 + C++20 تک تجدید + + + Upgrade to Qt6 + Qt6 تک تجدید + + + Restyled themes + طےشدہ + + + Redesigned configs section + تشکیلی حصوں کو دوبارہ شروع کریں + + + Stability improvements + غیر متصل بہتری + + + Generating warnings dinamically + جینیاتی طور پر تنبیہ + + + New tool: + نیا ٹول: + + + Changelog + لاگ تبدیل کرو + + + Tweakable parameters for some of the charts: + چند چارٹ کے لیے قابلِ ذکر پیرامیٹراں: + + + Improved project structure + تعمیر شدہ منصوبہ بندی + + + Modernized Cmake usage + جدیدیت استعمال کر نا + + + + Crapinfo + + Version + ورژن + + + Currently installed version of the software + موجودہ سوفٹ ویئر کا نصب شدہ نسخہ + + + Repository links + دوبارہ شروع تعلقات + + + Paths + پاتھ + + + The path of the executable file + پرانی فائل کے راستے + + + Executable + بند + + + The path where the configuration file gets saved and searched in + وہ راستہ جہاں کنڈ فائل بچ جاتی ہے اور اسے اندر تلاش کیا جاتا ہے + + + Configuration file + فائل فہرست + + + The path where the application searches for extra resources + وہ راستہ جہاں درخواست اضافی وسائل کے لیے تلاش ہوتی ہے + + + Application data + جگہ + + + + Crapnote + + Reduce the font size + فونٹ کا سائز کم کریں + + + Font size + فونٹ + + + Increase the font size + فا ئل حجم بڑھا ئيں + + + + Crappath + + Choose + منتخب کریں + + + Cancel + منسوخ + + + + Crapup + + Checking for updates + تجدید کا جائزہ لینا + + + New version available + نیا نسخہ دستیاب ہے + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + نیا نسخہ دستیاب ہے! +براہ مہربانی لاگ ڈوکٹر کی گیٹ ذخیرہ گاہ کا دورہ کریں اور اس کے بارے میں ہدایات پر عمل کریں + + + No update found + کوئی تجدید نہیں پایا گیا + + + LogDoctor is up-to-date + لاگ ڈوکٹر اپ-ڈی-ڈی- + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + آپ مستقبل سے ایک ورژن چلا رہے ہیں! +آپ کا نسخہ موجودہ وی پی این ورژن سے باہر ہے +آپ اصل لاگ ڈوکٹر چلا رہے ہیں؟ +براہ مہربانی لاگ ڈوکٹر کے محفوظے اور اس کا تازہ ورژن حاصل کریں + + + Failed to establish a connection + اتصال قائم کرنے میں ناکامی + + + Connection error, please try again later + اتصال مدون کو دوبارہ کوشش کریں + + + Connection timed out + اتصال کی مدت + + + Version check failed + نسخہ چیک ناکام ہوا + + + An error occured while parsing: +version mark not found + محفوظہ کو ٹیسٹ کرنے کے دوران غلطی. +نسخہ پتہ نہیں پایا گیا + + + An error occured while parsing: +malformed version + محفوظہ کو ٹیسٹ کرنے کے دوران غلطی. +مدون شدہ نسخہ + + + An error occured while comparing: +malformed upstream version + موازنہ کرنے کے دوران غلطی: +مفقود نسخہ + + + + CrissCross + + Victory + فتح + + + You beated me! + تم مجھے بدنام کیا! + + + This time you lost! + اس بار آپ ہار گئے! + + + Draw + نکالیں + + + Nice match + اچھا میچ + + + + DialogBool + + Yes + ہاں + + + No + نہیں + + + + DialogIda + + Ignore + نظر انداز کریں + + + Discard + مصر + + + Abort + Abort + + + + DialogMsg + + Ok + اوکے + + + + DialogSec + + One of the lists has an invalid item + فہرستوں میں سے ایک نامناسب آئٹم رکھتا ہے + + + An error occured while reading the configuration file + فائل پڑھنے کے دوران غلطی + + + An error occured while parsing configuration file's data + فائل کے ڈیٹا کو نصب کرنے کے دوران غلطی + + + Failed to create the configuration file's directory + اتصال کی فائل بنانے میں ناکامی + + + Failed to create the configuration file + فائل نہیں بنایا جاسکتا + + + An error occured while writing the configuration file + اتصال مدون کرنے کے دوران غلطی + + + An error occured while preparing the configuration file's data + انتظامیہ فائل کے ڈیٹا کی تیاری کے دوران غلطی + + + The path contains a symlink + راستے میں ایک نظم ہے + + + The file does not exist + فائل نہیں پائی گئی + + + Failed to create the database backups' directory + ڈیٹابیس کی ڈائریکٹری بنانے میں ناکامی + + + Failed to copy the database file + ڈیٹا بیس فہرست کاپی کرنے میں ناکامی + + + Failed to update the backups + پیکجوں کی تجدید کرنے میں ناکامی + + + Failed to create the directory + ڈائریکٹر بنانے میں ناکامی + + + Unrecognized entry + غیر درج شدہ اندراج + + + Size of the file + فائل کا حجم + + + Warning size parameter + ڈر سنانے والے حجم + + + Failed to read gzipped file + گلئیڈ فائل پڑھنے میں ناکامی + + + An error occured while parsing the format string + شکلبند کرنے کے دوران غلطی + + + Available memory + دستیاب یاد + + + Size of the logs + لاگس کے حجم + + + An error occured while reading the gzipped file + gzpor فائل پڑھنے کے دوران غلطی + + + An error occured while reading the file + فائل پڑھنے کے دوران غلطی + + + Something failed while handling the file + فائل لوڈ کرنے کے دوران کچھ ناکام ہوا + + + An error occured while working on the database + ڈیٹا بیس پر کام کرنے کے دوران غلطی + + + Aborting + آذربائیجان + + + Invalid locale + غیر متصل + + + Unexpected locale format + غیر متصل شکل + + + If you haven't manually edited the configuration file, +please report this issue + اگر آپ نے دستی طور پر وضع کردہ فائل کو مدون نہیں کیا ہے تو +براہ مہربانی اس شمارے کی رپورٹ کریں + + + The given locale is not an accepted language + دیہی زبان قبول نہیں ہے + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + اگر آپ یہ لاگ ڈوکٹر میں کرنا چاہتے ہیں تو، +بکس کے صفحہ پر درج نصیحت پر عمل کریں + + + Configuration file not found + فائل نہیں پائی گئی + + + Unable to retrieve the configuration file + فائل فہرست حاصل کی جارہی ہے + + + Skipping + حکمت + + + An error occured while handling the configuration file + اتصال مدون کرنے کے دوران غلطی + + + Failed to write the configuration file + اتصال کی فائل نہیں لکھی جاسکتی + + + Current configuration not saved + حالیہ اتصال محفوظ نہیں کیا گیا + + + File not readable + فائل نہیں پڑھی جاسکتی + + + The file is not readable + فائل نہیں پڑھی جاسکتی + + + File not writable + فائل حذف نہیں کی گئی + + + The file is not writable + فائل درج نہیں ہے + + + Directory not writable + ڈائری لکھنا ممکن نہیں + + + The directory is not writable + ڈائریکٹری درج نہیں ہے + + + Invalid path + غیر متصل راستے میں + + + Failed applying configuration + اتصال کا اضافہ ناکام ہوگیا + + + Invalid configuration lines + حفاظتی لائنوں میں + + + Has not been possible to apply some of the configurations + کچھ کوڑوں کا اطلاق کرنا ممکن نہیں ہے + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + اگر آپ آگے بڑھنے کا انتخاب کریں گے تو تمام پریفیکچرنگ ضلع ہو جائے گا۔ +جاری رہیں؟ + + + Failed to retrieve the help file + فائل حذف کرنے میں ناکامی + + + An error occured while getting the help file + فائل حذف کرنے کے دوران غلطی + + + Additional resources can be downloaded from the git repo + مزید وسائل کو گیٹ ریپو سے ڈاؤن لوڈ کیا جا سکتا ہے + + + Unable to retrieve the file + فائل حذف کرنے میں ناکامی + + + Invalid string + لو گ میں + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + دیے گئے تار غیر صحیح ہے اور فہرست میں شامل نہیں کیا جا سکتا۔ + +براہ مہربانی اسے درست کریں اور دوبارہ کوشش کریں + + + QSql driver not found + کیسل ڈرائیور نہیں ملا + + + Failed to retrieve the driver needed to handle the database + ڈیٹا بیس کو حل کرنے کے لیے ڈرائیور کو چلانے میں ناکامی + + + File not found + فائل نہیں پائی گئی + + + Failed to retrieve the database file + فائل فہرست حاصل کرنے میں ناکامی + + + Create a new database? + نیا ڈیٹا بیس بنائیں؟ + + + The database contains an unexpected table + ڈیٹا بیس میں ایک غیر متوقع میز ہے + + + Unexpected table + محفوظ میز + + + It seems that the database is missing a table + ایسا لگتا ہے کہ ڈیٹا بیس ایک میز سے محروم ہے + + + Table not found + ٹیبل نہیں پائی گئی + + + The database contains an unexpected column + ڈیٹا بیس میں غیر متوقع کالم موجود ہے + + + Unexpected column + غیر متصل کالم + + + It seems that the table is missing a column + ایسا لگتا ہے کہ میز ایک ستون سے محروم ہے + + + Column not found + رنگ + + + A column has an unexpected data-type + ایک کالم میں غیر متوقع ڈیٹا کی قسم ہے + + + Unexpected data-type + غیر واضح ڈیٹا- قسم + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + اس ڈیٹا بیس کا نام تبدیل کر کے '.copy' رکھ دیا جائے گا اور نئی تخلیق کی جائے گی۔ +جاری رہیں؟ + + + Database created + ڈیٹا بیس فہرست + + + Successfully created a new database + کامیابی سے نیا ڈیٹا بیس بنایا + + + Not a file + فائل نہیں بنایا جاسکتا + + + The path was supposed to point to a file, but it doesn't + راستہ کسی فائل کی طرف اشارہ کرنے کے لیے لگایا جاتا تھا لیکن ایسا نہیں ہوتا + + + Please remove the conflict and retry + براہ کرم جھگڑے اور دوبارہ شروع کریں + + + The database file is not readable + ڈیٹا بیس فہرست فحش اداکارائیں قابل ذکر ہیں + + + Please set the proper permissions and retry +If this error persists, please report this issue + برائے مہربانی درست اجازہ اور دوبارہ پلٹی مرتب کریں +اگر یہ غلطی جاری رہے تو براہ مہربانی اس نمبر کی رپورٹ دیں + + + The database file is not writable + ڈیٹا بیس فہرست بند کی گئی ہے + + + Invalid database path + [ تصویر کا حوالہ ] + + + Failed creating database + ڈی بگ بنانے میں ناکامی + + + An error occured while creating the database + ڈیٹا بیس بنانے کے دوران غلطی + + + Failed opening database + اوپن ڈیٹا بیس میں ناکامی + + + An error occured while opening the database + ڈیٹا بیس کھولنے کے دوران غلطی + + + Failed executing on database + ڈیٹا بیس پر غلطی + + + An error occured while executing a statement on the database + ڈیٹا بیس فہرست متعلقہ اطلاع کے دوران غلطی + + + Failed to backup database + بیک اپ ڈیٹا بیس میں ناکامی + + + Please report this issue + براہ مہربانی اس شمارے کی رپورٹ دیں + + + Invalid log format string + غیر متصل لاگ فارم نگاری + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + براہ مہربانی چیک کریں کہ آپ کی ویب سروسر کی طرف سے کوئی غلطی نہیں ہے +اگر اسے قبول کیا جائے تو براہ مہربانی یہاں ایک ٹیپو کی موجودگی کا جائزہ لیں +اگر سب کچھ ٹھیک ہے، تو براہ مہربانی اس نمبر کی رپورٹ کریں + + + Log format error + لاگ فارم خامی + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + لاگ فارم مقرر نہیں کیا گیا ہے یا نامناسب ہے۔ +براہ كرم یتیموں ميں مناسب فائل شامل کريں + + + Misconfigured log format + مس اخذ کردہ لاگ فارم + + + No log field has been set in the current logs format, +making it useless to parse logs + حالیہ لاگس فارمیٹ میں کوئی لاگ فیلڈ مقرر نہیں کیا گیا ہے، +اسے تختہ سازی کے لیے بیکار بنایا جاتا ہے + + + Please set up a format which contains at least one field + برائے مہربانی ایسی صورت مرتب کریں جس میں کم از کم ایک فیلڈ موجود ہوں + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + ایک یا ایک سے زیادہ میدانوں کے درمیان میں کمی واقع ہوتی ہے۔ +اس کی حدود قائم کرنا مشکل ہو گیا۔ +اور ممکنہ طور پر غلط اعداد و شمار کو محفوظ کرنے کے لئے + + + Please set up a format which contains separators between fields + برائے مہربانی ایک ایسی صورت مرتب کریں جس میں کھیتوں کے درمیان settlement موجود ہوں + + + Missing field in log format + لاگ فارم میں مفقود فیلڈ + + + An important field is missing from the provided format: + اہم میدان فراہم کردہ فارمیٹ سے محروم ہے: + + + The quality of the statistics may be seriously compromized + اعدادوشمار کی خوبی سنجیدہ ہو سکتی ہے + + + Proceed anyway? + ویسے بھی؟ + + + 'Carriage Return' in log format + لاگ فارمیٹ میں 'Carriage واپسی' + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + فراہم کردہ فارمیٹ میں 'کریٹیج لوٹ‘ شامل ہے۔ +اگر احتیاط کے ساتھ استعمال نہ کیا جائے تو یہ ڈیٹا نقصان یا شکست کا باعث بن سکتا ہے + + + An error occured while parsing logs + لاگس نکالتے وقت غلطی + + + Failed defining type + غیر متصل قسم + + + Failed to determine the log type + لاگ ٹائپ معلوم کرنے میں ناکامی + + + File already used + فائل پہلے ہی استعمال ہوئی ہے + + + The file has probably been used already + فائل غالباً پہلے ہی استعمال ہو چکی ہے + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + آگاہی کو نظرانداز کریں اور اِسے استعمال کریں ? + + + Duplicate file + ڈاکیٹ فائل + + + The file appears twice in the list of selections + فائل انتخابوں کی فہرست میں دو بار سامنے آتی ہے + + + Failed updating hashes + غیر متصل + + + An error occured while inserting the parsed files hashes into the database + تنصیب کردہ فائلیں کو ڈیٹا بیس میں داخل کرنے کے دوران غلطی + + + File exceeds warning size + فائل رولر زیادہ ڈرانے والی ہے + + + The file's size exceeds the warning size + فائل کا حجم تنبیہی حجم سے تجاوز کرتا ہے + + + Not enough memory + کافی یاد نہیں + + + The total size of the selected files exceeds the available memory + منتخب فائلیں کا کل حجم دستیاب یادداشت سے تجاوز کرتا ہے + + + Please free some resources, parse the files in different steps or split them into smaller units + برائے مہربانی کچھ وسائل آزاد کریں، فائلوں کو مختلف مراحل میں تقسیم کریں یا انہیں چھوٹے یونٹوں میں تقسیم کریں + + + Failed reading + پڑھنے میں ناکامی + + + File is empty + فائل خالی ہے + + + The file is blank + فائل رولر + + + Failed to retrieve the selected file + منتخب کردہ فائل کو حذف کرنے میں ناکامی + + + Discard it and continue, or Abort all and exit? + اسے نکال کر، یا تمام اور باہر؟ + + + No file to parse + فائل فہرست حاصل کی جارہی ہے + + + The list of files to parse is empty + فہرست فحش اداکارائیں بلحاظ خام مال ہے + + + Directory not found + ڈائریکٹری نہیں پائی گئی + + + The directory does not exists + ڈائریکٹری موجود نہیں ہے + + + Directory not readable + ڈائریکٹری نہیں پڑھی جاسکتی + + + The directory is not readable + ڈائریکٹری قابل تلاوت نہیں ہے + + + Please set the proper permissions before to start + براہ كرنے سے پہلے صحیح اجازہ مقرر کريں + + + Failed creating directory + ڈائریکٹر بنانے میں ناکامی + + + The path does not exists + راستہ موجود نہیں ہے + + + Data conversion failed + ڈیٹا تبدیل کرنے میں ناکامی + + + Failed to convert from '%1' to '%2' + '%1' to '%2' سے تبدیل کرنے میں ناکامی + + + Failed to create statistics + اعداد بنانے میں ناکامی + + + An error occured while processing + تنصیب کے دوران غلطی + + + Cannot create statistics + اعداد و شمار پیدا نہیں کر سکتے + + + No data has been found that matches with the currently set parameters + کوئی اعداد و شمار نہیں ملا ہے کہ موجودہ سیٹ پیرامیٹرز کے ساتھ مقابلے ہوتے ہیں + + + Not a folder + فولڈر نہیں + + + The path was supposed to point to a folder, but it doesn't + راستہ کسی فولڈر کی طرف اشارہ کرنا تھا لیکن ایسا نہیں ہے + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + داخلے کا نام تبدیل کر کے '.copy' رکھ دیا جائے گا اور نئی تخلیق کی جائے گی۔ +جاری رہیں؟ + + + An error occured + محفوظہ کو ٹیسٹ کرنے کے دوران غلطی + + + Failed renaming + غیر متصل + + + An error occured while renaming + دوران میں غلطی + + + + GameDialog + + Ok + اوکے + + + + MainWindow + + Parse logs from the Apache2 web server + Parse Laxs from Apache2 ویب سرور + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + نفیس ویب سرور کی طرف سے Parse لاگس + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + مائیکروسافٹ IIS ویب سرور کی طرف سے Parse لاگس + + + IIS + IIS + + + Select/deselect all the files + تمام فائلیں منتخب کریں + + + All + تمام + + + Inspect a log file + لاگ فائل حذف کریں + + + Name + نام + + + Size + حجم + + + Refresh the list + فہرست کی ترتیب عکسی کریں + + + Total size of the parsed data + جمع کردہ اعداد کا کُل حجم + + + Total number of parsed lines + جمعي لائنوں کي مکمل تعداد + + + Start parsing the selected files + منتخب فائلیں شامل کریں + + + START + مصر + + + Time elapsed since the start + شروع ہی سے وقت ضائع ہو گیا + + + Average speed, in parsed data size per second + اوسط رفتار، کمیت شدہ ڈیٹا حجم فی سیکنڈ میں + + + Web Server + ویب سرور + + + Select a Web Server + ویب سرور منتخب کریں + + + Year + سال + + + Month + ماہ + + + Day + دن + + + Hour + قیامت + + + Draw the chart + چارٹ پیسٹ کریں + + + Log line marked as Warning + لاگ لائن کو تنبیہ کے طور پر نشان لگایا گیا + + + Date when the request arrived (YYYY-MM-DD) + تا حال جب درخواست آئی (YYYY-M-DD) + + + Time when the request arrived (hh:mm:ss) + وقت آتا ہے جب طلبہ (ہ:mm:s) پہنچے + + + Protocol of the request + درخواست کا پروٹوکول + + + Method of the request + درخواست کا طریقہ + + + URI of the requested page + مطلوبہ صفحے کی تصدیق + + + Query carried along with the URI + قید کیساتھ ساتھ کُل‌وقتی خدمت + + + Response code from the server + سرور سے دوبارہ شروع ہونے والا کوڈ + + + User-agent of the client which made the request + کلائنٹ کا صارف۔ جس نے درخواست کی تھی + + + IP address of the Client which made the request + کلنٹن کا آئی پی پتے جس نے درخواست کی تھی + + + Cookie used for the request + طلبہ کے لیے کوکی استعمال کیا جاتا ہے + + + The URL which redirected the Client to the requested page + اُنہوں نے یہ بھی کہا : ” مَیں نے اِس کتاب کا صفحہ پڑھ لیا + + + Size ib Bytes of the request, usually includes header and data + طلب کے حجم ib Bytes، عام طور پر ہیڈر اور ڈیٹا شامل ہیں + + + Size in Bytes of the served content, usually includes header and data + خدماتی مواد کے بائٹس میں حجم، عام طور پر سربراہ اور ڈیٹا شامل ہوتے ہیں + + + Time taken by the server to serve the content, in milliseconds + مواد کی خدمت کے لیے سرور کی طرف سے وقت لیا، ملی سیکنڈ میں + + + Only use lines in which the field is starting with this string + صرف ان لائنوں کا استعمال کرتے ہیں جن میں میدان اس تار سے شروع ہو رہا ہے + + + Protocol: + پروٹوکول: + + + Method: + انداز: + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + صرف ان لائنوں کا استعمال کریں جن میں فیلڈ اس بیان سے مماثل ہے۔ +استعمال کریں '!', '=', '<' یا '>' اعلان کرنے کے لئے کہ کیا استعمال کرنا ہے + + + Response: + رداس: + + + Query: + کوارٹر: + + + URI: + اجازت نامہ: + + + Filters + فائلز + + + Count + گن + + + Number of occurrences + تعداد + + + Item + آئی ایم + + + Value of the field + میدان کی اہمیت + + + From: + از: + + + To: + غرض: + + + Select a log field to view + دیکھنے کے لیے لاگ فیلڈ منتخب کريں + + + Field: + فیلڈ: + + + Filter: + فائلز: + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + سٹرنگز کے ساتھ، صرف وہی لائنیں استعمال کی جائیں گی جن میں فیلڈ اس سٹرنگ سے شروع ہو رہی ہے۔ +نمبروں کے ساتھ، استعمال کریں '!', '=', '<' یا '>' اعلان کرنے کے لئے کہ کیا استعمال کرنا ہے + + + Protocol + پروٹوکول + + + Method + طریقہ + + + URI + ترکی + + + User-agent + صارف + + + Most recurrent + سب سے اہم بات + + + Most trafficked + زیادہ‌تر بچے + + + Date ever + تاریخ کبھی نہیں + + + Day of the week + ہفتے کا دن + + + Hour of the day + قیامت کا دن + + + Time taken + وقت نکالا + + + Bytes sent + بائٹس + + + Bytes received + بیٹس حاصل کئے گئے + + + Mean/Max performances + مقصد/Max نمائش + + + Requests received + درخواستیں موصول ہوئیں + + + Total work + مکمل کام + + + General + عمومی + + + Window + ونڈو + + + Dialogs + لاگ ان + + + Charts + چارٹ + + + Appearance + غیر متصل + + + Speed + رفتار + + + Relational + بحالی + + + TextBrowser + متن بروشر + + + Databases + ڈیٹا بیس + + + Security + سیکورٹی + + + Logs + لاگ ان + + + Defaults + طے شدہ + + + Control + کنٹرول + + + Path + پاتھ + + + Format + طےشدہ + + + Warnlists + آگاہییں + + + Blacklists + سیاہ رنگ + + + Remember the window's position and size + کھڑکی کے مقام اور حجم کو یاد رکھیں + + + Remember position and size + پوزیشن اور حجم یاد رکھیں + + + Remember window's position and size + کھڑکی کے مقام اور حجم کو یاد رکھیں + + + Geometry + عرفیت + + + Theme to use for the window + ونڈو کے لیے استعمال ہونے والاme + + + Theme + تھیم + + + Native + رنگ + + + Light + روشنی + + + Dark + اندھیرا + + + Auto + خودکار + + + Icons + نام + + + Normal quantity of dialog messages shown + گر تے هو ئے پیغامات کي عام مقدار + + + Normal + عام + + + Dialogs from the main processes + بنیادی مراحل سے متعلقه لاگس + + + Dialogs emitted when parsing logs + لاگس چوری کرتے وقت ڈی‌لوگ ختم ہو جاتے ہیں + + + Logs parser + لاگ انر + + + Dialogs emitted when viewing statistics + اعدادوشمار کو دیکھنے کے بعد ڈی‌لوگ ختم ہو جاتے ہیں + + + Statistics viewer + اعدادوشمار دیکھنے والا + + + Define the quantity of dialog mesages shown + حساب‌کتاب کی مقدار کو بہتر بنائیں + + + Dialogs level + لاگ ان + + + Reduced quantity of dialog messages shown + پیغامات کی کثرت + + + Essential + ضروری + + + Augmented quantity of dialog messages shown + شمارندی پیغامات کی مقدار + + + Explanatory + تدفین + + + Theme to use for the Charts + چارٹ کے لیے استعمال ہونے والا جرم + + + Preview + تفصیل + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + وقت میں ایک قدم کی نمائندگی کرتا ہے، سیکنڈ میں. +ایک ہی وقت کے اندر گرنے والی تمام اقدار کو ضم کر دیا جائے گا اور معنی قدر استعمال کیا جائے گا۔ + + + Time interval + وقت + + + The format to use for the labels of the time axis. + ٹائم اکیس کے لیبل کے استعمال کے لیے فارمیٹ. + + + Time format + وقت معین + + + The size of the pie + کا سائز + + + Pie size + مائل سائز + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + سب سے زیادہ تعداد یہ ہے کہ پَروں پر مشتمل ہوگی ۔ +گناہ گاروں کو ایک گروہ میں ڈالا جائے گا ۔ + + + Maximum slices + غیر متصل + + + Font to use for the Text Browser + متن برصغیر کے لیے استعمال ہونے والا فونٹ + + + Font + پرنٹ + + + Double-spaced lines + ڈبل-space لائنیں + + + Use wide lines + وسیع لکیریں استعمال کریں + + + Define the spacing between lines + لائنوں کے درمیان لا ئنن کو درست کريں + + + Lines spacing + لائنز + + + None + کچھ نہیں + + + Color scheme to use for the Text Browser + ٹیکس برصغیر کے لیے استعمال کرنے کے لیے رنگا سکیم + + + Color scheme + رنگوں کی تدبیر + + + The appearance of the Text Browser with the current settings + موجودہ ترتیبات کے ساتھ متن برصغیر کا ظہور ہوتا ہے + + + Insert the base path only, file name excluded + بصری راستے کو صرف، فائل غیر محفوظ کریں + + + The given path doen't exists, or doesn't point to a folder + دی گئی راستہ ڈوین موجود نہیں ہے یا کسی فولڈر کی طرف اشارہ نہیں کرتا ہے + + + Path for the database files + ڈیٹا بیس فہرست فائلوں کے لیے راہ + + + Paths + پاتھ + + + Apply the current path + موجودہ راستے کا اطلاق کریں + + + Select the path through a dialog window + ڈی بگ ونڈو کے ذریعے راسته منتخب کريں + + + Path where the logs data collection database is located + راستے جہاں لاگس ڈیٹا جمع ڈیٹا ڈیٹا بیس واقع ہے + + + Logs data + لاگس ڈیٹا + + + Path where the used files hashes database is located + راہ جہاں استعمال کردہ فائلوں کی ڈیٹا بیس ہے + + + Used files + استعمال کردہ فائلیں + + + Backup options for the Logs Data database + لاگس ڈیٹا ڈیٹا بیس کے لیے رجوع کریں + + + Backups + پسپپس + + + A new backup is made when closing LogDoctor after having succesfully edited the database + ڈیٹا بیس کو دوبارہ تبدیل کرنے کے بعد جب ایک نیا بیک اپ بنایا جاتا ہے + + + Backup the Logs Data database and keep + لاگس ڈیٹا ڈیٹا بیس کو دوبارہ بند کریں اور محفوظ رکھیں + + + Whether it is allowed or denied to follow symlinks occuring in a path + چاہے اسے کسی راستے میں ہونے والے سیم لنکس کی پیروی کرنے یا انکار کیا جاتا ہے + + + Follow symlinks + ہم‌جنس‌پسندوں کی پیروی کریں + + + Default WebServer + ویب پر خدمت کرنے والے + + + Usage control + استعمال کنٹرول + + + Hide already used files + حیدرآباد نے پہلے ہی فائلیں استعمال کیں + + + Size warnings + حجم + + + Warn me when using files with a size exceeding: + ایک بڑی تعداد کے ساتھ فائلیں استعمال کرتے ہوئے مجھے ڈراؤ: + + + Logs folder + لاگ فولڈر + + + Logs format string + لاگس شکلیہ + + + Format string + وائیرڈ نیٹ ورکس + + + Insert the format string you're using + آپ استعمال کر رہے ہیں فارم ٹائم کو تبدیل کریں + + + Apply the current string + حالیہ تاروں پر عمل کریں + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + فی الحال محفوظ کردہ سٹرنگ سے ایک نمونہ لاگ لائن بنائیں، یہ چیک کرنے کے لیے کہ آیا یہ درست طریقے سے فارمیٹ ہوئی ہے۔ +کوئی بھی فیلڈ جس پر LogDoctor نے غور نہیں کیا وہ 'DISCARDED' کے طور پر ظاہر ہوگا + + + Generate sample + جینیاتی نمونے + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + براہ کرم اس لائن کی درستگی کو چیک کریں۔ +'DISCARDED' کے بطور نشان زد فیلڈز کو صحیح طریقے سے پارس کیا گیا ہے، لیکن LogDoctor نے ان پر غور نہیں کیا ہے + + + Open an help window + مدد ونڈو کھولیں + + + Help + مدد + + + Select a log field + لاگ فیلڈ منتخب کريں + + + Use warnlist for this field + اس میدان کے لیے آگاہیی لسٹ استعمال کریں + + + Add the current line to the list + حالیہ لائن کو فہرست میں شامل کریں + + + Remove the selected item from the list + منتخب عناصر فہرست سے حذف کریں + + + Move the selected item down + منتخب عناصر کو اوپر جائیں + + + Use blacklist for this field + اس میدان کے لیے بلیک لسٹ استعمال کریں + + + Add line + لائن شامل کریں + + + Remove selection + انتخاب حذف کریں + + + Language + زبان + + + Utilities + تقسیم + + + Tools + آلات + + + Games + کھیل + + + Perform a version-check + ورژن چیک کریں + + + Show some info about LogDoctor + لاگ ڈوکٹر کے بارے میں کچھ معلومات دکھائیں + + + Open a block-note like window to write temporary text + عارضی متن لکھنے کے لیے ڈاک ٹکٹ کھولیں + + + Play CrissCross + کرس‌ٹینا کا کھیل + + + Play Snake + کھيليں + + + Show the changelog + طےشدہ + + + warnlist + list + + + blacklist + بلیک لسٹ + + + copy + کاپی + + + copies + کاپی + + + Check updates + طےشدہ + + + Infos + معلومات + + + BlockNote + بلاک کرو + + + CrissCross + کرس‌ٹینا + + + Snake + انڈیا + + + Changelog + لاگ تبدیل کرو + + + + RichText + + Select a file from the list + فائل فہرست حاصل کی جارہی ہے + + + to inspect its content + اس کے مواد کو جانچنے کے لئے + + + Failed to read + پڑھنے میں ناکامی + + + + SnakeGame + + PLAY + انکار کرو + + + Classic + کلاسیکی + + + Hunt + ہنٹ + + + Battle + جنگ + + + Game Over + اوپر کھیل + + + Your adversary fell in the water! + آپ کے مخالف پانی میں گر گئے! + + + YOU WON! + آپ وون! + + + You fell in the water! + تم پانی میں گر گئے! + + + YOU LOST! + تم بہت اچھا! + + + Your adversary ate itself! + آپ کے مخالف خود کھا گئے! + + + You ate yourself! + تم نے اپنے آپ کو کھا لیا! + + + Your adversary ate you! + آپ کے مخالف نے آپ کو کھایا! + + + You ate your adversary! + تم نے اپنے مخالف کھا لیا! + + + You ate each other! + تم ایک دوسرے کھاتے ہو! + + + MATCH IS DRAW! + MaTich ہے! + + + + TR + + Unexpected WebServer + غیرمتوقع ویب‌سائٹ پر خدمت کرنے والے + + + Logs Size Breakdown + لاگس حجم توڑنے والی ڈسک + + + Ignored + نظر انداز کریں + + + Parsed + پیر + + + Blacklisted + سیاہ رنگ + + + Others + دیگر + + + from + سے + + + to + جگہ + + + Log Lines Marked as Warning + آگاہی کے طور پر لاج لائینز + + + Time Taken to Serve Requests + خدمت کرنے کیلئے وقت نکالنا + + + Time of Day Count + دن کا وقت + + + Relational Count + بحالی کاؤنٹی + + + FALSE + غیر متصل + + + TRUE + غیر متصل + + + Date + تاریخ + + + Year + سال + + + Month + ماہ + + + Day + دن + + + Time + وقت + + + Hour + قیامت + + + Minute + پرنٹ + + + Second + دوسرا + + + Warning + تنبیہ + + + Protocol + پروٹوکول + + + Method + طریقہ + + + URI + ترکی + + + Query + جگہ + + + Response code + دوبارہ شروع کا کوڈ + + + Time taken + وقت نکالا + + + Bytes sent + بائٹس + + + Bytes received + بیٹس حاصل کئے گئے + + + Referrer + ریڈر + + + Cookie + کوک + + + Client + الٹ + + + User-agent + صارف + + + January + جنوری + + + February + فروری + + + March + مارچ + + + April + اپریل + + + May + مئی + + + June + جون + + + July + جولائی + + + August + اگست + + + September + ستمبر + + + October + اکتوبر + + + November + نومبر + + + December + دسمبر + + + Sunday + اتوار + + + Monday + منگل + + + Tuesday + منگل + + + Wednesday + بدھ + + + Thursday + جمعرات + + + Friday + جمعہ + + + Saturday + سبت + + + diff --git a/logdoctor/translations/LogDoctor_zh_CN.ts b/logdoctor/translations/LogDoctor_zh_CN.ts new file mode 100644 index 0000000..64dc93a --- /dev/null +++ b/logdoctor/translations/LogDoctor_zh_CN.ts @@ -0,0 +1,2177 @@ + + + + + Changelog + + Versions + 版本数 + + + Version 4 + 版本 4 + + + Version 3 + 版本 3 + + + Version 2 + 版本 2 + + + Version 1 + 版本 1 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + 构建脚本 + + + Cross-platform compatibility: + 跨平台兼容性 : + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + 统计: + + + Warnings + 警告 + + + Speed + 速度 + + + Counts + 计数 + + + Daytime + 日间 + + + Relational + 关系 + + + Globals + 全球 + + + Translations: + 翻译: + + + Italian + 意大利语 + + + Spanish + 西班牙语 + + + French + 法语 + + + Tools: + 工具 : + + + Block note + 块状说明 + + + Utilities: + 公用事业: + + + Infos viewer + 信息查看器 + + + Updates checker + 更新检查器 + + + Themes: + 主题 : + + + Dark + 阴暗 + + + Light + 光线 + + + Improvements and fixes + 改进和修正 + + + New themes: + 新主题 : + + + Ash + 灰尘 + + + Candy + 甜甜点 + + + Forest + 森林 + + + Powder + 粉末 + + + Restyled GUI + 已更改的图形界面 + + + Restyled dialogs + 重排对话框 + + + Doxygen documentation + Doxygen 文档 + + + Mini-Games: + 迷你游戏: + + + Criss-cross + 十字架对开 + + + Snake + 蛇头 + + + Changed default paths + 已更改默认路径 + + + New game modes for Snake + 蛇的新游戏模式 + + + Hunt + 韩特 + + + Battle + 战斗 + + + New translations: + 新译名 : + + + Japanese + 日本语 + + + Portuguese + 葡萄牙语 + + + Code improvements + 代码改进 + + + Performance improvements + 业绩改进 + + + Added tests suite: + 添加测试套件 : + + + white box tests + 白盒测试 + + + Customized charts themes + 自定义图表主题 + + + Fixes + 修补 + + + Tests improvements + 测试改进 + + + Docker support + 嵌入器支持 + + + Upgrade to C++20 + 升级到 C++20 + + + Upgrade to Qt6 + 升级到 Qt6 + + + Restyled themes + 重排主题 + + + Redesigned configs section + 重新设计配置科 + + + Stability improvements + 二. 稳定改善 + + + Generating warnings dinamically + 双向生成警告 + + + New tool: + 新工具 : + + + Changelog + 更改日志 + + + Tweakable parameters for some of the charts: + 一些图表的可调整参数: + + + Improved project structure + 改进项目结构 + + + Modernized Cmake usage + 现代化 制作用法 + + + + Crapinfo + + Version + 版本 + + + Currently installed version of the software + 目前安装的软件版本 + + + Repository links + 仓库链接 + + + Paths + 路径 + + + The path of the executable file + 可执行文件的路径 + + + Executable + 可执行文件 + + + The path where the configuration file gets saved and searched in + 配置文件保存和搜索的路径 + + + Configuration file + 配置文件 + + + The path where the application searches for extra resources + 应用程序搜索额外资源的路径 + + + Application data + 应用程序数据 + + + + Crapnote + + Reduce the font size + 缩小字体大小 + + + Font size + 字体大小 + + + Increase the font size + 增加字体大小 + + + + Crappath + + Choose + 选择 + + + Cancel + 取消 + + + + Crapup + + Checking for updates + 正在检查更新 + + + New version available + 新版本可供使用 + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + 新版本可以使用! +请访问 LogDoctor 的 git 仓库, 并遵循如何更新的指令 。 + + + No update found + 找不到更新 + + + LogDoctor is up-to-date + 日志医生更新 + + + :/ + : / 请检查url=值 (帮助). + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + 你正在运行一个版本 从未来! +您的版本超出了当前上游版本 +你是在运行原日志医生吗? +请访问 LogDoctor 的仓库并获取其新版本 + + + Failed to establish a connection + 建立连接失败 + + + Connection error, please try again later + 连接出错, 请稍后再试 + + + Connection timed out + 连接超时 + + + Version check failed + 版本检查失败 + + + An error occured while parsing: +version mark not found + 解析时发生错误 : +未找到版本标记 + + + An error occured while parsing: +malformed version + 解析时发生错误 : +错误的版本 + + + An error occured while comparing: +malformed upstream version + 比较时发生错误 : +上游版本不正确 + + + + CrissCross + + Victory + 胜利 + + + You beated me! + 你让我兴奋了! + + + This time you lost! + 这次你输了! + + + Draw + 绘制 + + + Nice match + 火柴不错 + + + + DialogBool + + Yes + + + + No + 没有 + + + + DialogIda + + Ignore + 忽略 + + + Discard + 丢弃 + + + Abort + 中止 + + + + DialogMsg + + Ok + 还好 + + + + DialogSec + + One of the lists has an invalid item + 其中一个列表有一个无效的项目 + + + An error occured while reading the configuration file + 读取配置文件时出错 + + + An error occured while parsing configuration file's data + 解析配置文件数据时出错 + + + Failed to create the configuration file's directory + 创建配置文件目录失败 + + + Failed to create the configuration file + 创建配置文件失败 + + + An error occured while writing the configuration file + 写入配置文件时出错 + + + An error occured while preparing the configuration file's data + 准备配置文件数据时出错 + + + The path contains a symlink + 路径包含符号链接 + + + The file does not exist + 文件不存在 + + + Failed to create the database backups' directory + 创建数据库备份目录失败 + + + Failed to copy the database file + 复制数据库文件失败 + + + Failed to update the backups + 更新备份失败 + + + Failed to create the directory + 创建目录失败 + + + Unrecognized entry + 未识别条目 + + + Size of the file + 文件大小 + + + Warning size parameter + 警告大小参数 + + + Failed to read gzipped file + 读取 gzipped 文件失败 + + + An error occured while parsing the format string + 解析格式字符串时出错 + + + Available memory + 可用的内存 + + + Size of the logs + 日志大小 + + + An error occured while reading the gzipped file + 读取 gzipped 文件时出错 + + + An error occured while reading the file + 读取文件时发生错误 + + + Something failed while handling the file + 处理文件时出错 + + + An error occured while working on the database + 在数据库中工作时出错 + + + Aborting + 中止 + + + Invalid locale + 无效的地方 + + + Unexpected locale format + 意外的地盘格式 + + + If you haven't manually edited the configuration file, +please report this issue + 如果你还没有手动编辑配置文件, +请报告这个问题 + + + The given locale is not an accepted language + 给定的语言不是被接受的语言 + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + 如果你想在LogDoctor有这个地方, +请遵守寄存器页面上的指示 + + + Configuration file not found + 未找到配置文件 + + + Unable to retrieve the configuration file + 无法获取配置文件 + + + Skipping + 跳过 + + + An error occured while handling the configuration file + 处理配置文件时出错 + + + Failed to write the configuration file + 写入配置文件失败 + + + Current configuration not saved + 当前配置未保存 + + + File not readable + 无法读取的文件 + + + The file is not readable + 文件无法读取 + + + File not writable + 文件不可写 + + + The file is not writable + 文件无法写入 + + + Directory not writable + 目录不可写入 + + + The directory is not writable + 目录不可写入 + + + Invalid path + 无效的路径 + + + Failed applying configuration + 应用配置失败 + + + Invalid configuration lines + 无效的配置行 + + + Has not been possible to apply some of the configurations + 无法应用一些配置 + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + 如果您选择继续, 所有未应用的配置都会丢失 +继续? + + + Failed to retrieve the help file + 获取帮助文件失败 + + + An error occured while getting the help file + 获取帮助文件时发生错误 + + + Additional resources can be downloaded from the git repo + 可从 git repo 下载额外资源 + + + Unable to retrieve the file + 无法获取文件 + + + Invalid string + 无效的字符串 + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + 给定的字符串无效, 不能添加到列表中 + +请改正并重试 + + + QSql driver not found + 找不到 QSql 驱动程序 + + + Failed to retrieve the driver needed to handle the database + 获取处理数据库所需的驱动程序失败 + + + File not found + 找不到文件 + + + Failed to retrieve the database file + 获取数据库文件失败 + + + Create a new database? + 创建新数据库吗 ? + + + The database contains an unexpected table + 该数据库包含一个出乎意料的表格 + + + Unexpected table + 非预期表格 + + + It seems that the database is missing a table + 看来数据库缺少一个表格 + + + Table not found + 找不到表格 + + + The database contains an unexpected column + 数据库包含出乎意料的一栏 + + + Unexpected column + 意外列 + + + It seems that the table is missing a column + 看来桌子少了一栏 + + + Column not found + 未找到列 + + + A column has an unexpected data-type + 列有出乎意料的数据类型 + + + Unexpected data-type + 意外数据类型 + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + 此数据库将重新命名为后缀'. copy'并创建一个新的数据库 。 +继续? + + + Database created + 创建数据库 + + + Successfully created a new database + 成功创建了新数据库 + + + Not a file + 没有文件 + + + The path was supposed to point to a file, but it doesn't + 这条路本该指向一个文件,但不会 + + + Please remove the conflict and retry + 请删除冲突并重试 + + + The database file is not readable + 数据库文件不可读 + + + Please set the proper permissions and retry +If this error persists, please report this issue + 请设置适当的权限并重试 +如果这个错误仍然存在, 请报告这个问题 + + + The database file is not writable + 无法写入数据库文件 + + + Invalid database path + 无效的数据库路径 + + + Failed creating database + 创建数据库失败 + + + An error occured while creating the database + 创建数据库时发生错误 + + + Failed opening database + 打开数据库失败 + + + An error occured while opening the database + 打开数据库时出错 + + + Failed executing on database + 数据库执行失败 + + + An error occured while executing a statement on the database + 执行数据库中的语句时出错 + + + Failed to backup database + 备份数据库失败 + + + Please report this issue + 请报告这个问题 + + + Invalid log format string + 无效的日志格式字符串 + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + 请检查您的 WebServer 没有出错 +如果被接受,请检查是否有打字机 +如果一切顺利,请报告此事 + + + Log format error + 日志格式错误 + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + 日志格式尚未设置, 或无效 +请在配置中添加一个有效的配置 + + + Misconfigured log format + 配置错误的日志格式 + + + No log field has been set in the current logs format, +making it useless to parse logs + 目前日志格式中没有设置日志字段 , +让它无法分析日志 + + + Please set up a format which contains at least one field + 请设置至少包含一个字段的格式 + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + 一个或多个字段之间缺少分隔符, +以致难以确定界限, +并可能导致存储不正确的数据 + + + Please set up a format which contains separators between fields + 请设置一个包含字段分隔符的格式 + + + Missing field in log format + 缺少日志格式的字段 + + + An important field is missing from the provided format: + 格式中缺少一个重要领域: + + + The quality of the statistics may be seriously compromized + 统计数字的质量可能严重降低 + + + Proceed anyway? + 继续吧? + + + 'Carriage Return' in log format + “ 运回” 以日志格式 + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + 所提供的格式包含“ 运回” 。 +如果不谨慎使用,可能导致数据丢失或崩溃 + + + An error occured while parsing logs + 解析日志时发生错误 + + + Failed defining type + 定义类型失败 + + + Failed to determine the log type + 确定日志类型失败 + + + File already used + 已经使用的文件 + + + The file has probably been used already + 文件可能已经使用 + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + 忽略警告并使用它, 丢弃它并继续, 还是中止整个过程 ? + + + Duplicate file + 复制文件 + + + The file appears twice in the list of selections + 文件在选择列表中两次出现 + + + Failed updating hashes + 更新散列失败 + + + An error occured while inserting the parsed files hashes into the database + 在数据库中插入解析的文件散列时出错 + + + File exceeds warning size + 文件超过警告大小 + + + The file's size exceeds the warning size + 文件大小超过警告大小 + + + Not enough memory + 没有足够的内存 + + + The total size of the selected files exceeds the available memory + 选定文件的总大小超过可用的内存 + + + Please free some resources, parse the files in different steps or split them into smaller units + 请释放一些资源, 以不同的步骤解析文件或将其分割为更小的单位 + + + Failed reading + 读取失败 + + + File is empty + 文件为空 + + + The file is blank + 文件为空白 + + + Failed to retrieve the selected file + 获取所选文件失败 + + + Discard it and continue, or Abort all and exit? + 丢弃它然后继续, 还是中止所有并退出? + + + No file to parse + 无文件可解析 + + + The list of files to parse is empty + 要分析的文件列表为空 + + + Directory not found + 找不到目录 + + + The directory does not exists + 目录不存在 + + + Directory not readable + 目录不可读 + + + The directory is not readable + 目录不可读 + + + Please set the proper permissions before to start + 请在开始前设置适当的权限 + + + Failed creating directory + 创建目录失败 + + + The path does not exists + 路径不存在 + + + Data conversion failed + 数据转换失败 + + + Failed to convert from '%1' to '%2' + 从 “%1” 转换到 “%2” 失败 + + + Failed to create statistics + 创建统计失败 + + + An error occured while processing + 处理时发生错误 + + + Cannot create statistics + 无法创建统计 + + + No data has been found that matches with the currently set parameters + 没有发现与当前设定的参数匹配的数据 + + + Not a folder + 不是文件夹 + + + The path was supposed to point to a folder, but it doesn't + 这条路本来是指向文件夹的,但是没有 + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + 此条目将重新命名为后缀". 复制"并创建一个新的条目 。 +继续? + + + An error occured + 发生错误 + + + Failed renaming + 重命名失败 + + + An error occured while renaming + 重命名时发生错误 + + + + GameDialog + + Ok + 还好 + + + + MainWindow + + Parse logs from the Apache2 web server + 从 Apache2 网络服务器解析日志 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + 从 Nginx 网络服务器解析日志 + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + 从 Microsoft IIS 网络服务器解析日志 + + + IIS + IIS + + + Select/deselect all the files + 选择/取消所有文件 + + + All + 全体 + + + Inspect a log file + 检查日志文件 + + + Name + 名称 + + + Size + 大小 + + + Refresh the list + 刷新列表 + + + Total size of the parsed data + 解析数据的总大小 + + + Total number of parsed lines + 解析项目总数 + + + Start parsing the selected files + 开始分析所选文件 + + + START + 裁武条约 + + + Time elapsed since the start + 开始以来的时间 + + + Average speed, in parsed data size per second + 平均速度, 以每秒分析数据大小为单位 + + + Web Server + Web 服务器 + + + Select a Web Server + 选择网络服务器 + + + Year + 年份 + + + Month + 月数 + + + Day + 天数 + + + Hour + 小时 + + + Draw the chart + 绘制图表 + + + Log line marked as Warning + 标记为警告的日志行 + + + Date when the request arrived (YYYY-MM-DD) + 请求到达日期(YYYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + 请求到达的时间( hh: mm: ss) + + + Protocol of the request + 请求的程序 + + + Method of the request + 请求方法 + + + URI of the requested page + 请求页面的 URI + + + Query carried along with the URI + 与URI一起进行查询 + + + Response code from the server + 服务器的响应代码 + + + User-agent of the client which made the request + 提出请求的客户的用户代理 + + + IP address of the Client which made the request + 提出请求的客户端的IP地址 + + + Cookie used for the request + 用于请求的 Cookie + + + The URL which redirected the Client to the requested page + 将客户端重定向到请求页面的 URL + + + Size ib Bytes of the request, usually includes header and data + 请求的 ib 字节大小, 通常包括标题和数据 + + + Size in Bytes of the served content, usually includes header and data + 服务内容的字节大小, 通常包括标题和数据 + + + Time taken by the server to serve the content, in milliseconds + 服务器服务内容所需的时间, 以毫秒计 + + + Only use lines in which the field is starting with this string + 只使用字段以此字符串开头的行 + + + Protocol: + 议定书: + + + Method: + 方法 : + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + 只使用字段匹配此语句的行 。 +用 '!'、'='、'<' 或 '>' 来宣布要使用什么 + + + Response: + 回应: + + + Query: + 查询 : + + + URI: + 乌里: + + + Filters + 过滤器 + + + Count + 计数 + + + Number of occurrences + 发生次数 + + + Item + 项目 + + + Value of the field + 外地价值 + + + From: + 发讯人: + + + To: + 改为: + + + Select a log field to view + 选择要查看的日志字段 + + + Field: + 字段 : + + + Filter: + 过滤器 : + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + 用字符串,只使用字段从此字符串开始的行。 +用数字,使用 '!', '=', '<' 或 '>' 来声明要使用什么 + + + Protocol + 议定书 + + + Method + 方法 + + + URI + URI 资源 + + + User-agent + 用户代理 + + + Most recurrent + 最经常 + + + Most trafficked + 大部分被贩运者 + + + Date ever + 约会曾经 + + + Day of the week + 周一当天 + + + Hour of the day + 每天的小时 + + + Time taken + 花费的时间 + + + Bytes sent + 发送字节 + + + Bytes received + 已收到字节 + + + Mean/Max performances + 平均/最大性能 + + + Requests received + 收到的请求 + + + Total work + 总工作 + + + General + 常规 + + + Window + 窗口 + + + Dialogs + 对话框 + + + Charts + 图表 + + + Appearance + 外观 + + + Speed + 速度 + + + Relational + 关系 + + + TextBrowser + 文本浏览器 + + + Databases + 数据库 + + + Security + 警卫 + + + Logs + 日志 + + + Defaults + 默认 + + + Control + 控制权 + + + Path + 路径 + + + Format + 格式 + + + Warnlists + 警告列表 + + + Blacklists + 黑名单 + + + Remember the window's position and size + 记住窗口的位置和大小 + + + Remember position and size + 记住位置和大小 + + + Remember window's position and size + 记住窗口的位置和大小 + + + Geometry + 几何 + + + Theme to use for the window + 用于窗口的主题 + + + Theme + 主题 + + + Native + 土著 + + + Light + 光线 + + + Dark + 阴暗 + + + Auto + 自动 + + + Icons + 图标 + + + Normal quantity of dialog messages shown + 显示对话框消息的正常数量 + + + Normal + 常规 + + + Dialogs from the main processes + 主要进程的对话框 + + + Dialogs emitted when parsing logs + 解析日志时发布的对话框 + + + Logs parser + 日志解析器 + + + Dialogs emitted when viewing statistics + 查看统计数据时发出的对话框 + + + Statistics viewer + 统计查看器 + + + Define the quantity of dialog mesages shown + 定义显示的对话框中的数量 + + + Dialogs level + 对话框级别 + + + Reduced quantity of dialog messages shown + 显示的对话信件数量减少 + + + Essential + 基本内容 + + + Augmented quantity of dialog messages shown + 显示的对话框信件数量增加 + + + Explanatory + 解释性说明 + + + Theme to use for the Charts + 用于图表的主题 + + + Preview + 预览 + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + 代表时间轴上的一步,以秒计。 +在同一间隔内的所有值将被合并并使用平均值。 + + + Time interval + 时间间隔 + + + The format to use for the labels of the time axis. + 用于时间轴标签的格式。 + + + Time format + 时间格式 + + + The size of the pie + 馅饼的大小 + + + Pie size + 派大小 + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + 馅饼所构成的最大切片数量. +超过的片段将分成一个综合片段。 + + + Maximum slices + 最大切片数 + + + Font to use for the Text Browser + 用于文本浏览器的字体 + + + Font + 字体 + + + Double-spaced lines + 双行 + + + Use wide lines + 使用宽线 + + + Define the spacing between lines + 定义行间距 + + + Lines spacing + 行间距 + + + None + + + + Color scheme to use for the Text Browser + 用于文本浏览器的颜色方案 + + + Color scheme + 颜色方案 + + + The appearance of the Text Browser with the current settings + 文本浏览器在当前设置下的外观 + + + Insert the base path only, file name excluded + 仅插入基础路径, 文件名称除外 + + + The given path doen't exists, or doesn't point to a folder + 给定的路径不存在, 或者没有指向文件夹 + + + Path for the database files + 数据库文件的路径 + + + Paths + 路径 + + + Apply the current path + 应用当前路径 + + + Select the path through a dialog window + 通过对话框窗口选择路径 + + + Path where the logs data collection database is located + 日志数据收集数据库所在路径 + + + Logs data + 日志数据 + + + Path where the used files hashes database is located + 使用的文件散列数据库所在的路径 + + + Used files + 已使用的文件 + + + Backup options for the Logs Data database + 日志数据库的备份选项 + + + Backups + 备份 + + + A new backup is made when closing LogDoctor after having succesfully edited the database + 在自动编辑数据库后关闭 LogDoctor 时新建备份 + + + Backup the Logs Data database and keep + 备份日志数据库并保存 + + + Whether it is allowed or denied to follow symlinks occuring in a path + 路径中是否允许或拒绝跟随符号链接 + + + Follow symlinks + 跟随符号链接 + + + Default WebServer + 默认 Web 服务器 + + + Usage control + 使用控制 + + + Hide already used files + 隐藏已使用的文件 + + + Size warnings + 大小警告 + + + Warn me when using files with a size exceeding: + 使用大小超过的文件时警告我: + + + Logs folder + 日志文件夹 + + + Logs format string + 日志格式字符串 + + + Format string + 格式字符串 + + + Insert the format string you're using + 插入您使用的格式字符串 + + + Apply the current string + 应用当前字符串 + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + 从当前保存的字符串中生成一个样本日志行, 以检查其格式是否正确 。 +LogDoctor 不考虑的任何字段都将显示为 'DISCARDED' + + + Generate sample + 生成样本 + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + 请检查date=中的日期值 (帮助) 本行的正确性. +标记为 'DISCARDED' 的字段已正确解析, 但LogDoctor 不考虑 + + + Open an help window + 打开帮助窗口 + + + Help + 帮助 + + + Select a log field + 选择日志字段 + + + Use warnlist for this field + 使用此字段的警告列表 + + + Add the current line to the list + 将当前行添加到列表 + + + Remove the selected item from the list + 从列表中删除选中的项目 + + + Move the selected item down + 将选中的项目下移 + + + Use blacklist for this field + 使用此字段的黑名单 + + + Add line + 添加行 + + + Remove selection + 删除选择 + + + Language + 语言 + + + Utilities + 公用事业 + + + Tools + 工具 + + + Games + 游戏 + + + Perform a version-check + 进行版本检查 + + + Show some info about LogDoctor + 显示一些关于日志文档的信息 + + + Open a block-note like window to write temporary text + 打开类似窗口的块记来写入临时文本 + + + Play CrissCross + 播放 Criss 缩写 + + + Play Snake + 玩"蛇"游戏 + + + Show the changelog + 显示更改日志 + + + warnlist + 警告列表 + + + blacklist + 黑名单 + + + copy + 复制 + + + copies + 副本 + + + Check updates + 检查更新 + + + Infos + 资料 + + + BlockNote + 块注 + + + CrissCross + 盘点 + + + Snake + 蛇头 + + + Changelog + 更改日志 + + + + RichText + + Select a file from the list + 从列表中选择一个文件 + + + to inspect its content + 检查其内容 + + + Failed to read + 读取失败 + + + + SnakeGame + + PLAY + 游戏 + + + Classic + 经典 + + + Hunt + 韩特 + + + Battle + 战斗 + + + Game Over + 游戏结束 + + + Your adversary fell in the water! + 你的对手掉入了水中! + + + YOU WON! + 你该死! + + + You fell in the water! + 你掉到水里来了! + + + YOU LOST! + 你输了! + + + Your adversary ate itself! + 你的对手吃了自己! + + + You ate yourself! + 你吃过自己! + + + Your adversary ate you! + 你的对手吃了你! + + + You ate your adversary! + 你吃了你的对手! + + + You ate each other! + 你们吃了对方! + + + MATCH IS DRAW! + 马奇是拖! + + + + TR + + Unexpected WebServer + 意外网络服务器 + + + Logs Size Breakdown + 日志大小细分 + + + Ignored + 已忽略 + + + Parsed + 解析 + + + Blacklisted + 列入黑名单 + + + Others + 其他人员 + + + from + + + + to + 改为 + + + Log Lines Marked as Warning + 标记为警告的日志行 + + + Time Taken to Serve Requests + 执行请求所需时间 + + + Time of Day Count + 计时时间 + + + Relational Count + 关系统计 + + + FALSE + 法尔西 + + + TRUE + 真实的 + + + Date + 日期 + + + Year + 年份 + + + Month + 月数 + + + Day + 天数 + + + Time + 时间 + + + Hour + 小时 + + + Minute + 分钟 + + + Second + 第二届 + + + Warning + 3⁄4 ̄ ̧漯B + + + Protocol + 议定书 + + + Method + 方法 + + + URI + URI 资源 + + + Query + 查询 + + + Response code + 反应代码 + + + Time taken + 花费的时间 + + + Bytes sent + 发送字节 + + + Bytes received + 已收到字节 + + + Referrer + 参考文件 + + + Cookie + 饼干 + + + Client + 客户端 + + + User-agent + 用户代理 + + + January + 1月(半天会议) + + + February + 2月(半天会议) + + + March + 3月(半天会议) + + + April + 4月(半天会议) + + + May + 5月(半天会议) + + + June + 6月份 + + + July + 7月(半天会议) + + + August + 8月(半天) + + + September + 9月(半天会议) + + + October + 10月(半天会议) + + + November + 11月(半天会议) + + + December + 12月(半天) + + + Sunday + 礼拜 + + + Monday + 星期一 + + + Tuesday + 星期二 + + + Wednesday + 纽约 + + + Thursday + 星期四 + + + Friday + 星期五 + + + Saturday + 星期六(上午) + + + diff --git a/logdoctor/translations/LogDoctor_zt_CN.ts b/logdoctor/translations/LogDoctor_zt_CN.ts new file mode 100644 index 0000000..f65c71a --- /dev/null +++ b/logdoctor/translations/LogDoctor_zt_CN.ts @@ -0,0 +1,2175 @@ + + + + + Changelog + + Versions + 版本 + + + Version 4 + 第4版 + + + Version 3 + 第3版 + + + Version 2 + 第2版 + + + Version 1 + 第 1 版 + + + C++17 + C++17 + + + Qt5 + Qt5 + + + Build scripts + 編譯文稿 + + + Cross-platform compatibility: + 跨平台相容性 : + + + Linux + Linux + + + BSD + BSD + + + Windows + Windows + + + OSX + OSX + + + Statistics: + 有: + + + Warnings + 警告 + + + Speed + 速度 + + + Counts + 計數 + + + Daytime + 白天 + + + Relational + 相關 + + + Globals + 全局 + + + Translations: + 翻譯: + + + Italian + 意大利人 + + + Spanish + 西班牙文 + + + French + 法文 + + + Tools: + 工具 : + + + Block note + 二. 封面 + + + Utilities: + 公用事业: + + + Infos viewer + 資訊檢視器 + + + Updates checker + 更新檢查器 + + + Themes: + 主題: + + + Dark + 黑暗 + + + Light + + + + Improvements and fixes + 改进和修正 + + + New themes: + 新主題 : + + + Ash + + + + Candy + 糖果 + + + Forest + 森林 + + + Powder + 粉末 + + + Restyled GUI + 已重新命名的 GUI + + + Restyled dialogs + 重排對話框 + + + Doxygen documentation + Doxygen 文件 + + + Mini-Games: + 迷你遊戲: + + + Criss-cross + 十字路口 + + + Snake + + + + Changed default paths + 已變更預設路徑 + + + New game modes for Snake + 蛇的新遊戲模式 + + + Hunt + 亨特 + + + Battle + 有打 + + + New translations: + 新翻譯 : + + + Japanese + 日本人 + + + Portuguese + 葡萄牙語Name + + + Code improvements + 代码改进 + + + Performance improvements + 二. 绩效改善 + + + Added tests suite: + 已新增的測試套件 : + + + white box tests + 白盒測試 + + + Customized charts themes + 自訂地圖主題 + + + Fixes + 修正 + + + Tests improvements + 二. 改进 + + + Docker support + Docker 支援 + + + Upgrade to C++20 + 升級到 C++20 + + + Upgrade to Qt6 + 升級到 Qt6 + + + Restyled themes + 重排主題 + + + Redesigned configs section + 已重新设计的配置區域 + + + Stability improvements + 二. 稳定改善 + + + Generating warnings dinamically + 二相產生警告 + + + New tool: + 新工具 : + + + Changelog + 變更紀錄 + + + Tweakable parameters for some of the charts: + 有部分地圖可修改參數: + + + Improved project structure + 二. 改善工程结构 + + + Modernized Cmake usage + 二. 现代化 做作用法 + + + + Crapinfo + + Version + 版本 + + + Currently installed version of the software + 目前已安裝軟體版本 + + + Repository links + 主目錄連接 + + + Paths + 路由 + + + The path of the executable file + 可執行檔的路徑 + + + Executable + 執行檔 + + + The path where the configuration file gets saved and searched in + 配置檔案被儲存和搜尋的路徑 + + + Configuration file + 配置文件 + + + The path where the application searches for extra resources + 應用程式搜尋額外資源的路徑 + + + Application data + 應用程式資料 + + + + Crapnote + + Reduce the font size + 減少字型大小 + + + Font size + 字型大小 + + + Increase the font size + 增加字体大小 + + + + Crappath + + Choose + 選擇 + + + Cancel + 取消 + + + + Crapup + + Checking for updates + 正在檢查更新 + + + New version available + 有新版本 + + + A new version is available! +Please visit LogDoctor's git repository and follow the instruction about how to update + 有新版本了! +請參觀 LogDoctor 的 git 主目錄并遵守如何更新的指令 + + + No update found + 找不到更新 + + + LogDoctor is up-to-date + 日志醫生已更新 + + + :/ + :/ + + + You're running a version from the future! +Your version is beyond the current upstream version +Are you running the original LogDoctor? +Please visit the LogDoctor's repository and get a fresh version of it + 有出自未來的版本了! +您的版本已超出目前的上游版本 +您正在執行原始的 LogDoctor? +請到 LogDoctor 的寄存器中取取取新版本 + + + Failed to establish a connection + 建立連接失敗 + + + Connection error, please try again later + 連接錯誤, 請稍後再試 + + + Connection timed out + 連接超時 + + + Version check failed + 版本檢查失敗 + + + An error occured while parsing: +version mark not found + 剖析出錯誤: +找不到版本標記 + + + An error occured while parsing: +malformed version + 剖析出錯誤: +版本不正確 + + + An error occured while comparing: +malformed upstream version + 相對出錯 : +上游版本不正確 + + + + CrissCross + + Victory + 胜利 + + + You beated me! + 你逗我! + + + This time you lost! + 這次你輸了! + + + Draw + 畫出 + + + Nice match + 有好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相好相相好相好相好相好相好相相好相好相好相好相好相好相好相相相相相好相相相相相相相相相好相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 + + + + DialogBool + + Yes + + + + No + + + + + DialogIda + + Ignore + 忽略 + + + Discard + 丟棄 + + + Abort + 中止 + + + + DialogMsg + + Ok + + + + + DialogSec + + One of the lists has an invalid item + 有一份清單有不合法的項目 + + + An error occured while reading the configuration file + 在讀取設定檔出錯 + + + An error occured while parsing configuration file's data + 剖析配置檔的資料出錯 + + + Failed to create the configuration file's directory + 建立設定檔目錄失敗 + + + Failed to create the configuration file + 建立設定檔失敗 + + + An error occured while writing the configuration file + 在寫入設定檔出錯 + + + An error occured while preparing the configuration file's data + 在準備設定檔的資料出錯 + + + The path contains a symlink + 该路由包含相關連 + + + The file does not exist + 檔案不存在 + + + Failed to create the database backups' directory + 建立資料庫備份目錄失敗 + + + Failed to copy the database file + 复制數據庫檔案失敗 + + + Failed to update the backups + 更新備份失敗 + + + Failed to create the directory + 建立目錄失敗 + + + Unrecognized entry + 未知的項目 + + + Size of the file + 文件大小 + + + Warning size parameter + 警告大小參數 + + + Failed to read gzipped file + 讀取 gzipped 檔案失敗 + + + An error occured while parsing the format string + 解析格式字串出錯 + + + Available memory + 有內存 + + + Size of the logs + 紀錄大小 + + + An error occured while reading the gzipped file + 讀取 gzipped 檔案出錯 + + + An error occured while reading the file + 讀取檔案出錯 + + + Something failed while handling the file + 在處理檔案時出事了 + + + An error occured while working on the database + 在數據庫中工作出錯 + + + Aborting + 中止 + + + Invalid locale + 不合法的地區 + + + Unexpected locale format + 意外地區格式 + + + If you haven't manually edited the configuration file, +please report this issue + 如果您沒有手動編輯設定檔, +有事請上報 + + + The given locale is not an accepted language + 有地區不是被接受的語言 + + + If you'd like to have this locale in LogDoctor, +please follow the instruction on the repository page + 如果你想把這個地點放入洛格道克特 +請遵守主目錄頁面上的指示 + + + Configuration file not found + 未找到配置文件 + + + Unable to retrieve the configuration file + 無法取回設定檔 + + + Skipping + 正在跳出 + + + An error occured while handling the configuration file + 處理設定檔出錯 + + + Failed to write the configuration file + 寫入設定檔失敗 + + + Current configuration not saved + 目前設定未儲存 + + + File not readable + 檔案不可讀取 + + + The file is not readable + 此檔案不可讀取 + + + File not writable + 檔案不可寫入 + + + The file is not writable + 此檔案無法寫入 + + + Directory not writable + 目錄不可寫入 + + + The directory is not writable + 目錄已無法寫入 + + + Invalid path + 不合法的路徑 + + + Failed applying configuration + 應用設定失敗 + + + Invalid configuration lines + 不合法的設定行 + + + Has not been possible to apply some of the configurations + 無法套用一些設定 + + + If you choose to proceed, all of the unapplied configurations will be lost +Continue? + 如果選擇進行, 所有未被應用設定都將被輸入 +接下去? + + + Failed to retrieve the help file + 取回說明文件失敗 + + + An error occured while getting the help file + 在得到說明檔出錯 + + + Additional resources can be downloaded from the git repo + 从 git repo 下載到相關資源 + + + Unable to retrieve the file + 無法取回檔案 + + + Invalid string + 不合法的字串 + + + The given string is invalid and cannot be added to the list + +Please correct it and retry + 指定的字串不合法, 不能被加入到清單中 + +就再去取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取 + + + QSql driver not found + 找不到 QSql 驅動程式 + + + Failed to retrieve the driver needed to handle the database + 取回處理數據庫需要的驅動程式失敗 + + + File not found + 找不到檔案 + + + Failed to retrieve the database file + 取回數據庫檔案失敗 + + + Create a new database? + 要建立新的數據庫嗎 ? + + + The database contains an unexpected table + 數據庫包含出乎意料的表格 + + + Unexpected table + 意外表格 + + + It seems that the database is missing a table + 有數據庫好像漏了一張相 + + + Table not found + 找不到表格 + + + The database contains an unexpected column + 數據庫中包含出乎意料的一欄 + + + Unexpected column + 意外列 + + + It seems that the table is missing a column + 有一列被取走 + + + Column not found + 找不到列 + + + A column has an unexpected data-type + 一列有出乎意料的資料類型 + + + Unexpected data-type + 有意外的相關資料型態 + + + This database will be renamed with a trailing '.copy' and a new one will be created. +Continue? + 此數據庫會被重新命名為后继的". 副本"并建立新的資料庫 。 +接下去? + + + Database created + 已建立資料庫 + + + Successfully created a new database + 已成功建立新資料庫 + + + Not a file + 不是檔案 + + + The path was supposed to point to a file, but it doesn't + 路由被指向了文件 但是它不是 + + + Please remove the conflict and retry + 請去除相冲突并重試 + + + The database file is not readable + 數據庫檔案無法讀取 + + + Please set the proper permissions and retry +If this error persists, please report this issue + 請設定相當權限并重試 +如果此錯誤持续存在, 請報告此問題 + + + The database file is not writable + 數據庫檔案無法寫入 + + + Invalid database path + 不合法的數據庫路徑 + + + Failed creating database + 建立數據庫失敗 + + + An error occured while creating the database + 建立數據庫出錯 + + + Failed opening database + 開啟資料庫失敗 + + + An error occured while opening the database + 開啟數據庫出錯 + + + Failed executing on database + 在數據庫中執行失敗 + + + An error occured while executing a statement on the database + 在數據庫中執行語言出錯 + + + Failed to backup database + 備份數據庫失敗 + + + Please report this issue + 有事請上報 + + + Invalid log format string + 不合法的日志格式字串 + + + Please check that no error is thrown by your WebServer +If it gets accepted, please check the presence of a typo here +If everything is fine, please report this issue + 請檢查您的 WebServer 沒有出錯 +如果被接受 就找找有打字機嗎 +如果出事了 就去上報 + + + Log format error + 日志格式出錯 + + + The log format has not been set, or is invalid +Please add a valid one in the configurations + 紀錄格式尚未設定, 或無效 +請在配置中加入一個有效的 + + + Misconfigured log format + 第 二 章 + + + No log field has been set in the current logs format, +making it useless to parse logs + 在目前的日志格式中沒有建立日志字段 , +就用去分析日志了 + + + Please set up a format which contains at least one field + 請建立至少包含一字段的格式 + + + A separator is missing between one or more fields, +making it hard to establish net bounds, +and possibly leading to store incorrect data + 在一個或多個字段相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相相去相去相去相去相去相去相相去相去相相去相相去相相相去相去相相去相去相相相去相去相相相相相去相相相去相相相相相去相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 +使相接而相接; +有可能导致儲存不正確的資料 + + + Please set up a format which contains separators between fields + 請建立一個格式, 在字段中包含分隔符 + + + Missing field in log format + 在日志格式中缺失字段 + + + An important field is missing from the provided format: + 在所提供格式中缺少相關字段: + + + The quality of the statistics may be seriously compromized + 相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相相相相相當相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 + + + Proceed anyway? + 就這樣了? + + + 'Carriage Return' in log format + 以紀錄格式取回"Clip Return" + + + The provided format contains the 'Carriage Return'. +This may lead to data losses or crashes if not used with caution + 所提供格式包含 “ Clip Return ” 。 +如果使用不小心, 有可能导致相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相 + + + An error occured while parsing logs + 解析紀錄出錯 + + + Failed defining type + 定義類型失敗 + + + Failed to determine the log type + 确定紀錄型態失敗 + + + File already used + 已使用的文件 + + + The file has probably been used already + 此檔案可能已被使用 + + + Ignore the warning and use it anyway, Discard it and continue, or Abort the entire process? + 取而代之地忽略警告并使用它; 放棄并繼續; 或中止整個行程? + + + Duplicate file + 复制檔案 + + + The file appears twice in the list of selections + 檔案在選取清單中出現了兩次 + + + Failed updating hashes + 更新散列失敗 + + + An error occured while inserting the parsed files hashes into the database + 在數據庫中插入已解析的檔案散列出錯誤 + + + File exceeds warning size + 文件已超出警告大小 + + + The file's size exceeds the warning size + 檔案大小已超过警告大小 + + + Not enough memory + 記憶力不足 + + + The total size of the selected files exceeds the available memory + 所選取的檔案總大小已超出可用的內存 + + + Please free some resources, parse the files in different steps or split them into smaller units + 請放出一些資源, 將檔案分出相關相關相關相關相關相關相關相關相關相關相關相 + + + Failed reading + 讀取失敗 + + + File is empty + 文件是空的 + + + The file is blank + 檔案是空白的 + + + Failed to retrieve the selected file + 取回所選取的檔案失敗 + + + Discard it and continue, or Abort all and exit? + 丟出再繼續取出取出取出? + + + No file to parse + 沒有要分析的檔案 + + + The list of files to parse is empty + 要分析的檔案清單是空的 + + + Directory not found + 找不到目錄 + + + The directory does not exists + 目錄不存在 + + + Directory not readable + 目錄不可讀取 + + + The directory is not readable + 此目錄不可讀取 + + + Please set the proper permissions before to start + 在啟動前, 請設定相當的權限 + + + Failed creating directory + 建立目錄失敗 + + + The path does not exists + 该路由不存在 + + + Data conversion failed + 資料轉換失敗 + + + Failed to convert from '%1' to '%2' + 从 '%1' 轉換到 '%2' 失敗 + + + Failed to create statistics + 建立數據失敗 + + + An error occured while processing + 處理出錯 + + + Cannot create statistics + 無法建立數據 + + + No data has been found that matches with the currently set parameters + 找不到符合目前設定的參數的資料 + + + Not a folder + 不是相簿 + + + The path was supposed to point to a folder, but it doesn't + 路由被指向了相關目錄 但是它不是 + + + The entry will be renamed with a trailing '.copy' and a new one will be created. +Continue? + 此項目將被重新命名為后續的". +接下去? + + + An error occured + 出錯 + + + Failed renaming + 重命名失敗 + + + An error occured while renaming + 重命名出錯 + + + + GameDialog + + Ok + + + + + MainWindow + + Parse logs from the Apache2 web server + 从 Apache2 網頁伺服器解析紀錄 + + + Apache2 + Apache2 + + + Parse logs from the Nginx web server + 从 Nginx 網頁伺服器解析日志 + + + Nginx + Nginx + + + Parse logs from the Microsoft IIS web server + 从 Microsoft IIS 網路伺服器解析紀錄 + + + IIS + IIS + + + Select/deselect all the files + 選擇/ 取消選取所有檔案 + + + All + 全部 + + + Inspect a log file + 檢查紀錄檔 + + + Name + 姓名 + + + Size + 大小 + + + Refresh the list + 刷新清單 + + + Total size of the parsed data + 解析數據的總大小 + + + Total number of parsed lines + 解析行數 + + + Start parsing the selected files + 開始剖析所選取的檔案 + + + START + 裁武会 + + + Time elapsed since the start + 有好幾年了 有好幾年了 + + + Average speed, in parsed data size per second + 平均速度, 以解析數據大小每秒 + + + Web Server + Web 伺服器 + + + Select a Web Server + 選擇網路伺服器 + + + Year + 年份 + + + Month + 月份 + + + Day + + + + Hour + 小時 + + + Draw the chart + 畫出地圖 + + + Log line marked as Warning + 標示為警告的紀錄行 + + + Date when the request arrived (YYYY-MM-DD) + (YYY-MM-DD) + + + Time when the request arrived (hh:mm:ss) + 第 二 章 + + + Protocol of the request + 第 二 章 + + + Method of the request + 要求的方法 + + + URI of the requested page + 所要頁面的 URI + + + Query carried along with the URI + 有URI相接的查詢 + + + Response code from the server + 伺服器回應代碼 + + + User-agent of the client which made the request + 提出此要求的客戶端的使用者代理 + + + IP address of the Client which made the request + 提出此要求的客戶端的 IP 位址 + + + Cookie used for the request + Cookie 就用於此要求 + + + The URL which redirected the Client to the requested page + 將客戶端重定向到所要求頁面的 URL + + + Size ib Bytes of the request, usually includes header and data + 要求的 ib 位元組大小, 通常包括信頭和相關資料 + + + Size in Bytes of the served content, usually includes header and data + 在已服務內容的位元組中大小, 通常包括信頭和資料 + + + Time taken by the server to serve the content, in milliseconds + 伺服器提供內容所花時間以毫秒為單位 + + + Only use lines in which the field is starting with this string + 只用字段以此字串起首的行 + + + Protocol: + 议定书: + + + Method: + 方法 : + + + Only use lines in which the field is matching this statement. +Use '!', '=','<' or '>' to declare what to use + 只使用字段符合此语句的行 。 +用 '!'、'='、'<' 或 '>' 来宣佈要用什麼 + + + Response: + 答复: + + + Query: + 查詢 : + + + URI: + URI: + + + Filters + 分頁 + + + Count + 數量 + + + Number of occurrences + 出事次数 + + + Item + 項目 + + + Value of the field + 字段值 + + + From: + 从: + + + To: + 至: + + + Select a log field to view + 選擇要查看的日志字段 + + + Field: + 字段 : + + + Filter: + 過程 : + + + With strings, only the lines in which the field is starting with this string will be used. +With numbers, use '!', '=','<' or '>' to declare what to use + 有字串, 就只用字段起於此字串的行 。 +有數字,用 '!', '=', '<' 或 '>' 来宣告要用什麼 + + + Protocol + 议定书 + + + Method + 二. 方法 + + + URI + URI 相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相相關相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 + + + User-agent + 使用者代理 + + + Most recurrent + 最常見的 + + + Most trafficked + 第 二 部 分 + + + Date ever + 有相去相去 + + + Day of the week + 星期一日 + + + Hour of the day + 每天一小時 + + + Time taken + 二. 所花時間 + + + Bytes sent + 已送出位元組 + + + Bytes received + 已收取位元組 + + + Mean/Max performances + 平均/最大性能 + + + Requests received + 收到的请求 + + + Total work + 工作 + + + General + 一般 + + + Window + 窗口 + + + Dialogs + 對話框 + + + Charts + 圖表 + + + Appearance + 外觀 + + + Speed + 速度 + + + Relational + 相關 + + + TextBrowser + 文字瀏覽器 + + + Databases + 數據庫 + + + Security + 安保 + + + Logs + 日志 + + + Defaults + 預設值 + + + Control + 控制 + + + Path + 路由 + + + Format + 格式 + + + Warnlists + 警告列表 + + + Blacklists + 黑名單 + + + Remember the window's position and size + 記住視窗的位置和大小 + + + Remember position and size + 記住位置和大小 + + + Remember window's position and size + 記住視窗的位置和大小 + + + Geometry + 几何 + + + Theme to use for the window + 視窗用主題 + + + Theme + 主題 + + + Native + 原生 + + + Light + + + + Dark + 黑暗 + + + Auto + 自動 + + + Icons + 圖示 + + + Normal quantity of dialog messages shown + 顯示對話框信件的正常量 + + + Normal + 一般 + + + Dialogs from the main processes + 主要相關相關相關 + + + Dialogs emitted when parsing logs + 解析紀錄出對話框 + + + Logs parser + 日志解析器 + + + Dialogs emitted when viewing statistics + 在收看相片時所發出對話框 + + + Statistics viewer + 數據檢視器 + + + Define the quantity of dialog mesages shown + 定義所顯示的對話框的數量 + + + Dialogs level + 對話框等級 + + + Reduced quantity of dialog messages shown + 已顯示的對話框訊息减少 + + + Essential + 基本 + + + Augmented quantity of dialog messages shown + 顯示的對話框信件增加量 + + + Explanatory + 第 二 章 + + + Theme to use for the Charts + 用于圖表的主題 + + + Preview + 預覽 + + + Represents a step in the time axis, in seconds. +All the values falling inside the same interval will be merged and the mean value will be used. + Represents a step in the time axis, in seconds. All the values falling inside the same interval will be merged and the mean value will be used. + + + Time interval + 相隔相隔 + + + The format to use for the labels of the time axis. + 時轴標籤所要使用的格式 。 + + + Time format + 時間格式 + + + The size of the pie + 有相克相克相克相克相克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克 + + + Pie size + 派大小 + + + The maximum number of slices that the pie will be composed of. +Exceeding slices will be grouped into one comprehensive slice. + The maximum number of slices that the pie will be composed of. Exceeding slices will be grouped into one comprehensive slice. + + + Maximum slices + 最大切片 + + + Font to use for the Text Browser + 要用於文字瀏覽器的字型 + + + Font + 字体 + + + Double-spaced lines + 二相行 + + + Use wide lines + 使用寬行 + + + Define the spacing between lines + 定義行間距 + + + Lines spacing + 行距 + + + None + + + + Color scheme to use for the Text Browser + 文字瀏覽器所要使用的顏色機制 + + + Color scheme + 顏色機制 + + + The appearance of the Text Browser with the current settings + 有目前設定的文字瀏覽器外觀 + + + Insert the base path only, file name excluded + 只插入基本路由, 檔案名稱被排除 + + + The given path doen't exists, or doesn't point to a folder + 指定的路徑不存在, 或是不指向資料夾 + + + Path for the database files + 數據庫檔案的路徑 + + + Paths + 路由 + + + Apply the current path + 套用目前的路徑 + + + Select the path through a dialog window + 在對話框中選擇路由 + + + Path where the logs data collection database is located + 紀錄相關資料庫所處路徑 + + + Logs data + 日志資料 + + + Path where the used files hashes database is located + 已用檔案散列數據庫所在的路徑 + + + Used files + 已用檔案 + + + Backup options for the Logs Data database + 紀錄數據庫的備份選項 + + + Backups + 備份 + + + A new backup is made when closing LogDoctor after having succesfully edited the database + 在數據庫被 supcessly 編輯后關閉 LogDoctor 時會提供新的備份 + + + Backup the Logs Data database and keep + 備份日志資料庫并保存 + + + Whether it is allowed or denied to follow symlinks occuring in a path + 它被允許或被拒絕跟隨同樣的路徑所發生 + + + Follow symlinks + 跟隨連接 + + + Default WebServer + 默认 Web 伺服器 + + + Usage control + 用法控制 + + + Hide already used files + 隱藏已用過的檔案 + + + Size warnings + 大小警告 + + + Warn me when using files with a size exceeding: + 在使用大小超過的檔案時警告我: + + + Logs folder + 日志資料夾 + + + Logs format string + 紀錄格式字串 + + + Format string + 格式字串 + + + Insert the format string you're using + 插入您正在使用的格式字串 + + + Apply the current string + 套用目前的字串 + + + Generate a sample log line from the currently saved string, to check if it gets formatted correctly. +Any field not considered by LogDoctor will appear as 'DISCARDED' + 从已儲存的字串中產生樣本紀錄行, 以檢查它是否被正確地格式化 。 +LogDoctor 不考慮到的任何字段都將以 'DISCARDED' 出名 + + + Generate sample + 生成樣本 + + + Please check the correctness of this line. +Fields marked as 'DISCARDED' got parsed correctly, but are not considered by LogDoctor + 請檢查此行是否正確 。 +標示為 'DISCARDED' 的字段被分解得正確, 但是被 LogDoctor 不考慮 + + + Open an help window + 開啟說明視窗 + + + Help + 說明 + + + Select a log field + 選擇日志字段 + + + Use warnlist for this field + 此字段使用警告列表 + + + Add the current line to the list + 在清單中加入目前的行 + + + Remove the selected item from the list + 从清單中移除所選取的項目 + + + Move the selected item down + 將所選項下移 + + + Use blacklist for this field + 使用此字段的黑名單 + + + Add line + 新增行 + + + Remove selection + 移除選擇區 + + + Language + 語言 + + + Utilities + 有水电 + + + Tools + 工具 + + + Games + 遊戲 + + + Perform a version-check + 執行版本檢查 + + + Show some info about LogDoctor + 顯示紀錄道克的一些資訊 + + + Open a block-note like window to write temporary text + 開啟相當於視窗的區塊符以寫入暫時文字 + + + Play CrissCross + 播放 CrissCross + + + Play Snake + 播放蛇 + + + Show the changelog + 顯示變更紀錄 + + + warnlist + 警告列表 + + + blacklist + 黑名單 + + + copy + 复制 + + + copies + 复制 + + + Check updates + 檢查更新 + + + Infos + 信息 + + + BlockNote + 區塊註解 + + + CrissCross + 晶体 + + + Snake + + + + Changelog + 變更紀錄 + + + + RichText + + Select a file from the list + 从清單中選擇檔案 + + + to inspect its content + 以檢查其內容 + + + Failed to read + 讀取失敗 + + + + SnakeGame + + PLAY + + + + Classic + 有經典 + + + Hunt + 亨特 + + + Battle + 有打 + + + Game Over + 遊戲結束 + + + Your adversary fell in the water! + 你的對手倒入了水中! + + + YOU WON! + 哦! + + + You fell in the water! + 你倒入了水中! + + + YOU LOST! + 你輸了! + + + Your adversary ate itself! + 你的敵人自食其果! + + + You ate yourself! + 你自己吃! + + + Your adversary ate you! + 你的對手把你吃了! + + + You ate your adversary! + 你吃了你的對手! + + + You ate each other! + 你們吃相了! + + + MATCH IS DRAW! + 馬奇被拖了! + + + + TR + + Unexpected WebServer + 有意外的 Web 伺服器 + + + Logs Size Breakdown + 紀錄大小分解 + + + Ignored + 被忽略 + + + Parsed + 已解析 + + + Blacklisted + 黑名單 + + + Others + 其他 + + + from + + + + to + + + + Log Lines Marked as Warning + 標示為警告的日志行 + + + Time Taken to Serve Requests + 服事要求所花時間 + + + Time of Day Count + 每日計數 + + + Relational Count + 相關數量 + + + FALSE + FALSE + + + TRUE + TRUE + + + Date + 日期 + + + Year + 年份 + + + Month + 月份 + + + Day + + + + Time + 時間 + + + Hour + 小時 + + + Minute + + + + Second + + + + Warning + 警告 + + + Protocol + 议定书 + + + Method + 二. 方法 + + + URI + URI 相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相相關相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 + + + Query + 查詢 + + + Response code + 回應代碼 + + + Time taken + 二. 所花時間 + + + Bytes sent + 已送出位元組 + + + Bytes received + 已收取位元組 + + + Referrer + 引用器 + + + Cookie + 曲奇 + + + Client + 客戶端 + + + User-agent + 使用者代理 + + + January + 1月 + + + February + 二月 + + + March + 三月 + + + April + 4月 + + + May + 五月 + + + June + 6月 + + + July + 7月 + + + August + 8月 + + + September + 9月 + + + October + 10月 + + + November + 11月 + + + December + 12月 + + + Sunday + 星期天 + + + Monday + 星期一 + + + Tuesday + 星期二 + + + Wednesday + 星期三 + + + Thursday + 星期四 + + + Friday + 星期五 + + + Saturday + 星期六 + + + -- GitLab From 510c2338115bc640251d96acc8e1aed344c059a6 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:45:52 +0200 Subject: [PATCH 20/34] Updated translation resurces --- .../resources/translations/LogDoctor_ar_AR.qm | Bin 0 -> 53263 bytes .../resources/translations/LogDoctor_az_AZ.qm | Bin 0 -> 53494 bytes .../resources/translations/LogDoctor_bg_BG.qm | Bin 0 -> 59724 bytes .../resources/translations/LogDoctor_bn_BN.qm | Bin 0 -> 57196 bytes .../resources/translations/LogDoctor_ca_SP.qm | Bin 0 -> 62501 bytes .../resources/translations/LogDoctor_cs_CZ.qm | Bin 0 -> 57178 bytes .../resources/translations/LogDoctor_da_DA.qm | Bin 0 -> 59619 bytes .../resources/translations/LogDoctor_de_GE.qm | Bin 0 -> 61112 bytes .../resources/translations/LogDoctor_el_GR.qm | Bin 0 -> 63566 bytes .../resources/translations/LogDoctor_en_GB.qm | Bin 57446 -> 57530 bytes .../resources/translations/LogDoctor_eo_EO.qm | Bin 0 -> 58911 bytes ...{LogDoctor_es_ES.qm => LogDoctor_es_SP.qm} | Bin 60844 -> 60970 bytes .../resources/translations/LogDoctor_et_ES.qm | Bin 0 -> 56436 bytes .../resources/translations/LogDoctor_fa_PE.qm | Bin 0 -> 56995 bytes .../resources/translations/LogDoctor_fi_FI.qm | Bin 0 -> 59502 bytes .../resources/translations/LogDoctor_fr_FR.qm | Bin 63364 -> 63608 bytes .../resources/translations/LogDoctor_ga_IR.qm | Bin 0 -> 62821 bytes .../resources/translations/LogDoctor_he_HE.qm | Bin 0 -> 51955 bytes .../resources/translations/LogDoctor_hi_IN.qm | Bin 0 -> 57208 bytes .../resources/translations/LogDoctor_hu_HU.qm | Bin 0 -> 59243 bytes .../resources/translations/LogDoctor_id_ID.qm | Bin 0 -> 57721 bytes .../resources/translations/LogDoctor_it_IT.qm | Bin 60680 -> 60900 bytes .../resources/translations/LogDoctor_ja_JP.qm | Bin 45787 -> 45637 bytes .../resources/translations/LogDoctor_ko_KO.qm | Bin 0 -> 44688 bytes .../resources/translations/LogDoctor_lt_LI.qm | Bin 0 -> 56798 bytes .../resources/translations/LogDoctor_lv_LA.qm | Bin 0 -> 57228 bytes .../resources/translations/LogDoctor_ms_MA.qm | Bin 0 -> 59939 bytes .../resources/translations/LogDoctor_nb_NB.qm | Bin 0 -> 57947 bytes .../resources/translations/LogDoctor_nl_NL.qm | Bin 0 -> 61406 bytes .../resources/translations/LogDoctor_pl_PL.qm | Bin 0 -> 59402 bytes .../resources/translations/LogDoctor_pt_BR.qm | Bin 59326 -> 59422 bytes .../resources/translations/LogDoctor_pt_PT.qm | Bin 0 -> 60238 bytes .../resources/translations/LogDoctor_ro_RO.qm | Bin 0 -> 60533 bytes .../resources/translations/LogDoctor_ru_RU.qm | Bin 0 -> 59547 bytes .../resources/translations/LogDoctor_sk_SK.qm | Bin 0 -> 56874 bytes .../resources/translations/LogDoctor_sl_SL.qm | Bin 0 -> 58735 bytes .../resources/translations/LogDoctor_sq_AL.qm | Bin 0 -> 57352 bytes .../resources/translations/LogDoctor_sv_SV.qm | Bin 0 -> 58854 bytes .../resources/translations/LogDoctor_th_TH.qm | Bin 0 -> 55295 bytes .../resources/translations/LogDoctor_tl_PH.qm | Bin 0 -> 63223 bytes .../resources/translations/LogDoctor_tr_TR.qm | Bin 0 -> 67695 bytes .../resources/translations/LogDoctor_uk_UK.qm | Bin 0 -> 57954 bytes .../resources/translations/LogDoctor_ur_PA.qm | Bin 0 -> 55348 bytes .../resources/translations/LogDoctor_zh_CN.qm | Bin 0 -> 40231 bytes .../resources/translations/LogDoctor_zt_CN.qm | Bin 0 -> 43743 bytes 45 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 logdoctor/resources/translations/LogDoctor_ar_AR.qm create mode 100644 logdoctor/resources/translations/LogDoctor_az_AZ.qm create mode 100644 logdoctor/resources/translations/LogDoctor_bg_BG.qm create mode 100644 logdoctor/resources/translations/LogDoctor_bn_BN.qm create mode 100644 logdoctor/resources/translations/LogDoctor_ca_SP.qm create mode 100644 logdoctor/resources/translations/LogDoctor_cs_CZ.qm create mode 100644 logdoctor/resources/translations/LogDoctor_da_DA.qm create mode 100644 logdoctor/resources/translations/LogDoctor_de_GE.qm create mode 100644 logdoctor/resources/translations/LogDoctor_el_GR.qm create mode 100644 logdoctor/resources/translations/LogDoctor_eo_EO.qm rename logdoctor/resources/translations/{LogDoctor_es_ES.qm => LogDoctor_es_SP.qm} (81%) create mode 100644 logdoctor/resources/translations/LogDoctor_et_ES.qm create mode 100644 logdoctor/resources/translations/LogDoctor_fa_PE.qm create mode 100644 logdoctor/resources/translations/LogDoctor_fi_FI.qm create mode 100644 logdoctor/resources/translations/LogDoctor_ga_IR.qm create mode 100644 logdoctor/resources/translations/LogDoctor_he_HE.qm create mode 100644 logdoctor/resources/translations/LogDoctor_hi_IN.qm create mode 100644 logdoctor/resources/translations/LogDoctor_hu_HU.qm create mode 100644 logdoctor/resources/translations/LogDoctor_id_ID.qm create mode 100644 logdoctor/resources/translations/LogDoctor_ko_KO.qm create mode 100644 logdoctor/resources/translations/LogDoctor_lt_LI.qm create mode 100644 logdoctor/resources/translations/LogDoctor_lv_LA.qm create mode 100644 logdoctor/resources/translations/LogDoctor_ms_MA.qm create mode 100644 logdoctor/resources/translations/LogDoctor_nb_NB.qm create mode 100644 logdoctor/resources/translations/LogDoctor_nl_NL.qm create mode 100644 logdoctor/resources/translations/LogDoctor_pl_PL.qm create mode 100644 logdoctor/resources/translations/LogDoctor_pt_PT.qm create mode 100644 logdoctor/resources/translations/LogDoctor_ro_RO.qm create mode 100644 logdoctor/resources/translations/LogDoctor_ru_RU.qm create mode 100644 logdoctor/resources/translations/LogDoctor_sk_SK.qm create mode 100644 logdoctor/resources/translations/LogDoctor_sl_SL.qm create mode 100644 logdoctor/resources/translations/LogDoctor_sq_AL.qm create mode 100644 logdoctor/resources/translations/LogDoctor_sv_SV.qm create mode 100644 logdoctor/resources/translations/LogDoctor_th_TH.qm create mode 100644 logdoctor/resources/translations/LogDoctor_tl_PH.qm create mode 100644 logdoctor/resources/translations/LogDoctor_tr_TR.qm create mode 100644 logdoctor/resources/translations/LogDoctor_uk_UK.qm create mode 100644 logdoctor/resources/translations/LogDoctor_ur_PA.qm create mode 100644 logdoctor/resources/translations/LogDoctor_zh_CN.qm create mode 100644 logdoctor/resources/translations/LogDoctor_zt_CN.qm diff --git a/logdoctor/resources/translations/LogDoctor_ar_AR.qm b/logdoctor/resources/translations/LogDoctor_ar_AR.qm new file mode 100644 index 0000000000000000000000000000000000000000..7a1ebc444a20601294a53030425d53985a86969c GIT binary patch literal 53263 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 KVdna;#SH+DC2SP{ literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_az_AZ.qm b/logdoctor/resources/translations/LogDoctor_az_AZ.qm new file mode 100644 index 0000000000000000000000000000000000000000..4be6d0c40b3572fdee8d5b54827f1cb92569d78f GIT binary patch literal 53494 zcmcE7ks@*G{hX<16=n7(EZlo{IRgU&YhqQrW0VsEgMa}81M_(X1~F#_23CIt2KkQ+ z46M-%3<{qhbhbDH1N(Xgh67~`4DKZi3=H)Q3?4cR3^{ih7(8Y$FffELFnDz`FqAHb z&^tOA7zz|W&z`&Kszz~(mz_3ysLhm0<_l=JO1!9;OTo?MV!*0htU8Tlg7R!(15{+J7;yW~^Xf=o4XJ zoj#R;VefMW)`hGL40Bd9ur52rz_4;91M3D;28Mms46MJK7#KG4Lg)i>3~b9P85lOs zWnjA*%fN8JnSq<@DFcJbGY0OtEes4Y1q_06tqcrKwhThntqcroq6`{Gr!X*Vn!{l5 zxtM`rO#y?&-A)FE_*)FFTg(|4W~(x|-g9SQU<_t(pEiYoK_Q62qv8((!*)#u&z7AG z42%s7UWug)3_C6`c;$pJFqB9z`0^cQU|_k#;M;tdfuUv^gYPsh28Nmx2LENj3=9nq z83KHh85kP*8G`U;kpF-$)I~k&~w=gj9 z_(JG;ZyBQAm@+UdF=mKPGiG2|{+c0!i4l9OX#5Z}u1A?OwZ1J4yk)qrFMhS`f5)q^S-7y^GXdU=O4 zFz5&{`u81WU{LI4j8s3yz`!rU*kZAYfq{JsV}C^`1A~h{*3OpJE1vfOSml+0Pjm!u~U9M1Eypu)EBp>!!-U z&?(KNXM2@_!BvmRX6a-G2FqJauBx0246z1GQBVFcFf3Zkl)Oxxfx(l5Df!+P28Pw2 zn9}|#GB9k}z?8o~kAZ<}0#otv$qWn~$C)a7MHm>imoZImeaXPE+<|Gyz`*auENXd# zfnnocW@%0l28QA(%qssUGBC`Y$*dtS#lXP3huQvKDFZ`M8?*bgjSLJ*yvzwrQyCcQ z&M+rR9AaSLo6TIR=)}OVIfc3AiWLI`r!I57_E!c5p>NFnw+}Ng7*1!Nn0}OjLA8T< ziO(kn2H%6sThxmf7^DoCw=K0~U`V*YeCn$f14A1>^SR@R3=Er(Ghgfc#K6$g%Y56? zo`E5BBlCmCM+^)_Cz)TITFSr>8NvKP|0Dy0bw2Z#vds((G49NNc5h)|ShI|Uxv`6Z zVa;zA){0aH28{|9X^F!O44eyDtQ)p6Fo;fI31LZQV9@-|5__bTfg!V(C2n^k1H;w? zmbgbk3=DJFSrXS?Wnc)J%~E>&Ap^sfGM2LYpnPw_QV|u$z%XqKOC8rP1_lNOmiGV7 z3=E9xSvq#BGB7YKgV39Pvvj{%!oaZImt}_M9tH-{=PdI&H#0C4ak9)$o65i-CdRS| zRPOEIVOf^=m4RW0HOsQ2n;96GX0V(;RK>thRmO5@`#A=NvL2ReJxdrESbnoyo7}>{ zQ2m+Z#*rBe46NELH-2?8Fzi%k`Mb}Rfx$zZapP{ z14H{%*09Mn3=AErtTE3-7#LQ~W=+sCVPKf-$(nqen}H!Ihc*3ODg%SaSJsS~TNoJj z$gpO;nasej`y*?%;zb6A6*a77w+=BdaM`mqihpKcC~{zJK0cL!!6crw`{XGGhABF% zQ-fU@7@|2?XSz2rFsyycI(wN51H;~8)&=rY85jz6S(jRwGBCt3u`X-8#K6$Ik#%*% zBnF1vr&-s4+`0D<>$c=91_s^^)}03P7#JiiLV{7PM6GoIzj zz~EcU=5?Txfg!7r%}4qR1B2rcws4iH3=GpW*fPC~85maAu@$H>GcYinV{84{%)lTV z#Wrzg6$1nBf3^j+GZ`4_f3huldzFD9-id8l{$U1&jX7+~OC~Wev^cS?=v~6V(6)nZ z#T8cuhN-q}YbShRU|2eZZR@2h28PLN*|s%3VPIG##L7UFSFY$oXWr;YRGOsUx|TXeh<5c`cei4eMxqY%6kk9p7+^3eoSRx zFz;daEU#o>C{?j8V zgWP}iN+(GMhP2J>RUBU#7_2PW>o4{(Ff5aU(EFaVH>Pc2VCc_h?>Rr6fnm}u_CBkn z3=DQ$>~rSdXJBxXVV{@un1LbbD*K|y76yimR_tpMnHU)M&SKwH*2TbJFp2%DRVV{P zTmbtW=c^11Q>U>%D$r(NSn-bi(aBj149uMDj}w|17(!mKKMhu8V2E1J{x(;YfgxO< z{hd!C1B0eG`{(0d85m5KaHWP8=hzz~+s$u8{7z!0{clU-*C1A|HzCwu5t1_s^#oFd|(3=CPeoazP53=B(B zISsk5FfbS=aGD-I&cHAyjMFNgfq{YV4yU`_N>Ce=GdSFsfnn`N&gAHH28L!c&dfFD z3=GOWoY}ED3=ETnAoL!0&T2s`1_q8#oHMvt7#JE-ITy%$WMJTL;#?r}iGhKCH|GMG z&kPLwUpN=Yd|_Y^(B)jT`3M7pR43<~pWes7kW$Qfaho;+ zL+oMB%TK>DFfiQVe7atUfnk3b=NmOA28Q`}IDgLE%)l^TmWy?BDFZ|JR4y6kUxV4 zTF}A3;BkyAb*BsiLvadMx{fIWLyj(2`j&78h9#G|G6GI8Fz`rlW&hp8z%a{{tBlc$ zfnnwhuCg{K28NOkTos3%85l~oaaCMc%)ns3kgMi#AOpjk2V8abiy0V7{J46TEoNX~ za^>pXWy-){TfjA8Ln#9T3k%nzTUQtuQonOeUUY?lVOBfWw5O^J4Eh(j)|Q`RU}$IH z+PFTLfq|`%Ypbw21H-HnTnD~NF)(nfHz`yHBw)FmN$* z@0oRzfnmP@_ufy*3=EPVxeq;6VPI&q=00&;n1P`znET9JCkBQ+v$!ABeqvxK6XaoN zy~4m?BE!SD;t2yo=0hH)9gi3os;hXEm=`fH^osFVnIC3gs8Hvz`S68-!D|(dxAGDO zhJD+4f^EJqFci*!(A)3wB+6Z7U~ppMNj~q%z)&y7lT)t3z+hz0lPl`Zz+j=wlm8u5 zzUT84u6Jc%@G;?O&VA0n;1SC+_0|Ojh5}WdS&Wkz7zEOI7KMs3Fxc|*tlcZZz~C*w zbKoDS-MNkDaMTh81{qzRV}Fk_FgS4YoLs=iz#wv%=X^ag0|QSD&)xg33=A1XJWqeh zGccsL@Vs1pg@K{Fk>?YreWRPh^K08l1_t>yUgkAY3=CDvd70N-W?-ng&C9;Egn_~M z6tAF`A_K$LoxCFUj~N)M`FTx@w=gg)b>?+iaG!y}}2GF1kK^@hBu zJD)Nz#BJlvyO7Mlz`cUE;Z`#P!-6K>&H!-+hW*EQ=lPm4FxYhRF8Felfr0%q?~XT9 z7#Knfc=reTF)(z5@g6y0!@y8;g7?%uM+Sy%n|M!qvNJGfHSk`FzQVwee46*F(m4i( z=~cYf?;mDh5ZcN6z$lJ^AtIRfq3%}(1`bEwufgsN3@vrMKOMF(FgSeXW7)QufkEH~ zpFsX*28OaPd{X*-3=F2%_+%?w85n~6`DEv9WnfTe;ZwC+%)qdkpU*zO=k_r$ zh_Lake|3g|Vd*u#3+Id(7#!O9Zs$lcFqlo|yM5p(1H%FlzIXQL7#Q-*_<85LGceTr z;1~KP!oU!7li%W09|Oa#R(>DV5C(<_5&p>j6b1%G8UD0wAq)&G`us&%^BEYT)A@_G zGcz!>a`KliOJ!h~u!z5Yn*;-c`yu{`;TjAK>$Lb+{gh!~s8r-XIbV~3VV?;9C9V_( zhQ8JO52hVqV5r>A|1{$Z1H;Zz{?~=g3=F)&nG6gEW-~J|FsLxNGGsFpGZZkSG88eC zFyt^rG88c=FcdH(GGsHPGL$f6GFWkdnzC#R3=Be!DJiKb3MHwF(Y`AJJr=0xcY=yl15^Or8 z7@QbN88R7i7*ZG%7>XH^8HyM(844Im7>eO0@H&-d=AV|m9tMAg3WidKJcd$+BqZgDc`21xlxs1hFhw#{GGsEwg98KPyc~vH zFkgY8k|CcVham?P@Qj9V!$cvmlcJE4nwD6aQ=(9iSdxLw;X(|~3>gfG40#Oc45{Fd zONSeRh+-_RQeg;&CZ9}(G=@xuY)}M&+yQbWqai~PLoP!i+$cfk{FGFM%-n*a{Ib;C z)I6+#h&RTa^GiwB#qC^_SzN4}T$Epo&GSYK&J0Bi`3%Jj#SFR(1t8ZmlrW?*K5cAmZaqu9$Su)1YdU=1SdS&z*vzbLgB zn~QlEf}jyriIkez+=^23lChO-Vhk<}nGAUhiJ<(+kj#(>&YP8RhsnFA=A{-TmSpCo zE0iY|<|XE4CMV|PV9Wk|41u7`&5+2D#E{4+4>yY4JtsdYF$Y^h5Mpp- zC}SvL$Y;o9$Y)3b6>e~CEFPtK*nFzOXuy!ikjIeEPzKJ)nG9tN3g8&2WXNR5V2T7K zTevAwo{+4ZqEJwjpOuEhq%b6ci`Ybl3XsWg)5M^r zfugurAu%sSAq_|TiGf`S%b|%NH-V}KxJf*od1?8@3T2t8<*7wj5(@VCWcMsd%*jl| zma@3OPA_1{N6IT4UWo;Xd8x(Nyvo67z!=YH$WRD(601*UdIq)-=VI^yrbfW9rWRu>e54qB8U8Rp!mEfufgyq+ zlOYA1lM$7wm~VbcYEd4zsBz9s%uZD(Ely0w=1DV#U~n1-H5L>Y{xCcT6(tOyx+s+) z4_vtAGgN}hO$CM`hE#?uhD=a?fCq_$UuwBRdSY&>LT-LaYOz9Eevv|OUSc*jyJQ$5 z8DOTO6_Uu_2bl;d7_oU@1j&#@aC@f&Ni!!{bAEmfHm!01Uw*^{evU0M79n?0JyA0r1LxmP$dB>S+c?Pej-B} zC2xKT>FommR4lFUn;$0JlAcj7lK&?v! zP(ux_Qvj|rB{MN6KOI{!j$1cBTsI`mV{yCyxY__Y8TMi;y(2h2-bwV0EYj zLkQT3paKEpNRWR)xdh=;-Vg$XP!L+v6BHFi44|?FxhxN1C}&6ocL+fZ4^TRSbPyro z1L`CefeTWQPK4z;A?2xw*@;OxsR{*&MTxnoC8FG0~he1o&YHJ6c`X)H_ous zqTMO;i;a8?;oxMP!jR8Uj?{Z+56{d?$uGxdl?<~YaWJ3P_+mt0O9G1H2^kRfocuzI!z!bwIIJZvn0Q$QXwZZFB=@!sG2nx zQW+}1EeKFlBMP-NhD31v4r;!FhEhu5&X5nu02N~;8L)CI748!pVIRWS5B5qKQzQeV z=?h9wMGVDY(IN)q0=57xBZJxrpqjCW(Gc8&z;ur_+&$$PsYR*aqBIdHVHKw)7A0pu z+taBPB}It}MXAO4rA5h*zA$QdBrs&-N^lGc4A4+vG-SwQGz4W3rbvb)@aTjBxFrN? z1S>E={E6gp@Hir5ND2{-4p`isjFFNR(o;bLjEQBbDc~+3)Hf*#nc#jIs^j@k%RzXQ zu|ta$%#mF`+yL zG`$RY41X9Dz@76F*oYTW$4|^NFS#f+u^19jX}FD7!(lwg=qm6KLJG)uxKl-fQd3Hk z2^!18;0zwvO9l<>!8NlvgZc;H<}TQipn*ZKC%M1_de0fM88VR+XXNKY`njlzSs1Js z^x?{wtn@(v&IT&bN(;cI9YN|gp_V$Zv94r>Qt*&KDMJy1A_EtLJEUX97!MvK0=4r& z!*J@*ZX{@kF^8c9-1UNVF{{Ai!ifw;Op)M-0remtjTlI(tb}$OK^-;FkQHbc1EjNx zK>)8YO5M;wi4w3Wpr%kE11yCjM#qXA74lNc6=3CIX0bwISz=}ms7zDj3djLR za#?0^W{HANe!5G3a!G!Xda*)!W{E-(qFe%xYvkwT*~TpF3<1x0z%!N^ zA$LPvtB{*m1fJkfNXswH1NXa-Got`JGeR>1+yW72P)iy#8VMSMfuuZe-HEK7(D0px zbADbPq{j_OFggkakUUXRRH=}do|u`Zkds&f86rS7Scbs~-2MV}Wb!~`$>8(|u1=7e zCL&12gNCS66!J^K<7vo7sW3Q!%MS(cfN~;3AvlA8(hR5}RRSKYMs!aV+!8ZE4V;pE zh16nD(>^8*D8y5MnEU2ri{!hje<5r>xq3Yokmx&l{nQ z1X|xhdSnV|;9x~_3}YRGJ5wY>9z!xXhl7UwLFFtckE5r5&=eQQ z!Jx7l)M^5i=a~#u;QAq$0mK4{pa)bjxP<~5YzK8lA<+UF0{{(tfCl2RsRsoKXq-a< z9C4r-Fa?I^4EYQd3@Hqt8VOVzg6sp0+JH<24PkY{$uqK7)pn4kAasyYn_5|xQ z&}bKER2fu@fqIXinn{5H!~;b=t~w3WS1e@!g&?eU!|FG1cz~uJav2hl8YHJ9^Gnr> zQWc6y^FR|13W>17S|P0{KNnmnrImt)@D;ft^Gl21vYEvSNvW0jc`0Be$&ii$Mv2em zSd^+znO_Pwz9b`6A-^ayJu@#c2T?EDqt=%oMev-WUW{H}rl*!DBr2p8r50zvos*xY zkcpB1IT&2P<09qojKbnllvoZ*id^7HK=5=OxM?E7;Kz{30BRM1a#$im31~b7u8qqt zGdWcuH?agVzk{w>f&r2aLG@HAqPSvEgc~3nl95@g04k`!p^=kcT%w508C(n@;2IHm z-ikde6V!G9PXnRb%!fQ{jAS2QWPYhaQfgvJYKlT`Dpsp_82lJOBl4h54`OPO$uA%5 zE*J0sq*H!=4mf!5_2rl&Aw3B$67;Y-Cc$O{A-X(M62TVX9^Pbk$t+GzECSbKoT!@c zxsJ^jU>llm})WOZ>B5+GH5j;_;4xR`D75|`q5vV-^ z%2%K!Ke!Zu$Gp6{b7E0ZW@37(LQrZ+X;GfK0;uN8PX|qKYUzP8KJsD<6-R~S{G8IWgVX7ZI4R0)7ghS&=V zR#5XB)D2GrXXiq&UT}k+DUu-<+>Or0HE#?O2e&5@89?18M0MZps8E~=8jmc=F9OxZ zxtYbFW}iY*YDsx&YMw%V9;l>J$jvWGRY=QB%}FWN;mS?S1~rQ^OB6B^i&8*ChlrL! zUTTR#5~!h7tiuIr)feO!7iT8rR4U}8CZ>RNmE*$~LplS0^k4EgX>ZsC}ck_nn!Nz6eEFDN7@ z<|!nlDx~C>=jG%lf))(H>l9cw2#YWD5Xqk@k|Bd3lOYY5UBM+ynhv^B^z zN#F@oL=#U3-4zPZ4pLDnWQHG9xq;$6DG}0#MvMCj5?zQqeg$d=f!qk0PzSjVG-wH$ zdVma5fKmh^E^+w)R~HX5&;?4#i3-Ifi6!7AI|})E;06F5A0>ci%ZnI5{WDNnLLWr} zrBPTWM@$>TT7#e-Uj}&D0mvVqm0zG18pwy~;DRs{X>A#~BMfDuJE{tyMF^deB#0PYhn94R_8uQ;^` z9E0~F-20L7oKQ5|VOz>%O- z0UE?g1g~MjUfVX2kTev)ql=(bctzl#tppFhAten4Vgnm{lCZ<&pCV8b2b3s4J|ZPy zBrx`amjZ#p4Z6}6+Oq+bDWFmhM5C82pk^Sb-T`%@h)vFlINhF~oCaX7RH*1*dEje}yFj6=(Gek7K8pq2?}sT?dfz{)(x z_&1`gQzycKu=znWCs`qui8ADXD-~!p%>Wwg04+=gWj9dhVT>ZfD++xgtWU4XEGU51 z6Ih}(47|DqG^UaZp0x$#bf-4BSul~6MrS1u_p%7ix- zFbg6qX(0zZssc)eMUY?yFCv6zUIs)LQvuux1FfCTWB|?NfZ9o*N)xsm9k=l=G%%zuj6R4h;hdP4mtUd)nq(|V1-H{73!Jb7 zupC1$e0%}aEl6Z20L=`6TL39YW99=b3BG&zu#nGRcf0ScgE&|EbZBhA1KElAy%!tf0=P0Se2@P`4^BT8aO zWQ+%m`!O0afX1ysX&5xzk-~tOFBfx3ECEkOz=rt|!|G_kq5`)G6eytek%;613KCH9 zj@V%$05TWU7lkGn=O22^W-2D`{hLIzkp04p@08Ln7eAq9`?i7%Pu zu-k^mY!7&m3fgV}D)B)p?D81CG30`mb%7f0phi2W5-VYfWQ+$bPGbOd4sjLcNSP)D zwDvqVGY_&(E+;=-0mlrO22y_*Gb=;J6TrKf;3XkawgDBP3Iuw(5k!_6pvsTDh*m)a zeNk#jQD$lx#Mkhs#xWF7fYoJ?>I2uveY7lywp@shpQxC0X&F~>KiNtg9fn^5AZld zN+~EohHugURJ^7#JO}Nk1np;Ij7LlrfY*VddlFZ)6sP7uCT4L&iveh>Cuj>hw0r=S zrI0;vpz#OLcm!x>7F%@+Ykri#7xjS3R!GeXUe|@zXtW@?K&=Az84+`4zJB-psrisaPPlwt+w7GLf{9* zlUb~gnp;qUZLk1;^A6-Cd|fo`+n^yq0n!Hw3>-Zwd=?`N03`(+2BhIha-g!L2-J## zkCB7MK|#CaL8H(m;I*Nk(g)VW11|*t_pGy_TTtO6i147a^hhiQk1ZsDruv~%_29ig z;NFe`%Elz*Rq5FB%OdcK#dwrvT_$LYAmoGw2H3;}XmAQNjt1&i7DA7)Ky=GMg?uiw znGb3zLN+;~?fL-Qfd~vl9~4w8LWZ+It=uXGE|i5qh#qN(XBv0~QZjfAH>g!xP?Qf! zmpb5{D0EXtX&xvTGU1yip#vPn3gwwOIiM+h&;lkdXJ~I0Ter0cPlRIDr=UY7AXNk` z5=C7_@^5s(54G~1I2USR>M1wkGF zrBwWhgA3d=tN>Ri;N$^MwJ8vfsi!F9WM+d?E69rwm*(UrC+4Jr))v86&cS_@hJArK zbPO5fU+6BG0@&7W)RJxu((WNpp37j!Vfe$44e2v8RKa&_LIy&>z5}h=0Iehe51+sy zH5)vn0$POtS|taHV&p*>h;H1&FG=9RO3084WSe36AjOaa4#2^fHpl~@v;kpKLcpJ)HiU87qlq| zG&G&fkO|HMh?s%RXMoCvV(?KIputE;Qw}kyuIpK%P@I~Y3p(f}u>_o?;W3w4tN>fP zmZ$()w~npAvSaWETa2&RU`5KE{K zoD%VYFN}oj8o*+P0r=DlP{{!*NkDU;pu-A4-DFUv!;-Mzj+gMwEQS^QsVNGe?jK~5 zAB!!x7otl0LRSicR|SGfT)YNVFvc-}iaSvK1}fY@sT@=wf;M78dh(!!O`voSYUvh% zC%H1AJ9a=jdq5dD57NE{Z&CvFH9!M_pd^A=_JVI-#nmq#Jb(sTmZJb}@PJ3@6-qJ^ zL6u_(cza-ZW=RG(T|t*}=Ts^br-F`%f^FEw5=J}>0pQ(#p#6-9qaOtP^1-cpaN{De z2HyB$0rYe+g7&;X;uAF82|8E;6tkcO6q!iJHgWmogBQL-clcuT8=#wA7@%!SxHov9 z`toyNCvu=x?>HL%AYG|>`K9R@xThx_;C&!i;sp)MK#CSn3mxhd@D49fYY9~Rq=0vP zfX07OmMZ&$*4sjk0?5fME&(qhQ%KBH$b?pcnI);Ym_f&A!Vu1o%8&#dV}^{uL*|1) z`z1i717wW~$X%c{tk2=S2(&}1z@2r_`fbqsSP=sk+-Hd19VnH7%mE#7^BlBB4s-w; z1GXkAD1(A_jDS{cfEIH>LIjjaGZ{cTJYWmDK@&|ypamC<@}P7K9w!Db@&*?GkOnXp zg9qd+KE`-(rvYA@gO*l=B2{*gW98n z+TZ8U&P{`58(3cvRJejpO#_!q;4sN$_yanN5V~eG4IJAk&^4)GUEt{hc-I8p(E^zS zDyBhgO;801Dn~$R0Mc3o4NroyY9e@jmjZYw5;PP9>Vtxsf4R`u1`X7}8hD^}qoDKw z8Yuv^X8$0qV2y{yM_N&8Dx?z%->j_zIy?imZ#WaQ$}%%gAtf^{EfusyU!k}pwV)U@ ztyo-;lL>AimbI1oUo8r)}uY>zDf9g|R8QcO~^jzJqq0Qo470knOw47{x#l#x>y{xDQA zq(g@`K$#q|iWHoX!G#EDt0TzIARUmfKx|w#BpLGyAYkQ@#!2S5|mpmi6ZK~zv_4a(~o z;K>G9tp@IggC;(aY7bI;U{9P6;2Tmvo9iIkP{97cHtM7Ws}{gT59pv$kkhes&k z{s72ek3wP|sPl`h8>_<*$Pmm>2%b;@bqx^X^^oLL$^cqH0ItW8mI#Rk1{dZiq(H~% z^Gk59*^xp%L;}aD3j)EJRq$hhaEyj4Asr0>izHC73@TJXC(j|D;(%fvj^)SLHiK~l zXJ-}^VDD&Rt0+)5s=`Z9jo|#;R7gz+S+b)5*$@Jr!vNKPpn?U5FYQ44`@y4#pm}SM z|3JNOP=f=Jkw6tXsE+_@7Jw?ML~x}BYQ!KG`6vgMCWFQ;(n@o3Dq#zK(AGg=$t(DV zb@@X;L%9l|f#EdJt|u(o-3T_JU<>p>2@Q184k&4XmJWj^y+FNCP-Tng1Z#ng41srh zL2GFs***_>TN`A*8y43X5bYXJ;x0xy*;A7kd%?Y6EY_M}u@+n6flMhvCW{b#DMb{k zL8%1PECU5Pp3!(G=$T`XA{f-M0i_X8p$4)TG(!aH`hbS%6c|8fdxGXy%fVY4A!>7w zcC6!e0G`o&4UC05kV6_lyR1Ncbj;^y4YEiQvnZxj-UhnK*M2><}j$!1FCAk17+~C(*WdlaH>x%C`e5#Dpn{d z2kpd$_P#;=M9?uzpk6lkY)5SMq!O&g0q?N^9jJ^u8H&U0LrsBL5}+SElY#n}klliy zh2Egi3CQR)DAOe|91Z6q^|aD^MR1aTu^V+zFs9y9Gu0 zNr|9Mq~Kv2&_tvHbXF3JlLU}_iaK*B2sae8Z9gY54|$g}Y?Y@3Qq*D3OcKb(5GaHU zu!IkBMGl57c(Rill9!RHeg;rDgEI}dF^nvO7!5!=*#Vy5G+;hdF9y%gD!?XfL6tOY z5&?D|6xslcAAH>es1ye^20&FZXpI|aLI70cVm8VVDnV5psIiV&HtK-fl%83Znx_C6 zV24!!iFpdJ&bLBNVqSVF_Su^TEbc-Y(*~X61s+!brAbIv0pwoLXf>pd3z}g8g(W=W zg8R^k;0_6>M+{oZ1#0_qF+k2m#(ku71i~kfadVJQVBo6a;PuLx#jvqBSX3mY zq=3!~0nbr^Y6@tv3>qMSFN()jBpW~v_(L>eL9vkwo=41M0F9l1f(+7k1UVGZ1e69j z6f|>#)az3yuFM4;?}sH3fKI#tg(Rp=iNE9r7dl{rQA>Vo&iBG_K5Y02bT}Jme-vbr z7vyx%*aIkTKs6nx{SN9xf!bxDct#%EwSar9JP~xGMnOS-G3bJge1(Gi%)AoN2y!BL zR9#0Qsk8(%e+hDDo;tSkBLXno2Wq-hLI$_N$5uc(?VxcI(23uWDJf!HX+@MP!Q;$C zxbqX1f(f-#tpsl6As@S;0Nx-5>MIm63JV?ZM*pcsP;x`Nhfpbrp(LI||>0=82Cl4qYYd}GK4Z735FE;$j7m*OF2dic^a+^Gl0C zJ=J{BjRN3{F0i=02t4QyDp3)oDJ&<#;tJ#o&?Xzu?oW{0k(&bOr2;5Ei@+zI6oN}q zkX}%a8Z;?T2<}xQ3L-~P{FUUFB<4Wc3DAWzkd`QPe`7I9>j8c&7w*}VBJiyzVRWKvztWi*F8PqXHEHcy# z%>xfXl;nd4VBzaqQK}zsnTaLs$RRZx;YK4CgTwQwG!9EZEdngYN}$b4zy~(q1`38E zj^M#LR-uGu3}jjhlzu_mzd?7>AXbTpAQ=dXK3r$|sG*q&>SaQfCxMzrpk1Ay;6+Rg zNg$aEZFl0FEEhvF8)Opl2#NrbS-1vDWWYyXK}sH24;MZu3=ck`(7dA5IJo{b3uojmuIBrDJ19QgHJYs zFAP&iOe;w(QpiXw1C2ixgU1FTLxV^wBS15t-xS+;>!2f z-3D?Ks2BrHp_|e&IWb=v1-K3-JIa-1pT1538GsBDnYPiWj?1$ z(9IP^smZCCWspq>9|{ zgL>tl)x@Am}1k4_rgL_T*nD2&Ojv@)|7^=VF%KYssLJ=gw0_#48fooAn-Aj3Jj3b z=RgIU0{CD_SQ`$s=`4}~1a%pF8GIRZ8C)1#7&PGtNXsR$Bvk?2E(0YQXviyo&Ikov za-b0z85ybT>#OVHqKVBB=vOo{yCi~_-=GJK2zYfs8u(xo&{|&bLL;~%_+1jgH7>{n z<*BLQ*#LACgfJJ@!SxHeKyMI*uL#5DR(y$o18M@+xB(qZ0vfLcb-Y0hl?w2TTqf8v z$os^#T|nFOA-l`4HzX3%Q}MJTj2ME!Tdkla71p&NXiIS6L7;$ScX2^tGN>gDJ317; zLLW0sK{r8yGBW7kSnwDH+(33nR|0E*c!5u>K+y-inisaW2(*?Sv6vN98^aPLs3->2 zv(R}%xP6LH`xH`hGfP0*V!&w<)K~#|1-48A-3Ja>T>=_U15J{`iX_mzuaIGk3TU$s z?jpGT>R9auUD61$A2BL~EoGT8_A`K55ui2_WU>uZ!WV-VO%{R2+(5|&cUa5A?1mrb zlM6bJ9=sI_G?<3XP9aR6!~MbwGcPB#EEQ`}4!PyDlmRp$n986Fy;2Qy7%OPBA2i_t zy5J6Rxv;QHerZxpsxByLftISn_I#knhYAt%4Tu&NAL#gNaETATHWs@#UBOr1LI(3d z%}B((v7D~Op!P;49NLJuO0p?a|9I7rhFG_4DoqD8)MiQf&fn+iJX zfK@lPpkM*rC4(&ttjKJzq$1sYtpGBd)aD3oKZ5SQg`Q1~9s#&D@w!1)<>BrvqMlZc zh&)!eqWoMOQRff6G!(V4WCe}A;0XFV47uQoh!I^{cE|<0*fJ)g0LJzV*qU|7KsIO+ z4zh9)v~nBNR0I_*paFeQgA%k{0c2Yqc;N=500v!<3+hIuf;*L{%QcawH$XlDkKure zGRROm=$u~Axx|pkgA(wxLN<6x1KU1BPzN5=SOu*>K+J1{R(d0^at9TZphdDt33#xY{99A(V+p&mVz9g8(l5Fkw{)2P@_!&)PjSqAx75?n&tsbz=NiqLBkcG6%Wu0xS>s1L>(pt z+8GJzSb(o}0$qn!tN@+Gz!t{%`d%!c!8L4}2wkMk3DO82AjGB{pOxHTooV2e0oe4a zAPssV*O8#C15b?bj3ERy4Rr7(G|^!*lm|R&59%SMB5kpOI0e+t!9GYM!{7_P;TEza z1vGCATCV|GHJizRD9ibL6Du-vOLG;9b25`5+p*DO7uTSlsBdawp1yBl1!y1`oOAMU zn83y03%(#DpCJYAcQ)VDl8k)tDUIkBg07*-hu)(Bn%f3dS^1!=i{P3?A(~-jD4x=i z2Vpf*!<-$WA8S*Mi@_0eWhUx1_rCdgB^lV_1{BKqpffU{S7L(JWP;XtfV&-V_wxDX z7lW?LgSIlT86?FJ2|9}aywL}=atM@KKo_BBGGxPz;RhR2Qk0mMmYJN5y{LqoQir;j z0Mvzs?N$Vz%?8?~2RBvP7q%k`KI;$KqX@q40-H+(z_)WKfJc!)opMB+viK!pAIrp7 zys-HtmSmP;on-@EtOA+jserqd)h|6WuL7I9IAC2!xLOv!{5-4%L+%WM9QcIj7P9$) z8vfW?*9=^+^1X^wm)ec^$mdOBFYJq%Zy#~ZM@}`Cq82lJOE4`AyS2u!J zpD=*xIZ#282%2wzds5V|G&d==2$UDVR~Z(8b}C|PQZa&3HmETLYNLQw_Moo|0xvcN z4-0}+fNFeD+bI}AUmJPT; zkG!f-oxu()hG{#fgaB1Opp1iWY#go*9(prz)r`s_Q7I+p6oR+o*#!E~?vsPgzV!P0mRy0u7OZ4m!vO zHFvS4+7bpw@M=y_KtLh|GzbNn>Vyp4XM$@`@E{apJXj?t&w*5fXfmS&?tMF=ykA_B z2)Q5wya)>#2C(xY&`a+Sq+?%@TU?-4BxpGhs4xPpD@4Q-tP=_vQvwb1>q2*PfR-93 zf{zVFES53#FG$T(NK{D5$xqJK1zlnbIYXu#dufUe-i7GEadvZLXqOGhEvXEk zvotfow?2c~b)b$i6QIEZL^W*=b|>PRZO|AwxHSyAWDRt9AL!Oz zxbriM!OQhaus1g%u=dPAB|E6j0;OnBj}6pI1l2sCp(aqsf=1CHv+SUyLYP#{ofhr8dcqZ!nFvuLxi724to(P^L z1|>V<#~Cqqsx(4(IfJ7RoSC5meR=SK8&Iyu%uChd0uS*QBXwqx#`F}@^T8+2fL6dm zO#qE~fEK=kS_XIq3b98R?gb6(0Y#~xDJN|D1fbW+moR`T*L6%#I^bU%W+75CoI}NFi#tAbAYcGwBA(SDA!4sa16#`3Biz*e8 zLG#a`L4}!{+-JuD&zMjklVItst0-(|ww9^4pL?F-D2n3}PrD_{VSyPjkMMr?oX+p)ZA2XzoQ_(7<^+QcwG}{T^Kf3 z`JnAa1+5MRv1{ewK@CSxD1*8y zpxPVx78lu|)Z&8tykgKrVJWGI-bgX{SS9SP3<7tjAX{ueja03st1JB$5+ywA(d!Q8p*bGnsFT92=I|1bw&}lTFY>UlVQkaH<`og%H1Qzh7 zEvWHS$N++%rHY`e2ddX#gAU;S4R|I6Jsi}b7J{+@csd7k#1`m?wL}Hz@@Gg9h|Oyn z49FQClm+4a1L&4kblYShw&|y&LdqoY8NVQ_!TkVib_hWS;$0X(*W!ZODTpaVx!{ca za>%JvnR#jX3W-Vir6q_-T5QItFa$GXFo5nBMs&|WYdS$Q>gf!iV}J7*5J!Cqfh_>J zFF7MIFFiFUAAHL(daA>haallT$6#|w40I?hl>u~mEvUTPAxTm3-gD&m+WPc#8=z>*)<|!csJ+WSMg?KFw)ob8_3w%OtNormRc|OD!pS)mOp*!!f zjt1afkiv?yBL-@~g4&~?^JWlZWURrUHT&4&zyM2o0W<%BifHtc@D+kVV}RhJ+d#|O zKxrG26+x?SL8rK3vkp|8f(BDSH7#gV6SOe_RJ?%u&Y%T#@OoA-xFoRzay5$rsL;Yb ziiK+?iW{_G8P9rULhBMNL7N~$gM6SvzeTB#J3~PGmNQZnpfmK)D}bSSAT>n+cE~h( zw#L11TNiXTA_FMtg9g???GRApf!MJ83u@tjnr)z^uJ99gLHDb{L&^r^R>%qx&=wq6 zCkqq;uqE4weh+lM33LJ~=*~i{>CO+O*#>F|fuakvV;0r`1345i=7rgGLZ0YEG@Xn< z4h4;gz=yx#Lt{CKNvS#T6%g>26xP;F6_(A_uxcrVAs;+gs}3Frf%GLn6L6rVi11!L zxD1385uni0m{kA42hr#I`G62sDKAm`k=*GpndM3 zVj8r{G8a5>a-7kS0oFu7$bb?Mq}>l2SqD{7dEnz?K}CKh_<#bCX@v|$;9EFyz!&#{ z))s&&5zv`iMM#a{T2M^pLg$I|;ImDT8Dq#{o1pTbATt%-SWV8)g>3xKPt)Ua1z#8e zDmI{6U?=gU7v-0NE>Q)a?+7}00i>-cH6t~zII}DjG9`^QQ9$-sg8T?-`lD5P@T?*X zayO_)3djc(#gNO8%V5P&jI=961MDF1 z3Ve`bpp_+JS4c*NRc@|TaWU3CA-I;+GKb`2?HJam98=jULp>r}ucFJvVRsFFYm zQ*bW_Jir7GU6~N@xd@0754_k0vMCs=@yKWOfQ$!?O@P`zu!Vt;wVRM*#9$3tA3tTrF+{3_lpH{v&>Zl5EX+fw zW3ZB;L7uRp78>(-nn@gx5nQB!SC-HqPplD5=o(wzP|!wO@UbJfcA!CLEI?j>tszDf z+Mo&+Q~`r}RFLKks2v8Xps_4ifQPUQX!1V^w!aeExB(vmotlGnU6U2EBcPX#fO0m% zAyrI~43KGmxRW5K%)u>{23ZQ~Mu0})h_KTMyzm!R_amow*hwgml86`&^MUOKE#U>N z-@}>%a1VQcmP(}Ho(sj-cLHfG(oIaqu|?DXZxV&XCn6q^_g(3S7NJbBX`k1BY*aL6LWO6XxapdKt_*Cb?Y z8@X?Rn4<)ZMVEq`1fX$LMCaT!JR`LvBee*0^i^gtXdo-UJT(QhZYU)+4|G#iNxlN~ zo+H@K90l;YE>Qb96SVXN)CIv7{rIvF8|2UnEZP{=7(g3BAf*6^1dXtewh#$is3MhT zprRD9FbO0J+5ibUqXpE}#a+^X`ZY!1ehuQ5OpuGf>jS{uIBe+^lv+WhD6LkJf%dZ{ zBW<^s9u7Kf6tX#}SO>g}9o)zQmx-X+0mxE*Q1b_zQ$g#;z%64?1VU#dGmD|iec>G@ z@aR4l*l0+5qZl*>Md{))&_-?0Y7yi`q%4uCiC8yKa4~@Ph=MwSh=op^@cIo)(qZ5M zZ$v0y0No6R*p9}QoL_*W*yDg|KpYdw0y?P`o7sHO9z!BS5z0sr2dwhLrV0BEAbil9 z6u}29C4#GFj-brs4A7Vf_!t<_uoz_M8#EmT%JHBC1?xP+icM_e?$VHfY0y#bplb;+ z=EzX((P01$M1wLw9(dyo;`5Y>3R z1%OjxNeT37b?|T^XyX~!^Lz~6;AMry-~((Bi;dZxa}tY-Gm}B#%!#Un1GaPoUet1e zj8pK3u0BIkj&JoZi$^Ks;0H84pmo)b3?U583?2*$pglPZ3Jfj`K@5%z;S7p!Yx#T~ zL!3PnJcAWnf*ivYu{ag?s47cLOUW0~KtbdZq};B;m;XQU%b)`_#nb42679MS{&x z&|R(&Ly>Qm08P0jb#}q|6m)kBXp9pyvW8^5AhPkrsX1xb3oi!_T0BEFpyH!8PoLf@30yB&Qsszz$Veu-3?E8Qzu|qkn9(lA4(!R_D z-%SJRc@%=n2vD09ysith(*kM1ku+%Y8e}`1Z(>n4Xu$@`?lqWw_`*XNyy*)(9q3e) znwXseJsb?C7c*V3`X&}7gLfan)j++B2o+{u$c|Q+3IbcMV9IdiK{nsaywVczXgN$N zrn}gD^YhSB3}}lRn1Z4`%Jei=s6$Fz~%Ke;472{JhdGYr=#Ae%p^ zb_91D5lS6FcV{tx>nfx(vf023%TZD&k&7l_CSy946}*ZNId}3w7dwI`T@sPD;Bf?{ zrll4Yq52APJ}@Xnf@b4DGv%ODQxw1@6sTK?INwqLv7}D{evT2$T~gqqwn4XdfsPG? z3}K_M<>7^`zEMcdPazQH9KnetrA6qGj_AR|TV`y*;1yBG{>Ka>&S21uYoJwx_|>rm zm!c;$d^wCIBq$W6T*S1QBP64=s2I&3n3Dr6py6y}x2b{0Z9wfE1+1e^pa?_W0|uEY z2?5P6fQID3>xC3xYqF3H#=-a-tlCDoZtvDw}XL!fr*h30F&1JS^xk5 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_bg_BG.qm b/logdoctor/resources/translations/LogDoctor_bg_BG.qm new file mode 100644 index 0000000000000000000000000000000000000000..52233d21bbe7ca8f72afc93cc6b99ea6373d1292 GIT binary patch literal 59724 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

e6^_eTbXDG7XuPyaJ8cp36#YKk*3*e>U5{T#%= zP_E54<=j372C*W(^{>t_FzmMByKv5!fx&G(-|ZYp1_rB{e76rgWnkE{f$yFDIR=Jm zFMi&+?hFjwpZJBoi7+sv&*Zl_)yKea@jJhdY6t^E;ywPz{uBlVl~4R>+d>!^Shn*Q zWzA<`NWITrw4IrOVQM3P`La|7hDCY&_1h#E82ml>Cx&YWhELJQ|3<@mfECvh;EKV$@ERHNrEOsE33|1VV z<}Dio1A~xbN=j;qLP=_INwGq4X=X{P6*~h11E+IFVqSV`PJTKg$Q~{hc@|R^dlpj` zYq(Bk$KnhuO4%5k7=jsG5Xzi_U9c$QVi9DqU~yuxVljX#Wphd_DalF2qFRYXkj0wC zj>U?_g2jQwfW;QWP)y-+%E?d8R>;dQ!Df;Uiz15`i#dx4ILtsMnKCFq z&2wb2VsT)xV6lgV6WnFIPNkVSDGJ5OMVSR9#aJB3#o)}K&7jR-$Y2iF#OkcAZD@`~ zF&~Q{iyezCiy@e_K+=$ymr{vEg9D2^ivu`fO<8O~5zS)3pul3!;>F^`V!`4G4h(x1 zJFu7?iwQW0%vlWKfn^G}LKG6ODGDj6X^EvdB?<+JB^lT}B*fs%kin41kjIeDkjjw5 zkk60~Hw2M5u((x)MV#A0EV@#RS1-ok%uvLT$xzHt%%IDV%uvLT4`RdJ&+S~4SzN4}T$Epo z&Fg;PBx1y31I;oPEH*55pv;5h3kMc2kO){Dl!y#ioS?B_%>rV(u-LIUu-LE|AZ0aK zXOM-u1v!Z&Y57ID3d#Ao1&Jk@NtrpBC6(B6ofSCOIj}f_(}@9#HH!s{IXqH9Nx+1~ zg2jNv7#!g?;6wq+=Qc>8B;j0IT#}!gS(TcikercNR8p)^l98I5ip}F(EJ`e1EH*5* zEOzj)VsS|<%El7S5-cL%q-X?E&7i9MX#|u~y&%~a z7Pbs74EYSn4A~5+3`KB9@VVqCXQvh^6qgnh(TLHz#A`C8{K{b&zQtD%O&&f|p%)yq}*jS`N zl@Z)l7LU?AY$0O-O)H4<1XP`Yd}Rlz;^2k16N>|jGm90A6N@t_L%>az@`MyGDGCKe z`B|ySB?`qQMWx9lrA64%rWS^M7U1#=l-=xE?7-m(s&1{2yeS5?0hEA>6%zAO6w+{| z2?jrgM21|3RJiMSJoD1>ixtW;Q_E9}up~SY770*{fipj-q(My|?4BiwIhl#rQmhz@ zJ`2df&?JRnF^5-TL1JENF}6SuU{M6M6Ih(U*4iQ!*sMO8=^5DKiHpI9A(J7Gp_HKl z?l)GS%)HVHte%o#v0$+Umsp?->%d}xR8VsJX69w;x+mtQ7GoDU6q zf<+dTTEPwm6?A4SpjrWxCLrYu#1o*D32tsN1T*BJ*(KqZTCR|un47AQo1cX3Am&4s+ya5(FDil$ckX11>eOMiv``KSMA>1U$%@{evU0BnZ@8?vEaK zET$|j(A;jp0_BZFxOoC_^HMSs zbMn)%RWS%NK}pyST+M;9D9Cp<;AR@AMn_c7{BScNxeJR&IatKOH7243!HO#r3$RGA zII`G-3nA3x#U5Ocn3svQ_r%Ad2=2mxl7SQhCB1T#{IlSzMBtjI|&zL2)Rk9|NgZ zVdW>N+y-?BA*D97odWm2Pzbn#N}!_vYQUO;;s?oD>>(MT<}S8EPJ%^(1ynmi8V=AB z5~U_$3(3#V!Rj3WXpY4!7I{Mm6p10wkZ=W;sQxUT&{Ea_oY6tf067Sh^ucuri!F;k zI8A^=?7&@mW3Wn4<_C3%omfnf{HqgEo|>4Qn3R*MP>@)Zn44OXS_G+Wit}?*74p+S z?SE)j09&A_u*k6(g0en~5sNWjhNTu2XXfWA7-F#&U7Hc6HX|am8DnZQCPJGDrZy8S+IW!t2G_y?^%u61 zRtB0Iuy!~QCWJ$K6IkrzV+dyeH6K$L@)^n*is5?L!!z?z^2@PVY5;Eg*@K6X;H3tv zAIW0K;?H6Y?vq=wID^MY5M?%hc}8YQszOqJ1!Uk0i+eO!M8G9Cq>T#6h~_K?ET9q= zG`0q6c$$L7iQq03a4aau$xH?}g%nZ}OA7? zXyv%D7_e9(4Y3J1=Y#6)Qc!0sKTjbo6EZl4YG?q95Q74Ehyqk}fIGQJZ9h=W32PgG zGBP9!LsKoh>tx5`0&Wa}QZynzYCD$}6{Y5t_X(i=} zke(E(yFeWmP@(R{0;+i+1wNv6!sS|#np|1}DyJ~RiHAiVF}4K{VAcTGSQV;8po$4p zK7o2=kV@VH)R2Jd69`Hz$S=+;$uFu@$jQvh2B#%dBXl4Z!V?c@oCP$z268#Lp%3l? zqDPN>NCv2oEy;kDs;O{4;fSj&h&`ZAID-yo)C4+WYY9q8khUFW3ImVcda;1Ufk0IN zXh;L$Hc(pz>`HJu5j4gNY7IIfbxy6}t}M?;ElLF!|A|ORwKz4gC^-Y#BT20&DN0l* zN-fSWElP%rYM_Qx1pyzRw@V?TC7{txP>%5jS6|R@WKdvnWC3;0K=}%kjU7Q50+e>a z1DT+1mJ3&MB@P-i2-FKL>A(7%g-xOD9)@(g_{BzmyRxHZkPBv&*&mCnr z+5urYxCDc=k+7LB=9!mVl$ux!iPkjSmVr93purwcc>pTIKtlm-M0}Zo-BZR>RG%5}qumrV2ilAxN5j^{10!qy+pqve|8#LMh zvK!PFw_*VeLV_B*AQ?#A0-2csx!a1xfW->jN&@j9ImCbkGOPuPJy6*MF45ruQRJwQ zms+j>E15Hk6%xx5Gjl*?t0GrG4mf#~Wfo_aDEQ>3yW}UAaL?Httldn(;Zt$T8{3I43@U#jjsI0(&s{n2Cd4SrB z&`ka?7!?$NRx?6wg}P87H?asjHK&l4Uz!K*&mw1E18_4EJVnU@?q@)%LJcXRZ63D<2 zvP0Eagjhf`Oy;1x1L|}`^ABiX2sG~miWKCrFA*e*KvOO$3i+krF8*;VkmOg*3Rd0X0MIz!MZ^&{+^fLsS$riU~`e z@NyH~784d(aCQK>7!>-TrZ%Xgg4luV2T<`0Nu5aj4L?}9i9Oxh;fNYgs}>X~pzLRb z)Dl3-f}qp^&xRt<77L^|u8;{y&wK=}#O(+9OqLESG;9O^+qNuU^K01fJZ zDh_M#FbODIfZCYQaTl=5K~t@uVjon;f=XOaB?Ovs22C&-vw&)SP~l<6;=o`}qZ;3c z#T-0T0&6$ef+q_w!v~UFKvVd}NOP>GBlAnui&7PeO7lRIZ3>C7%10rsC_fim9jBFo zrmGaWBJ)d&;If&;3Q4Jz`FSZ|CCQM^8b%GquWRL_=^szc7!DiDT`aDw-!G=S+?ylf$?7#vl zBy3S8_A`r<6N|vLHz%e>WANZ1XdMlxZ-K0l%`-hOA2L*crjH96;SNaFF!@8)9YAdG zErzT_a$-83X@E4SF0byK zSX7jmn4YQ-lv+|+l&7u$s*&^4L6dX2iQu#hb!c#EGB{)$Sfp4WH3_Kbf~@%f4G@5` zIw)I%#veen0XV3^9d`>Bdq`uR#TGQ-36C-rM}_44oYLGpg^WbdoUuY_UTQ@_YBDHc zfJTpWODYS%okmm_FsiXggO@15I?JFy1}$eY1y7rR3S7`65vYCw&G|cn3S|}(P?Uf= zCm=Q8j9~}vdAfsx4%F=d4QYXVqr<=j9%}{_WT1`?DC>Ymqn*KKfEx!43M@F94B&P= zY%vumG(e3cP|eO)W-rm!~`-Ew5$s?oZB50ic>)&;U)P+pq4~#W-+MwtdNviQl6Tc zr;wiqDh(BK^NUgy(lS$XQi^rBauc&bP07p>g^a|a6wq)qqLq`ETB48yYP=TfaDnPJSY2Ng=%Mf^{^p_(KkVZwj7S1kn2z zSj_Uk(TD;iB2WeaB@|FA7utjaw{Ad#IN;7AILU!zZIMRKbkJ>ubsURQA**9Rl_V%` zlM*4L6=?CBgu_LkFo(q*da?$|fwCDWLxM64$hAg9xD{6?7cwLXN|%WW#U+U);6-){ z`FY?b10J{g;cz>ouyAHU9k7CAN$9v9IE_I@H9)FC{V2pdFs?97Pb~p2I06M}Mruw0 zd;k?KOoMQ^%Yg+n%L!_Gf{J2C=(sBK3^}Ax4j+jG*9o8=9b!c*u3l_LVqQuPCBVG9xFnw$v~+VHu?lfBaogaER4YgIJAxft-68~ z)F8iuayDua=!GL4XXX{B7QsUuG_H^eTDg>yS`4a_KtsZrc_sOTQi>an7y-ovs2X$t z4+VnKF(j1`a;-KF*X9?bf?LO+NWhbDvv4>El(|8j0}B>&c-I!xk-(iqAOQ{!PPi^u z6d*>JEO0m(6r`YZgPCU3i{Vp5XbIec1ouN~X3)^N6H>!TnSg8Ht0f>UD_GMe2s|wf zDtkZ`DP-IcRB@ZKppTbe3rbK~1jVutBT^bk(F?C@>~OiY2-J)KMJLF$q(rG5(WL>XpMfaJKqJA(!#s*OU6!Am3U1Y4 zDT+dH1e-f}FdI~~5F22iE;Tgm!vo6{hm(p@p^c#o&^Rl$Nldh4Z$g4Ip^iYB6H+I_ z8L-(?G>dT!i(v^LhIEE1hD?S6h62bECl;tf;Gv;Ugfr5sG7Acz9LPsiJK76)E2bv28{-QHwA$EqM$f|EN4P0{lL9X&~6e~ zR}EAfnnAl_pq7y}%EBFU$2`yyto)*q#JmznR|L7g0&h-(wn}7z8`$|pxrrr^H9V+A zxfFPv0cgq!w6Yr%i=bs_pgtjDMVWvjY>r4FH#IlE2t1O3mN#5*q!3W!1bdSjG{psK zP+NcpmBCBI;7L@%IWaFUzeE8vVOf$2ZjC~gi(v_B9W4E9Nb?9QY^ zJ#-Mmg3v|~a<_xQ9&V?YGpL7=s*nht*Ml{7?6HKC8;cTnU92-`7Z7MH7-z#5lrs<^ z2+vpGMJ|XCl!q?)01f4*Wv0Vco`3?h7&MoT#R)E;;VSTu0BC=h2Rwa)f)Q4qnX|x4 zEO3y6k|exg1=^d2@VZN433ws_HYAT2#6}BfJv;%8C3xXB2!Lz=_1K^Z5qTU7))q2g z5dp8i1&y46W@bU7S*QVsl30*xB4L+IP?sOH)&vx2xKg1NUJF27CNuC@2c*LeX^cT@ zB)CV!P^|)0xu7XuEK!8tI}pc( zJC&e@C`zq`CEiIdzwu=p38?kp@*8A5tYD&w&7fu8p!kPQ)u8OslEknXmdUVKZG|K3 zAzODq^)_gz6t$-STGMQgl#4~67N(@8WkNcgSO;Snyl~hB>XYCa;eiG*w6KPkg79oD z1GO75a+9A2?ks}JEG+(|cK=%(YCo*MjVG2BuonH$atgGX1MVq4sG*=j3VZjC+=eed z++>^$U0ksQT5#>k0@_dlTWEsFkAz|gmLyB^6_OH@vr7x`MG>yz0Fvn;X2a`1`yAPK^-2Z%21z|Q`^+Q*HAhmAvM{L1P#`dB5`iOOf$Cu+(4;4L zz5+{|j_6WN1raSpsU=03sb!GxfF~Cm!%GuLb{S|>JZN45QY{#OSEhoZ2-KH?Y#Fj( zv4Jm)1Brr4Y|si?@M#*5rZN#TM%K7|RFqkkTBMMdnhF|ZD9KjQ5Dm1QKAhaA$Q$r*iP=64TGEllAq*n8w z6%(Lc`_TCraMv3pOu$Ex6fDxB^C9&xL?yO8Q=rZ>;tUQ+urpFCl2cPtiWQ(oGQc+#p!rn}%{d?+f-C|}b(^x- z!u`ezHZ-$XAvL$41l!;rsRLzvU<2_Ddf1^k4N@M1GCcBN2V`{u%-Ns?HK5Qyb~+?l zKsJFQ2FG}W23E`PjddW51tn`7#%6%JJfKB2phh`($vedTkOeHr!!@8l2le&sSj<4H zAHn4^`bJLdEiuqqW5g;gOOM22@Q7m)Xt@e>xe0iWBzPP^0cBe!@;(@B<-!^k0qB?t zsITn--a7{hYKX%@PDYH-fSm!Zeh{NEpphC-Wds^60+n3gfp45+jv&>Z;BhQSq#B?t z$AjnwE&c)x2%_3oL04**DEi{KLPz9YEgt}z}QYV6jACX7o{Gnlykyw_Rr(U9vo0wM$ zI+aBsH6;_Yb_`T6U>3$YT+o&0pdBAYB?={=wU3#_#idx5m@%Ay2LosrA2JIG3I<3b z0WWt0joE^iw}I9nfFcjH;Rh64pr9~fP{6X>8?@{T+1sS;l7W<%AR9nsDX5xu1LZ1k zX$qR6f~}PR3|RJfLN7 zrNya`(bmfH#7Z3n!UM3NbeWo0l3A1rI)(={UyUsX+JTB!@Z=_FAQrT45#%|%c?&wt z21*i${UFkwd1Z+?nJJ)=5u|yHoXk9|4FnrBYawUpfkyB^Yve#XJ3uXNLL(odFiYW` z0?;-$ENx{YuyvpS2Q5kiC0R)I0h)aRC2>&C4YJA{`dX^{@r>5qDj!;W10cQz#OlKA=z*d$fDu8yxU@KTX@Hh+-6HqIm z!!@AzLpTSN3qXe;BJYyX#&i11(~+0`KdE6quk^0C;g7xEKb-2&k0=s`Mb0BWTRf2z=-Z zNF}K701cUfCJQ0?8hqLZwDJVCp+Ks@Sp{4igJ$VLg)^ue0IlsplxMDf`QQO&(84?g za6=G0v#3y#kqBx6lz=yImuHq_fKw%OD@abILUAhSh)38lAXvf{bR>a4_@F}28hOyT z18Dg;r0D_bff&vO0SK$3IARcNwf>t6! z_6tGkBy8yr6fmHg6BO{K;Kr07iz&R81hF86Dadw2q`(ft1nqQ!n*i?&h5F?~k|1aS zI3kQep_d6+Dhmx#kSg$LD!GXz$m_&QK?4EB#qdx8tHTo9LP$Y_K1R&tmk-`l13l#d ztzQQ^6Aa`f5C)|ad(hrMxCeNkdh>H&=TMAlDF( zA`g@TK&M)Q_CzDL%&GW;*5yMEtI5eME&(q|RY=TJ$b?qxnI);Ym;uZfhPI;{w7~$> z-3K+{A#MR>IY{#zbg&M@UC8SkK}~W*+X~c0fffYd9v^7$8#rw;gfpZvBrybo4yt4* z1Cw0vb~B_k2CCpK!27~L9UqXnpuQrg*$+Cr71L#)Vggj;yR(3FIf2VLSQwdtM=(Jf zDnPD5b}#5`UuPC820aFZ{fG`5C~84T24prU3{1cU7t9?XH-VA^=*%qx7Gk;|OQ8G7 z!RP%zil4lENVyNHb4oIb^2_rSk}5&{wIYS^)TH3lqO#N?E>FS1tqB| z@ZGR5vp_Aw)Z$do0dDze3W=a`=6nUvnH3=2sb#4}l_eRVah}X#g|y7PRJeXnJDgCT z<_=1_0Il2tZ8iaonu3a7NXh`E2XK)N-SyxIK1k9Lyk!Nn1sN2Ep!fl$R!}hw+uIM# z$lx*!)PjeGH`o-=unR~JsGA6C%7QW;===dIaDfkM`hi4^!90+epoK%A`Ds*hKpWh3 zL8UZ{HRudv(D(x+*Rh};brKJaowTCVRLH;pe20b(=r}0YIT4wlHQt$d3MrXsX{n$i zUKEN;QVWVf%O#2nax%efn_LC(>hI!Q(77)~3Z;3O(8GCAOO^9sX#qdl$x6l9d!q_9C9*~ zA*($=1H;$`u&hvAhAWwa`q$>*;0HB+K<>9=afFwv5^%dg2hTz}jJUeZ*HG+(ReZ2S z0xITASRe!V$gKd7ji6otQDK6V#ht)sgn&X3wJ-pghv@!6Oa^6hVzNB`u!w<%1*ld8 z_2vqS@(WUn6be#{z%AeWJkU0_6a{c}fO0H&i~(}+LILQ|pyHBZlCo?bS>XxEM4+P1 z1H3vATv&rQJcE{gfWiyXC;-I|C{92b6P(%Lac)T1pGm1{pdDV|tzL=H1Bp?yMFxuF zK_v$$=Yz_8Sb{)q+khenlu1Bxpb{I@j5GnCNni#Z;Q%=lG9(4^1f+cf60=5H_HTjY z?9u|z?p*NtP|%*GM7y=oB844M4z>}yTKY|YQGGzg6S%$_Hc+3~ltO6xS z#NfMVU~plMLJD-IEx!ckYEn7y_G#$U0mL}O#wDb#sX%aM75s2N9CJ}hSj~brhCyXD zJlIjp!?9rmvV9R$hJ*Hlf`$o^H~Vq~XJ-}^U>_=o0JVal9XZH|JgCZqlw7cJ3u|!m z2P6i{v!MAhP!NMEZ16NED3Ra^4~^jb+*C+w0kVJ;lnruHA#<6aHUy{u!x2s%EXv@6 zJ3$*?AXyER9YGZ{xHJXTYjB$(brq=Wh7Kx#69cH@guIbZIk+?#G~$(3nv+urTXu@J zx))0>)MHTs?`i|(8pLQPjPE{;M`>+Ut>km*L0OWd5qZrb! z1s%!-I`jc_@D`--0gd;AreQ#{bfDOQG)Y0l6{stRJQ|?|I+_bUBm!E62`O^&kT*9& zc0FTplOM%y0@aCzputWSH>BXuB*s9Nt!z<9$xnq$bfs2+I(%3n!-t@CLeP0B9Nr zG?or(GJ#izqxl*X(4au}K&qj!TZAWgL8od#T8xl`ERg5YAQphC70`qXsGAC1Vhqz7|xhPQN zrRJ3sRl?`jic<3ub3w;zfySW{6-tT{Gr`+t)%B9|3o6yY>#reO8bF)wVY71J<;1Be zdU$8%lF-vSczzDlXaLPZf-s~MgG{%B2ks$ldQfPvfFc6qSJ1%_kn#_3 z0^QUC?pI^Uh@k6=AgL8}jsT>h02Obrlm?oihxr3zTpt>` z5dVVCutM}vltF#~IS5qPfr>+<(QQ1-hSssDfX`(F&18X&Zw1YPKw6Awvy6~Pg*pJ# z8wWL{;86=|#X(fCfZCj(CNM+}^~g@-=!J|Rp{iD30Yx~dtqK}{0v!?tIvy8t6a?z# znrN_h5mQ;90ufY#fXl+-)DrMsqRe90_%ke$5>rw@=XHVSnnAT1w2}Y~P{Fs)VXGiO z*UW&f?}D6&3#yzz9Z?6+S|MqiP>^2?x}Yv!p&&mquLLy1k_euG(osk%Edi}T0J%0# z9ouP5pd$?sApq*>`m+$@O8EQ=9(P(1R6;$3|K(>oFLsA(5N-Y-H`ABiGljnph+;$t{%|H2 zAr4s;2dYv*ZBbA+0(5j8Bwv8aEYL-cp!PTDjxJC&3mO4IK427_1`A6QK^Mq@N@-9C zAhxz3>taJ2i=4Pz6=hFuPVSdKX}5^9LP5Gkta|LB34R6N?d53 zhD?8e%WTM05-3JNl_)gjfJ$`mY$GUaKw_X=1{wlH>`8Y7#cxS|Nn#G9^#Wbk2We?T z&rB#rY16p|$0vX~5wFDq_AgHo|4S1k;i$Jv@=2;6MCxhx$kSr*Zg1QbS z(DO4PYZ5?F2C9ic5ejN6pqmRSe380a;0_k3tp)0|fM)Lqb-CieNg0%UL0bXo(e1*u zH42mru1pj4sY5+6&NMPI-IiX2eT<8~k{ zwIbHmOXF|=sLg}LN+s~%C2<2{f}w~*{cw(ZftFyHvY;3UURsIk7FL450qY7$BL)L{M)hzHRkwCHm+KR`yI7bE37I4A_)nS-paRNvt;~H{9`Z=DP-tFJYI1%$9qD`_BAE6A~+!WNYHL2M8W zs=Ps`B7wY(vfmlY>ReEx0$id&k9R~q%K>CRsJsMC-GauwK-E8}jDrLdv`mGLe}UA2 z%T;({ih!I>580~%>Idb5uJ|d>NX=77&dCR##Ry+`tB{yhl3JvYkyr*Aqb~-JnnMQ7 zkybZ@(mbdD1O+gcZ(?R1*FK=u1Y(H^hhs_#=t2MhP4`;5hLD@5@5zUBW{_0c07deugh30`I6pbo;RR z26Qh4=s;%BIS7cgV9bs=;ENQ{oy^DJ$WXwL$dC-)Cxf_Ih~2RuF*zd@e6J9?9ue@- zRJJVOxl-@~7Yi1|EkRt4-~lku)eYF32RW`Cw1xrmJOlJl0uRZ-LqiO7R}N%rFf2Sk z9S=$^0mUz3shR|)C6LZIHfz$rN9KSg=t0W>K!@IfvN|aDfoe2RPYkKK2W_;18g`&O z201kow6POZtlEJuCNKhbdq6clC^>?`!K?Vdt0jH%(~A{Ahr)nei>qV-^(8^;DnR)W)FT4* zc%d~Bq|J+a%OzYM6a%1PEKpKFUT3Wabs4C9z;q3G+&nuqwE$bXl>ndGX9B*t9CUvq zs0;@gk4S0k5W~T}c=TYGVo?X5`VL9Kh?2_<=@e8hr<}y(Y|uauRwINku4YHnZJgk% z*!`e4v7=kA0Cu`H3+OOWP-X+gJgC40FMa_^Z#+b%L%z2DK%iH}kw0Cmzq`%6Gqd4RG+NNPoif>Tj`c`@Xw40Px5fe#A<-FyZL zNyK@s?4Z3~Mfq4OOD7gV7Eognbn+@FOhF^Tpj9}S-T-+3(oBS?2e*De;R$!Vv~zxb zb|&cZU{D`5zX)8a6r~oHLht%UcP|GE*04-urh>_NBMquykXbn-kl z&7i9ja9-$+?kW-3^gD9F4|gFasDK2OjaXBe1hk6rgf^cc`y7ptCRsuHQx!mqII%f2 z3_SM$86<(Ee#m?ksAvE+<-lPMFGkVgfkA;mgGCqu8FX1>SY#MxT`s%v4Xkv378;b~NEg9T6W|u_pfR7?QqvMkb4m~^aIyJI4pag|8#DM!eavwo`>&6Lyvbp@G1vL zQ_>u%B4&ql53xo9WMu?g54cqaD$1-`Kr8$q?G#Y`3W_KY4a!g;)yStIgT}`}eO*LP zLlJ7DLTYYi321XEI0u26b|8IB}N3>sj@W-Dj_2|QK~&jg6B189^N`7CE%nE5%WWvN&zGSFfa(83ys`#_-u3QyQ& zE8vC?c+>}UIgSOA%Y|L?OOtX^bwSAzv;hmYGZH;E^+06=Xs-ziX1xw^H)#DaXjBCh zONdc5KG5YZ;F>TQ)cC;`5F+3c96@~}kh4K8AmqVqPS;{k3oR3J;W)ap1Xz@zjshiR z3#3&x+^!V`If;3Rp!+_t*~$g>5bD{hY;K^9Kj5QO(JkU*QDFgfaUml{h>31?x6GW9 z)FP~Uc;I>*kU|`)18e@(Vo_uPHQiCSV1W7>HY|t>xKIlhemBVOWatbaR&%*nG{C#p zT#)wlu(;)8Z}|Ek6ccFHLE1y0CY%+tWCV2~Ark}6Easq<%kT`U0J4tMCLJgQLDxEg z=713M18i>KCC%7kRRv|*8FQ2hl#vlb1H2G}kT$cTM>`w%tY1WQv$_@K=VFa)4)7jt z!opQFH_?3It67fd+%Xb(|ges9jL&8q^X7haG0b0obY5+k-C zgF1r?gC|2UgENC8LlA=tgDZmz(y@C>A+b{eI-a*UF}ENm6|~t8Jdg-Ee-G5AgN|x} zc3^^z&4ng39Z)ua>~_jT?1zF3t%Isp=!%b=N~uH55Q&35a5xAMRU-U$Nyq zA+WiSbOLHbSg;_{GKYIAXeBn}cxiM8L5gC~;vK|^Pb?m(Iao(JyjT>$qa2{B6E!u1 zQXFKp8^{l!IEAltgCB4LoAv>Z4#3MMagWTDRM;Xn@Bu&Ii6*RhmyJaoba^*iFN;Th zX%V*I5Q8X0s@*}gFd|6!K^j4WeV~Mrg1slf#^4D`f^f^2Jw1c5+2zCF$q)b@D+9IP zO<6z_l#nbg1s?GR*$nDdfx5P!S!z%g1$C$_SU}r+L2W8fvInj3c0!ub(Dw`gtxGCO zEiQ(+(>W(IHLnD;iat3*0X%{aay_&oh0SH4i+w>E7I_^!t0yQSV^a;faSSwV2rKhZ zH-oZz=B4Fhjg%}FAr|xtR6s?T4Rq}RsK`QX&4G$W@L)8!NC71n(B?-!@N7P)0D^2* z1r=D3aD*isM3&I?1mBwiZrgx*#0sFHYlZy0oJt*V>QMl#f(6Y|=ai;kAFK+(;%bO( z;NlhBiAE|e!7c@bC3s{Eyy^mWqa~zGhTLLQMRFaaWPuhwpdFc@TLw!(Q!d!z0JL5R z)CqzVq@e2?A#MUyQjpE{paC|-@QRRUUNPvxGKEBN0SKEeMbG4X;Pw`%VT&56ES}IE zyyzM@SVUPs$`O?>hfgA6!63SF0TxB*2p6RGLqrs-PiA@scwG>>9s}t5Oi;TM-m3%G zc7%F#ygs0YvI3~p4Bgv;Zgv9rv;t5>f|42}2+;<9!4V2-+JHvb6l9 z(4aFmEuiT%P+1EZABNTVpyC3uLIP>Qi*&Q|bZlv)JJRp4vvi$LcjU~3aG3V=@;LT(0w+6|x<4WeZPsVXg?M;m}T@1XVtXnX-u z$bbR}Ts%PC16q3nTGa=tq(E&<(6%SgvNh1!U&w?xcy%`D;0o~WAqn__ERYro)CCOc z42lfupz4o7oxv8)vH_oQ4jN^#U{GMNgNU=hss@mqAk#tZG*GDusW2gj@&lN@z2WvpW_Mct%25ZLmRZ9wk&wRFl2p7Niz7H3GfDX&9d#RZ&~XXscHpztQ&N+25{p1n44{Ld@paH`| zUerK(?VzP&kjQ{V4P><=sQf^TdDs!<`Qnm9$d!QLC9u#CfSt32UMqlx{;@7FVle~{ zq=On$poujFaK-|6uE9I;L91LrO#o9CH~2sk#48p^Js8lq7p&NWtW|>#IKc}GQ~!e0 zJcUGsq@4WZY~8&4l2phEf908ZDf#7~?lx$bPO3slYHmS(QDRZ0LP=@`)+V79XutEg19-O;d=CJNGm9yU zAv7m~7J-5G<{B_4;8^dY763Yz3DhPpMhr+m*8nM$rzU|G1ealN&LrS)7^v0*wM0SV zBzTYC|;;_NkQ;H7`C;Wrj|Y`}xY9PILP(4jtH zw}a-8zWYEGf z#7YK^fXr0zLRf4Ds6dCxLE{MEu*JK$fj=N8u~NagD6_cOxhTIFYhZxJjUe++po3M# zSwN{6(PrWTn-H9rn2oJL$;g3n$_b>HhlCR>GlH5qpaWt+Lr6~06|N9pgO)c#YFSuQ z${*bDkq2K757G}gbrRGm1jPiT(E{m5gBmU1?1z1%8C=kVVh*%&5Hz+8IrIY5`UjQ2 zAa{a#exT+OXut}TsX;Vou??sIfn;frK9n(W@HQfF*^N0W4o}pL(9>4HNdTNdp+nMn z@S#9ZV$RG<)#CzBnH3`qJs^!fE2QUx&m9Eq+=7|_8XW^|*aEeZ@C<2VOE#bpB+$qK zw7P`5mOY>-6*SR{O^*P$CIbz5f|k46u^@)6I0B0DOY)PkFAD;7`9M=6poj;xh(V*I z;6Q^e76J{1fFc*s_Yj8}2Wpvv+L3tryF%!WVnFnIIbr5t?e{vdh_e`g_pw9TTc9it zig-|BfYctKG98i(Ks5(w=m^4dWKduTWe8$GjIb*NmZla}DkOtezkmjfa`N-i6`;+% zRE5wWPi*1I2VN))vCa|6*=%6Lu(}!4^@7X`gJw1%t^tQB3$?pmnn9^4rOD(jrPTsY z%0cG)L6bq?IEIhjBNjy>4|WLzrKT077DJBP1g(w47G`4LCMC#VP`L|gyrOnnxq?!2 z5Lu+!F|Sp{NhZI zJ>Zq3pw+n8TpNO79Vn55N)w{2ga;NReVBtc0Gpy5!lDj$3@DF4n#StI3WLC9%5ayF z<|;^00qUR_u()E>!=UB_sN8lyiV%Sy$O(3k5t__=tP8tA>x@B#9jM~KWh^MZLG2UJ z05kgF5Tvxio@&*g4gf^~#1W|}3gBTP`0^DTX_*nUUm4^q6YzXLsQ$5r?0o~*R-nZZ z_MlE4Xx5m;3%tk^(R~Ara6y`~cHr(Eq+<^n#Dgs*w*c3jpm|?V(EvFc5j5mv$70C> z$v>ducOeBHXa_!cD1yZkyv82XUT*p*HA?4hT4HoMuR0!P!|@`hDEe_ zWrI?S3-a@dL05*Sq$2vR#o!}EvAJFVT*4yEN2*R?W?`+Gc)+_o+#zcW;qk>99O4)h zg3TTw7DX1=;Q`R}2-n3CoSIx(lnJ>*1$~4>4cu4<7Xf?i~LK=yI`%N8c87OOkCu2d! z(1MOFPE>$ysDTvi*gOpBPJza&K(;`7CHmmP1GKUhIT#R!>VgUx?7c!+h)eWSQX%Cl z_jQn!Q>93i2 zY559?N%^HEh(#mV9HE2T5#a4)i41uR=?tk1ISly>>F{6|0$T*~U2;ZZUV3UyemXY8 zd62t}aLp{B6AQ5^??YA&jtJ1u7idrdG*$|3?837WqND<)RXcDA59&36E*=NvQ&4XX z((p850SzC6ruiWwrJzPKs6PR!$soxMR2qObL_ul+_+SRy!FC`AD`X}qKz5Hn_ohQz z`#K7x#gJ=QGV_u_^ZvyO8L5dWsYT!>7ic5^n^#w%c@RAV9N^ERe-gARV*_23JTh%wxQGVdwo#IrS3+KBK(-Tts&dd!BPcf_ zCcQx|9Y}=&YWqM>C4ff_FW61c^Np~M6L7Ggj}5Tm8Wv#S11~fJjZcHS{cu}YgF(C7 zu*D;y=?oey03}6G(-|@!0qRXaS6V~I%)n&~3#e&nK)(6U`n5Q5UUDbl1ZsI>xGV*tuIpa~{W!Q+I~MimS$Ni2a}m8t+L ztg(+1^D#Ix&CGe?OpcWmdO9;-{;7SYR zW>DJ-adZsoLMG5u0%V^psLcu5um~C#0r?12V1j%HN+6)dG4c_RmY{+D0 zkUKp==gMTHDnQpZl|VM*LUVL#iURCXAM{E+4qRG7x{8oCAfyBV_3%J*^`OB6NLB{9 z1-c#<)OG}K>j#}0=nQJRLiajAdzu@-)ExKN|4~yIt0eKRXyzRi96p(Jv z(NUn~vhv{Fy`Uwu;9cDCxg(GogbfNu$vn&;|j0S6RK{+=WT-3nYR3P^wMu>$$E(eW> zz%o}sCbpqs1`ZY_v`v$&AsIM!OIpFy5|zV11+W7Ps3=CBsRkYOl?%S840$6Y?ro%Y zMA`|dL($sNNX0*PdvUj(A?AzOwi2_po9XRgvM5@DWMf$Sc)EauI2_C4k>xCnWexY1kO01VKXCerUEs$L1j2} zyZ~+zFW98aJV>t_n^{WWekf>N9B9}EQsSVw4Q?72*tC+w>{P7dKU0vL1u98FB?HJ{ zPx*+or5}e;6@;L1OjyQGq@d?nWvDOnUj+V9pbpBi8% zgLkfhoC~eq5qm!~GOTiQt%{3r?)RQ?5b&v4 zh_V;FWD#<_307-C%N-0^K-Pk+fHtV%)jlXuft&+syn-qtXmb{A8d?@&DN6APT6zFE z_5oX5gGR&+Ss=TFLH0tth8O|jf|yvIUxal>EF0QP1~ZPy3KNJrxOYIU8&HygBqTzO zMaj@0Pgr#TO)YpDgB(!15JOKap+TNl6NwghYz&kzK#c&<)Dk43K~*rQI|pj}g1Udm z?Qz~v&_N*JL+)_wWDfujoq)Uu9i>ERz=4*aI)J-{pe_{BurR!G0=HJd4LOJzh~29) zpaoA!u+tx)%{K7mJE=KXSBWO!bqc7~0kteZ-UWFTw0jVguEDcIpyn}nehZZJtcY-& zG{|wFE+1&bnh3W+YAT2qF-KZJH{pUJ1v2!EnZNkJwt+T_fYw`M%~7DqZPaD?kVzZt zojTBBvJ~7aHb86f5lI4^1zD_F9HE#0fR5V%b$bvy<3Pq0=_aP*IMN~p++zXtF-)OL z3r$(98FX3T2EnrmXp{uB!x@xHA=L@U8K9^Gjg%1BHWFH#3Uvf5|0I*TZG=!k${AXc znUh(PiGB673X3ABGDFN7!2Jb@cu+S6F?A~x1{!CFITgJA4_l#?1)jA$0B_lVBo;`AFA==N0<^~@ zH8mwOFCA-fgE&(ZmgA7dQ{Xi^C&(sH9>SWaMOc(E*Pg-ka)qZR;Tfc!2kx^$dSRd% z1QZ9LtOp*L2F>dr_0mA83{*UW#^oR#4OjyPq!ZMP0Yw0KCJ7XPETBdZsG;e_Vh+v} zpymsx5AK_f)4;Z8_T5OQ89WZDWO3kpy~p$}@~VOd5B9%cXq52$sA97GV^;4A?tZ&^Sh z?$GWtmZhZNNjiwzKy%Wdv2jQdf$kR2aE>YX4gy669nkFq3`z{PaFz{71iaxBwAxpR z0W@q2x}gBM-3sdHgNh=`*85Hm2i-&fIrOVo2fRfK+&l%B;h?#=@{G)6$Q(X6_k$Lk zf%_hyh=s0*$Sj6#BY}5a!EQjU|yWaDfj21MT=l|LP_Bg)KX@v9xT`r}RXR3DE3pWJyKEjTkX6N?Y6+C;L5&0`a7FGULne7ZS8QeGAk9;P zN>PxrQSGq+E#L%?S%DfDpcx4Vq?vQjJT$25W(M7N4a<%;NP9cPO7aylp?mEzONzmb zL1;yfY84mwP$TgDNbmq=`_SJ1S`utnF8t^gBlm$W)a*3EXM=F458pyK$sCcEJ!m@a68!`lSZH-1f~#l5+Y=j z0W=nmRtiIoh(lJ+0d5^5mzyl0Q_7H);5v5+d3n_E#P^l$^1GMpzUz!ZQA8_(A6Ks82w04RSa6U z0xF@9>vUo8wrKD)xl>VUVs;AjSXr2fpr!DjP(+L!ql*VYh*+n%Ipg{ zy8tXx{;u; z1@+)?EM|u(7lN+j1@(nNJzwNzF)MhzHfml6UDg2_w15;|h|UK`P-_famH=XTvjY5lOPCwwz#R(EIzdQQ0#&P!tOUyZ2siKsA+HHU zb~g|B^e{;HA=GmOCzg~JVI&J7@UV~r(itag!QfSw$R>i;pMuWN1$8CRBbzfAbZ0qe zH8rvh9&m{Y>a1ELoq59+T#BABd00S4WGb;pu*k9qz*8_wNKhzBxhn*&EkR5CL45+y z3J1inGDk>8X;Cp2pMg4oHb@7cv4AE#kX;!8jWSR*0ckZrwSb4Okh|TW_8sT|6i{mL zVgapIhcvK2jT%VmfTSl2&~!FZj|ei67Xq5o0!;*g*DWf*){7!LMFZ_@98gOGG$aXX zzd;sMKqq?OVI&Ch4QPxGbYdn(GNNGO4VDr?I~zb53sfgsAXQ-OA*HG4!HsJI0%n#5 zI6Z(?8h}pk1&0;*JbjGqn{e+TU*-^=ngk9xaEBjeB!wfvFk|oy1|ljTcF3?6rk<}BA0Q7r>5j#gbslr448o|EOtn3Mi$W0bL1q#0y^6O9zINvGtEJII~W)k Hm>3xWmn<_4 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_bn_BN.qm b/logdoctor/resources/translations/LogDoctor_bn_BN.qm new file mode 100644 index 0000000000000000000000000000000000000000..be1e401d308421daa2d96af598b43b146809a758 GIT binary patch literal 57196 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 KU|?WkWCQ?Ne@le` literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_ca_SP.qm b/logdoctor/resources/translations/LogDoctor_ca_SP.qm new file mode 100644 index 0000000000000000000000000000000000000000..6bf224e44fbc9f1af719f871d7ec327d25ada56d GIT binary patch literal 62501 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 QoKX)lp@V^efr*h300N^o5dZ)H literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_cs_CZ.qm b/logdoctor/resources/translations/LogDoctor_cs_CZ.qm new file mode 100644 index 0000000000000000000000000000000000000000..a12016bd954792da2cacde6e255fcb18c8efb778 GIT binary patch literal 57178 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_da_DA.qm b/logdoctor/resources/translations/LogDoctor_da_DA.qm new file mode 100644 index 0000000000000000000000000000000000000000..1ae7f4d9bc17d641997d885ab134432f748f89d0 GIT binary patch literal 59619 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_de_GE.qm b/logdoctor/resources/translations/LogDoctor_de_GE.qm new file mode 100644 index 0000000000000000000000000000000000000000..16cec44a657109daba4981f57dc2aef80e11acb5 GIT binary patch literal 61112 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 Bc60y$ literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_el_GR.qm b/logdoctor/resources/translations/LogDoctor_el_GR.qm new file mode 100644 index 0000000000000000000000000000000000000000..25d54c255c7164e4063a8c6827e80bb0c93c1a7d GIT binary patch literal 63566 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_en_GB.qm b/logdoctor/resources/translations/LogDoctor_en_GB.qm index 3a50366010e8f5d13fcfeac61de02ebc14b1a2a3..be23996b4f77fad0285b8e8d33cbed0e3871a958 100644 GIT binary patch delta 4415 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 delta 4403 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 V%duu;SmowUHoPgex##XY0RWx!BM$%o diff --git a/logdoctor/resources/translations/LogDoctor_et_ES.qm b/logdoctor/resources/translations/LogDoctor_et_ES.qm new file mode 100644 index 0000000000000000000000000000000000000000..1a1bd3f47a756225a65df3e86d6484b12b8c063e GIT binary patch literal 56436 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 W4v{ZDVS=2(3o@mHfq{XEkr4pEc8i4o literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_fa_PE.qm b/logdoctor/resources/translations/LogDoctor_fa_PE.qm new file mode 100644 index 0000000000000000000000000000000000000000..19fc2d3344dbf84ca835b8d610f04021fea3a6f9 GIT binary patch literal 56995 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 PIIY2zFhR~D2I&U?0fFs8 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_fi_FI.qm b/logdoctor/resources/translations/LogDoctor_fi_FI.qm new file mode 100644 index 0000000000000000000000000000000000000000..319ae62d56260ee280159c2bd120bc37d86d72e0 GIT binary patch literal 59502 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 WcL;ea0u$r}e~=j+3=9lRjEn$wM8*XG literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_fr_FR.qm b/logdoctor/resources/translations/LogDoctor_fr_FR.qm index 885cb2847a1c9939ee70e31fdb9a6be4b4c7a62b..e6d03d0803b5f9929b34cce8c4d2037b9d2add06 100644 GIT binary patch delta 4502 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_he_HE.qm b/logdoctor/resources/translations/LogDoctor_he_HE.qm new file mode 100644 index 0000000000000000000000000000000000000000..fdfd046409ec836a90dff01a9f351bb056deb031 GIT binary patch literal 51955 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_hi_IN.qm b/logdoctor/resources/translations/LogDoctor_hi_IN.qm new file mode 100644 index 0000000000000000000000000000000000000000..565c9a88d6e8d5331ba621de63fa5fd551734fd6 GIT binary patch literal 57208 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 VAs-$ROpp_aL3%qF7#Nrs836_UGED#g literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_hu_HU.qm b/logdoctor/resources/translations/LogDoctor_hu_HU.qm new file mode 100644 index 0000000000000000000000000000000000000000..756a880590fa709a81b21c088dc3664d36b41f00 GIT binary patch literal 59243 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 U0WAVY_8Jq?ObZj_oNkal02%9I4gdfE literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_id_ID.qm b/logdoctor/resources/translations/LogDoctor_id_ID.qm new file mode 100644 index 0000000000000000000000000000000000000000..747946822dc96d6064b2e83cf7cc67293cd0fe77 GIT binary patch literal 57721 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 Y3#gll9LX#UB@BpjhnXO!4ukXq05_bLWB>pF literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_it_IT.qm b/logdoctor/resources/translations/LogDoctor_it_IT.qm index a844e4659d39c36b110971ec340b1aa9e426a760..b8c29d0f7760d869f3028c7bab76ff197a35c272 100644 GIT binary patch delta 4462 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 I-8m%y0Jeo{5&!@I delta 4454 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 tFbT3SWH4mF9mtfCF~JBwq44>3jotf%WVJv diff --git a/logdoctor/resources/translations/LogDoctor_ko_KO.qm b/logdoctor/resources/translations/LogDoctor_ko_KO.qm new file mode 100644 index 0000000000000000000000000000000000000000..21dc1fc8db62a8e17c798a536438091a75213ba6 GIT binary patch literal 44688 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 LZzjmeBq03&1)J=x literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_lt_LI.qm b/logdoctor/resources/translations/LogDoctor_lt_LI.qm new file mode 100644 index 0000000000000000000000000000000000000000..30c8b89ac581b3e577e9ed3cbcd2737d1d94fe18 GIT binary patch literal 56798 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_ms_MA.qm b/logdoctor/resources/translations/LogDoctor_ms_MA.qm new file mode 100644 index 0000000000000000000000000000000000000000..ecdeef475676e73a0538d155d348ecc9953fbd77 GIT binary patch literal 59939 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 H!9n@~Q5Q7D literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_nb_NB.qm b/logdoctor/resources/translations/LogDoctor_nb_NB.qm new file mode 100644 index 0000000000000000000000000000000000000000..82a42f91125e332e2686ab72838cd6c9462f5f48 GIT binary patch literal 57947 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 cy?(?InpVh9H2IHD2`1E@BGdIO$_ zEO0m;6wshFgqeQSi{aBZXc@te3O)g~UO=56N$sM5pXpz{18aCd=lGb)R?<}h?x z2^5>4J{71d3tA;W-5gO~lnJlYF$)tcah$;53SJ!tatdfv4ARX5wZe12;-Ee>$cdl~ z3~G79#{EF;6HpHT)F*-TIY2EhP(K9J_Xp_$@sT$Im^LhWRLL_nPpP(ur}E)&#e%|;r!kZ?}S%gZlO08OQq zq=MVwkcDVi0$mNfA_G(>!$uUaPM^T@vVb#W+yG=geDVX$2YS#YNU%m?F{C^I4~)Qk zlm?zt1NYY9X3Jo%_yFzxK@38p*<%2;2UKN48l#}`1yB{4#{il-g|>v?O;LNeO=8ZV zepaeNB6#i*)^xMS5wDJp70H=f2$%EG?g7-k6_z^LF zfHd?2T}}d;bV$oghplb_1!pm69v_PnOc-3i8(Tn2q(Rn#3S!8d2q@!%as(u)fi@*z z4!4WBB$j}uIA9Y7hyi!B;8cOz1M9DXMz29Lw}=2nctikXE~s}3O=ieraIp575jZJ> z#yvp^43srMkpt_g;ZJD7E}5XA4bZw3P~hN7YX(@Y0F4uZtU_1;Dl|ap5wYP&4AlZq z1rC~Y#u@>j9Et7?Ogj)|De`;=nmwRm5r;h)V84KJHmH^WjctJ<094CD8mXX7e<0Bk z@Z=t7Bn;#$P*Dh~;6Q8jE5QXNY}pe`H%JzgI6#d`P*I4;2l~+QQ-#bD@B)(L{JfIP zywX%1h5RA~@F0;wVonZNDzzfB1X~6X0T&>kCH|1!FDO$WmO}EmltR{ofyTZd3%Jly zof+O)K9HwCTX8@|9;6TiMPdok5U?zCP7k!ErxMh7MX77B#HJly3n7*u5yR*m6@xdtC`Ycc5Hok6d1%mF6nb%t7!8ww+JzWB%FhFL zK|$pU7QcZqJ*c4tay_!0kX}6~t)STj4?=OMO|YIjo;Xv%8)u-LSBzA%^Fa*;6(iU? zfI2wMgVZaKXh3hI^25!=*(eRdX)q|%L0uh4rCS79JP+FF!~ja>;01=@6@6%-h15od zCApG(g`~vf?9u{!(Gr5!A&?F$a^(ezC|Dy-ok5ks5IlJTYR!NaAc91U7}ViWrwk2= zl6+9zS(aK<0-2LkS2a`zji9Tm8mVJRD^55a1#%Fq+yXfTJrqFs0~F1Obc(coAUVIF z5@kpV*VrL$`$4e-iU-gt4M?#Las{aP2NgKj8g|l1K>%sMfW}yHw(SCNdL6sfpa8); zI0=snbqt4KA2PraA4$}96az|Oi86j_Or$eG173KF(kv34jGmAn!`ApRBB+xBYG@&9 z7Xz$LhZR@Q%vh|hkb=kE4kWr8cR8dU(z*ny5Z09Qju zMG#V^OGzzBEy~TzgRI`n$xm0nK2OPjzrF=!YEUx*G(nGV+yW`Pfr@nn0%H{Tb2?&P z0;5R*?H(bIII185yePG#C^NMT;%9gQz%h)|gEz`i-2m!6K#F5f1q51Y4OznpX~*R; z`~dG#0Lg*2*dUsrkjc>u2IN@|P|1an?BT_QH7?&2WtOEDDdeT5f;!nH`3m5P4OE|E zDMIkaF0v;x!0VK97?7rl;EqB{S13V@Zz2f)k~CzSK@BWW4+OMd9JF{A)b0iiNr2{% ziHYdq)EvlkJdTL=!x_<#Dg_c5pr`~z4ZgAm6v2pc2i6oTfiD3AmF$qZAG`(;t@-YQ z(;c8X2DwLsuh$G6A%Mq?8Y01f`b&@$fzq(YRo&uG8`#1IG!$J7ZWMBKyF4U!e9JC>4OlBtU&MSXTzog%)%Jt?Et80TnKl3Z=!+ zos6ghOdjB+NT4DMl$;P-j6uyLP>&j9bRsyXf`%JG#Tsa)093ewmQa8k0pcSkIZ3d! zsTIkosVT(@(8CGf3;5CeCxK!;C_RC?3i%AV@VMdy8<$zEkeXXif^9%c4r&B)OC8(r z4I;eM0y1cfnYNblpJvwm;v6X3W^WJ zumfb^2sApG%K%$;0x3UX$pMr-L1*89vLWH=2#_j7X0`N4EC!E|C4m;2Ko^RDcL#!d z!wM)H9FcdAV9Uu17(Bpx#UOKtpv9M<$^le%L1G=0pV7x5Qo$n;paEM@iyfBoLF?r~ zgRvm}phc9BvJZFb5@LQjcv&x~*9%%C#|2&Sg&6Zdj9P?vrh(VVC4+ZZfZF~AMfsrA ztOFjcfNshv%>xBOCVY!Gbf~RZp*%Au2ei}#w9Jmn89L&DZD?Z)Mu;FH7Sv+PV<-hL zL;yuEs1yN3Jt)ILs!NcsKr*=f4K4LRO;!fb`XtasT+k>iWc(PEg+a@2K!;5ffVXLY z!VzQ#s8oTCcY-<(`3#UDHBd_mQM&j;Ln$M%EHzKPL?JgZuM~9hh(c;gCTN`(s9eV^ zQgyhX>%Kv|D~d`KNwO<3800D`BN&;;AP;dnT zXzdCpA%gUQ8q=V)NuW_7)Ey`V-~{*cHGI!$2*=H!+~BMFg+DLF@np4dj9H zHEg&JRx&`s4^--xf+qw(WjiR^K`Z+~O?5~D0sD{vrWZYff+`=xf;-SaAjovcFd?Y9 z0xCU0<1>)cm_QSIAY1Yn5Sc9+vR)G0*M-#;pk-;L#i@`{!^-l+N*x8l1BsyYmYP?R zS(FMoLl3Cbd%M1?pHM-pK+Y@I3S6d&w^Rbm*{fKnSG40vFM z;qbZ)R{fyD5vzBLOF-M2uy{8LKA{N-E>P71DpWzOA4ru0;z1g_i1-5K8Bjog=0-p% z98_q60t3`^0jUDzIK&vWu4jotacXKV=%B8|5^zF?$82V?0&G2Jq5^2g2)1I7I7fnN zHc-D8k{xk75maA*(g~<0KvebGn2rQH2YKESG|dBA)Qcq?L5&^Az93K;is)`5B^r2x zPQVAg5E-%;2#a~3%O(4sz2#RA$$3Cg>m zVi?q$gAGE15@9g|r27m?cqI(U;2s4i;el#p&`dk1pawPYKvUb0b^|DBf(l=d$)G)j zpsEp)MG*1s>X#25as@4gQvf&fz%yYAB^imJD!l}}b-6sVBm}t zu$V!v&_SLDC45k}Kt8xm#UHdz9lal&1j%> z1zL6i>Kj7>8B$Jx>;O#mvxK%JK&1}>BqE<_I` z1%u22&B%l5B~XV2qz5uF3(^S+QcytwI@uKDB2Y^ebW9g0$RTwX#0{WA0n$eVrCN|# zAa_7q1qw}2jRhGH1rTrQf2Z@7Wqc zyGmhZf!czp#i^hp$@0?_5<%m+`3j(O8bG>J%TkLfOEN&?FPX&(X_S{sSzwk38z@1y<@&lY4& z=p2(Gh0?rC=;5xYB?V}6F=+D#=*$?_8wNdL8BU= zC1#++0vZbdWo1x71B!gmC?IIX4=C~=LvEnR2UR$rIv%v=AGF~DC4?}F7f`VQN(i9l z4ahu5D1*k3LG6MfaDt?6=8l1e38=mU_0S56@(WUn6beA|EXANxnn2sbQWU^Z1j>`( z@c_u-1O=c&aEeQcNy?Od436LfpFxQqlwCk+36vc{z6OORsC5kLe1S3$s5k_LA*lNg zqCuM`LF25TmNY0;B3I*vg#D3}ng-f61>QcD2tDi;HQAS7jdYMRAgvV0@G+<+0hPK) zZD;WLBar4FsO|x+OUPgV?VkYUb&%5``5aW{Lv%y*gFJ~Cu(3e$LTLeLPb+xUp+b2^ zW^x9oFI$qBnOCfkSOVG!R$Kz!SO#v?V%CZbZ8Y-j5^xUE zDjj>`{084h2ii^y***vMA-3^KP?rW$nSq=Hi6BVnlnUMjnS(Tl!5;t_AXG@q0}WST z8+g!T2xJImClHWkOF3LXXz@bZuX(6NAU_izMf zXBHG-A1v@=@M8c~qF9z8GJqQ9kWL#Y8=y`ag0c!|S`pIR!3+b9;QZWFNc|64v6J$!VYk z!0<5zl;xk;QVV|wX!1Y-G&PY1+T)4EKtGISn4ks)D6BAx6^Oskcm0C8Nm*CufP zX@QQEf)8wfR{BATlRV_jzmQ$QSX|{pv8zC(b`p5J95M8wNsODo;~ZF=WP#x%coG8d zYy>4ZMBW9p#?a@96j7`Pr6f>;78E&n=8bGfvKH5j5^k&U%rIeJPYdc-fX2E(wF{`k z0%6c754f`lkA7LOUtudY6jJh2AyY@G6`;-*mf!^~vIEt`piTy;6$43YD29W()SyN) z>TDUBRhbZr@C2y|c;PE3fq;@Ns6hov^5|CK3QFwO;R(hq&~@V=3qb`ts4|94TtGT^ zpq4G@sNo+BpspRLTmwyAfU0hY!$7qS$a$ca320&h6gHr$UV%Z0L60FBTz*zED8Yy2 zLGrNj2h%1{w+z(2gP0200}nZ^9W;^)D#1#S>ar+MM5g9}&gFs4WEG|6CFX*Ti2{uS zB`TB@C1!%RhpOv=mZ_x`Q^O!*qccuBN8w;hh5ufzFabd;oGgsI~>o5rR5K zpcOQbHZdqPK#2}@FaQ*ep!O;#D}q)ZgIco4hol*R`~uE*i3J6ziABW6TvH|FXNkmf|HnIU4xdIih#SE43lhz=C z0~+E3wSzzb0!lQXhAkvffua}EO9zcoA=-WFaL0fSV<;%fPf7%B_XiL5fffZQKvxK0 zaU9{1&_`At<`=mz)yF#u6wnb?};wD_3LKfG0!8A=v;* znxK*py`e>ol@l5;U#k~`*GnkC7Eyp2BCyG^V(3YTXajf&;F%0i@d4^Ug3y)|Iq=tGCi{_HBSLDjRdRI z67v*b12GCYiFxUz*k>ybVRb1eOhJVdXif!E7(m=uiZWdX%J85j9mr20f1su!(0l-> zx`1_;K|Vw+Ft~7>fCRD`6lRF=UQm?;YCdD_Si@_*2t-&w=9oZX0UJ>SO=BiQwn`}+RTBTR+bJu<{UIa3`$U-qyw=A5gnic z3>2WC;X+V16x2KdIS(~DLHALlLN8f@^v+>*AnK4Vs5cL4bs|p$fp$wk_C$e#1JMVG z273-M#RMw!KqUycyem#E0q;G@EQXEy!XhCtB?WXE6?k43REt5Y2+%+hd>a+E>cN7+ z2|RxUas(*7flBRE2Grg;L=IGz=Q4nXyg^2?x>_t>p&&mquLLyPkqDj>(osk% zEdi|r0J%I*9oyMOq`MfDazU*k$oe95SEHn5xQnfbaxr*rgs__#*}#P$DCa=hH;Ca| zp|*49W99OK{_Erl%O#NMAOs}6ze7VC5btZ_6~Gu9i%-D z-K}4Y(h7nfM~Qpxa0k@mAge(2IVi$FBPgK63vw37gP{5nlo3F+C3HH00n~v44Hbcc z43=ym84yH*D!L*D%nsRVqz;(^!)~lyGRU|tD8NBgBB+G|%9^;lU~%At4NAh}8#RO$6P!K|r2Pm6>W?zsOV+n=k6{RNUr$cV{ z0uL}?i4@QcdC2QkAayaM_5fvEkQ`{QF=)IJH2DoGhfqp0czB3GueyMgET9AQz*nkO-Mx$^l=0 z2O1Uv6`Yu7rGpy4pqvHqIH>Fbm0_Ue(y*}sP&ooxQ2;7lLD>W(4^oF-#z87?(2jkO zZHPiQ0&*fcWX}btzmf~O@})c@HBTWqCm(#aAbg3cLSkA;YLP-lVi{;Wycj%!4H>{j zTICB$#h`);6trBviJ5tj3q!!cCd1&vfZoCf)d_i^HI?wV;&4n!0bL&fUj2q{gcBAc zAXN#$|TQ0Uy$j z?o>VoNAT5skkwg;n`PJ?3lftvQo;Aipz9F;-2iPppLb3!~po8)sC_y6U zbO}u3A)RAv7I-l@GJraTpc)ra)IriT$jzWa2{hIP86XA4HYkQ6=^m5^K@BNTp#W-* zAs>mL?O2))y5KQ2MWL`XF|Q=Eq!QGgf?QapkegZzx>T@Op*SPI9DI=ldX#`795kGW zI8&0vv9tto94%VK6$1r6XvGug)P2ygZ=eheO68z-A1K>`LJ8Db0@YujQWDgk z1+~f`opg{0thNBDL@Cd}$E-sN15g^t25*K(oOG`1Se9A@I_R|+bW@oQX#FAR;I-5g z$f`cjU=e7t9d!L%KI9~MbkF861T)|+%s@6n0v*(&2OX3H5&`WZ2etJ;bqJ^!gO$&a z;w&9{mlbH+5L&?m&xo2%knP_21)zpFc-YV8g)wM00Th;?h8|>?2UPPxyX6 z2Eq%zIstmm2iAZWV{ikX-wZ0HK!Ycs`Y0FaHX|PA{G9wEh2rFlRLHf;=zaiA2!L8S zXa*oH0Rb5c>Y;&(cF0vJkcI{<7lPsrbSY&Ccu6xT_`xMKJke<&I|0;f2JN)~T?GM3 z>LIBWB??YO`Q^os%NWp|CjdT=1yoXl_H-a$OUDk{>r|AFwPH*Fuik|?5H$D#TCWH? zYY5_%0tQf%4iw^uQXO>|0aVz4*5gA=0C~570aQ$aJO}F5BKF`&JLl(TXM!${1@#~E zi@>EyQEFi+^af{i|6spooE3b}IJOicf^^R~=*Dr>TgH)2N5`fa?}gmxE)&9-2u5r{ z;RF?tpwba*8U&rm4$89m;65#A=>%w36DTz!9~K5OBUJ&k2ojr9Vao&{Wm#3zJXROfm zLsrv(8X=(Kpojr9hJ~?w7w#!Rm(;Yx(wq{+>QroQ7XYuPK{6Arp988NYixqTFBQCp zA2gx?s%{}|B~UdBYIuOWmkGYp8&a8pWI>fRr~rYrju3^nwhQRM9mtMn?2V(u^i(`; zBRlZu3TRLW<{HqL38-#@cnsnqkQ+cPH%OWQ)n4ERKhni<3P|oKE=WuU^)FyYn!|Te zp~s2<1L(R9P}v9aDssWh4(Y044L~<^UEs15Npds32pr8izxgpa^ zh|H%5wM!v2H?st^)e)SULCr3ZCt%B-(A^H2phH9xYGDT|#vsjgPORm#Iaq}T@B9W2HJuGK4cQzGRS=-kdOnV zOvE+A>~5JkC8ubOsEo zIiO3PLGuxr3~5NsN*2&ff!IRB3+1XoL>mLr`T(^nP+J?2?ipyR3zWG)?F&#MM{PtY zfGi`u@dO$41vP;{tu#cL!sZ5EjEl|npi>Dz3sK>kz{M9h&_PR`;Q`MJF#>7RC3-Y- zFt~xQF-Al$t6NciF4o8eT@qRVzUd3GoQ@SVCWbXa1Q^_*`xZc zFhOR3Vhv;_sK5lN08LFo+Afe`WKio96uY2tG0=(v&~Awou=_zxYEY5{75xw$h)@T0 z(?Nrp(0mNON(6GEEOa$8I9?z%9=JdTpM3_Z6+x*7RIr0;N?6AfRA9kw+JO}EpmbQq z04nT3#VR6|sx!DScrpYtI5Rjh1TlavYH>k2wrnXRd`m!wjTR^77UZOYHi&@-(;(-U zfm%7xQ6A8~J}1KP_+hKmylDb$K{w;2|dRaG?kv5pI4lj zk_x&xFsTx8uM%XU0TrX~>CTihcvB^9>N3Vaj`cmf1#Ug7}XFqVtdVQ2BkFD=66 zbt#xq@F)>zG7HpN1vUH-9U^{^X3+2#C?TX^Z!NPic!H7`JlL5%J%h2?7sKGm5CFc! z6SRaKluSWM8?oF5Iywc-O0XTPpm9S`0S3xqpuhpKL3(j@;q*NNK&xenQj3dW?sm?} zOwB6+t3L(fU4M_0=N)n)PvoZ#ddQck=RJehb>Vb+O zM0-Nl6MSCJeX+{CG785ilnp2vBeelHzi~EoZGmy)Wi$_pF z3YuVmC1T_dQ$=zOq-1~=9-!TLpqt!EK@$epLKHLz2FhQc`8&|02FTa2)-F+4?DzQ*B$v@{J} z0~>=6LnTsUgw-cAJp;Vv1YM;Bcr_NJR|6{7L4gV?>k&hH7Izo4LoacgLS5X*UDhis|ME# z3I|w`0Wt@)U>URJBLp=Mbci}Md15nG1a2%+9}mq@pk5sIfiDH{K>?s~wM+((Q$Wo^ zP$dmH3a;Ao)wf{zGHMY{Ku)i*z{Bm-OAgJKWl zR#2G@s*ga;LeTUQD3gJE-tct5=bK*)y8Id1X2NEe9N4*_91p7cKy6V_fd(m+kQemu zgN-UFN=!@3OwPt$SlckTF@UZy1+{-c1u>{%0ksD~gB-9WIG~CG6de#pLsWo9Ul3)D zv@dMuD}3z?Xg@pnx-)D(;9&3rU(}9hCb0M=Vjqv@1J{h8m6xCc8xi#sn_pr{W*OEQ zTP_Aa2GA=YX&1E&}af$J!S80A79ys?9-N7f{;+bOZpX3j?W4Kph#74ImoU zO@SmJ&=4VLj094pKnhw=5P(KHK{`Nf7*J;l)KY=C8I%k`RZkwc>*K@#vrUOXkwFQ( zcUXzR7S6H(?@s~g0hN>>`;{2%z+$ix1k_#y*$W!t09_3SvMmF=`VN#4KrIq19dvkt z%JI+30iS9J?(2Zo^Fo`4pq3$cS0`j`LrF4thd+2@F=*@yd}W*-S7>png1Vx*j)JjCeec(RJwqo z6_i$y=kD!@@^*1aViEXu6!3CKsNZ2{AfcD{B@9Qw*Oh_7ACw|NDGAh40~KhXS#3zC z2G*JfWeHG;35p-&m;}WYsCx_=Aq05|bgdL5=0Qz1P(}mIhJ(xkRcnYWW$Is$nx~Mc zkd%|3oUNOeUy=$rJ*_-5FD1Vm)I|mD%t%!zNzEQVRc(XMmXMu_eP+=Ygd({F!XWW3=y2XetI&_7ILV0QuXo+VT_C|;w+$o@ph0Q6x;2V5F z1E8P?O9KyZgFAN&3YgAhF_wTt>@5Kuh(h>1=%BI&G+BmNJ_V}GK`9q`vP>Fe9O(L7aK8+;;tAX# z!&)wf!EFJRrJ%F|%2A-11ZXpw0hAg+vs0jxnIPpgXgwQD7I}>VNEW0Mxs7QKc27Cz zC=;-YK(h|uwm9hGUC`0KnMhY0fC@s;lE4z|O%Tuu5KtZkg#@HP0=XGf3P4JDP@V;~ z_dq>ZQ278VCm^d@KL!~;@` zK#gqB77@^~6#03&;DIx2#f20@00XGw59%D0fM=;e*&kfR!_DIe$V>$5IXpVrQ z{F3}+?8`R{Fg3z=i+~0_av4CKOQ=&oqkr(g6o(lLYRiIJW_WsmB3NueOjU5gOv2h5 z1oc_5jVpr6Ezm*{P=bN9cwxx|M1vY#p$tI`o^ban1eT^2RVpNd)+2z1QgZV1(iNbM zs8of}AW!V!3d&+2Yd~od)M7(8n+=3 zg@_o~YoK`47J(Gcpa~mL zOA_QRNRWe?LdbXJNCl%18t#(;`oP(Fkj1szWU#UA?L2CQ9;E&ZuMEd~WH#PZY>1@K@8e8B;Z zRLN)qPL-f7SfHUGP*Vm{A3+j3D8@l`He_NMG9Ck&2?lj#K!pdW;{wtJs%=0rpzH@3 z_y>8d2;41(E)|DffeBhT1ZoR_>O5G+O#`ph0o7)1iX z0myxjKm!#Dpfn1iVOz~WYv(|NbD*F_=mph;p#A}9N&*yY#zfoj{E|NR12fA#6&Zgh3BpMD_=z78HRF)hj7h0Nui#S^!#g42q7D%-mFk z#EQ&f@H*t;)a3lUlwv(D$DAB+HCmRKQ<_?=kd~MOK0P86Jc$UFDNf7<9gSU*T2z*p z1DQrlN>#{BElLNK!FefQMY*Yoc?w`N;3`0EMm=nK8g$|SdUXH`aZqIi@;|82kLZR9 z20_*c7AxRe*Q&)33?85WwOv3}9;hh{ORS*OfUUbH81|MUH z&Gn!bEhxT=kcL7zVWwcMNT}M}k~wg8YuV(JdF8kzWoueKIpIEnguqDZjJ?v9ti2^(x?1RiHW=G^i{E zb)sPj2)WrJ1hxR=pX7|hy!6zZ{B&%Fg0cp#P8$p8bTe$4`oNuil*S17q^=|e1*FCF zkUkP5a6t7B+VnSg02P$$^T4;3r$gKKkRSyOk(Pq*X$SQsLG=cx_XU~}1l0|&HVLHZ zmIzNqb|42UWF{#<*4smO*Fsz1Itr!5kP90!^O8Yx$;Ap8sfj76Mc~E~sPB!c*A^&}vb5-3N2A{G>(EJWK5mgv#FlY}Dwpg=ca02hb105y=Dw9AX@1RZ~Wd9MQ;|?kUK_vui z(g`$n11c?$N5K?=LF3BcLt#NnNkO>@Qdof2+JnxA#b!Aqz(BPvsIUNy)PM$-AyEwN zGQv}=U~oxd3FN{-1yDhYeH2szyfhQk8Y^J{wNUaI%E5Euh}ltY&^87W=>Yix)CL13auELq1867@G%^7a0ktAQ zZARqs#}c&FJv7J%I!RHK3b|Pibmm1ysseO4j8EpspoMKP+29k``!!3Y7W4p#YB^8;~C$ z>$^ak5@B6>P*}sZj3D~T(D_r)N%5eW2&}0;4Z6q`R98UC3Q!b)f)BFK8C0r3#vnlj zCTIW%RBwUW9w4uRf*VxpfV==|h(XRU0Lg%cM_`8;yH@Rlsr)@2oV4Lm43L9?6?Cx9FcvKr(VkOM*C4@vK!5*ma-Aq-0SkV8j6-5yZv zfXZ^vQJ5glfY^v}D~NX>=79nTbqxjhun5R0OyCwmN{Tf;4^NZ2d1DLsDg9J z#RssLKyd)F3gUPW3*k8F8M0chZlqPbaD>m}r^RAG!8<6A3LFHUQW-7efk({3k zIj$x@O^?eJe9;-GID~3}oqv~JlwVo^>YL`31!*fv%}C8F&MZrXEDph%yg-}M z(ApqiKS2@%C})5Y3u5YC7~})c=mso97Gz=_%H;qTo5-8dSVJ;!>_P+0d4YQ6pmqPS z7zV`#C=H+=Hfm&FM^+*S9uyK&`3Y%^zxNcBc4RQ*o zp#_Q}#JDam*o@3PNZ%TpDFRSaK*cLKW5UaOF0kH`#Oze8qdOJo8sTHYkSYh%^MF-6 zprR3!cR?)=(9BQ?cw7jyhy_$Ef(9o*yGtMy5-6-eaSA#y22v4$%tIPzfjiI+;Xu#@ z0pOqp_o_i1HE?4OJaPa!j27J9%gj^A&CJQkgbqz$3k?srr}CiNf^fIkK}RZq3K|6l z4TcPc3df$}V2|<0n`-*l}w;i3(8cW z_=B{uK_v&_rlMqMkSDAtho%-hO+nDISY#U!DTO68$P;T)k%AxU04mZ!qw}COm7uvb zq;ew^bVvgD2re9ZdL7`VfMOEVa|Knxpbi|Ua0FGikembYI;0{74LyKbKA^G+QB2E# z7ULwr_OnBqWZ)|~Qgg7bQ1n2u8q^7fSPlwrP%S0jB z5fQ{7?M1qY={UCBdog%J4we8--Z6l>-XKpws#wtaMo>Qh)C2^@G^E6X#4RY9qm5(0 zvxt6ZaVpeGSZYotbs0adLX9)DBr_+oBolJs9(wOc4q6m~nk1lN4K&{i9ZUqRgoV3M zC=4_r4RaiL%^0?#qmCgAyrmz~y9cdp0-b1sey|U6fFVU7bjcy8(*=qVPyk{UdaxE2 zw$s%R`B@*ds#_r!v@k6-PXWB}9+Ds+ovuXif&$RafYj8K%)E50SziL~7f?0?rB+C0 zMRc7xLAHQ$0oH^n!r%uALI%)6Y*0!A*YWTGPLYZ01!D)V*#}G0Mge5H6%c*I6y<2pt1(Coe+MyCV1}^sPmEs zUS$C4S-}DsmU2Ne;Gp^%Vmhe70f`{c(i`MK57+RF)RK(UBG4g}nZ=-C(fsn%6wrFX zl+--X{jVkY3eX!oVS5%8z^gVveS%ET(l$^B4O_zE0*_#Vo2~F5WP==@ghe@{7I@h) zC?$d73{+`?M~%RTOMwCu)V=~a9wdWYUxNY;QV4^B0VyMZ+t#4U7*udWf&tV+1K9wI z7Er4U611S|0TeipVgS_s2c;Yk4J))jy*SV^bC6z;iJ)i$O_RZL1?c4RfmkIvJsfmq zIpp}EVjb`{8gP>kToQxktsu9bfEs4t{0~|x1#Yc_A`d$6pIHpuQ~>V)g6EyMz(zyb zKErD`Kb-J-6iX6f;9&rz`U3F! zBt({HOU^IAQIvAPG{7xj0iF4d&1^9S?-JFgwpNwjU7Wh73P|pi=0~aVBKv@WsVL)Oi1KjYy6D!GA$b{~8$}A}cH?N>o zGOFRQabZx7L)7AIPKhNYIpEGcCwPb$v>_MlVbHNGpkfo$^#C~qalA0Qb53G$ab_|o z)X_AFpezl84#L3Q$_X-D!5_L36-_G#c+mv%1$!(WrI6!%&{TppOMtqSpt&GWWPr*b zP8@apsEd2Gofqd0BH{Q_rs=F2Rw`hDS%R zbO;$t6BnW<1TSXTAk#CTf(E7xbkbNpLp}p&_aCB)V}l$%g{+VRdWsX$S%RPwkdT$& zI@1Vd7wFU*P)7?i9t#?_KvdiuE~&}jm2Sw!fzJMLWbk1KW^jf3fYr^>C)gEP6(0j= zMJ}XymWb5s;BZS#Dk@Ec?3stT0Cds^s89n9!ys00v$+*zLN}Dd6yn*t4pSn4c3C|l z)v!aZf(KXUFx5N^Uf|>PL08lx{LSu_n1}904hAm<(DrkUf0bEUPp|agGIor8A07SP>U8ct%ed7L8)n}MMbFoQv+*(v=bq#X(6Kk zppG|$1&UBa4i`Wy(^Y_VCa|$ zp|2fgVDNp+z%W&ufg!k)f#Ier14Bp$0|QqC14Be90|U1=14C3M1H+M@5c(b)14FbH z1H<8X28Q^<3=AqJ3@knC85kOVF|e%YW?*23((T?1EGw2WFkG9*z_O#Afk9~r1Ix7# z28MoD29`Gl3=C748Cbp@VqloE1VUe*#K7_=gn@xA6hdEk%fQODmw{o18Uw40B?H3^ zZU$BvR|bX~dJL?lj~N(dmNKwIxKqo(x{#HDVVg4p>#|b}3`hGJST~q5FxDp3p`6@M5QuG%tqw(MkJ zU~FUXN-SkyxGu!tl@r3i&~}f(m+vqG11k@MZ}VXWh6x84e5Y|SFie=j;J+-Gfngdu zLx68G1H&|DhM>P+7#KLXAoPp|hG5nc3=ACR48a{U7#MEKGlZnBU|^VI520^9VF-B; z!N4&04?|ejX9fn5^$>bF6GKE>2?N8XB@7XJW->6`dd3jtAyDEQ4A<{7bY2T)U^sY{VTol614CU9!wP*p1_t(p z46CPqVPKG-%&=ANI|GA*EW`fzA_j)gEQW*ASs55?|1z8l6J=nKyU1|4BZPrrJwL;> zTc!*QUaJ`H^=)NfkT+y_BqztfAl1t7A?OwZ1D_0|YCtjr!OqwZ3~`o>Uf$sh z3`Tm4{(VOo7*zWiBh`;FFbEuAY_V9yz`&8h*k2LKz~EQNI6at|fuUQFamJ~m3=HWf z8MirqWMEJhVche1DFegp35-Vtiy0Wg|1h3?Y{bB@@ekw0N1GWK3K<#i{JF@$aCs}^ zy$R(E42u>s{#kN_fkDQE@xLl4oc1uW`4lrS#2jH_&wkFpkmAUs5&4yY!F?{1uA3?Y z!~A+CJ=?1c4E}SNY?e-DU~qC^a#iJIV90*M6!qjE1H;}zrsQSn3=F|nn3C^(VPH7H z#+3F~k%8e7A5;GRJO&2tBBtWwlNlK1Ycf^#iZC!-oxn7`^(6ztp?yqCCMPp6>L!{ z3=HQ*nWZ^J7#P}8m{tByWMJ4H%B&$T#lXO?!fb!9l!2kugV}xBMg|5oMdpO2sSFI0 zYnT%y4lytY$TF8IIx#R@SjSv*#fpJ}i{3 zC(~J2D^eL4blbQ0>FfcH%wEuTz zU|`(L(y?2Wfq`KKgudX;(*0%$1H;v1mKmOV7#Jkxvdrt;%)rockY#?_R0al#ODu~( z<=!1B0Xt ztLVN^28PDBtVY697#NQ4htT(`S#8#bFfhz6fzUToSsh}QGBDhn!0HC7CvNU!_1JKf zfnn}Z*09Mn3=H!^S!14wFfbhJWKGaAVPII*&zgLkn}MN7g*E+MDg%RfKWoO!Ees5| z`dG8xOlDxXmCBl}c#(nOhy`oetwRh9+|sO#;-489T7IxLAD_y=V7-^M`{XGGhSe)r zrv|$+Fl4H*&U9~LU^rFJI(wN51H{(yumoqTT z_`>=oY$*dn)D$+xE$R#m3x(KNj71q3Y)#mNG~P2XSng%h{Km?_V0VR08x+5CDQw2G zTp1W5b=kZQbTTkhe`NEK{=&fEUB?!#GL?a0of=!FcQFIQ@dCC2HD(3|rb}$CKbsjC zME9{x+*!rIz@N^xpmrt$!<4gZi{4&kV8|yZur7Q-9RbSb*H9cWqIL5}dTjmM_!wwCQ;k}?B>&jhwh1vv~1M|ZJ3Zed|yxb4jLis35*gSH&oM}1`m2A&+YA17NF z7#fY)ez{I&U|{ZH=h&CWz_9v0yKw(n28PIg?2;Cl3=9^k>v70^ExsHKh_iy%0P&(eYj6J_4n1LZ9 zioNV82LprBRrX3JNd|^;UG^%DuM7-MyV>h6_AxLVTmqr*Ze(vv+rq%G%$vRE{B#C} zRSN8VR!bQe+%~b#nSY;wA>a)Ayrjnr3`J|%7e%%(Fr2esUz5nhz;H*2eOFl*1A}=I z`&Fw@28LWW_B+m385q_!u|F!%W?(pSg#FRUSqu!!{Opetni&`p|FJ&}R%Kww*v zn9au#*7K8r!R0PTn)Oo#hMF53>GKXTFx0bhWOz?6vyX_r3?%@XE=T@HDq8A zR^s@VZ^FP(%+1O6s+EBuc_JsfurmWg@>@=Joh1wmnmnBBp<5XkOyW63#6uYvsuy#r z7c?_4>|e@h$bE%@!D<7i>EYuH3|qf&TIDk^FbL#vy4$T}U|^li860lRz;McuGdVh) zfnmlv&dfFD3=A3~oY}ED3=FFxAoQ*6oYjI>3=Et*IA?IPFfdHD=UgE3k%2+bk8^>{ zCk6(=R?Y=7pBWeg_i!$d`NF^;_?dIj<|7OYa-5v|^^F-AdObOhKEA`i(EE(@`1C#o zhLWY67q@9MFyu6IUVi$Ofq~%`=hO8<3=H?wINzu_F)-}njMqCp%lrk`|XmCxsb%lYU%$IBOqALsxoAbG*Jym63Fl*#m zTYip#VJ;8X#`VDr3~Xb>OQM0|RFv*P$Kh3=9+8xXx{#%D^C!#C4&2 zIs?OvK(4!Ylo=R=E_1!Hv0`B0+sO4bzLkMt`eCjgri&REx^8p*n5xRaV04ldml!3u@ zKhN5|A`A>+dOQdIf!dwhcn(J`VPKGd%5&`RQ3eK2Z=RD2_!t<(<9W{4Gcz#oZsWOo z-<5%(vW@5IPk9E03Jac>%dapnEPT%M3DmwZUc&Qh+eron85nZ+@#bAfW?cy%c?g zfuZ;|?^UI93=Hcx@m{}wn1Mm$Htz$YI0l9^ao&fzUl|xU*?GSPyE8D%65;*nu!Vua z%b$;B+hzs^p#^*b`I{LSx+3_b^!peXY+LwbD_j{E;;!<^&fChsp#6wX)ow8Z!*Ovw z(~e>W1~wT!Yqn$thQmksyo|pxFobCEh5i1>z%X+GU*gmM3=F>Je3_c!3=EFie662@ z7#M1t`KFxP$G{*~$G85~83u-faeNof88a|=KIXffBgw#Em&T>*UW?9VYU zGz9ST&UI&Cn5e-o^i70;A-kR5;#404!;Q22KB^%M45>%>Bl}Yr7*s|0)3${$Ft9}P z7iG<7V91=#U$mW>fnnBW{_%wLR2EO=A28R31%nS?+It(EU z`3$KH=?tk1Wl&ZMg91YdLn=ctLkWWdLoq`sLnfGS#Q|#4vN13)2sx&tq^2m8q!yPH zD-@SzmZVy-GcYi4I%g#2rKjfPr!#`gW?^t-D2D4{b}Y`oqKJ*bi6NN51)X6B?Q6ekyD7L*iYv7U>;nL(RDo57I5 z9Bw76v$nROIabBNU{|Ix6d);1%uA`nqS%Nbn4yFrks*&Eg&~n4k)enI6k!Dni3}+W zsSJ4x3gE~rXUJs8VyI%sWJqU7fg36ciJ=sQl+?7u(wq{7g2a*xY|a;AaAwE=TLMZM zpm0ow8-j>tEUr^xaAwE{yQGXEm7$0si6Ir7ctAmz2X}=Vn}32W5{GkWypqF zT*8pSkjjwDkjS8pJc$DU03lTGhFt8PfQUa7h z6c`E^iWu@4vKT7HiNPpq6!m(+6GEQ#R`deDGF&g(u4woCqo{*Q~;F_Ad||# zS-2eJW4I4^JoD1>ixtW;Q_E9}up~+$22XHl4=RN~r9E=mVfQRa%*jl|mX>)KyciO} zX&G4qhgV`jVqR)7w!q7gBKACx?6u7y`gK8dP$CQb{UO*~=A>UsO_>UWz?K@PKuKf;5!@Q9-f= z&l&8ch*fea-Krf^p>2bP#(@vfREDa!%zTjETw?E zCpq9|6v8KLA^G_^SUn*DZKU8X5_v-i6o)wsAq=2;AJTvaCF~?{&kd9;K}~&7s}R(F z1$DbYEnDRJrkEk0As6g$Q27Ot0VOR^`wyf$9o(Ws?i?Vzq!Ut}nwXuKl#{AZkXV$M zn_7}u1gV{h^K(-b^3y=Q187G9Td=8sdqa5)CE(T=D8N82S70b*C;<08L9Rt4asJSP zl*E$MVuj?4R8TV>OS)BI2xTZ>fH)b_(9451aY0o%sJm>$U;xjV0-*)zMTse?3MKgp z&f3~W23Sl~z+)n)I5vZu#)o8DV2K$PvxrG0T%jeP{#z#Y#)<$mr4)l36ABE5aN9Y< zQj3Z+^Yau8u~>|*%?MMQ5fR#qF|`>Jq0IzSn+X3F^ioiVEk92oEfX@tg=$P3 zxM>V3Hb7YvRMX`^yMXT*AT=ncR)u9-NPYvk7F581%5wCg1XR$ZF@V}6pg|=>2U^>? zw5TXGuOz2ZAv3SIBryk6#g{?TGqeyX&QB{TPlWWkP+h6U5DFeTfs8JK>LyS(rieiS zJTwFf1W<8?=vQ*NR-`7EmVinv%#h<^2!M@q!NZC*05*n&YOx74!9qH&pph_8#3?W! ziX2dbrU0BeKm(kh)_o=1RDqz>g8bsllKi4dg`CX1Y;a0LwZIMBk^_yAg3<^t2Nw>KjTlL=ZQ#Nfz~#{e2-02uMT#{d;UaXLwS)x#cC?UaPVfi^Z`Q_je z0aQ(ZhT%XBp2Vd5(h`LXkW9WpDY%J<9?;VmTp2(W0wgFw6&Wb&g2vQK!BbGMtPN_1 zLi*z%c~Ivkivi?GP>umrW{`9Zs#8I8ACRsJNE}qbSTS&c3ph|02^8$P;7$M}P#}Sr z$^aUiLW*2?+OToVQ%Ef;$}dvLPfji^N=;EH&&bS4g^cJIW#*+@apflFfJP)zQxr-I zic5-86LVo9itgDms(2PMdH~86ptO+30P-G4EDJna2l5c87{KNkLmZwdNGvKw^9nRg zp!;AF&3u65Uhv#T5qNM9HgyEchoD*kRKA1q185QqxnwaT|LpY5Apj z;665T*4JSG&0>L?RiJTbP%wi_A80iLNj0E}5KuXdC}>2SK|LSP2s>y55R%rx?FM9{ zL!eaxDEWe156Z>q48`EVVo-9|VSo*PgK9WXl13zPP|XIi5|mj$nF2I{0-8uEhbL7H z=lr}p$S4pb$?7N+K=N=&QKdp+dSYgtLQY}{WB?1o;N1Pzzl#m)364R(*0BV7N2Ud})Bn7v`Oi**PBwr!5 z7}O}tEY46!R7i&V5&nZ*jF1-d2qx}feX zy7@*}M@zx=JG@DYRt>;IOB6J63QK_SQWo6?4e%fqB$$wU+K}MGmgxEYU?nTA)C`$r zfw&UVpaPYp`QXYK6zrgqH;18=0lBFs0&S&0`tu5D;D|tTEMpym7r4QZ0v?7)1h@1- z^%cbVkXVLT3(7Q*Iu2A~f$Ahs-INU;+yIqVpt>@Yp&Z^of$0J{4U_;u4IxnP0aUbu zx^B#(2^`caTqS8Fj)Sf~jtol(%E6UFWSITLnplLBhuE_k-BDid3u|iU6Wqw`? zSV=OZqlZz4aXA*HDpcl|!i_J2`3#O$^*I&IdOGL8%)w zjGoMp0S_!Lzs%%Rh1|pv$h<4Mc1R<-3LN$zTR|yE0oRz%5@2v-NMis^%0UJ_5iL$u$0XS7K17daN+Q@`9tL*?P&NlO zWD&~QT{4T46N|ugG$*PCKCpv9J_W}D+)Zqr>3R8(!3Z=REDZig6NF6ukhKmFQ+z3>o)WH*rMc|y72(B;`!1E`dNu(l%JO*_JP?ZA8y`U734z9aF%RfLP8;B}JUfnsd zs302-P> z6cM1t9wZThy8NIT2h=Qrv`G>fbQww*DnWCY@E}ofR7lRxDb3AO$VdduT`QF4rB)QA zCWDd#Xp~B~q_P0qp+t2NqaQ;E1M-TOmkck#Ym7iEFF<(<)LI8MM?h`?EfatgU?A6( zKqDU%{UEo2RDyyGvYG+3o(44W0~(V775^YrAiX*aTnxSppn%K2k8dQ#DesI zM$57ovcWAeP}t-_`^)*@P82v9Fo3cy$R3?Q38HiCQs z>Xd*02#R8HC4eWr1Q9!PMxdznuDhAI9f%+Dpj0d4X{zh$rgAykQgTe=S zn6TYZp*R&ZDqoUc1Zr{QW)_2*-wH{oCFQB9c?$V?pb}OgH@_%VAuTgCC#6`2D>pG4 z)VRznQOHOvN&yXvBiclHsU-?Ypr&lG4i~65R*+v@oSBqUsgRSJm;%yOlCMx)0x~T# zFFC)c2((rL6z`x6jvD0*xN|NCIOk^OrDM^R!{CZEmITW8puhk{4=5_K!3#oQJjkpk zsAdGofr1A#LQ~F=2c884Eo4IkDM%Hl=>usyfFihnAs?QsEgVx)GC^~mi8+XYCWYk0 zJcXoGg_QjAyqx?*&{9QsEePwlV)20y>HQkGI|R`C9azjSA>Dj%lM<9DA@vU^34*dl z9=LY|s+&OJ2TJB38WK{lA^!7<3)`=}jg{%q!Ro9>tk(3A-D?v*Yv#8>F z)Dclo_CmxotbhPz6;R_GREr_{exTYB)?UNqM_e6s$UrJ67bGeamn4>e7aJ<%=YbnN zc>G*N6+eRt3(#6hP@w{fCs=&J3KLK(7Bn{r>hFPyC{R&?7!Su4Z|SKe;Kf{^Xv;{= zDS!_Vqs1F}gDapp-z@MD31}t(k@_HU1M5Da#vjZ-kPZfDN-`b1P!H7n0#)hQ{fDc^ zo{^ZBk^_n|kOwh`VX@?|U1Y@;E}w$Z8>q7dSsRTUZ;*TjD&0!J9VpO{6l??#G)D~T z)k8uC6zj#{mLq6f4rC&s6zqi~muBV_rxwBE8#Gpv3R-=ZlUfX_&p`w3nRzAogwk^X zSs?`JHY3siC_RJx2f~Ql3kelmIa3>lzw!%G!Tl9bB;(15>!{*ze2Ew0d{9*c!XTB9 zgpZzCNlV-oIJ^ytKv3GoOxNng@JU0ojGRW5FhC?*kdKj*HK?_jjx@!pOu+5%H8_yg zGpq?)M`LG#oUMS=;s(`;pi&cBQ^0Fv0|L$mr8v-#Z6bKhDE2nZ7OMCKREmH`7(nG8 zsQm(KSfb}0P{IRYY9&59Tp>^dYIuT@A1Dk+NrG`?g$J$@7Ua(&@Uj?CZI9fuSH$V^ z{Nz+{I~hyy-$s_>&u+I03C-08Kc7dd{Gp5M=lR(q;su8c;n4YI%Wb2oMJ819=lPO$r}-LRt=K?wAK! z;F(`kl9*Ql8A3oFXMlHzL7T5K!CmD1qTIw1$T~pODqRCSi46&3%Zxye$O} zk|7eafFo=USs^zyH@^rxiiuV>*f4lQm&<^>18Gb`3Lj7k1+hS#23RK-k{&@Dp1>mT zYF@%QF)uH_L;B4mVrC88Tu9 zG9Nxoh~^8(jxlVDwn5Pi@&&jsWguqqQU-I?7ifPXVp0dqZYy}wLY*)`YlJf>fXCC2 z2Mz4ueiU;C_5V{962YqgU`=p)ETQKCUPKFOynv=kK;vn++QP_wg(X?YXc;J^5vfET zy08p1otKuG4qNR83hrXi`Wh^bFal4GfsBEqe^8FGA=opO z1k_S+`3tfXR)k=&&j62oAUA+A2XHZl5Ukd~)*C=4K~VA>C_#b7ra(pJYw&t2 zM1dp%wI(GsEfX>nMZW_);uM>DC4pb%=ftz}uiLwIdR4=Jv0ZUdT`3gyi$=Rg^_yXRC!Ji=)Jhuc{ zSqaLpFbmZgR2dAx(}IZA#UL>wuo%ARSBCnyBp*}@mZcVzKxXXKRSnfaGd$|5M(S8n zffu~YfVBvBpF?7BsYor`T-46P4&*0nO5bW_>}!S=h4TYw#Q~EO$V3qbE?%6gsFD$DSAr zuzCtsSV6OEvARME9v>Othzdkjz!m>;*lovSmj&D|SOkOm8R@Wjc$6v#lpaA#@Sm(06vBV7Su4W!qOPlsY3#eL`r8U0grDI zF#%_w!(0OD7=cOxkV`>}(LqBPu#LCq2?CTHNKF>SsX36vDmapb2ZIy%#2eJef`u2P z1OoMmK9dP3e zR0e@U7nCMI{WDOP1u~q4k`my46LbTurccZP6+e{H00r&b0F9)9)>%W;=QDsCad0O{f}N0Bk(`>EQmg9Ch+32R` zxCZj@03-@Prh*~?N6*~^k8>e0i*JMgVFf4w4cS8<0OOM22@Mu~RXn7TMc@%hWF}T01fU+eTdDj=Vyncegks$}XaiHzAB zz}iIF;LZrB0t7YsK%I0@=>tlfpr!kuF;hsZ12m=qI?E^ryodmlXklX;py~=#ZIyu6 z@qwlaK#2j=VgQ*6s<7|{2BgvgwLUP?QhK4LacQ5a>3~(mYULWx|h~fDYLeE0kyE=m9B7CJbkH3r3_-C1Y6&SY zWP>LmL17CDby(#O+LI5OR{~Alf?^IFn(zX{9~xd6iDjvI>Lm)fiFu`KDS+B;QLqEG@_E1X$eT#9AsCBr&+P=OK|!nvTRO=bWk7LYeUtA}&o zOC^)QyJ|s^4l3`k?KcB0dkkX$E&T@t7|2vmiwLyX0kkCma>x=W7(n?7GIkw<2_dk}0SphVAqLjT(Z&8#Hi<$db{JRm|Xi zIIKnjE$u8VPKAtKR+cAL>L?H%&;+H$)Vz|+qEyf^S)dtoY&p|{!5?%Q8|YXVq%9S= zN*Yjd00mtR(uxsj&%Cn4oXix^NCwh)eokf{*2aPchJ~OwLmfKLG;dCYKycpj7nLFpCbeGnV5aSiVM;u6qyMl9Zs z0uSPWCd)uYC};sThz-hTurdM^Z=m=C*#&BafdU)U;0ARHKzR*hGpJ|$Ho zc5~sesEz47utSh%RYB8BphfmrLQn>}F%5OT7Q`z>8UPjWfo~6h?BBy;k_&XJ9%#rO z6a%0I>Y%KMo>gI8Fa_|cYP4hu_m+fjW-+XyN=;D!4K_fQMPaeo3Y<1!3;RL#gDPN1 z$p@LkhSWNsfWu{i$Da0WHG-C1#KgP!SF4t$=iaOon7VP)h)! z3KZOkY~$*e4<0ZEEx}X(H!Hz2bqXaJiJ%5S3HTs{^30M9a9W0LuF9!YC{6_(yb3#z z2TM3xfM+=&&I2`MKur@+0}d3^AcuqU5y(>@k7Hj!CE%A2?hk?+a*0J)S9I?~S$YBT zF2qJi?19Wi#3@J?665pUq1hN3z1|*Q>AP2$5)j;utC@@w0L3>yrhfL*U7MFmRDk~)BDP%&M37I9S zxtPJsn1`|X8kFro@egWGLD(RhA*mIV%0T<3L9JL&S^?EZAX!jr7Bmn6Q3cvx0&2*E z_K21L(T{gr_D2rxul^7IArkHf=(VMM+FfPAw=& zO@Z$^hnWRxd8QVpf(~rVPg6()jc4a8fKHGB=}s+6EvhWZ0F5kV7AvG>=B2{*gIfKB z`bj^)*$R|qL4`jkv_WwWDrZ1p1X`I7+QbjqVF?lkg*a%07<6<5D7}K(A)wV9AUROz zfyx$;9?&8RP!j=?(LkXGDf1wy1v0J#Ivg5g2Sg3%taOkLP^S@O8qQLh0hX2__Ja-^ z1-Tw{&@DtC#3tmkQ$TGtSSt#YK0&TTlz{Qjm`f{4O@$0(zz^Ng0UiAYJJBT*v|k`I zPa!2UEiJVu6?BYDNoqkcXz4?7K~5&P&6TSF-bqlL3p(eiNTD<@6M8H+YKasDZG?cj zpOB3rpb-v`(?Hn;k|ol>i3~Iv401Xs2qEYCCV_UDf=~Q_sRw0R$RJKB1L80P6{xq0 zQgid6vjd=(N={}nWbFoM_!`@=njJ=h0M+LpcNKuQp@CSCpa<3Lpy&b>4ImLvFe8Fh z0&YL(IBG}-7FTEe0r;>)Q1uAPcA!Lvx(^U!GN?NVvIP_pkSK;kH&LO&zy&@v4CE7t zE>IGHj9(y%3P`rjg6r**k=+kOkG1pjZVJ zeW3UT4WWR-12R~F=yVto_Dxc18ff1ncmri3^jLD#%mAuMKoJW%e+^cSgCYgd`T>>B zplF9V2c#Or2MxG`nyw(e0t0MwEvSrvl;9vIgX(64gDsF8Tv`CyK@VQH3EItE~q;XIeHv=G&yJ%0d&Fys2PVCuEpqp!0T4gz~I6h zg%s#KV15bCHJy44?%>llp%WC~AcQm!U}YsJNq_r`e!# z0M<=J^lwni#IfB+2!1gDXf+SGq=9>yBRD&=paAVGx5ac*i-YvIh;8f*ORNWDmTiRJEKpYz)JV<%kAZ>4)jB*u87RVBKMuktxLlOum_&_a3P%9HO zN`^car-B_^ahT?L*_0=3d1qL9b|O`C(F5Y`cf$YCkL81xwM z%`HZOqBb=TbOIS{p0Fr2FEJN%kRE7sEK#APC@~Yf*;`!?wDeFNy#5-pB>{90222-t zk#TB@9^M(oGhCEKqX*o^TC7z60md#Dap<#G+z_l5)`bLeQ}%(8veqKv&Qh6Zmv~ zY;6_;oNh+=0eiL)hue;tW3XfxL=k~76cR9ytb;mJ1_>aDcR~Ab9FRU;FsRA`DK#eWr(KnFGp}OGNQ3vF* z^vtr+VuPA}5SM})Kp;1QdODD? zP)Jdk4c*{|NNu1{2Kg0IxIl6jsEvRq-XS_cv(J!|CqNxp5G#d&i-8L|=mLswP>&IL z$OWR0sG$USSVbVh3NrHt3M<&?ENH4Z8M3)9DODj6a^oN5hzU@c#sxd<4R)FkbVCie z-;X7mhe5*?+0U>_3*;AA@eC@A5vwghJ_UsjD6N9R3>0>dFo)z@M6sX@@(ajepu!eZ z93zeA<5_~W3Z8W#(+!y2c2G1UA`p@-K+QIgqd^f48_Yvb1fa+QjnqSy2|%I;IgvmT zFGvMqZ~!C*8#@CfB$P{F;L#Qh_9|kc5LD!XN+@t?Tbx<~-piC(3>#;MMO0!+3g}!w z@C-euR)tnjpdmH*<~wYaQvf`Oz_an-Gl@V0NRSE%mPd;jDj9MalE5oVKrsX=M?l^I z3{G;X0#T$u|xa2-n$(!lBvNb-O<1{zQBkOCK`U<*)d zM{M4#!Z00j<`~F)P`eV8bwL>p=3&&N3Ch3_FM?tkG}Z=cmx7icf{Iv(>p+tbkgfu( ze~Rv23wVH(CxUL)EGWn?23@q7uTYSmnO6dup-KeL>***Ym6m{3fq?v#r;hC`xgrw% z19C5@p$-|*1&u6%&PW6G$YDN*^ejOB0i{|{<%!E5Rz&#&JljRsCyZinpFs9~Lvj%) z34*FJP_ck~AP6L^L9qktr$ST^KGYA=iUqZ}L48+HkpmhNfedzmVinX@1XZArW)R2~ zpu`OtmjKa4;L&bS$p9-6Ko^IC`u(6#0+k}5vI8`11~Cg7_u#!ykW>LG>Oo_cplkxl zK9E&yAl;CuB9M*P8eb*g&@Rd^L)yoU$Wfpg8RH~EJudJumAQ$K1L8ml3)C%F$jL7* zP6ba0Bo~1f`6^_lfkz6!jX3aJc5-4V=)g5B`LhFB#Dm6?K@~YDBtfAEN-3bY02SVl zxB%rTP&|PO3Xm^B)hQ%YU{xk4W}lRbOEXnK-Cx|69OtdKof_cq7jrvAt3>3hC}=hTc-f& zr9gV*De&ceppb;<0;LbwUVKo41mq6vd+{AXsiP#nBryllQiCq#g!D(C=Uo(|wBO)I z6XTvaz61^mP$2;-4nR=}8i4{Oc96$l-APc=MeU}dMkB2L2L%c!aZt0<3JQ2okp>=O zL%Qz)6wHu}j%#Q*4xBYW*#Wc#6TY;ShFwL@3KLu^uaX>mh_IfrwNkwKxrS8VnMYcs80+^mDsJ9#$i3EeTKzC z1@QVJNMQ=bkK;^K2FOZD zOmjiu0xI`FNe@(0fu`kA+LMTO36f3FUJA}dSGWQNWE&_x5aXBvNT%W%u2cdCF(hMx zrpWVPTLHiWl%Ns}F-D2%LTeX6f!9XK1dg|wh5HeVM!F!qXm^rps`lO79dcg4OHPm z3RqCIA(t4SCK#Rjbfdne8U{xBnv%NvvfI)*th$#Y4Oboh1F2_;Uu7X1QbK?{vkZGD1fX3)!gu9 zT;QFNh^{C$zd)ArfC@vzd=|4~4*0?tbSLvMID)Ti1Qj=_42av;*c}TJlQUAmcdw!A z5rQ580BUbQoQ$}4mdg=55D2=U2Ak82;LTa|b#tKX0UFGO1U-lcok@jDm_L3KbYXFkQR|3U6sMZG6;2;{*(uVY2Kt&a(SOmEglqDer94M8*j>Q4V zK>UDSU}-u*4pPW30Cf_;t1ZE+Uw!h^ixoh}jY_V8~}Eg&bxJ&q!)ecY?|lOt*pOAF@+Z3$Uee8JxlR8tLW|c8CSw zkp}dLkYR{o0JU$5pcAE#0tD0*KwfCW<&=|{oDCY%!fJ>RgA;hkET}s3V*vF(5I2l* zI_2aiXZz)sU@fBMz-@pM21o@4%BrAHN@A!4I|or-@;Oz4?(-~4O-{`$gKWw~_lX>I zL=tqf8mLJKsdF)n;({1eoC>)H9^Dur250a-XV6R)sDQ{v+C|CfoROH9o|=;nK6M;Z zCuqF{Xf*&R9fQ*fJdW9%GZKp+tJl!Ak#@ByFZf~~=Cvo6QE+D-)L?0g#oREcpAfrKiB;&!WLqG*3sMLUzLZCtt zy!!-v`hGq`Ie6Ux;+!T8WQTyd{h-}MpzDf286hOKqC~-|D8IZIazPM!s0pC2%!T`p z9kl1KC?9L}>HyZ2&j8sNiS9*E8wkC?0S!3iF_b}XYe9_hN;~K0XJ>-0aR>EV^NYYG zOHpcJX=*We1PtB1JkZ(*)Ko?^lUbefOR*haS{9eYBJcziy4yrh&KQGeL)31ZprR5~N@7iIFukP=po8o{2_O?`4+%(b zssd)6GErtX$CKCOBb1hA}{OH6)HeO&w4^2UQ#j3>pkxP^in` z%iznP%izM`!k`IH5n3*ZC8-MFmMSP|L1Re)bR!1n>O_sm$jC@tUte7p7fo!=WCJ@B z5%tV2iQuK4=)oulQHSJUNIn2Hu~U(*`rvm-1h)@BZYfVq#Tq4Q;N@^2Z-biSps`y} zV+>?c5+oOa4;(_|B|(?ew8YY!62w|)Y(7!IVk)TchnSCC;B!FD!y4x);N~3c7@T`RjXaQtVGHok{h5Qs#h?~{33!zmez$=- zqo86Lw4o2;D_DU5i6Bs$5X1ucAGK~($LiLy%+zv_TM=Wd*m4ADbs0*`VB}tqyU>qH z1-S#1d>~Vtps8R`F^!yms|w)u z065ISDG=my&;&jx^MGRm?lwNqHCW)9Fd5X`!RAR323H1XU@<@(l*)jp4>?_nLG7~4 zM64bY123lqHOev>AiXe9o<n?MMUU9etodAyAs9Si2`X+tl`p7w18RnVE?7lQ zQ~Yj_UFpzSNvvjxpxoLE-M|Bn9~RJkz1Tt~0vyGVQX0L<2TDSa2@Oym0X$3z&Lp6^ z9#QUt0tsJZPXS~#sf|2P41junpuSfkQnP~14ZP4Cn@>Q4iUr_1X+Wdxpb{O_MgSEk z@F50xaPUHmLD~R~o&-1;!oce$tl)ZB-HP&aaYTJE_%uZ5AsPrBpz%Pgkp;Tl2olMl zK}h7NW_M4`OD)2h3m7MWJN=+q3F0GA9Dr(DP{*kld~s|6xcv_+)KN#hV1+8E0su{@ zg2o&`p#zFPP~HFy5fp%nYtR@YXkY*&3o1fDGa}&p20a25)ZPQ>QUEXI0}U&Hh7drh z1>`P}Yapi%z*=pfVFb`UW{?GJh$;-!q61Z3h~a5SY6I2NDd6RNt_(TgYqmf|A!L~Y zs8Iyc2Pz;TRU2qR8$cF=Xk0g4D z1xb&P7zXvU5KSRS%z|V<*N`LUHF1y3lvLQFK=6@I;7KT~IhKtf6m*XeJjPi(@=J@b z1%V7iA-JG~w6Gu<4wP^a6&628J7}m7lrU1T_bS*JJV8kgZY8s)XD~J!s~9{P0vL1| zKv$N5q70N=Q8PPeWDRmTDx~rRMKUB<5ba7>W`&4@T5O==6VieNHKIY84pIn!#t%WY ze;(3t5c-}0pw(GLsl~-GUpePwf;RV+XJjU4D1c`SKz@aG!La#5f+2tbRK0^b3y@X@ z=;$Tn2xIjGC3##$G{#2B6{*(e?!urr>cgq+vN-Pw-7j;Pw)z zf2{x-K3B-k%c;}>r$7bJx@6F7cur{w_8~7Hh5+cze~=w3kTizuf7F5-5znAKXrTB< zRQ8Akw5mw%f|NkeLJG9o7Id>~DQL0>TlgD+hgXoR0#G52Sj!Dr*M<^a@N_NYnO6+D z1X3XpTxi0kWigA000z)l2*SB6p3uG9m`X#yr_CdpmmEGwi!ITWb20dU6J7>VLxa^P zGd%#MF(hJ3Pgh%Jdl-# zpa29VJXj3`>#jp;Fwk5gC`lrU6e-ZD9iWaV_*(JQ6j0$0ozKJ;V;oQiAX=&{pdn~% zO2wc`LGA-#P!WNAjU*>XBX~$1n{FPcZjjFq#XC1xPa1gj6*gV4E3`p{86sJOhWqii z?1Z4^g07K(CSGjD!@N|?pbMUL16BRVBW4iifqK2z2O;&q=hIg(WI`L9py&hTeNYYn zMHuMJ4p84Q8@$mS5ypJJi4~c-rMU{lIho0j1BuX62IO`D^r;Yr&ck5~A9M>DXw(LIf``pFwIm}Se0Ko4!$5upHMyW#kZL$s zsR>FLMGVlo1D+W~Ax6UL1w1u?0IH*qdtMMTur|M8ceNtdN36d2c_kUxVqOJo2WXB7 zRHK2K4Mhy44CxG@UM?tL!3_tv+xdL+i%S%WQlV`(Yz8Wz7zhah&>9%9K@2%al_Wpd zu#%$0w6x6RZ0rSl2)G3WnjQmHO2~_~Knrw1&IMI3pqYKp&>dtqE2zB&ssKRkRfzqd z)*L7~f+`2(3RKz`wuc?Q@(OhR1^ALuY<}Zl@B!U4urr;K?xEx)&#N~ zQTnp^C6;8CVV!c|V(?>tY=^FZ2Rf@?dS+e)cK3h|&_nhSi(h^oR)ay;GK0DWpkgNx zX`q4457dLiI?52m0Gh&r?3V_GKB)0S?HOYYi1p-67b_u8C4loEq$>_;?V)!*Mg2;1 zlTwR7xh_8$l6^9@-AQ<4lmF9dwJ0BE!ke5I=%S7>png1Vx*j)Jv>2ex!xLDeV$HM<~r4CHythyc|kp!E&NtK#j53WDO2 zM977p;6=I6aDbiOhF*VUzz_NXoe+`Fkj;<>nK1?*MFLuP04m5p@dWBXf~t8?GYgbn zK;vVO(P5A%s9yqdGK39k=Yo1QAP=CQS8VEEkea8EsE`Djh}O-^FG+=*23ek&my%x& z>Ue|pHKi()q~;dn7bO-|DwL#FU~Tm2z}*g7E(5wK7m}tx?f^B^Kxq%|19(9u46#2? z0eq}A#8zz49RY13fi^CHd9-qeYJPSk@+M37TJPJ%S&LB#>8BYnZ`XwYa7 z=;U0;W%1xnEH($jgGmRQ<9sudi}H)}(@GRPJ%b52F@%WlgI6=yoPsy(RIoV@TtyLZ z78^qVs8bI2Crdyg_BM$LL?QTmeo*NJ8rTDk7k~ybAU#n~TtnI{kiI5zX(bIZRslAB z4qICX?nq+o^R~fl1C@uMvKQ1l1dZ*Z+X*VyAvFx797SsULuMfvK*MLC0tJ*qLF*R*iAvFM~nFc#|T$cgU_k>(-g64AY{sd6}6@1DV=t5+8Y-ARL zcLL&YHW$>{$kECQG8}6JTEGhjKVOz$)04l9P z!MP~2xY)TUzZk2hWf+3NBOZ`c2I+QVn#2V*DL5}N8(X80Q4Gg0 z1*lw8U_cy}1nSU0)&?S%Z;)mSC?r9NDF@tG34>+sK$qk6Cg&q@r;wh zW3&-^5)L>qfHNa>_&E*NY^nCE?lAwKKP!m97TcGV? zpwX5yr{BP}fj1k1+9Ig!UCf@YILug3tDC@Rrx1oMh^Zz{m^oPcyH*TQ44`fa zsBK-qfIO}X%3Ywrd`MyhmCK+8A0%;yG6XSr!h=mAur#%(QXv_%5(YF>l#`#At^jSs zr7DC5d14Ds&@np&&=pajl%9vwL1zOSh}FGe(B*lcAq_~U7?jvSy$n!I0jlFbqbDE( zK_L!G?hqG)7H@;H4yXpgw+L4=C^e-tncO9~up>f1H5m9z1$bKklAS;UZOFy4Ku~I0 zQED-yF92E>i7lkWz^gMs13<72F{nF)NPk>GsX2+DwW(Mq`WP%2AVZy?wH=_M9W;&# zDjGne;-JugOp}4yoS*_9G#-P#vQ#Q4H8&O9|0~EZ&IH*6UQG&GpNq}Cp!Haw5*~53 zIzDS*Wg@7Q1SK#~Ed<#n2P*OKIZGYxEKu%%G>FxU6^L?U0Fi+La~<)nQii*VG#6=r z&+Y_OWuS2yNQi-Kh3zy3C1X%+fvD&Nf*_{|LPlRQ^RX@pkApAG2jvNDLqVXZ0;LVm z@=jPa4{O6=renxnT1>~NK^+5%3W$SJQxw3%LGYz3IMO$x8#GIUno%G}<}rY3B2Wnp z%Cw*hr$9*-QVfB*NRZpdKn*{bGeP+RbYvrFw;rfYgUEqA3o5B0#Y7&sh6P=60SaT# zTrQ+>4Dt#nJAn4aAWqbTq()F3ox_j@UT6&(F#}}~P^tu_3Q#eFdf5fY)u6%%=2BSU z3Gx%9-INZVC5Fg@?1eOhK}8wr!h2X#8lnc&EC$(zYCgzRP?B0ymY4&X6i!N2$W1Lu2bK4EDPTppsfl?CU^Czz_% zK>a}w4GIiU?;fS!4|k4mF!*{Zg+$O&PzA`jxY!)0h1YyY*B<0_+^ywTu6AJA|es0@L04UrZB!aXI0X)$Qr23M00ar!=N-WHT>K*a~Bhz1n|u&fNK zN0Gx7RB$0$8zBF~t2DS{)S-?6WlZptE$BF6(BamJ3eYV-kO~A_&;-F}njxNr6pOHe z4%Bi3HEbbEWMJ;pXMnUpK$R>Of56=(3vrizN-Crr2j7+hawNDfip@1H;01M{EC4B1 zK{kMrC}OG&R6v938Q6F(mgO~Y`{jZ&^2;G-{$}Q-LR(S`4|?Co?Y@v?8EbAtN<0CAA3LqyvpGVDsP%EFJ_o!3nm* z2FZhv0v6;jP%48IvLI(e#6jr-*2V-?)ztE|E5y@zsGbHF-Qe3>N>cMm$n(1vn%`lS zGo(ulYSDxI1oAJUX~qk74fNC~tRoPhDge}^M;<0;#WmExAixmJ07}a6rSR~`W(@}I zox>JqMc`@!GE@)J3yLpLXv2~dhz2DcPy-VbKcG2FkQz{u1JRK90{IIRkBCwaq!uCv zN}wnu58PD>!Jx5x@Il?6#nYf12PsTIyIeqLc4Kp}3UpfmsIUMT3u*&H90eNYO9fwP zg{Z9sgG&-iAXn)sfC_NzN8sF2_R1s#0H53~&lsz@MF0=f_$l&fLOpG(y`{L2)L&ZH4kKw2dMcCY7oMr4K&XPI%@<(gS-by@93Te zjnRNcaf=xcO=}~NlR;yh@Ci5gP z5zt5eH&XWVTJ5ut&_q{=m zB?X_f1wDcZ<%lL+i)$FU;GO|l16joa*@^|~V1b(Bpq7vV17sNibPWr5pb{hxS}y_W zeZpb}G=c*fjs$rG*6~3O2uL^1A39?IDT5)ib)YsED2X9v4bW|bnFs0~AUbNGpoffw zfUa2t1sO;V(%l19wU9O*B%6TLf;wHGGk_q89^wK}T1i7nC$*q-k_%m(lLwzWhpf|q zTtopX6ALm^;a#QV{9MSSt?{95Y{9IJ6jgwQ_vbhP`XEi6~s62(1(}g!XTf3MtWe`vmg`OU^oL8LkM`E zcrF9t+C0{f3>OIs#X}0W|Opn%~I;7lHASG!Rd~osh6Z`UDg$WR!PC&>fZB#gFD#)!o>&u%0@^wyP}K?vXHZP! zAT7b?4Fw&A0zMEB#}0iDoaa%1VivRj0@CmRS0dn`fEDwg!T?sxBM(~1fEHpU!OpLM zHv7PrJEi7eUEvyn=M*VWse+gv!eKQ77N^2vK^o*7PzMt<e;9t@=nphaT1ic!wclFXdUl1%I?z}4W%5R#=~-5g|} zA*XYpFwiUj%(>w8iP(y$9=NffYzpf7fi9r~jW2*AA5rvTny0!eC+j$|Tu zfeC0YOloRMW?nkhVn__^vmypicOH~aKrTeCwKzd`fN~wy>>vcah!50efVM&qNk2R_ z3C~daF$RC|{mQVI0c{upHB&&-^PnIEIRsJ>f|@m;n*%|jpdoxnj~mi$0X2+31HjnN zE{06=LzcS0(k&>MK>-Si7|``5AX7nNko2s;02);VEs8|%5`iiQNb?mGK_J^fE=3H2 zxrS$?mSm(Bfe!V}ECvlD=a;9ZfYz_3q~?KcTrbI2fZmV|+l#CKUR@08_hf>WT7tT# z*b*Nfc*YQONSzIG^cxl}j1CM=;Py5sXh7|3i046VYt-H#sILlY0D#(pu$mDx?FtH% z90rhj5DSr-K~)8;p$0M&k?KK331pioD4j!UQIKj-9s$vy>Rgg~_pGzSDZfCg0bA+`y!IVF~q1C^VHa;4NPz-~%r}1v#iBa{(VmRnDLYw~Wu%F~r$J z!82IFCCD*c5sQOC^A-UNt_-dWK5$(u0X~kASkx*pc!BQ>10@Vl?+xTdP=tYIg+XO% z9+J(Rk^Z3yKK{WW*enH|_5qFtq+vsZqd7oY!~OlR>9k|;0=J$(6*;Uu2RYINRKtNr zra{MZg9cSVbt>e<0#FePN=wMj6OPO;RRA6Tl$w~Fp^y)%*05RU0`)Pd3Qq!`aSghf z7F3DDcKRYR2q+}*TPhB-v@*Z6NFgz$EVZaOv8WQ8#YR{y24!#1`W5`v2qIfkoSKt{ z%>pf`1(2y2P@f!>(GayAs15`LS`kv5ih&GHOU=mv)e4~cpggf8wFsN(K~U2{CV+w; zQniEHcA#1k)Y1cmD6GK^YmgA4(NbG_-5+GNDFvthU2?rF1 zNO1?Yy)wTPTOhy^56B3RQJ8^1O5iJ^d7G$s;9>wRt^$pxBbFDkIu;aVg15Lag#0`ynd?T`C5e%_&8? zLXZV?t{k!=TqniBYy+JG2CCjbEA~KTE24G7;gXsRUa5&}92bKdgCm0vLokCYJj_|$ z9DRaakyQyWxG})`@u2cB6RwuSEj6jAG!b&v2FwkhCO9aaK$hJh79+8_6=gz?pnxd_ z4NR3XARGxl?E3R7@sEL9P+@i~4C}lu(B)eB)9=aPrtv^uL z8Q~QcuhJawp?ff^AxiQXP?SLSfWnk`LH7fJ+y=^)h+Y6_z6<-}d{Ai!av!2^3@R-V zp(G93UJu#U@0(bZ4O&E3tN`j)LO1xs?ACzV4XUj{r-Fjg7^Ei*G7nTXf+{xTH3Y)o zE$iUr2Tnz)iPMJ(B3a4io0(S%Im;EM5M(B#dkdO%MT8ZbZ+;$Hih_9pd8`GoNgHOM0C)#3 zs2c{l#Rqw^hQlwv3?rNHF@Savf))*-<|%gn~OC(y%0(Kd4;* z9u`0-1nt@aP41*3&E>O!H-Uj0*f51eZZAM6_h&#^JrB<`tl+it$T=Id;{nvzfXo(y zDosRQ3$Sx`v)IID=CQN-&ZJ4|tOVD8dtwj`3v+E=5n691P(Mj-Z8| zaQj(8fEL2rz_$ zH}GJF3ukz0N*+eYfNDHYF^ebz;6oxXhp<7;(T01R1+;`8Im+1>K*c1YMZ^R-S01Fl LgMop8iIEWix?FeK literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_pl_PL.qm b/logdoctor/resources/translations/LogDoctor_pl_PL.qm new file mode 100644 index 0000000000000000000000000000000000000000..3fefab62cdcb024faedbdba5fa37e501d9b4544e GIT binary patch literal 59402 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 TkO)qLn+2~tV%qF>y+Qy0$95(b delta 4302 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 z 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 Dl71H6 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_ru_RU.qm b/logdoctor/resources/translations/LogDoctor_ru_RU.qm new file mode 100644 index 0000000000000000000000000000000000000000..2f4a5294b978a42b898823116c0a7eb33dd144ac GIT binary patch literal 59547 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


U?^rNVJKoq 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_sk_SK.qm b/logdoctor/resources/translations/LogDoctor_sk_SK.qm new file mode 100644 index 0000000000000000000000000000000000000000..19d8ce6d181b228189f5873bc488375edab3fcc9 GIT binary patch literal 56874 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_sl_SL.qm b/logdoctor/resources/translations/LogDoctor_sl_SL.qm new file mode 100644 index 0000000000000000000000000000000000000000..d5e69ee4c250f23d7cebfc27ff38946cd6ea427e GIT binary patch literal 58735 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_sq_AL.qm b/logdoctor/resources/translations/LogDoctor_sq_AL.qm new file mode 100644 index 0000000000000000000000000000000000000000..1799cf4a1e67eab5fd5200d052fb24c4d38746f1 GIT binary patch literal 57352 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 H#K;H$_)FxA literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_sv_SV.qm b/logdoctor/resources/translations/LogDoctor_sv_SV.qm new file mode 100644 index 0000000000000000000000000000000000000000..20a2b308da3cf0d2e0c5fc3c38c30d4bb1cf76a5 GIT binary patch literal 58854 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

)" ); // leave the p tag + } else if ( version == "v4.02" ) { + + content.append( R"(
  • )" ); + content.append( tr("Upgrade to C++23") ); + content.append( R"(
  • )" ); + content.append( tr("Automatized translations") ); + content.append( R"(
  • )" ); + content.append( tr("Security improvements") ); + content.append( R"(
  • )" ); + content.append( tr("Tests improvements") ); + content.append( R"(
  • )" ); + content.append( tr("Fixes") ); + content.append( R"(
  • )" ); // leave the p tag + } else { throw DoNotCatchException( "Unexpected changelog version", version.toStdString() ); } diff --git a/logdoctor/modules/changelog/changelog.ui b/logdoctor/modules/changelog/changelog.ui index d5d1407..a879498 100644 --- a/logdoctor/modules/changelog/changelog.ui +++ b/logdoctor/modules/changelog/changelog.ui @@ -57,7 +57,7 @@

    0Ax9XYsgz;xWpHE& zVQ^;fU{GKy2y z93!!)1)Z1x+I0shQ9u()pvDj=au7ChM*4>;`1l8hV6zN#@CwKP?+T+}{tI zPC4)~3ku*G4>Cj#vKrKg0MQ6Dgd_7y6+nl>q$Vb3DCC2xCTzxmcG!R%0;)hk4m#Y!-kb1JwdhQ>Yl+)d#IL zKo}~BY-n+6P8v4jRG{7mg*>PS49W9C8V?>207XxUZ8Z?%RSQy0WSWuJ+-qynu5(F+)3b@0H#$8eDoUVkP%Ro4l0sBqveR>R=MFPw?P&>!}Nj9 zdqd2@f=X}Xb-q{*UV~{Q>%cXbW)24EToJ-ckjWiT@d8t%fp%CI>d{?DJS0QF2Xi4C z!UaCm33QJx;v_T{&^b}aia-Srba)TEC&A6+VYc zYBG3r9kSt|V>TQad>Dcmyct5^PGxm-^a*xFR%gNhx&je2dtC~eCIv@7K@qrl9B!#e zMWu<5a{*v3l>)aPL2X}jln2+y=2nym-98V~hG(BXObH)@KLez53mQv6gcZAI zdR~4JY7&!U0JV(s7!ck<;lo|R?v4q@3f!5GLvJGS;72$JU*h)QxI_aN^;2KkU~K!=-; zd^A7&HgMz+B4bn<<_^$EFQ~dg&ywt*AxY?Y95A&S4F2G4p|G%kWN9osxXU@iQ&aLV v!Uo5%3d|bNNob&CgUEd>pl&|0haqEm@IfiKeN2#3tU)GqFfcGMF){)GZn>bB literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_th_TH.qm b/logdoctor/resources/translations/LogDoctor_th_TH.qm new file mode 100644 index 0000000000000000000000000000000000000000..1a79beb9beb023339604ed18bde5ef5724e96aa5 GIT binary patch literal 55295 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_tl_PH.qm b/logdoctor/resources/translations/LogDoctor_tl_PH.qm new file mode 100644 index 0000000000000000000000000000000000000000..64ff286e58b8f23b57909b482adc41dc41a9753c GIT binary patch literal 63223 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 literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_tr_TR.qm b/logdoctor/resources/translations/LogDoctor_tr_TR.qm new file mode 100644 index 0000000000000000000000000000000000000000..61a31b39f92c75439adf46780a1f1945df82473c GIT binary patch literal 67695 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 Pffl5@gMop8iIEWiaL)GO literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_zh_CN.qm b/logdoctor/resources/translations/LogDoctor_zh_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..88b2ef429dbbd4bd403b0b70d87782861fd9a45f GIT binary patch literal 40231 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 uQnwdrrj|22H6;(jZ#cR!1iThSo^ literal 0 HcmV?d00001 diff --git a/logdoctor/resources/translations/LogDoctor_zt_CN.qm b/logdoctor/resources/translations/LogDoctor_zt_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..df66fca89a9f99a759b318e4752e66bbf76f97fa GIT binary patch literal 43743 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 F0RXMpW5NIc literal 0 HcmV?d00001 -- GitLab From bd43a2fa895f0e0f0cf61d86372af8895f5bbff5 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:47:38 +0200 Subject: [PATCH 21/34] Updated CMake files Updated translations.cmake to include new TS files --- logdoctor/cmake/translations.cmake | 43 ++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/logdoctor/cmake/translations.cmake b/logdoctor/cmake/translations.cmake index 5954fe0..2117499 100644 --- a/logdoctor/cmake/translations.cmake +++ b/logdoctor/cmake/translations.cmake @@ -1,11 +1,50 @@ set(TS_FILES + translations/LogDoctor_ar_AR.ts + translations/LogDoctor_az_AZ.ts + translations/LogDoctor_bg_BG.ts + translations/LogDoctor_bn_BN.ts + translations/LogDoctor_ca_SP.ts + translations/LogDoctor_cs_CZ.ts + translations/LogDoctor_da_DA.ts + translations/LogDoctor_de_GE.ts + translations/LogDoctor_el_GR.ts translations/LogDoctor_en_GB.ts - translations/LogDoctor_es_ES.ts + translations/LogDoctor_eo_EO.ts + translations/LogDoctor_es_SP.ts + translations/LogDoctor_et_ES.ts + translations/LogDoctor_fa_PE.ts + translations/LogDoctor_fi_FI.ts translations/LogDoctor_fr_FR.ts + translations/LogDoctor_ga_IR.ts + translations/LogDoctor_he_HE.ts + translations/LogDoctor_hi_IN.ts + translations/LogDoctor_hu_HU.ts + translations/LogDoctor_id_ID.ts translations/LogDoctor_it_IT.ts - translations/LogDoctor_ja_JP.ts + translations/LogDoctor_ja_JA.ts + translations/LogDoctor_ko_KO.ts + translations/LogDoctor_lt_LI.ts + translations/LogDoctor_lv_LA.ts + translations/LogDoctor_ms_MA.ts + translations/LogDoctor_nb_NB.ts + translations/LogDoctor_nl_NL.ts + translations/LogDoctor_pl_PL.ts translations/LogDoctor_pt_BR.ts + translations/LogDoctor_pt_PT.ts + translations/LogDoctor_ro_RO.ts + translations/LogDoctor_ru_RU.ts + translations/LogDoctor_sk_SK.ts + translations/LogDoctor_sl_SL.ts + translations/LogDoctor_sq_AL.ts + translations/LogDoctor_sv_SV.ts + translations/LogDoctor_th_TH.ts + translations/LogDoctor_tl_PH.ts + translations/LogDoctor_tr_TR.ts + translations/LogDoctor_uk_UK.ts + translations/LogDoctor_ur_PA.ts + translations/LogDoctor_zh_CN.ts + translations/LogDoctor_zt_CN.ts ) macro(logdoc_add_lupdate_target) -- GitLab From b8c9f47c02c26a04da93add5c8f849365e04c742 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:49:15 +0200 Subject: [PATCH 22/34] Updated UI Moved Language management from the menu bar to the configurations section --- logdoctor/mainwindow.ui | 264 ++++++++++++++++++++-------------------- 1 file changed, 130 insertions(+), 134 deletions(-) diff --git a/logdoctor/mainwindow.ui b/logdoctor/mainwindow.ui index 78d316c..111a028 100644 --- a/logdoctor/mainwindow.ui +++ b/logdoctor/mainwindow.ui @@ -6143,8 +6143,8 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - + + @@ -6226,7 +6226,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use - + @@ -6333,8 +6333,8 @@ With numbers, use '!', '=','<' or '>' to declare what to use - - + + @@ -6440,7 +6440,102 @@ With numbers, use '!', '=','<' or '>' to declare what to use - + + + + + + + Qt::Orientation::Horizontal + + + QSizePolicy::Policy::Fixed + + + + 16 + 32 + + + + + + + + Qt::Orientation::Horizontal + + + + 569 + 32 + + + + + + + + + 0 + 0 + + + + + 260 + 32 + + + + + 260 + 32 + + + + + 13 + + + + + + + + + + + + + + + 128 + 32 + + + + + 16777215 + 32 + + + + + 16 + + + + Theme to use for the window + + + Language + + + + + + + Qt::Orientation::Vertical @@ -7094,97 +7189,97 @@ All the values falling inside the same interval will be merged and the mean valu - 1 + 1 - 2 + 2 - 3 + 3 - 4 + 4 - 5 + 5 - 10 + 10 - 15 + 15 - 20 + 20 - 30 + 30 - 60 + 60 - 120 + 120 - 180 + 180 - 240 + 240 - 300 + 300 - 600 + 600 - 900 + 900 - 1200 + 1200 - 1800 + 1800 - 3600 + 3600 @@ -7267,12 +7362,12 @@ All the values falling inside the same interval will be merged and the mean valu - hh:mm + hh:mm - hh + hh @@ -7563,12 +7658,12 @@ Exceeding slices will be grouped into one comprehensive slice. - hh:mm + hh:mm - hh + hh @@ -12103,17 +12198,6 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log 11 - - - Language - - - - - - - - @@ -12150,77 +12234,13 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - - - - true - - - true - - - - :/flags/flags/gb.png:/flags/flags/gb.png - - - &English - - - English - - - - - true - - - - :/flags/flags/es.png:/flags/flags/es.png - - - E&spañol - - - Español - - - - - true - - - - :/flags/flags/fr.png:/flags/flags/fr.png - - - &Francais - - - Francais - - - - - true - - - - :/flags/flags/it.png:/flags/flags/it.png - - - &Italiano - - - Italiano - - - Check &updates + Check updates Perform a version-check @@ -12228,7 +12248,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - &Infos + Infos Show some info about LogDoctor @@ -12236,7 +12256,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - &BlockNote + BlockNote Open a block-note like window to write temporary text @@ -12244,7 +12264,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - &CrissCross + CrissCross Play CrissCross @@ -12252,39 +12272,15 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log - &Snake + Snake Play Snake - - - true - - - - :/flags/flags/jp.png:/flags/flags/jp.png - - - 日本語 - - - - - true - - - - :/flags/flags/br.png:/flags/flags/br.png - - - &Português - - - &Changelog + Changelog Show the changelog -- GitLab From 60c745d8d6798f255488f64bd9100960118bb150 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:52:24 +0200 Subject: [PATCH 23/34] Added new custom model Added LanguagesListModel for the languages QComboBox --- logdoctor/customs/models/CMakeLists.txt | 2 + .../customs/models/languages_listmodel.cpp | 46 +++++++++++ .../customs/models/languages_listmodel.h | 80 +++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 logdoctor/customs/models/languages_listmodel.cpp create mode 100644 logdoctor/customs/models/languages_listmodel.h diff --git a/logdoctor/customs/models/CMakeLists.txt b/logdoctor/customs/models/CMakeLists.txt index b3bfdde..d2a87a8 100644 --- a/logdoctor/customs/models/CMakeLists.txt +++ b/logdoctor/customs/models/CMakeLists.txt @@ -1,5 +1,7 @@ target_sources(LogDoctor PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/languages_listmodel.h + ${CMAKE_CURRENT_SOURCE_DIR}/languages_listmodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/logfields_listmodel.h ${CMAKE_CURRENT_SOURCE_DIR}/logfields_listmodel.cpp ) diff --git a/logdoctor/customs/models/languages_listmodel.cpp b/logdoctor/customs/models/languages_listmodel.cpp new file mode 100644 index 0000000..212d608 --- /dev/null +++ b/logdoctor/customs/models/languages_listmodel.cpp @@ -0,0 +1,46 @@ + +#include "languages_listmodel.h" + +#include "modules/exceptions.h" + + +LanguagesListModel::LanguagesListModel(QObject *parent) + : QAbstractListModel{parent} +{ +} + +int LanguagesListModel::indexOfLanguage( const std::string& lang ) const +{ + int index{ 0 }; + for ( const auto& [code,_] : this->model_data ) { + if ( code == lang ) { + return index; + } + ++index; + } + throw DoNotCatchException( "Unexpected Language code", lang ); +} + +int LanguagesListModel::rowCount( const QModelIndex& parent ) const +{ + Q_UNUSED(parent) + return this->model_data.size(); +} + +QVariant LanguagesListModel::data( const QModelIndex& index, int role ) const +{ + if ( !index.isValid() || index.row() >= this->model_data.size() ) { + return QVariant{}; + } + + const auto& item{ this->model_data.at( index.row() ) }; + + switch ( role ) { + case Qt::DisplayRole: + return item.second; + case Qt::UserRole: + return QVariant::fromValue( item.first ); + default: + return QVariant{}; + } +} diff --git a/logdoctor/customs/models/languages_listmodel.h b/logdoctor/customs/models/languages_listmodel.h new file mode 100644 index 0000000..deb3dd4 --- /dev/null +++ b/logdoctor/customs/models/languages_listmodel.h @@ -0,0 +1,80 @@ +#ifndef LOGDOCTOR__CUSTOMS__LANGUAGES_LISTMODEL_H +#define LOGDOCTOR__CUSTOMS__LANGUAGES_LISTMODEL_H + + +#include + + +class LanguagesListModel final : public QAbstractListModel +{ + Q_OBJECT + + using data_pair_t = std::pair; + using model_data_t = std::vector; + +public: + explicit LanguagesListModel(QObject* parent=nullptr); + + //! Returns the index in the model of the given language code + /*! + \param lang The language code + \return The index in the model + \throw DoNotCatchException + */ + int indexOfLanguage( const std::string& lang ) const; + + int rowCount( const QModelIndex& parent=QModelIndex() ) const override; + QVariant data( const QModelIndex& index, int role ) const override; + +private: + const model_data_t model_data{ + {"sq_AL", QStringLiteral("Albanian (Albania)")}, + {"ar_AR", QStringLiteral("Arabic (classic)")}, + {"az_AZ", QStringLiteral("Azerbaijani (Azerbaijan)")}, + {"bn_BN", QStringLiteral("Bengali (Bangladesh)")}, + {"bg_BG", QStringLiteral("Bulgarian (Bulgaria)")}, + {"ca_SP", QStringLiteral("Catalan (Spain)")}, + {"zh_CN", QStringLiteral("Chinese (cantonese) (China)")}, + {"zt_CN", QStringLiteral("Chinese (traditional) (China)")}, + {"cs_CZ", QStringLiteral("Czech (Czech Republic)")}, + {"da_DA", QStringLiteral("Danish (Denmark)")}, + {"nl_NL", QStringLiteral("Dutch (Netherland)")}, + {"en_GB", QStringLiteral("English (United Kingdom)")}, + {"eo_EO", QStringLiteral("Esperanto")}, + {"et_ES", QStringLiteral("Estonian (Estonia)")}, + {"fi_FI", QStringLiteral("Finnish (Finland)")}, + {"fr_FR", QStringLiteral("French (France)")}, + {"de_GE", QStringLiteral("German (Germany)")}, + {"el_GR", QStringLiteral("Greek (modern) (Greece)")}, + {"he_HE", QStringLiteral("Hebrew")}, + {"hi_IN", QStringLiteral("Hindi (India)")}, + {"hu_HU", QStringLiteral("Hungarian (Hungary)")}, + {"id_ID", QStringLiteral("Indonesian (Indonesia)")}, + {"ga_IR", QStringLiteral("Irish (Ireland)")}, + {"it_IT", QStringLiteral("Italian (Italy)")}, + {"ja_JP", QStringLiteral("Japanese (Japan)")}, + {"ko_KO", QStringLiteral("Korean (Korea)")}, + {"lt_LI", QStringLiteral("Lithuanian (Lithuania)")}, + {"lv_LA", QStringLiteral("Latvian (Latvia)")}, + {"ms_MA", QStringLiteral("Malay (Malaysia)")}, + {"nb_NB", QStringLiteral("Norwegian (Norway)")}, + {"fa_PE", QStringLiteral("Persian (Persia)")}, + {"pl_PL", QStringLiteral("Polish (Poland)")}, + {"pt_BR", QStringLiteral("Portuguese (Brazil)")}, + {"pt_PT", QStringLiteral("Portuguese (Portugal)")}, + {"ro_RO", QStringLiteral("Romanian (Romania)")}, + {"ru_RU", QStringLiteral("Russian (Russia)")}, + {"sk_SK", QStringLiteral("Slovak (Slovakia)")}, + {"sl_SL", QStringLiteral("Slovenian (Slovenia)")}, + {"es_SP", QStringLiteral("Spanish (Spain)")}, + {"sv_SV", QStringLiteral("Swedish (Sweden)")}, + {"tl_PH", QStringLiteral("Tagalog (Philippines)")}, + {"th_TH", QStringLiteral("Thai (Thailand)")}, + {"tr_TR", QStringLiteral("Turkish (Turkey)")}, + {"uk_UK", QStringLiteral("Ukranian (Ukraine)")}, + {"ur_PA", QStringLiteral("Urdu (Pakistan)")} + }; +}; + + +#endif // LOGDOCTOR__CUSTOMS__LANGUAGES_LISTMODEL_H -- GitLab From 365e3c8560c0160b2544d161bc52da9dc10e02cc Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:53:38 +0200 Subject: [PATCH 24/34] Updates --- .../customs/models/logfields_listmodel.h | 2 +- logdoctor/mainwindow.cpp | 109 ++++-------------- logdoctor/mainwindow.h | 26 ++--- logdoctor/modules/shared.h | 30 ++--- 4 files changed, 52 insertions(+), 115 deletions(-) diff --git a/logdoctor/customs/models/logfields_listmodel.h b/logdoctor/customs/models/logfields_listmodel.h index 1cf35d8..099c55f 100644 --- a/logdoctor/customs/models/logfields_listmodel.h +++ b/logdoctor/customs/models/logfields_listmodel.h @@ -25,7 +25,7 @@ public: QVariant data( const QModelIndex& index, int role ) const override; private: - real_data_t real_data; + real_data_t real_data; QVector view_data; }; diff --git a/logdoctor/mainwindow.cpp b/logdoctor/mainwindow.cpp index b2abbfa..83e2d4b 100644 --- a/logdoctor/mainwindow.cpp +++ b/logdoctor/mainwindow.cpp @@ -10,6 +10,7 @@ #include "customs/logfile_treewidgetitem.h" #include "customs/models/logfields_listmodel.h" +#include "customs/models/languages_listmodel.h" #include "utilities/checks.h" #include "utilities/colors.h" @@ -18,6 +19,7 @@ #include "utilities/printables.h" #include "utilities/rtf.h" #include "utilities/stylesheets.h" +#include "utilities/vectors.h" #include "modules/dialogs.h" #include "modules/exceptions.h" @@ -121,13 +123,6 @@ MainWindow::MainWindow(QWidget *parent) ////////////// //// MENU //// - // languages - connect( this->ui->actionEnglishGb, &QAction::triggered, this, &MainWindow::menu_actionEnglishGb_triggered ); - connect( this->ui->actionEspanolEs, &QAction::triggered, this, &MainWindow::menu_actionEspanolEs_triggered ); - connect( this->ui->actionFrancaisFr, &QAction::triggered, this, &MainWindow::menu_actionFrancaisFr_triggered ); - connect( this->ui->actionItalianoIt, &QAction::triggered, this, &MainWindow::menu_actionItalianoIt_triggered ); - connect( this->ui->actionJapaneseJp, &QAction::triggered, this, &MainWindow::menu_actionJapaneseJp_triggered ); - connect( this->ui->actionPortuguesBr, &QAction::triggered, this, &MainWindow::menu_actionPortuguesBr_triggered ); // tools connect( this->ui->actionBlockNote, &QAction::triggered, this, &MainWindow::menu_actionBlockNote_triggered ); // utilities @@ -161,28 +156,20 @@ MainWindow::MainWindow(QWidget *parent) this->ui->box_StatsRelat_LogsField_2->setModel( new RelationslLogFieldsListModel() ); + ////////////////// + //// CRAPCONF //// + { + QSignalBlocker blocker( this->ui->box_ConfWindow_Language ); + this->ui->box_ConfWindow_Language->setModel( new LanguagesListModel() ); + } + + /////////////////// //// POLISHING //// // default tabs this->switchMainTab( 0 ); this->switchStatsTab( 0 ); - // language menu - if ( this->language != "en_GB" ) { - this->ui->actionEnglishGb->setChecked( false ); - if ( language == "es_ES" ) { - this->ui->actionEspanolEs->setChecked( true ); - } else if ( language == "fr_FR" ) { - this->ui->actionFrancaisFr->setChecked( true ); - } else if ( language == "it_IT" ) { - this->ui->actionItalianoIt->setChecked( true ); - } else if ( language == "ja_JP" ) { - this->ui->actionJapaneseJp->setChecked( true ); - } else if ( language == "pt_BR" ) { - this->ui->actionPortuguesBr->setChecked( true ); - } - } - // set the default WS as the current one switch ( this->default_web_server ) { case WS_APACHE: @@ -212,6 +199,9 @@ MainWindow::MainWindow(QWidget *parent) this->ui->checkBox_ConfWindow_Geometry->setChecked( this->remember_window ); this->ui->box_ConfWindow_Theme->setCurrentIndex( static_cast(GlobalConfigs::window_theme) ); this->ui->box_ConfWindow_Icons->setCurrentIndex( static_cast(GlobalConfigs::icons_theme) ); + this->ui->box_ConfWindow_Language->setCurrentIndex( + dynamic_cast( this->ui->box_ConfWindow_Language->model() )->indexOfLanguage( this->language ) + ); // dialogs this->ui->slider_ConfDialogs_General->setValue( static_cast(this->dialogs_level) ); this->ui->slider_ConfDialogs_Logs->setValue( static_cast(this->craplog.getDialogsLevel()) ); @@ -447,7 +437,7 @@ void MainWindow::readConfigs() invalid_lines.append( QString::fromStdString( line ) ); DialogSec::errLangLocaleInvalid( QString::fromStdString( val ) ); } else { - if ( val == "en_GB" || val == "es_ES" || val == "fr_FR" || val == "it_IT" || val == "ja_JP" || val == "pt_BR" ) { + if ( VecOps::contains( this->available_languages, val ) ) { this->language = val; } else { invalid_lines.append( QString::fromStdString( line ) ); @@ -1649,13 +1639,6 @@ void MainWindow::updateUiFonts() QFont header_font{ small_font }; header_font.setPointSizeF( this->font_size_small+2 ); // menu - this->ui->menuLanguage->setFont( menu_font ); - this->ui->actionEnglishGb->setFont( menu_font ); - this->ui->actionEspanolEs->setFont( menu_font ); - this->ui->actionFrancaisFr->setFont( menu_font ); - this->ui->actionItalianoIt->setFont( menu_font ); - this->ui->actionJapaneseJp->setFont( menu_font ); - this->ui->actionPortuguesBr->setFont( menu_font ); this->ui->menuTools->setFont( menu_font ); this->ui->actionBlockNote->setFont( menu_font ); this->ui->menuUtilities->setFont( menu_font ); @@ -1819,6 +1802,8 @@ void MainWindow::updateUiFonts() this->ui->box_ConfWindow_Theme->setFont( font ); this->ui->label_ConfWindow_Icons->setFont( big_font ); this->ui->box_ConfWindow_Icons->setFont( font ); + this->ui->label_ConfWindow_Language->setFont( big_font ); + this->ui->box_ConfWindow_Language->setFont( font ); // conf dialogs this->ui->label_ConfDialogs_Level->setFont( big_font ); this->ui->label_ConfDialogs_General->setFont( font ); @@ -2289,59 +2274,6 @@ WarnlistField MainWindow::warnlistFieldFromString( const QString& str ) ////////////// //// MENU //// ////////////// -// switch language -void MainWindow::uncheckAllLanguageMenuEntries() -{ - this->ui->actionEnglishGb->setChecked( false ); - this->ui->actionEspanolEs->setChecked( false ); - this->ui->actionFrancaisFr->setChecked( false ); - this->ui->actionItalianoIt->setChecked( false ); - this->ui->actionJapaneseJp->setChecked( false ); - this->ui->actionPortuguesBr->setChecked( false ); -} -void MainWindow::menu_actionEnglishGb_triggered() -{ - this->uncheckAllLanguageMenuEntries(); - this->ui->actionEnglishGb->setChecked( true ); - this->language = "en_GB"; - this->updateUiLanguage(); -} -void MainWindow::menu_actionEspanolEs_triggered() -{ - this->uncheckAllLanguageMenuEntries(); - this->ui->actionEspanolEs->setChecked( true ); - this->language = "es_ES"; - this->updateUiLanguage(); -} -void MainWindow::menu_actionFrancaisFr_triggered() -{ - this->uncheckAllLanguageMenuEntries(); - this->ui->actionFrancaisFr->setChecked( true ); - this->language = "fr_FR"; - this->updateUiLanguage(); -} -void MainWindow::menu_actionItalianoIt_triggered() -{ - this->uncheckAllLanguageMenuEntries(); - this->ui->actionItalianoIt->setChecked( true ); - this->language = "it_IT"; - this->updateUiLanguage(); -} -void MainWindow::menu_actionJapaneseJp_triggered() -{ - this->uncheckAllLanguageMenuEntries(); - this->ui->actionJapaneseJp->setChecked( true ); - this->language = "ja_JP"; - this->updateUiLanguage(); -} -void MainWindow::menu_actionPortuguesBr_triggered() -{ - this->uncheckAllLanguageMenuEntries(); - this->ui->actionPortuguesBr->setChecked( true ); - this->language = "pt_BR"; - this->updateUiLanguage(); -} - // use a tool void MainWindow::menu_actionBlockNote_triggered() { @@ -4546,6 +4478,15 @@ void MainWindow::on_box_ConfWindow_Icons_currentIndexChanged(int index) this->updateUiIcons(); } +void MainWindow::on_box_ConfWindow_Language_currentIndexChanged(int index) +{ + const QModelIndex idx{ this->ui->box_ConfWindow_Language->model()->index( + index, 0 ) }; + this->language = this->ui->box_ConfWindow_Language->model()->data( + idx, Qt::UserRole).value(); + this->updateUiLanguage(); +} + ///////////////// //// DIALOGS //// diff --git a/logdoctor/mainwindow.h b/logdoctor/mainwindow.h index 4928fd4..f61f683 100644 --- a/logdoctor/mainwindow.h +++ b/logdoctor/mainwindow.h @@ -297,6 +297,8 @@ private slots: void on_box_ConfWindow_Icons_currentIndexChanged(int index); + void on_box_ConfWindow_Language_currentIndexChanged(int index); + //// DIALOGS //// void on_slider_ConfDialogs_General_sliderReleased(); @@ -544,23 +546,9 @@ private slots: void on_button_ConfIis_Blacklist_Down_clicked(); - /////////////// + ////////////// //// MENU //// - //// LANGUAGE //// - - void menu_actionEnglishGb_triggered(); - - void menu_actionEspanolEs_triggered(); - - void menu_actionFrancaisFr_triggered(); - - void menu_actionItalianoIt_triggered(); - - void menu_actionJapaneseJp_triggered(); - - void menu_actionPortuguesBr_triggered(); - //// TOOLS //// void menu_actionBlockNote_triggered(); @@ -650,6 +638,14 @@ private: std::string language{ "en_GB" }; + const std::vector available_languages{ + "ar_AR", "az_AZ", "bg_BG", "bn_BN", "ca_SP", "cs_CZ", "da_DA", "de_GE", "el_GR", + "en_GB", "eo_EO", "es_SP", "et_ES", "fa_PE", "fi_FI", "fr_FR", "ga_IR", "he_HE", + "hi_IN", "hu_HU", "id_ID", "it_IT", "ja_JP", "ko_KO", "lt_LI", "lv_LA", "ms_MA", + "nb_NB", "nl_NL", "pl_PL", "pt_BR", "pt_PT", "ro_RO", "ru_RU", "sk_SK", "sl_SL", + "sq_AL", "sv_SV", "th_TH", "tl_PH", "tr_TR", "uk_UK", "ur_PA", "zh_CN", "zt_CN" + }; + //! Translates the UI to the selected language void updateUiLanguage(); diff --git a/logdoctor/modules/shared.h b/logdoctor/modules/shared.h index cb372ca..8351989 100644 --- a/logdoctor/modules/shared.h +++ b/logdoctor/modules/shared.h @@ -20,28 +20,28 @@ public: const std::string BOOLS__FALSE { TR::tr("FALSE").toStdString() }; const std::string BOOLS__TRUE { TR::tr("TRUE").toStdString() }; -const std::string WORDS__DATE { TR::tr("Date").toStdString() }; -const std::string WORDS__YEAR { TR::tr("Year").toStdString() }; -const std::string WORDS__MONTH { TR::tr("Month").toStdString() }; -const std::string WORDS__DAY { TR::tr("Day").toStdString() }; -const std::string WORDS__TIME { TR::tr("Time").toStdString() }; -const std::string WORDS__HOUR { TR::tr("Hour").toStdString() }; +const std::string WORDS__DATE { TR::tr("Date").toStdString() }; +const std::string WORDS__YEAR { TR::tr("Year").toStdString() }; +const std::string WORDS__MONTH { TR::tr("Month").toStdString() }; +const std::string WORDS__DAY { TR::tr("Day").toStdString() }; +const std::string WORDS__TIME { TR::tr("Time").toStdString() }; +const std::string WORDS__HOUR { TR::tr("Hour").toStdString() }; const std::string WORDS__MINUTE { TR::tr("Minute").toStdString() }; const std::string WORDS__SECOND { TR::tr("Second").toStdString() }; -const std::string FIELDS__WARNING { TR::tr("Warning").toStdString() }; -const std::string FIELDS__PROTOCOL { TR::tr("Protocol").toStdString() }; -const std::string FIELDS__METHOD { TR::tr("Method").toStdString() }; -const std::string FIELDS__URI { TR::tr("URI").toStdString() }; -const std::string FIELDS__QUERY { TR::tr("Query").toStdString() }; +const std::string FIELDS__WARNING { TR::tr("Warning").toStdString() }; +const std::string FIELDS__PROTOCOL { TR::tr("Protocol").toStdString() }; +const std::string FIELDS__METHOD { TR::tr("Method").toStdString() }; +const std::string FIELDS__URI { TR::tr("URI").toStdString() }; +const std::string FIELDS__QUERY { TR::tr("Query").toStdString() }; const std::string FIELDS__RESPONSE_CODE { TR::tr("Response code").toStdString() }; const std::string FIELDS__TIME_TAKEN { TR::tr("Time taken").toStdString() }; const std::string FIELDS__BYTES_SENT { TR::tr("Bytes sent").toStdString() }; const std::string FIELDS__BYTES_RECEIVED { TR::tr("Bytes received").toStdString() }; -const std::string FIELDS__REFERRER { TR::tr("Referrer").toStdString() }; -const std::string FIELDS__COOKIE { TR::tr("Cookie").toStdString() }; -const std::string FIELDS__CLIENT { TR::tr("Client").toStdString() }; -const std::string FIELDS__USER_AGENT { TR::tr("User-agent").toStdString() }; +const std::string FIELDS__REFERRER { TR::tr("Referrer").toStdString() }; +const std::string FIELDS__COOKIE { TR::tr("Cookie").toStdString() }; +const std::string FIELDS__CLIENT { TR::tr("Client").toStdString() }; +const std::string FIELDS__USER_AGENT { TR::tr("User-agent").toStdString() }; const std::string MONTHS__JANUARY { TR::tr("January").toStdString() }; const std::string MONTHS__FEBRUARY { TR::tr("February").toStdString() }; -- GitLab From 679404db62a1a81fab2b129612343ad34c70c94e Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:54:52 +0200 Subject: [PATCH 25/34] Removed unused icons Removed the icons of the countries' flags --- logdoctor/resources/flags/br.png | Bin 2145 -> 0 bytes logdoctor/resources/flags/es.png | Bin 1787 -> 0 bytes logdoctor/resources/flags/fr.png | Bin 1217 -> 0 bytes logdoctor/resources/flags/gb.png | Bin 2903 -> 0 bytes logdoctor/resources/flags/it.png | Bin 1264 -> 0 bytes logdoctor/resources/flags/jp.png | Bin 1313 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 logdoctor/resources/flags/br.png delete mode 100644 logdoctor/resources/flags/es.png delete mode 100644 logdoctor/resources/flags/fr.png delete mode 100644 logdoctor/resources/flags/gb.png delete mode 100644 logdoctor/resources/flags/it.png delete mode 100644 logdoctor/resources/flags/jp.png diff --git a/logdoctor/resources/flags/br.png b/logdoctor/resources/flags/br.png deleted file mode 100644 index cc3ba45bd5f42344dcf50386a18149fee308adbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2145 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?Ftr8;jvQe)KP^kVj6L`oPzCcWX-yg@!t2XYf@8(ZbtByX(8EO zw?mSHn%Cw!CpjNjqM~sqNHAgo>(spm^mI0Vzd85j%;IyOza2hvZjNMH>2#A!`!k=P z-nsXA&i~JU=HISfpy8_N71$LtWznDaF1^`Tm-(t~cRghgYFqL803WleMZ?1$g;o4( zs{>vsrR@>lFZ+D<`-uOdE&RIQj8aoHZ++af_veEjyf?O-ObPwJR>Lf5h4qChMFURd zztgTQVANe%?0(>4!#npUTo;bH#(7U$q0B{TJJGe|)6)fN?!zn^LdURzL4wD;!H+-I~ayv+}^E z{6mwhH_8aG^Y}C6@_y`Idbgv5Dg2^QLzr?#pu*CQb!@L3uPF zg4?fHUbU6q_v$TcKi21Veuh8KrU%6iyU!WBZ!cWguVr%j^sgOLI0_1n%)j*9_`qt0 zVxGCIGAfyKjRe__u)Wn~xF>3qeCNAXVs5H=|Fx}~luSHSUOs$%miNv3wWs!Z%T;@X zE&u&_N&e1I%dzc zpCry)pPs&C$!G5rCB-M-0u|M8LcZHvvyCsvgU+s@lp*~k8M3_p>X)9AeXmBk&C=HJ)nJ^1-vKH>eM zw7R=?z4L1=dUwp&Sy{^aEX9)%lEpju=nAaKU_MjulYV-xBGSE?muo! z%cgtJZH|~WnXzKu-mX;vJx_V3&wR9XXMPrc@E*>4k{YQu{OZr2)E06!Q<=*wBWq!^ zPe5v`4eve|%RgD)BIV{>>s%R=ed*IDJO2GQtJ^%j8!T%|xNzL}v-ZyFx4mm_n@nAn zT)XGn^v^CzfhHSXZ#`O*Tq~TaDpu$G`R*<`vuivba$cvDZ4VVbdWKi|qWsNu$4)eg z{NOS^d0$-SdGuxOW_F3b>Q0xoOA8lys^myXTUXZncHH*oMeds=8=kIIT@z=_e7ND- zIf3Knd`}kMD4BouT;=r2{Hu}M&b>|Wd&zNXZnM!t84t;a9DBrOp4rc?o?2u%f9YdV0Y4={~pEjChw=V9ApYM(4^SHsZ3F0_EesIBe_Q?S=u4* z@})&LuS-AM{9f zhVtwH`3X!9jC;>83RdY(mN&b;`QHzld-C55vtKDxZ+n-TW#N^7-yq}QrW~Eq%TyjL zG?7@aOsz$>|I>@T?3y1fCD;G|oHgP0y*X#+d5e1ZJ$mN5 z-Z&tyAG)z9k-fca@1bM2&nHSu;yifppTx!to~6|{zwX_evtzBONr{@zJL|yH$CAHp z;rY2q)p-9z#v8&?&s4UaJn{0#r0v|Nr6fJ8DnFdjiQ6yrXgjyw$Lq)Apa1PEx|cP} zt+-nBFy~~~&DB3Yy_FA$ownedkKT3M_DrqLkBfRM zjpt=cek#1a(bC3pee?S(-yboqQ?c1|A?)P)TdQ`=`XDAT*Pdz5j@?D)lUoZH7_%X>2D3clwZkp=D*eZ+PSYa%I!{ked1tOahfr@`E82rdUx|r zOa4V^%vF4TwXcgQI)JOXR_DXJwNG2jzA8=FpqS=-$M5g83s!9wfm^zit>#^mbKq#u za};LTQz25pW8}WxOWOU|0hwzha+kNUc?aF^i<(gKE8tk`N9hH*9hx0#k23DLyk@p2 z66xR1di(zAbHN+0T$udNa$D}Q`7O(PT0)Ynw{{q|@30jw%sXW8Y*DH03Qq~E)Q*)g z%{5WI$}7`SIaOG5JQqCGkf=W_Uo-V??)2mTvp;TRwP%n$@G!M(&fZ5%)`d5}N%A|V z|2@*YH6vRs>b%QqD;dtkA*@{tO>VCxUc_z5IvC)qa%K0KcQ2BqgZ?nbOj#tdRKr#C e)c@6g*e@-bG(-AJ$QcF(1_n=8KbLh*2~7YVtST4) diff --git a/logdoctor/resources/flags/es.png b/logdoctor/resources/flags/es.png deleted file mode 100644 index cb1c2a7861e29308172722787fabc64e49cca604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?FY``0wb%^L{<%Mf$jrBoGJp`VlEtJYxb%?vUgzG*x>R= zQN^r*!L_qRbTLQcU`1ecQ0SQ+j-YmSTXgoYV6my)p7Bm zwWWSn8&~?IY6Z_c6|(Hp!%msymsdYHeA7QHDO30PgGt8r^Sy#t3>K$G_+BpA`?&P$ zme05Ox24Ux|M30C|I82K6?Vi&{95DOoWJ$jzp5P8IM(;i^KFDz?a4^eXE3*!a`Zr= z1Vh`*g$=VNCTMI+PFtoGS})iF!WXNyEs5~lzGSS zMFK(vEP3KY!rwjM?rPb~(ATOnsf@B@d6;d`AjcRaa>IR2T9R7t#v1e)24c zVUcLZH$R7k-sblg2esZgG$Ginx#eut#Hf&j+SMmM&5Y%;Ox-B-kZr38$0@I$EBS1$ zN}3&8u&7GoAOE$jJzv#>PNe%7F~#{-Jm1=|^)_SXiX0WoRo(?Zy$?Mt?mZmcp1LQx zE!_B;sr5s>C1wU1%zqAto?oo{@bUR~9~Y!vk+UjFO?-B8hWfLpH?D_PF6w2k6REIX zv!w51gS7DBn*E9L2)oAFVAn%ZvY5&UpH-`uhcA)v)(0F5AOy?2(t*w!?41 zg(d%gIcl1yeJELf?9Cgoqsx`o+3Y+P^J~V7Yx*nx|5EijTYh1O*TSU3V)I?Z=kokJ z;%GC?Z}0uh=Ph5&YBrs4prY&_pD3g0`7<#tUw`r5;%(e{@^ea4n#)GzBXc=w-tYYS zz@&c1;~hT)mF?pb-(Py(dFk|zWta5CBO>ctUrq9Rwo~rlUq-PRPP68j%#==-eX#oa z{R09_fzzg6U%5R$F`h$nH(P(S@sG5bXVa#BetN6obbsf1=iQgtt=QQruSct_v!3;z zb9bi0-Nn8K4QdX4SSou+QZ=qXNAKE?TVL%{<$c^WCtbWQlJ&jl&+oGWH>~$D-4ZPO zH!=P7R-v!AU8DG!eKs2(yO?9VM(gNj&ZEVgM?Z5eE#_=p+7c7`k@awESw!RCU~|z& zu?sf}ZTcB@;+C}KyEWRor^(%CmfpW|!@u)JoB2P_@bxQq4^D3IyL)k6`;~Vs?07(`RblxZr0LGLv_zdHX^6QkkChC(c}S zx@o#J(Q9?Jv4G^8RguDLZoZB*QO5Hrd0U%;#vP^i&yGrEQ`LMpe%L5^y%?A`YcbE$Q(I2 zhtu2lOOf~6S+io9cP>g3mz`qUH2v@E$?LX%vz_)u@0gXt?H-9-?N7@%_G`8N46hTg zt@?i>yxU%P-rspjtpStf*V|TYQJb7^rgqAg!>`aR{^aYR?k}4(#e*NtF}7Z8pq<1T z>f@^1=>8z=%$xXqEAmat%D3mqX)l~{DrA|_R8SQn-}i@Ke&>t@VSD~fWnf@n@O1Ta JS?83{1OWWzPyqk{ diff --git a/logdoctor/resources/flags/fr.png b/logdoctor/resources/flags/fr.png deleted file mode 100644 index c65915a7f622665c2785694d3a020a54cc625d3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F$py6WNawD%hq)Mg(qhbkty76p_2p$>b+*Ne(OPS*5_BkK8XBx+b+LEpqTM$q*KZ z3TygsVUx~H&lAaMe|FqoxIulR?Y#E6Qx|+tkCZ!mlHM!^_>}&Gz ze(S7PtIqnS|NOR^o87G9)WvtJ+H8aZe+zJjZ@gcZR{8%j|F!QfPs#-?87{;|M|aDy z9MIj9_T$b$t2L(U-@mH~{d2cx-`CpS>C^R{KeYXdjQ#0;vb$hUB{wfOs|M34N0+37 zpC4Arxv;44d*1t5S6v<6a9gFGr9ivy@%^g3_u{3crQIhx)L+cgKlgg4x7j4^1Aoo8 z9`#na&uSpcSp0Kw?~FeJi>@t5=b6ebAs!%=uq#vP<;)Laa&Eh81sMd7ml<;W>P{4i zam^Lq1({W-m*Q?Cbots`r z>}BY!m0svQZIZ64K=btn73&Y^s4fUzknqi+$j>>OcdclT;fLCMjdYQtaU!j8B1idI z|K2;=EXjYZ^q`L&J6{a@hXoHb9hSf3&$TJq?&j_BlBdFwd5&tsnR4MnrMxlbv3X@; z^Q@T*@6`02Iq2voDA3}dC3HfC;q#=E`caqX>P$G#bbcMLgNxtv`F#xrk%>wbetVgh z@^F1O?l$`CbLxhUGKa!SBb^iK+4nvRNvO_L{Jrl~Caywa# zuXDVfe6n#mQ|B6S4((7|1>pnUj$T_2iZ3x zt7M*=S%_2n!DOeY*OuPDRdHiYYWs z=&Z^l#QmUP3;QJZl4(00`K`F4+v*m^HgCnn&XX?>T%YkQLgLo3Ms-ff&wc^9Go(G9 zt;t#N&7x}7`U@w$PrYcCeCE)QxTw7I{Jj+nEs6Yp>*S4%jSY^iOnvZaV%387RjDBi z8r&WXH}nqFeUg0R^hkMvEyLa~udZEO_^qsLTeQk^+2e-$o*(=k{UKU+OO##BegBh^ z8Eb?2r-YkK+Mw`D!RlI)f6|1T{MFD6qXL z%Fi8{{5stJ+nTN2D&Y(^*WP~Bn^Us;eDDvZlV%N}ORw%R%yV+ly!uv-xsYY5Rg_1I z$}f>G8XPAX4s7RoRh;$t=Ci$bcVGU$^~V$I>xu;%4Zd^c-Th(AyzN(fb9A&Ck8^%z z=F39Coe67WL!StLzrX9>io3Vtmo?3QwUK+#Vv#b&y^p27@6Il-d$l4^|1h*fxOn8h c!avrh=CJ}@ds2QeFfcH9y85}Sb4q9e07}O%vj6}9 diff --git a/logdoctor/resources/flags/gb.png b/logdoctor/resources/flags/gb.png deleted file mode 100644 index 3352c86605f0a157107040e9b2b3663af99ecc1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2903 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F5M9MoA-0vy`%0s@=#)C65>8%{0Q)^uspE>_3e?7qq-lV_wKZvIj8 z!dcRVRd9kMTeF!~GYd<*!cX>+4?UZ3*;RDJCjpY z^w!f)e5Uz&uXb(y&@Qq3w7&ymh^>dGgU19dmz6tQ9iq-!wa00R%HKEIawEF*ClllU z@?CwB_5N{Ncch&9JbU%I`h8per3aSJl-jIb?`8gelW67i{<(6KtNvfP_mTP6IW{Hb zf*z4JcoQq4B&WtqP&;5DToIQKK&tNA2^8b<^@<4SM%+pYGUwLH)?&xtR~{ zx+>4C`XXc;F7s&jq+13bgaQIgWeYcMRLKa82(evoJf%<7aCf((shac!8BZtfCkjj+ znoZS9U9=L6UPRb@&U2eGe@Wflv^AU466V^@eZ2hKracc1lya`PUM(@%oFn-9xgXu$ zJAX|t{bNw0HI+N=aCltjB8PhibnNOMC)QQRmrqIiAmr5Gv}B13SK}0+xqi&9?IFA# zS6i-}SrF;a&8XWp+bU&)?tj5!BCmY+=z< zHF8-NTC`PdQ&%bO?tlBx zYKP#ELmejGYCGml5;(i){@sHTnTxYd@mw(3bT7*F%!K<7zWu07diOi$&x@3T`5Z2K ziY^}(oGvqeT|PJY#F^Zl+hHgB&!1QOs=rzAEAJG)pUk44<6TX5y_huh%)YJs#-%0Y zAx?4pC*8MH_%k^z3VwL7diSTJuNR-Zy`A&+n(2m5QYP;GT;C!2Nm?o=Y>4n7&}rx!K`sXcr8;Z)mI4c6Bi>wj>*Gk%`AzeH}DpZUhT ze;j2p7W`dJA`6?Nl@>76?uv{wNfxL*wQp(BqsJWS%$k?gljqvXUd=cV_B7#8@obAf zsf8ClH^c>J zf4s0++A_X|b%}zl?li+n^J4e;6}Og4NSbKa8!=@XR=tzF(weS*_nhv|%oic74~v9X zY<;|1N3q~s-`MKmM#0+B(&(H}J(Ip$p4Z9$Hm1zARE+dSu4!ndffb zbD1u{zUtTJ-iTj+EA*y5`0+-=RKE7m%0tQ)d*(f#pR+-?f6c_&Z>&pOj~9rQAopAl*FVn4YC&CWQ zP8AV2@r#Y=tKXidqPpj2-{btxFIePvW7ePjAqyWo%Rbnh*6`3__U?5&%=bcGuV=me z>yXBwuDp!@!Wa0p~1n+lxGi1sHOZrYJryq*gawEdV&VJjfs&n(!ELn5uU@Y^d6YpkR;kozos%OnM ztwpz%Ccc^0Y-rv6iB)?+XM>^n>^HivKTHdKps9O2d-b9C*yj819Cq1yICPsWR6Ulw zLv!wnJ2E|%b1&$mNyXTG+rM*e|983m7^iEgpD(=hePb1P@OL#|!GqQEn(H?R=U&?U zsWtJBma*ZDh1ppvBR*MO&EMNDm8+EcD`lP9vWXKXx_Iz7c?F1m$<%zYcIAxU-+ryU z*MIx%;jq-_vk!5;u9S1 zTsRmpzpAG#|6IYhMopFdp$B$Zem8n@{bt6hOHw;T%zJM6Z+BJPx!0e)Ow>o^uvGW+ z-|{;w%A`zZZ<}mYYZNY~mvkii_{`mJgx`E!x2!p3HH&D=x~mDRS0!J0QhFwSr}TP# zhdUD-OYZL%eLaOUWbfYATkPteo?pr8%dMJadH#;`?khXyzrA%`bpcnS5=(P+dBW{i z?Verz%l>WF-)ZnjuqJ%nrMgA*ba z=P%5QByWEgVO2G)V6e6S+wkVk(HD=BHBZN%zG>Y)c~^p-@YbR@xj8bGLicZ(_Fnzm zK6#FW@7ZN+UQvflEVcZDPAs(G3g9ZE=B-r+=t( zSCrJ$Puo{w-}y0Z&E)^RQ`p^t|9*_i$=~C9_qw`<^*7UV@kT*nI#Rw)O|4zM@y+3P?%qp0eG zly-7AfIH zi?)<3KYa1#yYFeg1@0~pi42#1Wh|@i7qN$T>Vw>zt|_-xO}>5Vtxxs0&}$+oA0E80 z`*Lb))fcO$8q;3zPkJxCFZIu=)Tx5!nOn2(pJZCto;SKi?ztDkF4oiF93{KF*T zmhq{C*ndgC*_Z9Vc=BaIsmO}A0*xjgjxS!p=Hk#)(j3;T)Xf|CD__3;&AG?x_Zuw^ p3lzEdjdcgKReI}9{MCQrCezoe^Y+~1W?*1o@O1TaS?83{1OQ*mxHkX* diff --git a/logdoctor/resources/flags/it.png b/logdoctor/resources/flags/it.png deleted file mode 100644 index 0d13d3a620bde9591ce2b70e9c804f69b44b41af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1264 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?Fj+V@eol|V$v0Ik)g05Cs*DAIupO zgA}Ber2N!N2zM}xI+1syKeGRAIsefc$^CC<%2qdL)Xbi_(f0cDJJs*ndAD4P%3izm zT2%J``739xi;62NFno3J`JT&#^INv|M_p=X=u0YiIPvFO|9REPoA1BRx9Ho8F*8Db7{KYRD+{&^3d_g}xh5AS+@Hs#FebLru4R5iYKUE1SSsOPXSeJX<+?@r+j zB0t;?m&Sgnvh6sb*I>VYcWw3AN&6XoNFMMH6j{sexMAm(EnBK3Uhtov`?_>(`NStz zdGA$+a_T#Nj%C;^Xdu7m+n?uM@0rhCevxswk9mjG1+D;=6AxQO7#jZHDAbu}$2+0p z@ec8}hd&P{6xeYc7H>Yt@GyZP+2=v^y??LPMn_Nkll*q=ceBN3_m_!WVPs_8d^cl^Fe6kP1TT6=4XGNsZO3N z{coGdi58_96Brp;Qa|v1jbA%Y>!iVCp3V2y=qoZVIQ`&rX@KjpW&eUt%5c?n{eI~h z!!obGN>6!-$-FJDdzW7lO#A8}uyO6>Ru#64QxA#-rRt`qNqQ`v-TzDFgGx)zBt{5Fon%bG-_ zTjUv3r*`#y1YHGu;BvJ zUx^p(njh>MVk5pW@=ZEW!MykJ`g?J;9A2feYkQwpeyEi%E-qet-fuZ`GS8N4k6*K# zKF`9WByiAP>BcrgrlQ$V|D)Ek@o~I4&c5Id%THC4eQX=slJDlm{LiwV9{%-;yMDD& zQO^@ji*qX#IK;kx`*u!a>A6WZ+zE^a4zGKCs5Ev*)Z_1eYmWq4)R@m$bH=cfnTt)S zqoI*$Utm=2!rJGTvtPfK-n>7m=K0O-jD-)&?2h%$E?+on`s-7tx;PJCc>T3%IfG7= zw64J>|35#TZ9RVY_xJwp4s(}9zrvo(yY$Pv{g0x_x7&NI%eSp#K0ALJwCq^B_5Y23 atm@|XHM25thdFpYWkgbZ{M8zQ*+|3>e>0v-tC!T_h$PWqc`Wy z)!nbze{<$fMnNT)4gp1{mZi+AmtC4^oZj>9-Mb~PcfIah;mUDw$<{K4hT?aujuV8P zQaUp(l-~W#aA)1RbqfSp^ka9WNVRPgZn$~zVqx90;*SQG-oAZn%^;(&$TsNI+Kmx8 zGZQ5q%xN}cQ(_W4XyU7}biouS8@cns7avU34$l(|Y%893F)Cf>^e)w?EWjGYIo-ALi}-VNbKCt zt_quT!7D|M9Xs}5*Sk4M&qWSc-p{}Nt@ve$lv79R;|Yca#|~Jw3ovcVJ-igDA zSbm97;Lu0T6np#b`{inD*+Q)eE>-u}num5(d7yNg|K%nID`NBocV&B(pBo-&tD z1uJ!#zkl$}eYx0s^Qg%UjoGS;b`|;Y&!3q(Wu5c#b57!ak8&=II@a**uccFJ-XjLB ze?PvzOZ-!mR_L^1nxR1S<&dAZZPpymj4GJweQ)b+@AnRycJu0_oe?tJeEe&VVH10n z?n8+U*G-jg?tROcG-LVk@ragyWeLn zaWgb5+j~Cwt#rG*!n)@wc3;1oT-=^$QFfJk=g(=Ec?B7cZFt#iezE3>sDN{;MVf%V z{K{*(H$Gg;?zR@bzDw$97|&Yu`^UGf_djs+hSBQloGb-xqOospe0-a35U!Vh#%}RO zO{TUl2Wum?ZfF0#@3&<6{{O74XG#S!Rm}1a%$go|y!MF`1yeRhig2|C9=q{%7R!?&%bvczDwi*-ul-^_S2;g(mN`RD?)`mt zQ+on6uSCSh&(FR6ZIc2=nAXy3&p!WL&eeJ-ZS7YvhS^)Ly>1oY4D_0PBxz$;^i!G1 zL0pak2R_^ESjT<;d$&u;#NvOv&;NXRcX#*Z(B)#kfB)_moapNkUs6_SeSKZvu^DbH9N<#s cq2ST|1?xC6wjbXHDhwGsUHx3vIVCg!0O+=FfB*mh -- GitLab From 0c7375dcf1cb8b0bed74fad3b1bb06e950b3171a Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 20:56:04 +0200 Subject: [PATCH 26/34] Updated resources Added new qm files. Removed unused icons. --- logdoctor/resources/resources.qrc | 49 +++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/logdoctor/resources/resources.qrc b/logdoctor/resources/resources.qrc index e4f5fda..dd54db2 100644 --- a/logdoctor/resources/resources.qrc +++ b/logdoctor/resources/resources.qrc @@ -3,12 +3,51 @@ logo/logdoctor.svg + translations/LogDoctor_ar_AR.qm + translations/LogDoctor_az_AZ.qm + translations/LogDoctor_bg_BG.qm + translations/LogDoctor_bn_BN.qm + translations/LogDoctor_ca_SP.qm + translations/LogDoctor_cs_CZ.qm + translations/LogDoctor_da_DA.qm + translations/LogDoctor_de_GE.qm + translations/LogDoctor_el_GR.qm translations/LogDoctor_en_GB.qm - translations/LogDoctor_es_ES.qm + translations/LogDoctor_eo_EO.qm + translations/LogDoctor_es_SP.qm + translations/LogDoctor_et_ES.qm + translations/LogDoctor_fa_PE.qm + translations/LogDoctor_fi_FI.qm translations/LogDoctor_fr_FR.qm + translations/LogDoctor_ga_IR.qm + translations/LogDoctor_he_HE.qm + translations/LogDoctor_hi_IN.qm + translations/LogDoctor_hu_HU.qm + translations/LogDoctor_id_ID.qm translations/LogDoctor_it_IT.qm translations/LogDoctor_ja_JP.qm + translations/LogDoctor_ko_KO.qm + translations/LogDoctor_lt_LI.qm + translations/LogDoctor_lv_LA.qm + translations/LogDoctor_ms_MA.qm + translations/LogDoctor_nb_NB.qm + translations/LogDoctor_nl_NL.qm + translations/LogDoctor_pl_PL.qm translations/LogDoctor_pt_BR.qm + translations/LogDoctor_pt_PT.qm + translations/LogDoctor_ro_RO.qm + translations/LogDoctor_ru_RU.qm + translations/LogDoctor_sk_SK.qm + translations/LogDoctor_sl_SL.qm + translations/LogDoctor_sq_AL.qm + translations/LogDoctor_sv_SV.qm + translations/LogDoctor_th_TH.qm + translations/LogDoctor_tl_PH.qm + translations/LogDoctor_tr_TR.qm + translations/LogDoctor_uk_UK.qm + translations/LogDoctor_ur_PA.qm + translations/LogDoctor_zh_CN.qm + translations/LogDoctor_zt_CN.qm fonts/3270.ttf @@ -255,14 +294,6 @@ icons/midtone/spinbox_sub.png icons/midtone/up.png - - flags/br.png - flags/es.png - flags/fr.png - flags/gb.png - flags/it.png - flags/jp.png - games/crisscross/o.png games/crisscross/x.png -- GitLab From 98894f5821cb1149d9a51078c55c0c89ca3fdcd5 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 21:13:53 +0200 Subject: [PATCH 27/34] Version update Version 4.02 --- Dockerfile | 2 +- installation_stuff/osx_bundle/Info.plist | 4 ++-- logdoctor/CMakeLists.txt | 2 +- logdoctor/mainwindow.h | 2 +- version.txt | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5d6aae2..ba801f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,6 @@ RUN bash -c "scripts/DOCKER_private.sh" WORKDIR / RUN rm -rf /tmp/logdoctor -LABEL logdoctor.version=4.01 +LABEL logdoctor.version=4.02 ENTRYPOINT /usr/bin/logdoctor diff --git a/installation_stuff/osx_bundle/Info.plist b/installation_stuff/osx_bundle/Info.plist index 4474dbe79f..3677317 100644 --- a/installation_stuff/osx_bundle/Info.plist +++ b/installation_stuff/osx_bundle/Info.plist @@ -13,9 +13,9 @@ CFBundleIdentifier com.logdoctor.LogDoctor CFBundleShortVersionString - 4.01 + 4.02 CFBundleVersion - 4.01 + 4.02 CFBundleExecutable LogDoctor CFBundleIconFile diff --git a/logdoctor/CMakeLists.txt b/logdoctor/CMakeLists.txt index cd8a33d..3d64780 100644 --- a/logdoctor/CMakeLists.txt +++ b/logdoctor/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.5) -project(LogDoctor VERSION 4.01 LANGUAGES CXX) +project(LogDoctor VERSION 4.02 LANGUAGES CXX) include(cmake/project.cmake) logdoc_set_cmake_options() diff --git a/logdoctor/mainwindow.h b/logdoctor/mainwindow.h index f61f683..f5f4ed4 100644 --- a/logdoctor/mainwindow.h +++ b/logdoctor/mainwindow.h @@ -54,7 +54,7 @@ class MainWindow final : public QMainWindow Q_OBJECT // current version of LogDoctor - const float version{ 4.01f }; + const float version{ 4.02f }; public: diff --git a/version.txt b/version.txt index a25458e..06f35be 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -.:!¦version¦!:.4.01.:!¦version¦!:. +.:!¦version¦!:.4.02.:!¦version¦!:. -- GitLab From 99135982c4bad177cd07ccab3f004d47d919c4e6 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Sun, 4 Aug 2024 21:14:19 +0200 Subject: [PATCH 28/34] Updated Changelog --- logdoctor/modules/changelog/changelog.cpp | 14 ++++++++++++++ logdoctor/modules/changelog/changelog.ui | 11 ++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/logdoctor/modules/changelog/changelog.cpp b/logdoctor/modules/changelog/changelog.cpp index 723d804..61120c0 100644 --- a/logdoctor/modules/changelog/changelog.cpp +++ b/logdoctor/modules/changelog/changelog.cpp @@ -261,6 +261,20 @@ void Changelog::on_tree_Versions_itemClicked(QTreeWidgetItem* item, int index) content.append( tr("Tests improvements") ); content.append( R"(

    - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers false @@ -79,6 +79,11 @@ true
    + + + v4.02 + + v4.01 @@ -206,7 +211,7 @@ - QTextEdit::NoWrap + QTextEdit::LineWrapMode::NoWrap <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -219,7 +224,7 @@ li.checked::marker { content: "\2612"; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + Qt::TextInteractionFlag::TextSelectableByKeyboard|Qt::TextInteractionFlag::TextSelectableByMouse -- GitLab From d33f63ef17c1617eec8a010e2e000aa60045580e Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Wed, 28 Aug 2024 20:37:46 +0200 Subject: [PATCH 29/34] Code improvements Replaced size_t with std::size_t --- logdoctor/games/crisscross/game.cpp | 4 +- logdoctor/games/crisscross/game.h | 2 +- logdoctor/games/snake/game.h | 2 +- logdoctor/games/snake/snake.cpp | 45 ++++++++----------- logdoctor/main.cpp | 2 +- logdoctor/mainwindow.cpp | 24 +++++----- logdoctor/modules/craphelp/craphelp.cpp | 16 +++---- logdoctor/modules/craplog/craplog.cpp | 32 ++++++------- logdoctor/modules/craplog/craplog.h | 32 ++++++------- .../modules/craplog/modules/formats/parse.cpp | 36 +++++++-------- .../craplog/modules/formats/samples.cpp | 2 +- logdoctor/modules/craplog/modules/lib.h | 10 ++--- .../modules/craplog/utilities/datetime.cpp | 4 +- logdoctor/modules/craplog/utilities/logs.cpp | 10 ++--- logdoctor/modules/craplog/workers/lister.cpp | 2 +- logdoctor/modules/craplog/workers/parser.cpp | 18 ++++---- logdoctor/modules/craplog/workers/parser.h | 20 ++++----- .../craplog/workers/parser/logs_data.cpp | 40 ++++++++--------- .../craplog/workers/parser/logs_data.h | 8 ++-- .../crapview/datatypes/count_stats.cpp | 2 +- .../crapview/datatypes/daytime_stats.cpp | 2 +- .../modules/crapview/datatypes/global_stats.h | 16 +++---- .../crapview/datatypes/relational_stats.cpp | 6 +-- .../crapview/datatypes/relational_stats.h | 2 +- .../crapview/datatypes/speed_stats.cpp | 6 +-- .../crapview/datatypes/warning_stats.cpp | 20 ++++----- .../modules/crapview/modules/fetcher.cpp | 18 ++++---- .../modules/crapview/utilities/charts.cpp | 6 +-- .../modules/crapview/utilities/globals.h | 11 ++--- logdoctor/modules/database/database.cpp | 4 +- logdoctor/modules/database/database.h | 2 +- logdoctor/tests/white_box.cpp | 8 ++-- logdoctor/utilities/io.cpp | 18 ++++---- logdoctor/utilities/io.h | 2 +- logdoctor/utilities/memory.cpp | 14 +++--- logdoctor/utilities/memory.h | 7 +-- logdoctor/utilities/printables.cpp | 10 ++--- logdoctor/utilities/printables.h | 4 +- logdoctor/utilities/rtf.cpp | 12 ++--- logdoctor/utilities/strings.cpp | 40 ++++++++--------- logdoctor/utilities/strings.h | 6 +-- 41 files changed, 260 insertions(+), 265 deletions(-) diff --git a/logdoctor/games/crisscross/game.cpp b/logdoctor/games/crisscross/game.cpp index 26fc031..a0a2f16 100644 --- a/logdoctor/games/crisscross/game.cpp +++ b/logdoctor/games/crisscross/game.cpp @@ -288,12 +288,12 @@ void CrissCross::AI_playTurn() noexcept void CrissCross::AI_updateWeights() noexcept { // reset the weights - for ( size_t i{0ul}; i<9ul; ++i ) { + for ( std::size_t i{0ul}; i<9ul; ++i ) { this->board_weights[ i ] = 0; } // calculate the new weights unsigned win_streak, lose_streak; - std::vector empty_tiles (3); + std::vector empty_tiles (3); for ( const auto& sequence : this->sequences ) { // reset data win_streak = lose_streak = 0; diff --git a/logdoctor/games/crisscross/game.h b/logdoctor/games/crisscross/game.h index 0f6062d..737f0d2 100644 --- a/logdoctor/games/crisscross/game.h +++ b/logdoctor/games/crisscross/game.h @@ -72,7 +72,7 @@ private: QIcon(":/games/games/crisscross/x.png") }; - const size_t sequences[8][3]{ + const std::size_t sequences[8][3]{ {0,1,2},{3,4,5},{6,7,8}, // horizontal {0,3,6},{1,4,7},{2,5,8}, // vertical {0,4,8},{2,4,6} // diagonal diff --git a/logdoctor/games/snake/game.h b/logdoctor/games/snake/game.h index 1f9e48f..f52b5c2 100644 --- a/logdoctor/games/snake/game.h +++ b/logdoctor/games/snake/game.h @@ -100,7 +100,7 @@ private: //// SNAKE //// //! The maximum length of the snake - const size_t MAX_SNAKE_LENGTH{ 64 }; + const std::size_t MAX_SNAKE_LENGTH{ 64 }; //! The snake Snake snake; diff --git a/logdoctor/games/snake/snake.cpp b/logdoctor/games/snake/snake.cpp index e70ba19..2a1dcdc 100644 --- a/logdoctor/games/snake/snake.cpp +++ b/logdoctor/games/snake/snake.cpp @@ -64,20 +64,13 @@ const QPixmap& Snake::getHeadImage() const noexcept bool Snake::inTile( const unsigned x, const unsigned y, const bool avoid_tail ) const noexcept { - if ( this->size() > 0 ) { - size_t i{ 0 }; - size_t max{ this->size()-1ul }; - if ( !avoid_tail ) { - ++ max; - } - for ( auto bp{ this->cbegin() }; bp != this->cend(); ++bp ) { - if ( bp->x == x && bp->y == y ) { - return true; - } - ++i; - if ( i >= max ) { - break; - } + if ( this->empty() ) { + return false; + } + const auto max{ avoid_tail ? std::prev(this->cend()) : this->cend()}; + for ( auto bp{ this->cbegin() }; bp != max; ++bp ) { + if ( bp->x == x && bp->y == y ) { + return true; } } return false; @@ -143,9 +136,9 @@ void Snake::update( QGraphicsScene* field_scene, const bool dry , const bool is_ this->grow( is_borning ); field_scene->addItem( this->back().image ); } - // anyway, update the whole body - size_t i{ 0 }; - const size_t max_i{ this->size()-1ul }; + // update the whole body + std::size_t i{ 0 }; + const std::size_t max_i{ this->size()-1ul }; unsigned new_x, prev_x, new_y, prev_y; Direction new_direction, prev_direction, prev_body_d; const QPixmap& head_img{ (this->adversary) ? this->img_snakeHead_ : this->img_snakeHead }; @@ -427,7 +420,7 @@ void Snake::move( const Snake& adv_snake, const unsigned food_x, const unsigned this->updateFieldMap( adv_snake, food_x, food_y ); - for ( size_t i{0}; i<4ul; ++i ) { + for ( std::size_t i{0ul}; i<4ul; ++i ) { this->collectData( dataset.at(i), classes.at(i), adv_snake, food_x, food_y ); } @@ -443,10 +436,10 @@ Direction Snake::predictDirection( const std::array,4>& data Direction class_label{ this->head_direction }; // process data - for ( size_t i{0}; i<4ul; ++i ) { + for ( std::size_t i{0ul}; i<4ul; ++i ) { const std::array& d = data.at(i); float& r = results[i]; - for ( size_t j{0}; j<7ul; ++j ) { + for ( std::size_t j{0ul}; j<7ul; ++j ) { r += d.at(j) * weights.at(j); } } @@ -462,12 +455,12 @@ Direction Snake::predictDirection( const std::array,4>& data } } if ( max != min ) { - for ( size_t i{0}; i<4ul; ++i ) { + for ( std::size_t i{0ul}; i<4ul; ++i ) { results[i] = (results[i]-min) / (max-min); } } else { keep_current |= true; - for ( size_t i{0}; i<4ul; ++i ) { + for ( std::size_t i{0ul}; i<4ul; ++i ) { results[i] = 0.f; } } @@ -475,7 +468,7 @@ Direction Snake::predictDirection( const std::array,4>& data // choose the best result if ( ! keep_current ) { max = 0.f; - for ( size_t i{0}; i<4ul; ++i ) { + for ( std::size_t i{0ul}; i<4ul; ++i ) { if ( results[i] > max ) { class_label = classes.at(i); max = results[i]; @@ -757,8 +750,8 @@ void Snake::collectData( std::array& data, const Direction& direction, void Snake::updateFieldMap( const Snake& adv_snake, const unsigned& food_x, const unsigned& food_y ) noexcept { // reset to default state - for ( size_t x{0}; x<16ul; ++x ) { - for ( size_t y{0}; y<16ul; ++y ) { + for ( std::size_t x{0ul}; x<16ul; ++x ) { + for ( std::size_t y{0ul}; y<16ul; ++y ) { Tile& t = this->field_map.at(x).at(y); t.entity = Entity::N; t.s_index = 0u; @@ -862,7 +855,7 @@ std::array Snake::checkAround( const Direction& direction, const uns } unsigned x_, y_; - for ( size_t i{0}; i<8ul; ++i ) { + for ( std::size_t i{0ul}; i<8ul; ++i ) { x_ = x; x_ += x_pattern.at(i); y_ = y; diff --git a/logdoctor/main.cpp b/logdoctor/main.cpp index 546aa87..309391a 100644 --- a/logdoctor/main.cpp +++ b/logdoctor/main.cpp @@ -8,7 +8,7 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); - qRegisterMetaType(); + qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); diff --git a/logdoctor/mainwindow.cpp b/logdoctor/mainwindow.cpp index 83e2d4b..d9abf21 100644 --- a/logdoctor/mainwindow.cpp +++ b/logdoctor/mainwindow.cpp @@ -2815,7 +2815,7 @@ void MainWindow::on_button_LogFiles_ViewFile_clicked() // check the size if ( proceed ) { - const size_t warn_size{ this->craplog.getWarningSize() }; + const std::size_t warn_size{ this->craplog.getWarningSize() }; if ( warn_size > 0ul ) { if ( item.size() > warn_size ) { // exceeds the warning size @@ -2927,7 +2927,7 @@ void MainWindow::on_listLogFiles_itemChanged(QTreeWidgetItem *item, int column) Q_UNUSED(item) Q_UNUSED(column) // control checked - size_t n_checked{ 0ul }; + std::size_t n_checked{ 0ul }; QTreeWidgetItemIterator i(this->ui->listLogFiles); while ( *i ) { if ( (*i)->checkState(0) == Qt::CheckState::Checked ) { @@ -3010,7 +3010,7 @@ void MainWindow::resetPerfsLabels() void MainWindow::updatePerfsLabels() { if ( this->craplog.isParsing() || this->force_updating_labels ) { - const size_t size{ this->craplog.getParsedSize() }; + const std::size_t size{ this->craplog.getParsedSize() }; this->ui->label_MakeStats_Size->setText( PrintSec::printableSize( size ) ); this->ui->label_MakeStats_Lines->setText( QString::number( this->craplog.getParsedLines() ) ); this->ui->label_MakeStats_Speed->setText( this->craplog.getParsingSpeed() ); @@ -3038,7 +3038,7 @@ void MainWindow::craplogFinished() this->force_updating_labels &= false; // draw the chart this->craplog.makeChart( - this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), + this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), this->fonts, this->ui->chart_MakeStats_Size ); ColorSec::applyChartTheme( @@ -3214,7 +3214,7 @@ void MainWindow::drawStatsWarn() this->ui->chart_StatsWarn->setChart( new QChart() ); this->crapview.drawWarn( this->ui->table_StatsWarn, this->ui->chart_StatsWarn, - this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), + this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), this->wsFromIndex( wsIndex ), this->ui->box_StatsWarn_Year->currentText(), this->ui->box_StatsWarn_Month->currentText(), @@ -3392,7 +3392,7 @@ void MainWindow::drawStatsSpeed() this->crapview.drawSpeed( this->ui->table_StatsSpeed, this->ui->chart_StatsSpeed, - this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), + this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), this->wsFromIndex( this->ui->box_StatsSpeed_WebServer->currentIndex() ), this->ui->box_StatsSpeed_Year->currentText(), this->ui->box_StatsSpeed_Month->currentText(), @@ -3628,7 +3628,7 @@ void MainWindow::drawStatsCount() this->ui->chart_StatsCount->setChart( new QChart() ); this->crapview.drawCount( this->ui->table_StatsCount, this->ui->chart_StatsCount, - this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), + this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), this->wsFromIndex( this->ui->box_StatsCount_WebServer->currentIndex() ), this->ui->box_StatsCount_Year->currentText(), this->ui->box_StatsCount_Month->currentText(), @@ -3913,7 +3913,7 @@ void MainWindow::drawStatsDay() this->ui->chart_StatsDay->setChart( new QChart() ); this->crapview.drawDay( this->ui->chart_StatsDay, - this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), + this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), this->wsFromIndex( this->ui->box_StatsDay_WebServer->currentIndex() ), this->ui->box_StatsDay_FromYear->currentText(), this->ui->box_StatsDay_FromMonth->currentText(), @@ -4205,7 +4205,7 @@ void MainWindow::drawStatsRelat() this->ui->chart_StatsRelat->setChart( new QChart() ); this->crapview.drawRelat( this->ui->chart_StatsRelat, - this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), + this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ), this->wsFromIndex( this->ui->box_StatsRelat_WebServer->currentIndex() ), this->ui->box_StatsRelat_FromYear->currentText(), this->ui->box_StatsRelat_FromMonth->currentText(), @@ -4645,7 +4645,7 @@ void MainWindow::refreshChartsPreview() QChart* t_chart{ new QChart() }; // apply the theme - t_chart->setTheme( this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ) ); + t_chart->setTheme( this->CHARTS_THEMES.at( static_cast(GlobalConfigs::charts_theme) ) ); // add the bars t_chart->addSeries( bars ); t_chart->setTitle( "Sample preview" ); @@ -4916,13 +4916,13 @@ void MainWindow::on_checkBox_ConfControl_Size_clicked(bool checked) // enable warning this->ui->spinBox_ConfControl_Size->setEnabled( true ); this->craplog.setWarningSize( - (static_cast(this->ui->spinBox_ConfControl_Size->value()) * 1'048'576ul) +1ul ); + (static_cast(this->ui->spinBox_ConfControl_Size->value()) * 1'048'576ul) +1ul ); } } void MainWindow::on_spinBox_ConfControl_Size_editingFinished() { this->craplog.setWarningSize( - (static_cast(this->ui->spinBox_ConfControl_Size->value()) * 1'048'576ul) +1ul ); + (static_cast(this->ui->spinBox_ConfControl_Size->value()) * 1'048'576ul) +1ul ); } diff --git a/logdoctor/modules/craphelp/craphelp.cpp b/logdoctor/modules/craphelp/craphelp.cpp index dfa3722..3e6b45d 100644 --- a/logdoctor/modules/craphelp/craphelp.cpp +++ b/logdoctor/modules/craphelp/craphelp.cpp @@ -74,19 +74,19 @@ void Craphelp::helpLogsFormat( const std::string& path, const QFont& font, const if ( colors_scheme_id == ColorsScheme::None ) { // remove the style for the colors while (true) { - const size_t start{ aux.find( "background-color:" ) }; + const std::size_t start{ aux.find( "background-color:" ) }; if ( start == std::string::npos ) { break; } - const size_t stop{ aux.find( ";\n", start ) + 2ul }; + const std::size_t stop{ aux.find( ";\n", start ) + 2ul }; aux.erase( start, stop-start ); } while (true) { - const size_t start{ aux.find( "color:" ) }; + const std::size_t start{ aux.find( "color:" ) }; if ( start == std::string::npos ) { break; } - const size_t stop{ aux.find( ";\n", start ) + 2ul }; + const std::size_t stop{ aux.find( ";\n", start ) + 2ul }; aux.erase( start, stop-start ); } content = QString::fromStdString( aux ); @@ -124,19 +124,19 @@ void Craphelp::helpLogsFormatDefault( std::string_view file_name, const QFont& f if ( colors_scheme_id == ColorsScheme::None ) { // remove the style for the colors while (true) { - const size_t start{ aux.find( "background-color:" ) }; + const std::size_t start{ aux.find( "background-color:" ) }; if ( start == std::string::npos ) { break; } - const size_t stop{ aux.find( ";", start ) + 1ul }; + const std::size_t stop{ aux.find( ";", start ) + 1ul }; aux.erase( start, stop-start ); } while (true) { - const size_t start{ aux.find( "color:" ) }; + const std::size_t start{ aux.find( "color:" ) }; if ( start == std::string::npos ) { break; } - const size_t stop{ aux.find( ";", start ) + 1ul }; + const std::size_t stop{ aux.find( ";", start ) + 1ul }; aux.erase( start, stop-start ); } content = QString::fromStdString( aux ); diff --git a/logdoctor/modules/craplog/craplog.cpp b/logdoctor/modules/craplog/craplog.cpp index 02c3e19..8ef2b0e 100644 --- a/logdoctor/modules/craplog/craplog.cpp +++ b/logdoctor/modules/craplog/craplog.cpp @@ -108,12 +108,12 @@ void Craplog::setHashesDatabasePath( const PathHandler& path ) noexcept this->db_hashes_path = path / DatabasesNames::hashes; } -size_t Craplog::getWarningSize() const noexcept +std::size_t Craplog::getWarningSize() const noexcept { return this->warning_size; } -void Craplog::setWarningSize(const size_t new_size ) noexcept +void Craplog::setWarningSize(const std::size_t new_size ) noexcept { this->warning_size = new_size; } @@ -246,7 +246,7 @@ void Craplog::setLogsPath( const WebServer& web_server, const PathHandler& new_p /////////////////// //// LOGS LIST //// // return the size of the list -size_t Craplog::getLogsListSize() const noexcept +std::size_t Craplog::getLogsListSize() const noexcept { return this->logs_list.size(); } @@ -383,7 +383,7 @@ bool Craplog::isFileNameValid( const std::string& name ) const case WS_NGINX: { // further checks for apache / nginx - size_t start, stop; + std::size_t start, stop; start = name.rfind(".log." ); if ( start == std::string::npos ) { return false; @@ -394,7 +394,7 @@ bool Craplog::isFileNameValid( const std::string& name ) const stop -= 3ul; } // serach for incremental numbers - for ( size_t i{start}; i<=stop; ++i ) { + for ( std::size_t i{start}; i<=stop; ++i ) { if ( ! CharOps::isNumeric( name.at( i ) ) ) { return false; } @@ -404,7 +404,7 @@ bool Craplog::isFileNameValid( const std::string& name ) const case WS_IIS: { // further checks for iis - size_t start, stop; + std::size_t start, stop; start = name.find( this->logs_base_names.at( WS_IIS ).contains ) + 3ul; if ( start == std::string::npos ) { return false; @@ -415,7 +415,7 @@ bool Craplog::isFileNameValid( const std::string& name ) const } // search for date std::string date; - for ( size_t i{start}; i<=stop; ++i ) { + for ( std::size_t i{start}; i<=stop; ++i ) { if ( ! CharOps::isNumeric( name.at( i ) ) ) { return false; } @@ -428,7 +428,7 @@ bool Craplog::isFileNameValid( const std::string& name ) const char aux_date[7]; // using strftime to display time strftime( aux_date, 7, "%y%m%d", tmp ); - for ( size_t i{0}; i<6ul; ++i ) { + for ( std::size_t i{0ul}; i<6ul; ++i ) { if ( date.at(i) != aux_date[i] ) { // different date, valid return true; @@ -451,7 +451,7 @@ bool Craplog::checkStuff() { this->proceed |= true; { - const size_t l_size{ this->logs_list.size() }; + const std::size_t l_size{ this->logs_list.size() }; this->log_files_to_use.clear(); if ( this->log_files_to_use.capacity() < l_size ) { this->log_files_to_use.reserve( l_size ); @@ -462,7 +462,7 @@ bool Craplog::checkStuff() } } - size_t logs_size{ 0ul }; + std::size_t logs_size{ 0ul }; for ( const LogFile& file : this->logs_list ) { if ( ! file.isSelected() ) { @@ -723,12 +723,12 @@ bool Craplog::editedDatabase() const noexcept } -size_t Craplog::getParsedSize() noexcept +std::size_t Craplog::getParsedSize() noexcept { std::unique_lock lock( this->mutex ); return this->parsed_size; } -size_t Craplog::getParsedLines() noexcept +std::size_t Craplog::getParsedLines() noexcept { std::unique_lock lock( this->mutex ); return this->parsed_lines; @@ -767,13 +767,13 @@ bool Craplog::isParsing() const noexcept return this->is_parsing; } -void Craplog::updatePerfData( const size_t parsed_size, const size_t parsed_lines ) noexcept +void Craplog::updatePerfData( const std::size_t parsed_size, const std::size_t parsed_lines ) noexcept { std::unique_lock lock( this->mutex ); this->parsed_size = parsed_size; this->parsed_lines = parsed_lines; } -void Craplog::updateChartData( const size_t total_size, const size_t total_lines, const size_t blacklisted_size ) noexcept +void Craplog::updateChartData( const std::size_t total_size, const std::size_t total_lines, const std::size_t blacklisted_size ) noexcept { std::unique_lock lock( this->mutex ); this->total_size = total_size; @@ -805,7 +805,7 @@ void Craplog::makeChart( const QChart::ChartTheme& theme, const std::unordered_m // logs size donut chart QPieSeries* parsedSize_donut{ new QPieSeries() }; parsedSize_donut->setName( PrintSec::printableSize( this->parsed_size ) ); - const size_t parsed_size{ this->parsed_size - this->blacklisted_size }; + const std::size_t parsed_size{ this->parsed_size - this->blacklisted_size }; parsedSize_donut->append( "P@" + parsed_slice_name + "@" + PrintSec::printableSize( parsed_size ), static_cast( parsed_size ) ); @@ -815,7 +815,7 @@ void Craplog::makeChart( const QChart::ChartTheme& theme, const std::unordered_m // logs size donut chart QPieSeries* ignoredSize_donut{ new QPieSeries() }; - const size_t ignored_size{ this->total_size - this->parsed_size }; + const std::size_t ignored_size{ this->total_size - this->parsed_size }; QString printable_ignored_size{ PrintSec::printableSize( ignored_size ) }; ignoredSize_donut->setName( printable_ignored_size ); ignoredSize_donut->append( diff --git a/logdoctor/modules/craplog/craplog.h b/logdoctor/modules/craplog/craplog.h index 6ef26b6..957f9ec 100644 --- a/logdoctor/modules/craplog/craplog.h +++ b/logdoctor/modules/craplog/craplog.h @@ -138,7 +138,7 @@ public: \return The number of files actually in the list \see logs_list */ - size_t getLogsListSize() const noexcept; + std::size_t getLogsListSize() const noexcept; //! Returns the LogFile instance of the given file /*! @@ -230,10 +230,10 @@ public: //// WARNING SIZE //// //! Returns the currently set warning size for the log files - size_t getWarningSize() const noexcept; + std::size_t getWarningSize() const noexcept; //! Sets the new warning size for the log files - void setWarningSize( const size_t new_size ) noexcept; + void setWarningSize( const std::size_t new_size ) noexcept; //////////////////// @@ -265,10 +265,10 @@ public: //// PERFORMANCES //// //! Returns the total logs size - size_t getParsedSize() noexcept; + std::size_t getParsedSize() noexcept; //! Returns the parsed logs lines - size_t getParsedLines() noexcept; + std::size_t getParsedLines() noexcept; //! Returns the speed on parsing logs QString getParsingSpeed() noexcept; @@ -310,12 +310,12 @@ public slots: void stopWorking( const bool successful ); - void updatePerfData( const size_t parsed_size, - const size_t parsed_lines ) noexcept; + void updatePerfData( const std::size_t parsed_size, + const std::size_t parsed_lines ) noexcept; - void updateChartData( const size_t total_size, - const size_t total_lines, - const size_t blacklisted_size ) noexcept; + void updateChartData( const std::size_t total_size, + const std::size_t total_lines, + const std::size_t blacklisted_size ) noexcept; void showWorkerDialog( const WorkerDialog dialog_type, const QStringList args ) const noexcept; @@ -355,11 +355,11 @@ private: ////////////////////// //// PERFORMANCES //// - size_t total_lines { 0ul }; // total number of logs lines - size_t parsed_lines { 0ul }; // number of parsed logs lines - size_t total_size { 0ul }; // total size of the logs - size_t parsed_size { 0ul }; // size of the logs which have been used - size_t blacklisted_size { 0ul }; // size of the logs which has been blacklisted + std::size_t total_lines { 0ul }; // total number of logs lines + std::size_t parsed_lines { 0ul }; // number of parsed logs lines + std::size_t total_size { 0ul }; // total size of the logs + std::size_t parsed_size { 0ul }; // size of the logs which have been used + std::size_t blacklisted_size { 0ul }; // size of the logs which has been blacklisted std::chrono::system_clock::time_point parsing_time_start, parsing_time_stop; @@ -378,7 +378,7 @@ private: //// LOGS CONTROL //// // warning size, in Bytes - size_t warning_size{ (1'048'576u * 50u) +1u }; // => 1 MiB * x + std::size_t warning_size{ (1'048'576u * 50u) +1u }; // => 1 MiB * x //////////////////// diff --git a/logdoctor/modules/craplog/modules/formats/parse.cpp b/logdoctor/modules/craplog/modules/formats/parse.cpp index 24d6ece..c02666e 100644 --- a/logdoctor/modules/craplog/modules/formats/parse.cpp +++ b/logdoctor/modules/craplog/modules/formats/parse.cpp @@ -26,7 +26,7 @@ namespace /*private*/ \return The number of new lines in a single log line \see LogsFormat, processApacheFormatString(), processNginxFormatString() */ -size_t countNewLines( std::string_view initial, std::string_view final, const std::vector& separators ); +std::size_t countNewLines( std::string_view initial, std::string_view final, const std::vector& separators ); //! Parses the escapes (backslashes) and returns the resulting string @@ -66,7 +66,7 @@ bool checkNginxFieldChar( const char& chr ); \return The ending poin of the field in the string \see processNginxFormatString() */ -size_t findNginxFieldEnd( const std::string& string, const size_t start ); +std::size_t findNginxFieldEnd( const std::string& string, const std::size_t start ); //! Checks whether the given character is valid or not @@ -134,8 +134,8 @@ LogsFormat parseApacheFormatString( const std::string& f_str ) // parse the string to convert keyargs in craplog's fields format bool is_strftime_sep{ false }; int n_fld{ 0 }; - size_t start, stop{0ul}, aux, aux_start, aux_stop; - const size_t max{ f_str.size()-1ul }; + std::size_t start, stop{0ul}, aux, aux_start, aux_stop; + const std::size_t max{ f_str.size()-1ul }; std::string aux_fld, aux_fld_v, cur_sep; LogsFormatField cur_fld{ _INVALID }; // find and convert any field @@ -194,7 +194,7 @@ LogsFormat parseApacheFormatString( const std::string& f_str ) // remove the per-status directives (if any) if ( CharOps::isNumeric( c ) || c == '!' || c == ',' ) { // per-status, not important for LogDoctor - size_t aux_aux{ aux+1ul }; + std::size_t aux_aux{ aux+1ul }; while (true) { if ( aux_aux > max ) { break; @@ -278,7 +278,7 @@ LogsFormat parseApacheFormatString( const std::string& f_str ) } else /*if ( aux_fld_v == "t" )*/ { // only 't' remaining - size_t aux_aux{ aux_fld.find( '%' ) }; + std::size_t aux_aux{ aux_fld.find( '%' ) }; if ( aux_aux == std::string::npos ) { // no concatenation, only valid fields used, anything else used as text // whole content used as varname @@ -296,7 +296,7 @@ LogsFormat parseApacheFormatString( const std::string& f_str ) } else { // concatenation allowed, only strftime() value used as fields, everything else treated as text - size_t aux_aux_start, + std::size_t aux_aux_start, aux_aux_stop{0}; std::string aux_aux_fld; while (true) { @@ -307,7 +307,7 @@ LogsFormat parseApacheFormatString( const std::string& f_str ) aux_aux = aux_fld.find( '%', aux_aux_stop ); // check if false positive if ( aux_aux != std::string::npos ) { - const size_t aux_aux_{ aux_aux+1ul }; + const std::size_t aux_aux_{ aux_aux+1ul }; if ( aux_aux_ >= aux_fld.size() ) { aux_aux = std::string::npos; break; @@ -451,8 +451,8 @@ LogsFormat parseNginxFormatString( const std::string& f_str ) std::vector fields; // parse the string to convert keyargs in craplog's fields format bool finished{ false }; - size_t start, aux, stop{0ul}; - const size_t max{ f_str.size()-1ul }; + std::size_t start, aux, stop{0ul}; + const std::size_t max{ f_str.size()-1ul }; std::string cur_fld, cur_sep; // find and convert any field while (true) { @@ -542,8 +542,8 @@ LogsFormat parseIisFormatString( const std::string& f_str, const IISLogsModule l // W3C logging module if ( f_str.size() > 0ul ) { bool finished{ false }; - size_t start, stop{0ul}; - const size_t max{ f_str.size()-1ul }; + std::size_t start, stop{0ul}; + const std::size_t max{ f_str.size()-1ul }; std::string cur_fld; const std::string cur_sep{ " " }; const auto& f_map{ getIisFields() }; @@ -600,9 +600,9 @@ LogsFormat parseIisFormatString( const std::string& f_str, const IISLogsModule l namespace /*private*/ { -size_t countNewLines( std::string_view initial, std::string_view final, const std::vector& separators ) +std::size_t countNewLines( std::string_view initial, std::string_view final, const std::vector& separators ) { - size_t nl{ 0ul }; + std::size_t nl{ 0ul }; nl += StringOps::count( initial, '\n' ); nl += StringOps::count( final, '\n' ); for ( const std::string& sep : separators ) { @@ -617,7 +617,7 @@ std::string parseApacheEscapes( std::string_view string , const bool strftime ) if ( string.empty() ) { return std::string{string}; } - size_t i{ 0ul }, + std::size_t i{ 0ul }, max{ string.size()-1ul }; std::string str1; str1.reserve( string.size() ); @@ -720,8 +720,8 @@ std::string parseNginxEscapes( std::string_view string ) if ( string.empty() ) { return std::string{string}; } - size_t i{ 0ul }; - const size_t max{ string.size()-1ul }; + std::size_t i{ 0ul }; + const std::size_t max{ string.size()-1ul }; char c, cc; std::string str; str.reserve( string.size() ); @@ -771,7 +771,7 @@ bool checkNginxFieldChar( const char& chr ) return CharOps::isAlnum( chr ) || chr == '_'; } -size_t findNginxFieldEnd( const std::string& string, const size_t start ) +std::size_t findNginxFieldEnd( const std::string& string, const std::size_t start ) { if ( string.empty() || start >= string.size()-1ul ) { return start; diff --git a/logdoctor/modules/craplog/modules/formats/samples.cpp b/logdoctor/modules/craplog/modules/formats/samples.cpp index ffae866..71d08ac 100644 --- a/logdoctor/modules/craplog/modules/formats/samples.cpp +++ b/logdoctor/modules/craplog/modules/formats/samples.cpp @@ -77,7 +77,7 @@ QString makeSample( const samples_umap_t& map, const LogsFormat& logs_format ) QString sample; // append the initial characters sample += QString::fromStdString( logs_format.initial ); - for ( size_t i{0ul}; iused_already; } //! Returns the size of the file - inline size_t size() const noexcept + inline std::size_t size() const noexcept { return this->size_; } //! Returns the name of the file, to be displayed in the list inline const QString& name() const noexcept @@ -61,7 +61,7 @@ struct LogFile final private: bool selected; bool used_already; - size_t size_; + std::size_t size_; QString name_; std::string hash_; PathHandler path_; @@ -152,10 +152,10 @@ struct LogsFormat final std::string final; //!< The final separator std::vector separators; //!< The separators in the middle std::vector fields; //!< The logged fields - size_t new_lines; //!< The number of new lines within the string + std::size_t new_lines; //!< The number of new lines within the string explicit LogsFormat() noexcept = default; - explicit LogsFormat(const std::string& str,std::string&& itl,std::string&& fnl,std::vector&& seps,std::vector&& flds,const size_t nl) noexcept + explicit LogsFormat(const std::string& str,std::string&& itl,std::string&& fnl,std::vector&& seps,std::vector&& flds,const std::size_t nl) noexcept :string{str},initial{std::move(itl)},final{std::move(fnl)},separators{std::move(seps)},fields{std::move(flds)},new_lines{nl}{} }; diff --git a/logdoctor/modules/craplog/utilities/datetime.cpp b/logdoctor/modules/craplog/utilities/datetime.cpp index 417b43d..da50331 100644 --- a/logdoctor/modules/craplog/utilities/datetime.cpp +++ b/logdoctor/modules/craplog/utilities/datetime.cpp @@ -82,7 +82,7 @@ std::vector processDateTime( std::string_view datetime_, const Logs year = datetime.substr( datetime.size()-4 ); } else if ( format == date_time_gmt ) { - size_t start{ datetime.find( ", " ) + 2ul }; + std::size_t start{ datetime.find( ", " ) + 2ul }; day = datetime.substr( start, 2ul ); start += 3ul; month = convertMonth( datetime.substr( start, 3ul ) ); @@ -160,7 +160,7 @@ std::vector processDateTime( std::string_view datetime_, const Logs year += (y<10) ? "0"+std::to_string( y ) : std::to_string( y ); } else if ( format == date_time_mdyyyy ) { - size_t aux_; + std::size_t aux_; if ( datetime.at(2) == '/' ) { month = datetime.substr( 0ul, 2ul ); aux_ = 3ul; diff --git a/logdoctor/modules/craplog/utilities/logs.cpp b/logdoctor/modules/craplog/utilities/logs.cpp index bc32874..d583036 100644 --- a/logdoctor/modules/craplog/utilities/logs.cpp +++ b/logdoctor/modules/craplog/utilities/logs.cpp @@ -21,9 +21,9 @@ namespace /*private*/ */ bool deepTypeCheck( const std::string& line, const LogsFormat& format ) noexcept { - size_t n_sep{ format.separators.size() }, - n_sep_found{0}, n_blank_sep{0}, - found_at, aux_found_at1{0}, aux_found_at2; + std::size_t n_sep{ format.separators.size() }, + n_sep_found{0}, n_blank_sep{0}, + found_at, aux_found_at1{0}, aux_found_at2; std::string sep, aux_sep1, aux_sep2; // check the initial part if ( ! format.initial.empty() ) { @@ -35,7 +35,7 @@ bool deepTypeCheck( const std::string& line, const LogsFormat& format ) noexcept ++ n_blank_sep; } // check the middle part - for ( size_t i{0}; iquit(); return; } - size_t size; + std::size_t size; QString name; std::string path; // iterate over entries in the logs folder diff --git a/logdoctor/modules/craplog/workers/parser.cpp b/logdoctor/modules/craplog/workers/parser.cpp index 1947b07..32a02cf 100644 --- a/logdoctor/modules/craplog/workers/parser.cpp +++ b/logdoctor/modules/craplog/workers/parser.cpp @@ -229,7 +229,7 @@ void CraplogParser::parseLogLines() ++ this->parsed_lines; }}; - const auto signal_emission_gap{ [](const size_t n_lines)->size_t{ + const auto signal_emission_gap{ [](const std::size_t n_lines)->std::size_t{ return n_lines>10000ul ? n_lines/1000ul : n_lines>1000ul ? n_lines/100ul : n_lines>100ul ? n_lines/10ul @@ -239,11 +239,11 @@ void CraplogParser::parseLogLines() // parse all the lines if ( this->proceed ) { - const size_t n_lines{ this->logs_lines.size() }; - const size_t nl{ this->logs_format.new_lines }; - size_t send{ 0ul }; + const std::size_t n_lines{ this->logs_lines.size() }; + const std::size_t nl{ this->logs_format.new_lines }; + std::size_t send{ 0ul }; if ( nl == 0ul ) { - const size_t send_gap{ signal_emission_gap(n_lines) }; + const std::size_t send_gap{ signal_emission_gap(n_lines) }; const LogsFormat& lf {this->logs_format}; this->data_collection.reserve( n_lines ); for ( const std::string& line : this->logs_lines ) { @@ -254,13 +254,13 @@ void CraplogParser::parseLogLines() } } } else { - const size_t real_lines{ n_lines / (nl+1ul) }; - const size_t send_gap{ signal_emission_gap(real_lines) }; + const std::size_t real_lines{ n_lines / (nl+1ul) }; + const std::size_t send_gap{ signal_emission_gap(real_lines) }; const LogsFormat& lf {this->logs_format}; this->data_collection.reserve( real_lines ); - for ( size_t i{0ul}; ilogs_lines.at( i ); - for ( size_t n{0ul}; nlogs_lines.at( i ); } diff --git a/logdoctor/modules/craplog/workers/parser.h b/logdoctor/modules/craplog/workers/parser.h index 40f3533..dc19e6e 100644 --- a/logdoctor/modules/craplog/workers/parser.h +++ b/logdoctor/modules/craplog/workers/parser.h @@ -49,13 +49,13 @@ public: signals: void perfData( - const size_t parsed_size, - const size_t parsed_lines ); + const std::size_t parsed_size, + const std::size_t parsed_lines ); void chartData( - const size_t total_size, - const size_t total_lines, - const size_t blacklisted_size ); + const std::size_t total_size, + const std::size_t total_lines, + const std::size_t blacklisted_size ); void showDialog( const WorkerDialog dialog_type, @@ -102,11 +102,11 @@ private: ////////////////////// //// PERFORMANCES //// - size_t total_lines { 0ul }; - size_t parsed_lines { 0ul }; - size_t total_size { 0ul }; - size_t parsed_size { 0ul }; - size_t blacklisted_size { 0ul }; + std::size_t total_lines { 0ul }; + std::size_t parsed_lines { 0ul }; + std::size_t total_size { 0ul }; + std::size_t parsed_size { 0ul }; + std::size_t blacklisted_size { 0ul }; /////////////////// //// BLACKLIST //// diff --git a/logdoctor/modules/craplog/workers/parser/logs_data.cpp b/logdoctor/modules/craplog/workers/parser/logs_data.cpp index 995bb9d..52a4892 100644 --- a/logdoctor/modules/craplog/workers/parser/logs_data.cpp +++ b/logdoctor/modules/craplog/workers/parser/logs_data.cpp @@ -15,11 +15,11 @@ LogLineData::LogLineData(const std::string& line, const LogsFormat& logs_format) { using F = LogsFormatField; - size_t start, stop{logs_format.initial.size()}, + std::size_t start, stop{logs_format.initial.size()}, sep_i{0}; - const size_t line_size{ line.size()-1ul }, - max_seps{ logs_format.separators.size() }, - n_seps{ max_seps-1ul }; + const std::size_t line_size{ line.size()-1ul }, + max_seps{ logs_format.separators.size() }, + n_seps{ max_seps-1ul }; while ( sep_i <= max_seps ) { // split fields @@ -47,7 +47,7 @@ LogLineData::LogLineData(const std::string& line, const LogsFormat& logs_format) // should be unreachable throw ("Unexpected section reached"); } - const size_t sep_size{ sep.size() }; + const std::size_t sep_size{ sep.size() }; // get the field const F fld{ logs_format.fields.at( sep_i ) }; @@ -58,17 +58,17 @@ LogLineData::LogLineData(const std::string& line, const LogsFormat& logs_format) if ( sep_i < n_seps ) { // not the last separator, check for mistakes - size_t aux_stop = stop; + std::size_t aux_stop = stop; if ( (_MAY_HAVE_SPACES & fld) && sep == " " ) { // check the fields with whitespace-separated values - const size_t n{ fld == request_full ? 2ul - : fld & _COUNT_SPACES }; + const std::size_t n{ fld == request_full ? 2ul + : fld & _COUNT_SPACES }; - size_t c{ StringOps::count( fld_str, ' ' ) }; + std::size_t c{ StringOps::count( fld_str, ' ' ) }; if ( c < n ) { // loop until the correct number of whitespaces is reached - size_t aux_start = line[stop+1ul] == ' ' ? stop : stop+1ul; + std::size_t aux_start = line[stop+1ul] == ' ' ? stop : stop+1ul; while ( c < n ) { aux_stop = line.find( sep, aux_start ); if ( aux_stop == std::string::npos ) { @@ -88,7 +88,7 @@ LogLineData::LogLineData(const std::string& line, const LogsFormat& logs_format) if ( fld_str.back() == '\\' ) { // the found separator is not actually the separator but is part of the user-agent string // keep searching until the real separator is found - size_t aux_start = stop + sep_size; + std::size_t aux_start = stop + sep_size; while (true) { aux_stop = line.find( sep, aux_start ); if ( aux_stop == std::string::npos ) { @@ -167,7 +167,7 @@ LogLineData::LogLineData(const std::string& line, const LogsFormat& logs_format) // process the request to get the protocol, method, resource and query } else if ( fld == request_full ) { // check whether the request string has the proper number of spaces - const size_t n_spaces{ StringOps::count( fld_str, ' ' ) }; + const std::size_t n_spaces{ StringOps::count( fld_str, ' ' ) }; if ( n_spaces == 0ul ) [[unlikely]] { // no spaces @@ -193,9 +193,9 @@ LogLineData::LogLineData(const std::string& line, const LogsFormat& logs_format) } else [[likely]] { // correct amount of spaces - const size_t aux_stop1{ fld_str.find( ' ' ) }, - aux_start{ aux_stop1+1ul }, - aux_stop2{ fld_str.find( ' ', aux_start ) }; + const std::size_t aux_stop1{ fld_str.find( ' ' ) }, + aux_start{ aux_stop1+1ul }, + aux_stop2{ fld_str.find( ' ', aux_start ) }; if ( aux_stop1 > 0ul && aux_stop2 > aux_start ) [[likely]] { std::string method{ fld_str.substr( 0ul, aux_stop1 ) }; @@ -220,7 +220,7 @@ LogLineData::LogLineData(const std::string& line, const LogsFormat& logs_format) } else if ( fld == request_uri_query ) { // search for the query std::string uri, query; - const size_t aux_{ fld_str.find( '?' ) }; + const std::size_t aux_{ fld_str.find( '?' ) }; if ( aux_ != std::string::npos ) { uri = fld_str.substr( 0ul, aux_ ); query = fld_str.substr( aux_+1ul ); @@ -270,7 +270,7 @@ void LogLineData::storeUriQuery(std::string&& str) noexcept void LogLineData::storeMalformedRequestOneSpace(std::string&& str) noexcept { - const size_t pos{ str.find( ' ' ) }; + const std::size_t pos{ str.find( ' ' ) }; std::string field1{ str.substr( 0ul, pos ) }, field2{ str.substr( pos+1 ) }; const bool is_method1{ VecOps::contains( this->valid_methods, field1 ) }, @@ -335,8 +335,8 @@ void LogLineData::storeMalformedRequestOneSpace(std::string&& str) noexcept void LogLineData::storeMalformedRequestMultiSpace(std::string&& str) noexcept { - const size_t pos1{ str.find( ' ' ) }, - pos2{ str.rfind( ' ' ) }; + const std::size_t pos1{ str.find( ' ' ) }, + pos2{ str.rfind( ' ' ) }; std::string field1{ str.substr( 0ul, pos1 ) }; std::string field2{ StringOps::strip( str.substr( pos1+1ul, pos2-pos1-1ul ) ) }; std::string field3{ str.substr( pos2+1ul ) }; @@ -492,7 +492,7 @@ void LogLineData::storeMalformedRequestMultiSpace(std::string&& str) noexcept } } -size_t LogLineData::size() const noexcept +std::size_t LogLineData::size() const noexcept { return this->year + this->month diff --git a/logdoctor/modules/craplog/workers/parser/logs_data.h b/logdoctor/modules/craplog/workers/parser/logs_data.h index 4b35e95..e5d2cf6 100644 --- a/logdoctor/modules/craplog/workers/parser/logs_data.h +++ b/logdoctor/modules/craplog/workers/parser/logs_data.h @@ -39,10 +39,10 @@ struct FieldData final inline const std::string& operator *() const noexcept { return this->data; } //! Returns the sum of the field's data size with another field's data size - inline size_t operator +(const FieldData& rhs) const noexcept + inline std::size_t operator +(const FieldData& rhs) const noexcept { return this->data.size() + rhs.data.size(); } //! Returns the sum of the field's data size with the given size - friend inline size_t operator +(const size_t lhs, const FieldData& rhs) noexcept; + friend inline std::size_t operator +(const std::size_t lhs, const FieldData& rhs) noexcept; private: bool is_set; @@ -50,7 +50,7 @@ private: }; -inline size_t operator +(const size_t lhs, const FieldData& rhs) noexcept +inline std::size_t operator +(const std::size_t lhs, const FieldData& rhs) noexcept { return lhs + rhs.data.size(); } @@ -72,7 +72,7 @@ struct LogLineData final LogLineData &operator=(const LogLineData &) = delete; //! Returns the total size of all the fields' data - size_t size() const noexcept; + std::size_t size() const noexcept; // date and time FieldData year; diff --git a/logdoctor/modules/crapview/datatypes/count_stats.cpp b/logdoctor/modules/crapview/datatypes/count_stats.cpp index da6a377..fbfc112 100644 --- a/logdoctor/modules/crapview/datatypes/count_stats.cpp +++ b/logdoctor/modules/crapview/datatypes/count_stats.cpp @@ -17,7 +17,7 @@ bool CountData::buildFromQuery( QueryWrapper& query ) { QHash aux_data; - if ( const size_t size{ query.size() }; size > 0ul ) { + if ( const std::size_t size{ query.size() }; size > 0ul ) { aux_data.reserve( size * 3 ); } else { return false; diff --git a/logdoctor/modules/crapview/datatypes/daytime_stats.cpp b/logdoctor/modules/crapview/datatypes/daytime_stats.cpp index d37f563..e09abe6 100644 --- a/logdoctor/modules/crapview/datatypes/daytime_stats.cpp +++ b/logdoctor/modules/crapview/datatypes/daytime_stats.cpp @@ -77,7 +77,7 @@ qreal DaytimeData::insertInChart( QList& sets ) const const auto check_max_count{ [&count,&max_count](){ if ( count > max_count ) max_count = count; }}; - for ( size_t h{0ul}; h<24ul; ++h ) { + for ( std::size_t h{0ul}; h<24ul; ++h ) { const auto& data_{ data.at( h ) }; count = data_.at( 0ul ); *sets.at( 0ul ) << count; diff --git a/logdoctor/modules/crapview/datatypes/global_stats.h b/logdoctor/modules/crapview/datatypes/global_stats.h index eca6aff..e37d248 100644 --- a/logdoctor/modules/crapview/datatypes/global_stats.h +++ b/logdoctor/modules/crapview/datatypes/global_stats.h @@ -10,10 +10,10 @@ struct RecurrenceData final { - QHash protocol; - QHash method; - QHash uri; - QHash user_agent; + QHash protocol; + QHash method; + QHash uri; + QHash user_agent; }; struct TrafficData final @@ -28,9 +28,9 @@ struct TrafficData final struct Perfs final { - size_t max{ 0ul }; - size_t total{ 0ul }; - size_t count{ 0ul }; + std::size_t max{ 0ul }; + std::size_t total{ 0ul }; + std::size_t count{ 0ul }; }; struct PerformanceData final { @@ -47,7 +47,7 @@ struct GlobalsData final RecurrenceData recurs; TrafficData traf; PerformanceData perf; - size_t req_count{ 0 }; // total number of requests + std::size_t req_count{ 0 }; // total number of requests GlobalsData() noexcept = default; GlobalsData(GlobalsData&&) noexcept = default; diff --git a/logdoctor/modules/crapview/datatypes/relational_stats.cpp b/logdoctor/modules/crapview/datatypes/relational_stats.cpp index c243fd1..1571d48 100644 --- a/logdoctor/modules/crapview/datatypes/relational_stats.cpp +++ b/logdoctor/modules/crapview/datatypes/relational_stats.cpp @@ -41,7 +41,7 @@ bool RelationalData::buildFromQuery( QueryWrapper& query, TimeManager&& time ) return false; } - data.reserve( static_cast( 24*(60/(time.intervalStep()/60)) ) ); + data.reserve( static_cast( 24*(60/(time.intervalStep()/60)) ) ); int count{ 0 }; @@ -84,7 +84,7 @@ bool RelationalData::buildFromQuery( QueryWrapper& query, TimeManager&& time ) bool RelationalData::buildFromQuery( QueryWrapper& query, DateManager&& date, const QDate last_date ) { - if ( const size_t size{query.size()}; size == 0ul ) { + if ( const std::size_t size{query.size()}; size == 0ul ) { return false; } else { data.reserve( size * 2 ); @@ -153,7 +153,7 @@ void RelationalData::process( QueryWrapper& query, DateManager& date, const int } } -void RelationalData::reserveSpace( const size_t size ) +void RelationalData::reserveSpace( const std::size_t size ) { data.reserve( size ); } diff --git a/logdoctor/modules/crapview/datatypes/relational_stats.h b/logdoctor/modules/crapview/datatypes/relational_stats.h index fbb4722..de285a2 100644 --- a/logdoctor/modules/crapview/datatypes/relational_stats.h +++ b/logdoctor/modules/crapview/datatypes/relational_stats.h @@ -40,7 +40,7 @@ public: bool buildFromQuery( QueryWrapper& query, DateManager&& date, const QDate last_date ); bool appendFromQuery( QueryWrapper& query, DateManager& date, const QDate initial_date, const QDate final_date, const int last_day ); - void reserveSpace( const size_t size ); + void reserveSpace( const std::size_t size ); void appendFirstEmpty( DateManager& date ); void appendLastEmpty( DateManager& date, const QDate&& last_date ); diff --git a/logdoctor/modules/crapview/datatypes/speed_stats.cpp b/logdoctor/modules/crapview/datatypes/speed_stats.cpp index 41f31f6..44c31f9 100644 --- a/logdoctor/modules/crapview/datatypes/speed_stats.cpp +++ b/logdoctor/modules/crapview/datatypes/speed_stats.cpp @@ -44,7 +44,7 @@ void SpeedData::pushDatum( const SpeedDatum datum ) bool SpeedData::buildFromQuery( QueryWrapper& query, TimeManager&& time ) { - if ( const size_t size{ query.size() }; size > 0ul ) { + if ( const std::size_t size{ query.size() }; size > 0ul ) { data.reserve( size * 3 ); } else { return false; @@ -88,8 +88,8 @@ bool SpeedData::buildFromQuery( QueryWrapper& query, TimeManager&& time ) int SpeedData::insertInChart( QLineSeries*const line ) const { - size_t i{ 0 }; - const size_t max_i{ data.size() }; + std::size_t i{ 0 }; + const std::size_t max_i{ data.size() }; int value{0}, count{0}, aux_value, max_value{0}; qint64 time{ -1 }; diff --git a/logdoctor/modules/crapview/datatypes/warning_stats.cpp b/logdoctor/modules/crapview/datatypes/warning_stats.cpp index 84f89e6..483e7b1 100644 --- a/logdoctor/modules/crapview/datatypes/warning_stats.cpp +++ b/logdoctor/modules/crapview/datatypes/warning_stats.cpp @@ -149,7 +149,7 @@ void WarningData::setTimelineAsDay() timeline = TimelineType::Day; data.reserve( 24ul ); - for ( size_t h{0ul}; h<24ul; ++h ) { + for ( std::size_t h{0ul}; h<24ul; ++h ) { data.push_back( std::vector>{} ); auto& aux{ data.back() }; aux.reserve( 6ul ); @@ -163,7 +163,7 @@ void WarningData::setTimelineAsHour() timeline = TimelineType::Hour; data.reserve( 6ul ); - for ( size_t g{0ul}; g<6ul; ++g ) { + for ( std::size_t g{0ul}; g<6ul; ++g ) { data.push_back( std::vector>{} ); auto& aux{ data.back() }; aux.reserve( 10ul ); @@ -191,8 +191,8 @@ bool WarningData::buildForDay( QueryWrapper& query ) } while ( query->next() ) { - data.at( static_cast( toInt( query[3] ) ) ) - .at( static_cast( getMinuteGap( toInt( query[4] ) )/10 ) ) + data.at( static_cast( toInt( query[3] ) ) ) + .at( static_cast( getMinuteGap( toInt( query[4] ) )/10 ) ) .emplace_back( query ); } @@ -206,8 +206,8 @@ bool WarningData::buildForHour( QueryWrapper& query ) while ( query->next() ) { const int min{ toInt( query[4] ) }; - data.at( static_cast( getMinuteGap( min )/10 ) ) - .at( static_cast( min % 10 ) ) + data.at( static_cast( getMinuteGap( min )/10 ) ) + .at( static_cast( min % 10 ) ) .emplace_back( query ); } @@ -245,8 +245,8 @@ int WarningData::insertForDay( std::vector>& bars ) const bars.back().push_back( new QBarSet("") ); } - for ( size_t h{0}; h<24ul; ++h ) { - for ( size_t m{0}; m<6ul; ++m ) { + for ( std::size_t h{0ul}; h<24ul; ++h ) { + for ( std::size_t m{0ul}; m<6ul; ++m ) { int norm_count{0}, warn_count{0}; for ( const WarningDatum& datum : data.at( h ).at( m ) ) { datum.hasWarnings() ? ++warn_count : ++norm_count; @@ -272,8 +272,8 @@ int WarningData::insertForHour( std::vector>& bars ) const bars.back().push_back( new QBarSet("") ); } - for ( size_t g{0ul}; g<6ul; ++g ) { - for ( size_t m{0ul}; m<10ul; ++m ) { + for ( std::size_t g{0ul}; g<6ul; ++g ) { + for ( std::size_t m{0ul}; m<10ul; ++m ) { int norm_count{0}, warn_count{0}; for ( const WarningDatum& datum : data.at( g ).at( m ) ) { datum.hasWarnings() ? ++warn_count : ++norm_count; diff --git a/logdoctor/modules/crapview/modules/fetcher.cpp b/logdoctor/modules/crapview/modules/fetcher.cpp index 256f3d9..0be1176 100644 --- a/logdoctor/modules/crapview/modules/fetcher.cpp +++ b/logdoctor/modules/crapview/modules/fetcher.cpp @@ -353,21 +353,21 @@ void Fetcher::fetchGlobalsData( std::optional& result, QStringView bool no_data{ true }; int max_date_year{0}, max_date_month{0}, max_date_day{0}; double n_days{0.0}; - size_t max_date_count{0}; - std::array week_days_count{ 0, 0, 0, 0, 0, 0, 0 }; + std::size_t max_date_count{0ul}; + std::array week_days_count{ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; GlobalsData data; const auto week_day_from{ - [](const int y, const int m, const int d)->size_t - { return static_cast( QDate(y,m,d).dayOfWeek()-1 ); } + [](const int y, const int m, const int d)->std::size_t + { return static_cast( QDate(y,m,d).dayOfWeek()-1 ); } }; const auto update_perf{ [](Perfs& perf, const int val) { if ( val >= 0 ) { - if ( const size_t v{static_cast(val)}; v > 0ul) [[likely]] { + if ( const std::size_t v{static_cast(val)}; v > 0ul) [[likely]] { if ( v > perf.max ) { perf.max = v; } @@ -383,8 +383,8 @@ void Fetcher::fetchGlobalsData( std::optional& result, QStringView int d{-1}, h{-1}, tt{-1}, bs{-1}, br{-1}, day{-1}, hour{-1}; - double hour_count{0}; - size_t day_count{0}; + double hour_count{0.0}; + std::size_t day_count{0ul}; QString protocol, method, uri, user_agent; QueryWrapper query{ db.getQuery() }; @@ -450,7 +450,7 @@ void Fetcher::fetchGlobalsData( std::optional& result, QStringView // sum the day count to the total count data.req_count += day_count; // sum the day count to the relative day of the week count - const size_t week_day{ week_day_from(year,month,day) }; + const std::size_t week_day{ week_day_from(year,month,day) }; data.traf.day[ week_day ] += static_cast(day_count); ++ week_days_count[ week_day ]; // check the max date count @@ -520,7 +520,7 @@ void Fetcher::fetchGlobalsData( std::optional& result, QStringView data.req_count += day_count; // sum the day count to the relative day of the week count - const size_t week_day{ week_day_from(year,month,day) }; + const std::size_t week_day{ week_day_from(year,month,day) }; data.traf.day[ week_day ] += static_cast(day_count); ++ week_days_count[ week_day ]; diff --git a/logdoctor/modules/crapview/utilities/charts.cpp b/logdoctor/modules/crapview/utilities/charts.cpp index 388e620..0433468 100644 --- a/logdoctor/modules/crapview/utilities/charts.cpp +++ b/logdoctor/modules/crapview/utilities/charts.cpp @@ -26,11 +26,11 @@ void appendToSeries( std::vector& b_series, std::vectorsetColor( cols[ w ] ); series->append( b ); diff --git a/logdoctor/modules/crapview/utilities/globals.h b/logdoctor/modules/crapview/utilities/globals.h index 106a598..75e720d 100644 --- a/logdoctor/modules/crapview/utilities/globals.h +++ b/logdoctor/modules/crapview/utilities/globals.h @@ -14,7 +14,7 @@ namespace GlobalsOps inline void appendMostRecurrent( auto& recur_list, const auto& kvr, const QString& __dash ) { - size_t max{ 0 }; + std::size_t max{ 0ul }; QStringView max_str{ __dash }; std::for_each( kvr.begin(), kvr.end(), [&max,&max_str](const auto sc) @@ -23,13 +23,14 @@ inline void appendMostRecurrent( auto& recur_list, const auto& kvr, const QStrin std::make_tuple( max_str.toString(), QString::number(max) ) ); } -inline void appendMostTrafficked( auto& traffic_list, const auto& traf, const size_t max_i, const double max_c, const QString&& value, const QString& __dash, const QString& __zero ) +inline void appendMostTrafficked( auto& traffic_list, const auto& traf, const std::size_t max_i, const double max_c, const QString&& value, const QString& __dash, const QString& __zero ) { if ( max_i == traf.size() ) { traffic_list.emplace_back( __dash, __zero ); } else { - const size_t f{ static_cast(max_c) }; - const size_t d{ max_c<10.0 ? static_cast(max_c*100.0)%100ul : static_cast(max_c*10.0)%10ul }; + const auto f{ static_cast(max_c) }; + const auto d{ max_c<10.0 ? static_cast(max_c*100.0)%100ul + : static_cast(max_c*10.0)%10ul }; QString count{ QString::number( f ) }; if ( d > 0 ) { count += QString::number( d ).prepend(QLatin1Char('.')); @@ -40,7 +41,7 @@ inline void appendMostTrafficked( auto& traffic_list, const auto& traf, const si inline auto getMaxIndexCount( const auto& traf ) { double max_c{ 0.0 }; - size_t max_i{ traf.size() }; + std::size_t max_i{ traf.size() }; /*std::ranges::for_each( std::views::enumerate(traf), [&max_c,&max_i](const auto ic) { if (auto& [i,c]{ic}; c>max_c){ max_c=c; max_i=i; } });*/ diff --git a/logdoctor/modules/database/database.cpp b/logdoctor/modules/database/database.cpp index 7e7f362..4c1734d 100644 --- a/logdoctor/modules/database/database.cpp +++ b/logdoctor/modules/database/database.cpp @@ -116,12 +116,12 @@ void QueryWrapper::operator()( const QString& text ) } } -size_t QueryWrapper::size() +std::size_t QueryWrapper::size() { if ( !query.last() ) { return 0ul; } - const auto sz{ static_cast( query.at()+1 ) }; + const auto sz{ static_cast( query.at()+1 ) }; if ( !query.first() ) { throw DatabaseException( QStringLiteral("Failed to move back to first record") ); } diff --git a/logdoctor/modules/database/database.h b/logdoctor/modules/database/database.h index 49bbeea..0603095 100644 --- a/logdoctor/modules/database/database.h +++ b/logdoctor/modules/database/database.h @@ -145,7 +145,7 @@ public: Throws if the query cannot be restored at the initial position \throw DatabaseException */ - size_t size(); + std::size_t size(); //! Returns the name of the associated database const QString& dbName() const noexcept diff --git a/logdoctor/tests/white_box.cpp b/logdoctor/tests/white_box.cpp index 4547b88..f3ee9ce 100644 --- a/logdoctor/tests/white_box.cpp +++ b/logdoctor/tests/white_box.cpp @@ -473,7 +473,7 @@ bool testWorkarounds() T_TEST_START("Workarounds::enumerate") { const auto equality{ [](EnumeratedArray>& enumerated, const std::array,3>& fake_enumerated) -> bool { - size_t i{ 0ul }; + std::size_t i{ 0ul }; for (const auto& tpl : enumerated) { if ( tpl != fake_enumerated.at(i) ) return false; ++i; @@ -493,8 +493,8 @@ bool testWorkarounds() if ( flattened.size() != fake_flattened.size() ) { return false; } - const size_t max{ flattened.size() }; - for ( size_t i{0ul}; i>& zipped, std::array,3>& fake_zipped) -> bool { - size_t i{ 0ul }; + std::size_t i{ 0ul }; for (const auto& tpl : zipped) { if ( tpl != fake_zipped.at(i) ) return false; ++i; diff --git a/logdoctor/utilities/io.cpp b/logdoctor/utilities/io.cpp index 09113d7..4f49643 100644 --- a/logdoctor/utilities/io.cpp +++ b/logdoctor/utilities/io.cpp @@ -160,7 +160,7 @@ void readFile( const std::filesystem::path& path, std::string& content ) } -void randomLines( const std::filesystem::path& path, std::vector& lines, const size_t n_lines, const bool strip_lines ) +void randomLines( const std::filesystem::path& path, std::vector& lines, const std::size_t n_lines, const bool strip_lines ) { // read rhe first N lines only try { @@ -189,19 +189,19 @@ void randomLines( const std::filesystem::path& path, std::vector& l StringOps::split( aux_lines, aux ); } aux.clear(); - const size_t max{ aux_lines.size() }; + const std::size_t max{ aux_lines.size() }; if ( max > 0ul ) { if ( max <= n_lines ) { lines = aux_lines; } else { time_t nTime; srand( (unsigned)time(&nTime) ); - size_t index; - std::vector picked_indexes; - for( size_t i=0ul; i picked_indexes; + for( std::size_t i{0ul}; i(rand()) % max; - if ( VecOps::contains( picked_indexes, index ) ) { + index = static_cast(rand()) % max; + if ( VecOps::contains( picked_indexes, index ) ) { continue; } break; @@ -214,8 +214,8 @@ void randomLines( const std::filesystem::path& path, std::vector& l lines.push_back( line ); } // add the first and last lines, to double check for file integrity - for ( const size_t& index : std::vector{0ul,max-1ul} ) { - if ( ! VecOps::contains( picked_indexes, index ) ) { + for ( const auto index : std::vector{0ul,max-1ul} ) { + if ( ! VecOps::contains( picked_indexes, index ) ) { const std::string& line{ aux_lines.at( index ) }; if ( StringOps::startsWith( line, '#' ) ) { continue; diff --git a/logdoctor/utilities/io.h b/logdoctor/utilities/io.h index b8f040c..e949b0d 100644 --- a/logdoctor/utilities/io.h +++ b/logdoctor/utilities/io.h @@ -101,7 +101,7 @@ bool renameAsCopy( const std::filesystem::path& path, std::error_code& err ) noe \param n_lines The number of lines to pick \param strip_lines Whether to strip control-characters away from the lines */ -void randomLines( const std::filesystem::path& path, std::vector& lines, const size_t n_lines=16ul, const bool strip_lines=true ); +void randomLines( const std::filesystem::path& path, std::vector& lines, const std::size_t n_lines=16ul, const bool strip_lines=true ); //! Reads the content of a file /*! diff --git a/logdoctor/utilities/memory.cpp b/logdoctor/utilities/memory.cpp index f0a9b37..4ac31c7 100644 --- a/logdoctor/utilities/memory.cpp +++ b/logdoctor/utilities/memory.cpp @@ -21,12 +21,12 @@ namespace MemOps { -size_t availableMemory() { +std::size_t availableMemory() { #if defined( Q_OS_WIN ) MEMORYSTATUSEX mem_statexs; mem_statexs.dwLength = sizeof( mem_statexs ); GlobalMemoryStatusEx( &mem_statexs ); - return static_cast( mem_statexs.ullAvailPhys ); + return static_cast( mem_statexs.ullAvailPhys ); #elif defined( Q_OS_DARWIN ) mach_msg_type_number_t count{ HOST_VM_INFO_COUNT }; vm_statistics_data_t vmstat; @@ -38,26 +38,26 @@ size_t availableMemory() { if ( n_pages < 0u || page_size < 0l ) { return 0ul; } - return static_cast( n_pages ) * static_cast( page_size ); + return static_cast( n_pages ) * static_cast( page_size ); #elif defined( Q_OS_BSD4 ) vmtotal vmt; u_int page_size; - size_t vmt_size{ sizeof(vmt) }; - size_t uint_size{ sizeof(page_size) }; + std::size_t vmt_size{ sizeof(vmt) }; + std::size_t uint_size{ sizeof(page_size) }; if ( sysctlbyname("vm.vmtotal", &vmt, &vmt_size, NULL, 0) < 0 ) { throw DoNotCatchException("Failed to get vmtotal", "failed"); } if ( sysctlbyname("vm.stats.vm.v_page_size", &page_size, &uint_size, NULL, 0) < 0 ) { throw DoNotCatchException("Failed to get v_page_size", "failed"); } - return vmt.t_free * static_cast( page_size ); + return vmt.t_free * static_cast( page_size ); #elif defined( Q_OS_UNIX ) const long n_pages{ sysconf( _SC_AVPHYS_PAGES ) }; const long page_size{ sysconf( _SC_PAGE_SIZE ) }; if ( n_pages < 0l || page_size < 0l ) { return 0ul; } - return static_cast( n_pages * page_size ); + return static_cast( n_pages * page_size ); #else # error "System not supported" #endif diff --git a/logdoctor/utilities/memory.h b/logdoctor/utilities/memory.h index f50e7fd..1c087be 100644 --- a/logdoctor/utilities/memory.h +++ b/logdoctor/utilities/memory.h @@ -2,6 +2,9 @@ #define LOGDOCTOR__UTILITIES__MEMORY_H +#include + + //! MemOps /*! Utilities for system's memory infos @@ -9,14 +12,12 @@ namespace MemOps { -namespace{ using size_t = unsigned long; } - //! Returns the available (free) memory in the system /*! \return The amount of memory in Bytes \throw DoNotCatchException */ -size_t availableMemory(); +std::size_t availableMemory(); } // namespace MemOps diff --git a/logdoctor/utilities/printables.cpp b/logdoctor/utilities/printables.cpp index 570a2df..83154ca 100644 --- a/logdoctor/utilities/printables.cpp +++ b/logdoctor/utilities/printables.cpp @@ -9,7 +9,7 @@ namespace PrintSec { -QString printableSize( const size_t bytes ) noexcept +QString printableSize( const std::size_t bytes ) noexcept { std::string size_sfx{" B"}; double size{ static_cast(bytes) }; @@ -23,11 +23,11 @@ QString printableSize( const size_t bytes ) noexcept } // cut decimals depending on how big the floor is std::string size_str{ std::to_string( size ) }; - size_t cut_index{ size_str.find('.')+1 }; + std::size_t cut_index{ size_str.find('.')+1 }; if ( cut_index == 0ul ) { // catches the overflow of +1 of the above cut_index = size_str.find(',')+1; } - size_t n_decimals{ 3ul }; + std::size_t n_decimals{ 3ul }; if ( size >= 100.0 ) { -- n_decimals; if ( size >= 1000.0 ) { @@ -63,11 +63,11 @@ QString printableSpeed( const double bytes, const double secs_ ) noexcept } // cut decimals depending on how big the floor is std::string speed_str{ std::to_string( speed ) }; - size_t cut_index{ speed_str.find('.')+1ul }; + std::size_t cut_index{ speed_str.find('.')+1ul }; if ( cut_index == 0ul ) { // catches the overflow of +1 of the above cut_index = speed_str.find(',')+1ul; } - size_t n_decimals{ 3ul }; + std::size_t n_decimals{ 3ul }; if ( speed >= 100.0 ) { -- n_decimals; if ( speed >= 1000.0 ) { diff --git a/logdoctor/utilities/printables.h b/logdoctor/utilities/printables.h index 81dd574..3f6fb23 100644 --- a/logdoctor/utilities/printables.h +++ b/logdoctor/utilities/printables.h @@ -2,7 +2,7 @@ #define LOGDOCTOR__UTILITIES__PRINTABLES_H -#include +#include class QString; @@ -20,7 +20,7 @@ namespace PrintSec \return The string to be displayed */ QString printableSize( - const size_t bytes + const std::size_t bytes ) noexcept; diff --git a/logdoctor/utilities/rtf.cpp b/logdoctor/utilities/rtf.cpp index bdc9d85..bb4ad62 100644 --- a/logdoctor/utilities/rtf.cpp +++ b/logdoctor/utilities/rtf.cpp @@ -32,12 +32,12 @@ void RichText::enrichLogs( QString& rich_content, const std::string& content, co QString rich_line{}, class_name{}; std::string sep, fld, fld_str, aux_sep2; bool missing{ false }; - size_t i, start, stop, aux_start, aux_stop, - line_size, sep_size; - const size_t n_sep{ logs_format.separators.size()-1 }; + std::size_t i, start, stop, aux_start, aux_stop, + line_size, sep_size; + const std::size_t n_sep{ logs_format.separators.size()-1 }; std::vector lines; StringOps::splitrip( lines, content ); - size_t lines_left{ lines.size() }; + std::size_t lines_left{ lines.size() }; for ( const std::string& line : lines ) { -- lines_left; // check if the line is commented, usually from IIS logs @@ -94,8 +94,8 @@ void RichText::enrichLogs( QString& rich_content, const std::string& content, co if ( sep == " " ) { // whitespace-separated-values fields - size_t c{ StringOps::count( fld_str, ' ' ) }, - n{ 0 }; + std::size_t c{ StringOps::count( fld_str, ' ' ) }, + n{ 0 }; if ( fld == "request_full" ) { n = 2; } else if ( fld == "date_time_mcs" ) { diff --git a/logdoctor/utilities/strings.cpp b/logdoctor/utilities/strings.cpp index 1996dba..777ea6b 100644 --- a/logdoctor/utilities/strings.cpp +++ b/logdoctor/utilities/strings.cpp @@ -7,11 +7,11 @@ namespace StringOps { -size_t count( std::string_view str, std::string_view flag ) noexcept +std::size_t count( std::string_view str, std::string_view flag ) noexcept { - const size_t flg_size{ flag.size() }; - size_t count{ 0ul }; - for ( size_t start{0ul}; (start=str.find(flag, start)) != std::string::npos; ++count ) { + const std::size_t flg_size{ flag.size() }; + std::size_t count{ 0ul }; + for ( std::size_t start{0ul}; (start=str.find(flag, start)) != std::string::npos; ++count ) { start += flg_size; } return count; @@ -28,8 +28,8 @@ bool isNumeric( QStringView str ) noexcept std::string strip( const std::string& str, const char chr ) noexcept { - if (const size_t start{ str.find_first_not_of( chr ) }; start != std::string::npos ) { - const size_t stop{ str.find_last_not_of( chr ) }; + if (const std::size_t start{ str.find_first_not_of( chr ) }; start != std::string::npos ) { + const std::size_t stop{ str.find_last_not_of( chr ) }; return str.substr( start, stop-start+1ul ); } return std::string{}; @@ -37,8 +37,8 @@ std::string strip( const std::string& str, const char chr ) noexcept std::string strip( const std::string& str, const char* chars ) noexcept { - if (const size_t start{ str.find_first_not_of( chars ) }; start != std::string::npos ) { - const size_t stop{ str.find_last_not_of( chars ) }; + if (const std::size_t start{ str.find_first_not_of( chars ) }; start != std::string::npos ) { + const std::size_t stop{ str.find_last_not_of( chars ) }; return str.substr( start, stop-start+1ul ); } return std::string{}; @@ -47,7 +47,7 @@ std::string strip( const std::string& str, const char* chars ) noexcept std::string lstrip( const std::string& str, const char chr ) noexcept { - if (const size_t start{ str.find_first_not_of( chr ) }; start != std::string::npos ) { + if (const std::size_t start{ str.find_first_not_of( chr ) }; start != std::string::npos ) { return str.substr( start ); } return std::string{}; @@ -55,7 +55,7 @@ std::string lstrip( const std::string& str, const char chr ) noexcept std::string lstrip( const std::string& str, const char* chars ) noexcept { - if (const size_t start{ str.find_first_not_of( chars ) }; start != std::string::npos ) { + if (const std::size_t start{ str.find_first_not_of( chars ) }; start != std::string::npos ) { return str.substr( start ); } return std::string{}; @@ -64,7 +64,7 @@ std::string lstrip( const std::string& str, const char* chars ) noexcept std::string rstrip( const std::string &str, const char chr ) noexcept { - if (const size_t stop{ str.find_last_not_of( chr ) }; stop != std::string::npos ) { + if (const std::size_t stop{ str.find_last_not_of( chr ) }; stop != std::string::npos ) { return str.substr( 0ul, stop+1ul ); } return std::string{}; @@ -72,7 +72,7 @@ std::string rstrip( const std::string &str, const char chr ) noexcept std::string rstrip( const std::string& str, const char* chars ) noexcept { - if (const size_t stop{ str.find_last_not_of( chars ) }; stop != std::string::npos ) { + if (const std::size_t stop{ str.find_last_not_of( chars ) }; stop != std::string::npos ) { return str.substr( 0ul, stop+1ul ); } return std::string{}; @@ -81,7 +81,7 @@ std::string rstrip( const std::string& str, const char* chars ) noexcept std::string lstripUntil( const std::string& str, const char delim, const bool inclusive, const bool consecutives ) noexcept { - if (size_t start{ str.find( delim ) }; start != std::string::npos ) { + if (std::size_t start{ str.find( delim ) }; start != std::string::npos ) { if ( inclusive ) { ++ start; if ( consecutives ) { @@ -105,7 +105,7 @@ void split( std::vector& list, const std::string& target_str, const return; } list.reserve( count( target_str, separator )+1ul ); - size_t start{0ul}, stop; + std::size_t start{0ul}, stop; while ( (stop=target_str.find( separator, start )) != std::string::npos ) { if ( start < stop ) { list.push_back( target_str.substr( start, stop-start ) ); @@ -123,9 +123,9 @@ void split( std::vector& list, const std::string& target_str, std:: return; } list.reserve( count( target_str, separator )+1ul ); - const size_t trg_size{ target_str.size() }; - const size_t sep_size{ separator.size() }; - size_t start{0ul}, stop; + const std::size_t trg_size{ target_str.size() }; + const std::size_t sep_size{ separator.size() }; + std::size_t start{0ul}, stop; while ( (stop=target_str.find( separator, start )) != std::string::npos ) { if ( start < stop ) { list.push_back( target_str.substr( start, stop-start ) ); @@ -158,9 +158,9 @@ void splitrip(std::vector& list, const std::string& target_str, con std::string replace( std::string_view str, std::string_view target, std::string_view replace ) noexcept { std::string s{ str }; - const size_t t_size{ target.size() }; - const size_t r_size{ replace.size() }; - size_t start{ s.find( target ) }; + const std::size_t t_size{ target.size() }; + const std::size_t r_size{ replace.size() }; + std::size_t start{ s.find( target ) }; while ( start != std::string::npos ) { s.replace( start, t_size, replace ); start = s.find( target, start+r_size ); diff --git a/logdoctor/utilities/strings.h b/logdoctor/utilities/strings.h index b97abc1..b5a725f 100644 --- a/logdoctor/utilities/strings.h +++ b/logdoctor/utilities/strings.h @@ -24,9 +24,9 @@ namespace StringOps \param flag The character to find \return The number of occurrences */ -inline size_t count( std::string_view str, const char flag ) noexcept +inline std::size_t count( std::string_view str, const char flag ) noexcept { - return static_cast( std::count( str.cbegin(), str.cend(), flag ) ); + return static_cast( std::count( str.cbegin(), str.cend(), flag ) ); } //! Counts the occurrences of the given sequence in the given string @@ -35,7 +35,7 @@ inline size_t count( std::string_view str, const char flag ) noexcept \param flag The string to find \return The number of occurrences */ -size_t count( std::string_view str, std::string_view flag ) noexcept; +std::size_t count( std::string_view str, std::string_view flag ) noexcept; //! Checks whether a string only contains numeric characters /*! -- GitLab From 0c4d44c907ae89a204a809a181f18a13bb962d60 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Wed, 28 Aug 2024 22:43:52 +0200 Subject: [PATCH 30/34] Code improvements Added concepts to workarounds: HasRangesEnumerate and HasRangesZip. Updated code to use ranges when available. --- .../modules/crapview/modules/fetcher.cpp | 13 ++++++----- .../modules/crapview/utilities/globals.h | 22 ++++++++++++------- logdoctor/workarounds/lib.h | 13 +++++++++++ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/logdoctor/modules/crapview/modules/fetcher.cpp b/logdoctor/modules/crapview/modules/fetcher.cpp index 0be1176..d17a5e5 100644 --- a/logdoctor/modules/crapview/modules/fetcher.cpp +++ b/logdoctor/modules/crapview/modules/fetcher.cpp @@ -546,11 +546,14 @@ void Fetcher::fetchGlobalsData( std::optional& result, QStringView } // process the day of the week - /*std::ranges::for_each( std::views::zip( data.traf.day, week_days_count ), - [](auto tc){ if (auto& [t,c]{tc}; c>0.0){ t/=c; } });*/ - for ( auto [total,count] : Workarounds::zip( data.traf.day, week_days_count ) ) { - if ( count > 0.0 ) { - total /= count; + if constexpr ( HasRangesZip ) { + std::ranges::for_each( std::views::zip( data.traf.day, week_days_count ), + [](auto tc){ if (auto& [t,c]{tc}; c>0.0){ t/=c; } }); + } else { + for ( auto [total,count] : Workarounds::zip( data.traf.day, week_days_count ) ) { + if ( count > 0.0 ) { + total /= count; + } } } diff --git a/logdoctor/modules/crapview/utilities/globals.h b/logdoctor/modules/crapview/utilities/globals.h index 75e720d..c39ad28 100644 --- a/logdoctor/modules/crapview/utilities/globals.h +++ b/logdoctor/modules/crapview/utilities/globals.h @@ -38,19 +38,25 @@ inline void appendMostTrafficked( auto& traffic_list, const auto& traf, const st traffic_list.emplace_back( value, count ); } } + inline auto getMaxIndexCount( const auto& traf ) { double max_c{ 0.0 }; std::size_t max_i{ traf.size() }; - /*std::ranges::for_each( std::views::enumerate(traf), - [&max_c,&max_i](const auto ic) - { if (auto& [i,c]{ic}; c>max_c){ max_c=c; max_i=i; } });*/ - for( const auto [index,count] : Workarounds::enumerate(traf) ) { - if ( count > max_c ) { - max_c = count; - max_i = index; + + if constexpr ( HasRangesEnumerate ) { + std::ranges::for_each( std::views::enumerate(traf), + [&max_c,&max_i](const auto ic) + { if (auto& [i,c]{ic}; c>max_c){ max_c=c; max_i=i; } }); + } else { + for( const auto [index,count] : Workarounds::enumerate(traf) ) { + if ( count > max_c ) { + max_c = count; + max_i = index; + } } - }; + } + return std::make_tuple( max_i, max_c ); } diff --git a/logdoctor/workarounds/lib.h b/logdoctor/workarounds/lib.h index 33bf56e..378744f 100644 --- a/logdoctor/workarounds/lib.h +++ b/logdoctor/workarounds/lib.h @@ -3,6 +3,7 @@ #include +#include template @@ -18,4 +19,16 @@ template concept IsStdArray = is_std_array::value; +template +concept HasRangesEnumerate = requires(Cont c) { + std::views::enumerate(c); +}; + + +template +concept HasRangesZip = requires(Cont1 c1, Cont2 c2) { + std::views::zip(c1, c2); +}; + + #endif // LOGDOCTOR__WORKAROUNDS__LIB_H -- GitLab From 59974023887fae8e8d509881933aafbc97e106b5 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Thu, 29 Aug 2024 22:36:21 +0200 Subject: [PATCH 31/34] Fixes Updated workaround concepts --- .../modules/crapview/modules/fetcher.cpp | 19 +++++++----- .../modules/crapview/utilities/globals.h | 23 ++++++++------- logdoctor/workarounds/lib.h | 29 ++++++++++++------- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/logdoctor/modules/crapview/modules/fetcher.cpp b/logdoctor/modules/crapview/modules/fetcher.cpp index d17a5e5..ef3dee4 100644 --- a/logdoctor/modules/crapview/modules/fetcher.cpp +++ b/logdoctor/modules/crapview/modules/fetcher.cpp @@ -14,6 +14,7 @@ #include #include +#include using namespace FetcherPrivate; @@ -546,15 +547,17 @@ void Fetcher::fetchGlobalsData( std::optional& result, QStringView } // process the day of the week - if constexpr ( HasRangesZip ) { - std::ranges::for_each( std::views::zip( data.traf.day, week_days_count ), - [](auto tc){ if (auto& [t,c]{tc}; c>0.0){ t/=c; } }); - } else { - for ( auto [total,count] : Workarounds::zip( data.traf.day, week_days_count ) ) { - if ( count > 0.0 ) { - total /= count; - } + const auto mean_day_count{ [](auto tpl){ + if (auto& [total,count]{tpl}; count > 0.0) { + total /= count; } + }}; + + if constexpr ( isRangesZipAvailable() ) { + std::ranges::for_each( std::ranges::views::zip( data.traf.day, week_days_count ), mean_day_count ); + } else { + auto ziparr{ Workarounds::zip( data.traf.day, week_days_count ) }; + std::for_each( ziparr.begin(), ziparr.end(), mean_day_count ); } // make the max-date tuple diff --git a/logdoctor/modules/crapview/utilities/globals.h b/logdoctor/modules/crapview/utilities/globals.h index c39ad28..16a9e05 100644 --- a/logdoctor/modules/crapview/utilities/globals.h +++ b/logdoctor/modules/crapview/utilities/globals.h @@ -8,6 +8,8 @@ #include +#include + namespace GlobalsOps { @@ -44,17 +46,18 @@ inline auto getMaxIndexCount( const auto& traf ) double max_c{ 0.0 }; std::size_t max_i{ traf.size() }; - if constexpr ( HasRangesEnumerate ) { - std::ranges::for_each( std::views::enumerate(traf), - [&max_c,&max_i](const auto ic) - { if (auto& [i,c]{ic}; c>max_c){ max_c=c; max_i=i; } }); - } else { - for( const auto [index,count] : Workarounds::enumerate(traf) ) { - if ( count > max_c ) { - max_c = count; - max_i = index; - } + const auto update{ [&max_c,&max_i](const auto& tpl){ + if (const auto& [index,count]{tpl}; count > max_c) { + max_c = count; + max_i = index; } + }}; + + if constexpr ( isRangesEnumerateAvailable() ) { + std::ranges::for_each( std::ranges::views::enumerate(traf), update); + } else { + const auto enarr{ Workarounds::enumerate(traf) }; + std::for_each( enarr.cbegin(), enarr.cend(), update ); } return std::make_tuple( max_i, max_c ); diff --git a/logdoctor/workarounds/lib.h b/logdoctor/workarounds/lib.h index 378744f..675a4f4 100644 --- a/logdoctor/workarounds/lib.h +++ b/logdoctor/workarounds/lib.h @@ -3,7 +3,6 @@ #include -#include template @@ -19,16 +18,24 @@ template concept IsStdArray = is_std_array::value; -template -concept HasRangesEnumerate = requires(Cont c) { - std::views::enumerate(c); -}; - - -template -concept HasRangesZip = requires(Cont1 c1, Cont2 c2) { - std::views::zip(c1, c2); -}; +consteval bool isRangesEnumerateAvailable() +{ + #ifdef __cpp_lib_ranges_enumerate + return true; + #else + return false; + #endif +} + + +consteval bool isRangesZipAvailable() +{ + #ifdef __cpp_lib_ranges_zip + return true; + #else + return false; + #endif +} #endif // LOGDOCTOR__WORKAROUNDS__LIB_H -- GitLab From a3f55ce2afc88a5b1a7d67b738d91946b2d3c6be Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Thu, 29 Aug 2024 22:39:49 +0200 Subject: [PATCH 32/34] Fixes for Windows Windows' std::filesystem::path::value_type is wchar instead of char --- logdoctor/games/crisscross/game.cpp | 2 +- logdoctor/games/crisscross/game.h | 2 +- logdoctor/mainwindow.cpp | 54 +++++++++---------- logdoctor/modules/craphelp/craphelp.cpp | 2 +- logdoctor/modules/craphelp/craphelp.h | 3 +- logdoctor/modules/craplog/workers/lister.cpp | 8 +-- logdoctor/modules/craplog/workers/parser.cpp | 8 +-- .../modules/crapview/modules/fetcher.cpp | 2 +- logdoctor/modules/security/path.cpp | 2 +- logdoctor/modules/security/path.h | 16 +++++- logdoctor/utilities/gzip.cpp | 4 +- 11 files changed, 58 insertions(+), 45 deletions(-) diff --git a/logdoctor/games/crisscross/game.cpp b/logdoctor/games/crisscross/game.cpp index a0a2f16..6b00051 100644 --- a/logdoctor/games/crisscross/game.cpp +++ b/logdoctor/games/crisscross/game.cpp @@ -208,7 +208,7 @@ void CrissCross::victory() noexcept { // disable all buttons except the victory sequence ones bool disable{ true }; - for ( unsigned i=0; i<9; ++i ) { + for ( std::size_t i{0ul}; i<9ul; ++i ) { disable |= true; for ( const auto& j : this->victory_sequence ) { if ( i == j ) { diff --git a/logdoctor/games/crisscross/game.h b/logdoctor/games/crisscross/game.h index 737f0d2..53b66df 100644 --- a/logdoctor/games/crisscross/game.h +++ b/logdoctor/games/crisscross/game.h @@ -56,7 +56,7 @@ private: const bool p2_human{ !p1_human }; // victory related - std::vector victory_sequence; + std::vector victory_sequence; // game data unsigned board[9]{ diff --git a/logdoctor/mainwindow.cpp b/logdoctor/mainwindow.cpp index d9abf21..5ee11e2 100644 --- a/logdoctor/mainwindow.cpp +++ b/logdoctor/mainwindow.cpp @@ -346,9 +346,9 @@ void MainWindow::readConfigs() const auto& invalid{ path_exp.error() }; QString invalid_component; if ( this->dialogs_level > DL_ESSENTIAL ) { - invalid_component = QString( invalid.full_path.c_str() ); + invalid_component = toQString( invalid.invalid_component ); } - DialogSec::errConfPathHasSymlink( QString( invalid.full_path.c_str() ), invalid_component ); + DialogSec::errConfPathHasSymlink( toQString( invalid.full_path ), invalid_component ); proceed &= false; } else { const path_t& conf_file{ this->configs_path.getPathUnchecked() }; @@ -356,14 +356,14 @@ void MainWindow::readConfigs() // configuration file not found QString file; if ( this->dialogs_level == DL_EXPLANATORY ) { - file = QString( conf_file.c_str() ); + file = toQString( conf_file ); } DialogSec::warnConfFileNotFound( file ); proceed &= false; } else if ( ! IOutils::checkFile( conf_file ) ) { // the given path doesn't point to a file - const QString path_msg{ conf_file.c_str() }; + const QString path_msg{ toQString( conf_file ) }; if ( DialogSec::choiceFileNotFile( path_msg ) ) { if ( IOutils::renameAsCopy( conf_file, err ) ) { return; @@ -379,7 +379,7 @@ void MainWindow::readConfigs() // file not readable QString file; if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( conf_file.c_str() ); + file = toQString( conf_file ); } DialogSec::errConfFileNotReadable( file, err_msg ); proceed &= false; @@ -929,9 +929,9 @@ void MainWindow::writeConfigs() const auto& invalid{ path_exp.error() }; QString invalid_component; if ( this->dialogs_level > DL_ESSENTIAL ) { - invalid_component = QString( invalid.full_path.c_str() ); + invalid_component = toQString( invalid.invalid_component ); } - DialogSec::errConfPathHasSymlink( QString( invalid.full_path.c_str() ), invalid_component ); + DialogSec::errConfPathHasSymlink( toQString( invalid.full_path ), invalid_component ); proceed &= false; } else { const path_t& conf_file{ this->configs_path.getPathUnchecked() }; @@ -951,7 +951,7 @@ void MainWindow::writeConfigs() } else if ( ! IOutils::isDir( base_path ) ) { // not a directory - const QString path_msg{ base_path.c_str() }; + const QString path_msg{ toQString( base_path ) }; if ( DialogSec::choiceDirNotDir( path_msg ) ) { if ( ! IOutils::renameAsCopy( base_path, err ) ) { if ( this->dialogs_level > DL_ESSENTIAL ) { @@ -982,7 +982,7 @@ void MainWindow::writeConfigs() } else if ( ! IOutils::checkDir( base_path, false, true ) ) { QString file; if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( base_path.c_str() ); + file = toQString( base_path ); } DialogSec::errConfDirNotWritable( file, err_msg ); proceed &= false; @@ -990,7 +990,7 @@ void MainWindow::writeConfigs() } else if ( ! IOutils::checkFile( conf_file ) ) { // the given path doesn't point to a file - const QString path_msg{ conf_file.c_str() }; + const QString path_msg{ toQString( conf_file ) }; if ( DialogSec::choiceFileNotFile( path_msg ) ) { if ( ! IOutils::renameAsCopy( conf_file, err ) ) { if ( this->dialogs_level > DL_ESSENTIAL ) { @@ -1012,7 +1012,7 @@ void MainWindow::writeConfigs() // file not writable QString file; if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( conf_file.c_str() ); + file = toQString( conf_file ); } DialogSec::errConfFileNotWritable( file, err_msg ); return; @@ -1136,7 +1136,7 @@ void MainWindow::backupDatabase() const if ( invalid.isReasonSymlink() ) { QString invalid_component; if ( this->dialogs_level > DL_ESSENTIAL ) { - invalid_component = QString( invalid.full_path.c_str() ); + invalid_component = toQString( invalid.invalid_component ); } DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), invalid_component, false ); return; @@ -1147,14 +1147,14 @@ void MainWindow::backupDatabase() const // database file does not exists or is not a file QString file; if ( this->dialogs_level > DL_ESSENTIAL ) { - file = QString( db_file.c_str() ); + file = toQString( db_file ); } DialogSec::errDatabaseFailedBackup( DialogSec::tr("The file does not exist"), file, false ); return; } const path_t backups_dir{ this->db_data_path.getPathUnchecked() / "backups" }; if ( IOutils::isSymlink( backups_dir ) ) { - DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), QString( backups_dir.c_str() ), false ); + DialogSec::errDatabaseFailedBackup( DialogSec::tr("The path contains a symlink"), toQString( backups_dir ), false ); return; } else if ( ! IOutils::exists( backups_dir ) ) { // backups directory doesn't exists, make it @@ -1172,11 +1172,11 @@ void MainWindow::backupDatabase() const } } else if ( ! IOutils::isDir( backups_dir ) ) { // exists but it's not a directory, rename as copy and make a new one - if ( DialogSec::choiceDirNotDir( QString( backups_dir.c_str() ) ) ) { + if ( DialogSec::choiceDirNotDir( toQString( backups_dir ) ) ) { if ( ! IOutils::renameAsCopy( backups_dir, err ) ) { QString path_msg; if ( this->dialogs_level > DL_ESSENTIAL ) { - path_msg = QString( backups_dir.c_str() ); + path_msg = toQString( backups_dir ); if ( err.value() ) { err_msg = QString::fromStdString( err.message() ); } @@ -2037,13 +2037,13 @@ void MainWindow::makeInitialChecks() } else if ( ! IOutils::isDir( path ) ) { // not a directory, rename as copy a make a new one - if ( ! DialogSec::choiceDirNotDir( QString( path.c_str() ) ) ) { + if ( ! DialogSec::choiceDirNotDir( toQString( path ) ) ) { // choosed not to rename the entry as '.copy' std::exit( 1 ); } else if ( ! IOutils::renameAsCopy( path, err ) ) { QString p; if ( this->dialogs_level > DL_ESSENTIAL ) { - p = QString( path.c_str() ); + p = toQString( path ); if ( err.value() ) { err_msg = QString::fromStdString( err.message() ); } @@ -2063,11 +2063,11 @@ void MainWindow::makeInitialChecks() } } else if ( ! IOutils::checkDir( path, true ) ) { - DialogSec::errDirNotReadable( QString( path.c_str() ), err_msg ); + DialogSec::errDirNotReadable( toQString( path ), err_msg ); std::exit( 1 ); } else if ( ! IOutils::checkDir( path, false, true ) ) { - DialogSec::errDirNotWritable( QString( path.c_str() ), err_msg ); + DialogSec::errDirNotWritable( toQString( path ), err_msg ); std::exit( 1 ); } } @@ -4722,7 +4722,7 @@ void MainWindow::on_tool_ConfDatabases_Data_Dialog_clicked() } else if ( ! this->db_data_path.getPathUnchecked().empty() ) { crappath->setDirectory( QString::fromStdString( this->db_data_path.toString() ) ); } else { - crappath->setDirectory( QString( this->home_path.c_str() ) ); + crappath->setDirectory( toQString( this->home_path ) ); } if ( crappath->exec() ) { @@ -4773,7 +4773,7 @@ void MainWindow::on_button_ConfDatabases_Data_Save_clicked() this->db_data_path = path_handler; this->craplog.setStatsDatabasePath( path_handler ); this->crapview.setDbPath( path_handler ); - this->ui->inLine_ConfDatabases_Data_Path->setText( QString( path.c_str() ) ); + this->ui->inLine_ConfDatabases_Data_Path->setText( toQString( path ) ); } this->ui->inLine_ConfDatabases_Data_Path->setFocus(); this->ui->button_ConfDatabases_Data_Save->setEnabled( false ); @@ -4790,7 +4790,7 @@ void MainWindow::on_tool_ConfDatabases_Hashes_Dialog_clicked() } else if ( ! this->db_hashes_path.getPathUnchecked().empty() ) { crappath->setDirectory( QString::fromStdString( this->db_hashes_path.toString() ) ); } else { - crappath->setDirectory( QString( this->home_path.c_str() ) ); + crappath->setDirectory( toQString( this->home_path ) ); } if ( crappath->exec() ) { @@ -4840,7 +4840,7 @@ void MainWindow::on_button_ConfDatabases_Hashes_Save_clicked() } this->db_hashes_path = path_handler; this->craplog.setHashesDatabasePath( path_handler ); - this->ui->inLine_ConfDatabases_Hashes_Path->setText( QString( path.c_str() ) ); + this->ui->inLine_ConfDatabases_Hashes_Path->setText( toQString( path ) ); } this->ui->inLine_ConfDatabases_Hashes_Path->setFocus(); this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false ); @@ -4986,7 +4986,7 @@ void MainWindow::on_button_ConfApache_Path_Save_clicked() DialogSec::warnDirNotReadable( nullptr ); } this->craplog.setLogsPath( WS_APACHE, path_handler ); - this->ui->inLine_ConfApache_Path_String->setText( QString( path.c_str() ) ); + this->ui->inLine_ConfApache_Path_String->setText( toQString( path ) ); } this->ui->button_ConfApache_Path_Save->setEnabled( false ); } @@ -5382,7 +5382,7 @@ void MainWindow::on_button_ConfNginx_Path_Save_clicked() DialogSec::warnDirNotReadable( nullptr ); } this->craplog.setLogsPath( WS_NGINX, path_handler ); - this->ui->inLine_ConfNginx_Path_String->setText( QString( path.c_str() ) ); + this->ui->inLine_ConfNginx_Path_String->setText( toQString( path ) ); } this->ui->button_ConfNginx_Path_Save->setEnabled( false ); } @@ -5778,7 +5778,7 @@ void MainWindow::on_button_ConfIis_Path_Save_clicked() DialogSec::warnDirNotReadable( nullptr ); } this->craplog.setLogsPath( WS_IIS, path_handler ); - this->ui->inLine_ConfIis_Path_String->setText( QString( path.c_str() ) ); + this->ui->inLine_ConfIis_Path_String->setText( toQString( path ) ); } this->ui->button_ConfIis_Path_Save->setEnabled( false ); } diff --git a/logdoctor/modules/craphelp/craphelp.cpp b/logdoctor/modules/craphelp/craphelp.cpp index 3e6b45d..e9356fe 100644 --- a/logdoctor/modules/craphelp/craphelp.cpp +++ b/logdoctor/modules/craphelp/craphelp.cpp @@ -65,7 +65,7 @@ std::unordered_map Craphelp::getColorScheme( const ColorsS } -void Craphelp::helpLogsFormat( const std::string& path, const QFont& font, const ColorsScheme colors_scheme_id ) const noexcept +void Craphelp::helpLogsFormat( const std::filesystem::path& path, const QFont& font, const ColorsScheme colors_scheme_id ) const noexcept { std::unordered_map colors_scheme{ this->getColorScheme( colors_scheme_id ) }; std::string aux; diff --git a/logdoctor/modules/craphelp/craphelp.h b/logdoctor/modules/craphelp/craphelp.h index 463fe6e..a4c7f98 100644 --- a/logdoctor/modules/craphelp/craphelp.h +++ b/logdoctor/modules/craphelp/craphelp.h @@ -4,6 +4,7 @@ #include +#include #include @@ -34,7 +35,7 @@ public: \param colors_scheme_id The ID of the color-scheme to be used \throw DoNotCatchException */ - void helpLogsFormat( const std::string& path, const QFont& font, const ColorsScheme colors_scheme_id ) const noexcept; + void helpLogsFormat( const std::filesystem::path& path, const QFont& font, const ColorsScheme colors_scheme_id ) const noexcept; //! Provides help about log formats /*! diff --git a/logdoctor/modules/craplog/workers/lister.cpp b/logdoctor/modules/craplog/workers/lister.cpp index a3e1237..1a38705 100644 --- a/logdoctor/modules/craplog/workers/lister.cpp +++ b/logdoctor/modules/craplog/workers/lister.cpp @@ -37,19 +37,19 @@ void CraplogLister::work() if ( ! path_exp.has_value() ) { if ( path_exp.error().isReasonSymlink() ) { emit this->showDialog( WorkerDialog::errPathHasSymlink, - {QString( path_exp.error().invalid_component.c_str() ), - QString( path_exp.error().full_path.c_str() )} ); + {toQString( path_exp.error().invalid_component ), + toQString( path_exp.error().full_path )} ); this->quit(); return; } else { emit this->showDialog( WorkerDialog::errDirNotExists, - {QString::fromStdString( this->logs_path.toString() )} ); + {toQString( this->logs_path.getPathUnchecked() )} ); this->quit(); return; } } else if ( ! IOutils::isDir( path_exp.value() ) ) { emit this->showDialog( WorkerDialog::errDirNotExists, - {QString::fromStdString( this->logs_path.toString() )} ); + {toQString( this->logs_path.getPathUnchecked() )} ); this->quit(); return; } diff --git a/logdoctor/modules/craplog/workers/parser.cpp b/logdoctor/modules/craplog/workers/parser.cpp index 32a02cf..88996d8 100644 --- a/logdoctor/modules/craplog/workers/parser.cpp +++ b/logdoctor/modules/craplog/workers/parser.cpp @@ -160,8 +160,8 @@ void CraplogParser::joinLogLines() const auto path_exp{ file_path.getPath() }; if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { const auto& invalid{ path_exp.error() }; - throw InvalidPathException( {QString(invalid.invalid_component.c_str()), - QString(invalid.full_path.c_str())} ); + throw InvalidPathException( {toQString(invalid.invalid_component), + toQString(invalid.full_path)} ); } const path_t& path{ path_exp.value() }; @@ -485,8 +485,8 @@ bool CraplogParser::checkDatabaseFile() noexcept if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { const auto& invalid{ path_exp.error() }; emit this->showDialog( WorkerDialog::errPathHasSymlink, - {QString(invalid.invalid_component.c_str()), - QString(invalid.full_path.c_str())} ); + {toQString(invalid.invalid_component), + toQString(invalid.full_path)} ); return false; } const path_t& path{ path_exp.value() }; diff --git a/logdoctor/modules/crapview/modules/fetcher.cpp b/logdoctor/modules/crapview/modules/fetcher.cpp index ef3dee4..c13c04f 100644 --- a/logdoctor/modules/crapview/modules/fetcher.cpp +++ b/logdoctor/modules/crapview/modules/fetcher.cpp @@ -28,7 +28,7 @@ void Fetcher::setDialogLevel( const DialogsLevel new_level ) noexcept void Fetcher::setDbPath( PathHandler&& path ) noexcept { this->db_path = std::move(path); - this->db_name = QString( this->db_path.getPathUnchecked().filename().c_str() ); + this->db_name = toQString( this->db_path.getPathUnchecked().filename() ); } diff --git a/logdoctor/modules/security/path.cpp b/logdoctor/modules/security/path.cpp index c128c92..9376d08 100644 --- a/logdoctor/modules/security/path.cpp +++ b/logdoctor/modules/security/path.cpp @@ -88,7 +88,7 @@ const path_t& PathHandler::getPathUnchecked() const return this->path; } -const path_t PathHandler::getParentUnchecked() const +path_t PathHandler::getParentUnchecked() const { return this->path.parent_path(); } diff --git a/logdoctor/modules/security/path.h b/logdoctor/modules/security/path.h index 5450cd8..5f2a12d 100644 --- a/logdoctor/modules/security/path.h +++ b/logdoctor/modules/security/path.h @@ -2,6 +2,8 @@ #define LOGDOCTOR__MODULES__SECURITY__PATH_H +#include + #include #include #include @@ -10,7 +12,17 @@ using path_t = std::filesystem::path; -class InvalidPath; +struct InvalidPath; + + +inline QString toQString(const path_t& path) +{ + #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) + return QString( path.native().c_str() ); + #else + return QString( path.c_str() ); + #endif +} //! PathHandler @@ -50,7 +62,7 @@ public: const path_t& getPathUnchecked() const; //! Convenience function that just returns the parent path, skipping all the checks - const path_t getParentUnchecked() const; + path_t getParentUnchecked() const; }; diff --git a/logdoctor/utilities/gzip.cpp b/logdoctor/utilities/gzip.cpp index af86f26..cfbf0f8 100644 --- a/logdoctor/utilities/gzip.cpp +++ b/logdoctor/utilities/gzip.cpp @@ -76,7 +76,7 @@ public: } }; -} //namespace (private) +} // namespace (private) @@ -105,7 +105,7 @@ void readFile( const std::filesystem::path& path, std::string& content ) } if ( successful ) { - FileHandler file{ path.c_str(), "rb" }; + FileHandler file{ path.native().c_str(), "rb" }; if ( ! file.valid() ) { // unable to open the file return; -- GitLab From 2a7cda9f96aeb88e7197cef8cf6e4a5640b5b109 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Fri, 30 Aug 2024 20:54:11 +0200 Subject: [PATCH 33/34] Improvements and fixes --- .../customs/models/languages_listmodel.cpp | 2 +- logdoctor/modules/craplog/craplog.cpp | 19 +++++++++--------- .../modules/crapview/modules/fetcher.cpp | 6 +++--- .../modules/crapview/utilities/globals.h | 6 +++--- logdoctor/modules/security/path.cpp | 4 ++-- logdoctor/modules/security/path.h | 2 +- logdoctor/utilities/checks.cpp | 16 +++++++-------- logdoctor/utilities/gzip.cpp | 2 +- logdoctor/workarounds/lib.h | 20 ------------------- 9 files changed, 29 insertions(+), 48 deletions(-) diff --git a/logdoctor/customs/models/languages_listmodel.cpp b/logdoctor/customs/models/languages_listmodel.cpp index 212d608..0936133 100644 --- a/logdoctor/customs/models/languages_listmodel.cpp +++ b/logdoctor/customs/models/languages_listmodel.cpp @@ -24,7 +24,7 @@ int LanguagesListModel::indexOfLanguage( const std::string& lang ) const int LanguagesListModel::rowCount( const QModelIndex& parent ) const { Q_UNUSED(parent) - return this->model_data.size(); + return static_cast( this->model_data.size() ); } QVariant LanguagesListModel::data( const QModelIndex& index, int role ) const diff --git a/logdoctor/modules/craplog/craplog.cpp b/logdoctor/modules/craplog/craplog.cpp index 8ef2b0e..c346d9d 100644 --- a/logdoctor/modules/craplog/craplog.cpp +++ b/logdoctor/modules/craplog/craplog.cpp @@ -424,16 +424,17 @@ bool Craplog::isFileNameValid( const std::string& name ) const // check if the file has today's date time_t t; time( &t ); - struct tm* tmp = localtime( &t ); + struct tm tmp; + #ifdef Q_OS_WINDOWS + localtime_s( &tmp, &t ); + #else + localtime_r( &t, &tmp ); + #endif char aux_date[7]; - // using strftime to display time - strftime( aux_date, 7, "%y%m%d", tmp ); - for ( std::size_t i{0ul}; i<6ul; ++i ) { - if ( date.at(i) != aux_date[i] ) { - // different date, valid - return true; - break; - } + strftime( aux_date, 7, "%y%m%d", &tmp ); + if ( strcmp( date.data(), aux_date ) != 0 ) { + // different date, valid + return true; } }break; diff --git a/logdoctor/modules/crapview/modules/fetcher.cpp b/logdoctor/modules/crapview/modules/fetcher.cpp index c13c04f..c27e551 100644 --- a/logdoctor/modules/crapview/modules/fetcher.cpp +++ b/logdoctor/modules/crapview/modules/fetcher.cpp @@ -553,12 +553,12 @@ void Fetcher::fetchGlobalsData( std::optional& result, QStringView } }}; - if constexpr ( isRangesZipAvailable() ) { + #ifdef __cpp_lib_ranges_zip std::ranges::for_each( std::ranges::views::zip( data.traf.day, week_days_count ), mean_day_count ); - } else { + #else auto ziparr{ Workarounds::zip( data.traf.day, week_days_count ) }; std::for_each( ziparr.begin(), ziparr.end(), mean_day_count ); - } + #endif // make the max-date tuple data.traf.date = std::make_tuple( diff --git a/logdoctor/modules/crapview/utilities/globals.h b/logdoctor/modules/crapview/utilities/globals.h index 16a9e05..2cdfe9f 100644 --- a/logdoctor/modules/crapview/utilities/globals.h +++ b/logdoctor/modules/crapview/utilities/globals.h @@ -53,12 +53,12 @@ inline auto getMaxIndexCount( const auto& traf ) } }}; - if constexpr ( isRangesEnumerateAvailable() ) { + #ifdef __cpp_lib_ranges_enumerate std::ranges::for_each( std::ranges::views::enumerate(traf), update); - } else { + #else const auto enarr{ Workarounds::enumerate(traf) }; std::for_each( enarr.cbegin(), enarr.cend(), update ); - } + #endif return std::make_tuple( max_i, max_c ); } diff --git a/logdoctor/modules/security/path.cpp b/logdoctor/modules/security/path.cpp index 9376d08..68b1a71 100644 --- a/logdoctor/modules/security/path.cpp +++ b/logdoctor/modules/security/path.cpp @@ -96,8 +96,8 @@ path_t PathHandler::getParentUnchecked() const void InvalidPath::showDialogMessage() const { - const QString fp( this->full_path.c_str() ); - const QString ic( this->invalid_component.c_str() ); + const QString fp( toQString( this->full_path ) ); + const QString ic( toQString( this->invalid_component ) ); switch ( this->reason ) { case Reason::NotExists: DialogSec::errPathNotExists( fp, ic ); diff --git a/logdoctor/modules/security/path.h b/logdoctor/modules/security/path.h index 5f2a12d..ec6e55d 100644 --- a/logdoctor/modules/security/path.h +++ b/logdoctor/modules/security/path.h @@ -18,7 +18,7 @@ struct InvalidPath; inline QString toQString(const path_t& path) { #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) - return QString( path.native().c_str() ); + return QString::fromWCharArray( path.c_str() ); #else return QString( path.c_str() ); #endif diff --git a/logdoctor/utilities/checks.cpp b/logdoctor/utilities/checks.cpp index 75d1514..b70b912 100644 --- a/logdoctor/utilities/checks.cpp +++ b/logdoctor/utilities/checks.cpp @@ -199,8 +199,8 @@ bool checkCollectionDatabase( const PathHandler& db_path ) noexcept if ( path_exp.error().isReasonSymlink() ) { const auto& invalid{ path_exp.error() }; DialogSec::errDatabasePathHasSymlink( - QString(invalid.invalid_component.c_str()), - QString(invalid.full_path.c_str()) ); + toQString(invalid.invalid_component), + toQString(invalid.full_path) ); } else { if ( DialogSec::choiceDatabaseNotFound( db.name() ) ) { throw MakeNewDatabase{}; @@ -323,7 +323,7 @@ bool checkCollectionDatabase( const PathHandler& db_path ) noexcept if ( err ) { err_msg = QString::fromStdString( err.message() ); } - DialogSec::errRenaming( QString(path.c_str()), err_msg ); + DialogSec::errRenaming( toQString(path), err_msg ); return false; } } @@ -350,8 +350,8 @@ bool checkHashesDatabase( const PathHandler& db_path ) noexcept if ( path_exp.error().isReasonSymlink() ) { const auto& invalid{ path_exp.error() }; DialogSec::errDatabasePathHasSymlink( - QString(invalid.invalid_component.c_str()), - QString(invalid.full_path.c_str()) ); + toQString(invalid.invalid_component), + toQString(invalid.full_path) ); } else { if ( DialogSec::choiceDatabaseNotFound( db.name() ) ) { throw MakeNewDatabase{}; @@ -421,7 +421,7 @@ bool checkHashesDatabase( const PathHandler& db_path ) noexcept if ( err ) { err_msg = QString::fromStdString( err.message() ); } - DialogSec::errRenaming( QString(path.c_str()), err_msg ); + DialogSec::errRenaming( toQString(path), err_msg ); return false; } } @@ -441,8 +441,8 @@ bool checkDatabaseFile( const PathHandler& db_path, const QString& db_name ) noe if ( !path_exp.has_value() && path_exp.error().isReasonSymlink() ) { const auto& invalid{ path_exp.error() }; DialogSec::errDatabasePathHasSymlink( - QString(invalid.invalid_component.c_str()), - QString(invalid.full_path.c_str()) ); + toQString(invalid.invalid_component), + toQString(invalid.full_path) ); return false; } const path_t& path{ path_exp.value() }; diff --git a/logdoctor/utilities/gzip.cpp b/logdoctor/utilities/gzip.cpp index cfbf0f8..e0a366f 100644 --- a/logdoctor/utilities/gzip.cpp +++ b/logdoctor/utilities/gzip.cpp @@ -105,7 +105,7 @@ void readFile( const std::filesystem::path& path, std::string& content ) } if ( successful ) { - FileHandler file{ path.native().c_str(), "rb" }; + FileHandler file{ path.string().c_str(), "rb" }; if ( ! file.valid() ) { // unable to open the file return; diff --git a/logdoctor/workarounds/lib.h b/logdoctor/workarounds/lib.h index 675a4f4..33bf56e 100644 --- a/logdoctor/workarounds/lib.h +++ b/logdoctor/workarounds/lib.h @@ -18,24 +18,4 @@ template concept IsStdArray = is_std_array::value; -consteval bool isRangesEnumerateAvailable() -{ - #ifdef __cpp_lib_ranges_enumerate - return true; - #else - return false; - #endif -} - - -consteval bool isRangesZipAvailable() -{ - #ifdef __cpp_lib_ranges_zip - return true; - #else - return false; - #endif -} - - #endif // LOGDOCTOR__WORKAROUNDS__LIB_H -- GitLab From 6ec9197c62b108209a1382d2ca89cda859ae3095 Mon Sep 17 00:00:00 2001 From: Valentino Orlandi Date: Fri, 30 Aug 2024 21:45:47 +0200 Subject: [PATCH 34/34] Fix --- logdoctor/workarounds/ranges_enumerate.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/logdoctor/workarounds/ranges_enumerate.h b/logdoctor/workarounds/ranges_enumerate.h index a978cea..0996ea6 100644 --- a/logdoctor/workarounds/ranges_enumerate.h +++ b/logdoctor/workarounds/ranges_enumerate.h @@ -47,11 +47,17 @@ public: explicit EnumeratedArray( const Array& a ) : arr{a} {} - inline auto begin() noexcept + inline auto cbegin() const noexcept { return Enumerator(arr.cbegin()); } - inline auto end() noexcept + inline auto begin() noexcept + { return cbegin(); } + + inline auto cend() const noexcept { return Enumerator(arr.cend()); } + + inline auto end() noexcept + { return cend(); } }; -- GitLab